From 901fbbb01eafa1c8f7b55b6dba11dbdfae87d13d Mon Sep 17 00:00:00 2001 From: Hugo T R Date: Thu, 13 Jul 2023 20:07:45 +0200 Subject: [PATCH] added nodeSelector support to opaque server --- internal/frontend/cuefrontendopaque/server.go | 16 +- internal/planning/deploy/deploy.go | 1 + internal/runtime/interface.go | 19 +- internal/runtime/kubernetes/deployment.go | 7 + schema/server.pb.go | 453 +++++++++++------- schema/server.proto | 30 +- 6 files changed, 320 insertions(+), 206 deletions(-) diff --git a/internal/frontend/cuefrontendopaque/server.go b/internal/frontend/cuefrontendopaque/server.go index 6f61ac76c..be3fd8108 100644 --- a/internal/frontend/cuefrontendopaque/server.go +++ b/internal/frontend/cuefrontendopaque/server.go @@ -25,7 +25,7 @@ var ( extensionFields = []string{ "args", "env", "services", "ports", "unstable_permissions", "permissions", "probe", "probes", "security", "sidecars", "mounts", "resources", "requires", "tolerations", "annotations", - "resourceLimits", "resourceRequests", "extensions", + "resourceLimits", "resourceRequests", "extensions", "nodeSelector", // This is needed for the "spec" in server templates. This can't be a private field, otherwise it can't be overridden. "spec"} @@ -60,6 +60,7 @@ type cueServerExtension struct { Security *cueServerSecurity `json:"security,omitempty"` Tolerations []*schema.Server_Toleration `json:"tolerations,omitempty"` Annotations map[string]args.ResolvableValue `json:"annotations,omitempty"` + NodeSelector map[string]string `json:"nodeSelector,omitempty"` Extensions []string `json:"extensions,omitempty"` } @@ -334,6 +335,19 @@ func parseServerExtension(ctx context.Context, env *schema.Environment, pl parsi } } + if len(bits.NodeSelector) > 0 { + if err := parsing.RequireFeature(loc.Module, "experimental/container/nodeSelector"); err != nil { + return nil, fnerrors.AttachLocation(loc, err) + } + + for k, v := range bits.NodeSelector { + out.NodeSelector = append(out.NodeSelector, &schema.NodeSelectorItem{ + Key: k, + Value: v, + }) + } + } + if len(bits.Tolerations) > 0 { if err := parsing.RequireFeature(loc.Module, "experimental/container/tolerations"); err != nil { return nil, fnerrors.AttachLocation(loc, err) diff --git a/internal/planning/deploy/deploy.go b/internal/planning/deploy/deploy.go index fceddea4b..23d26a8f3 100644 --- a/internal/planning/deploy/deploy.go +++ b/internal/planning/deploy/deploy.go @@ -872,6 +872,7 @@ func PrepareRunOpts(ctx context.Context, stack *planning.Stack, srv planning.Pla out.Probes = frag.Probe out.Tolerations = frag.Toleration out.Annotations = frag.Annotation + out.NodeSelector = frag.NodeSelector if err := integrations.IntegrationFor(srv.Framework()).PrepareRun(ctx, srv, &out.MainContainer); err != nil { return err diff --git a/internal/runtime/interface.go b/internal/runtime/interface.go index 6423ef307..ddd5b2d60 100644 --- a/internal/runtime/interface.go +++ b/internal/runtime/interface.go @@ -237,15 +237,16 @@ type DeployableSpec struct { Focused bool // Set to true if the user explicitly asked for this object to be deployed. Attachable AttachableKind - Description string - Class schema.DeployableClass - Id string // Must not be empty. - Name string // Can be empty. - Volumes []*schema.Volume - Permissions *schema.ServerPermissions - Replicas int32 - Tolerations []*schema.Server_Toleration - Annotations []*schema.NamedResolvable // Annotations that apply to individual pods. + Description string + Class schema.DeployableClass + Id string // Must not be empty. + Name string // Can be empty. + Volumes []*schema.Volume + Permissions *schema.ServerPermissions + Replicas int32 + Tolerations []*schema.Server_Toleration + Annotations []*schema.NamedResolvable // Annotations that apply to individual pods. + NodeSelector []*schema.NodeSelectorItem MainContainer ContainerRunOpts Sidecars []SidecarRunOpts diff --git a/internal/runtime/kubernetes/deployment.go b/internal/runtime/kubernetes/deployment.go index b4894e3e4..c84e5742b 100644 --- a/internal/runtime/kubernetes/deployment.go +++ b/internal/runtime/kubernetes/deployment.go @@ -178,6 +178,13 @@ func prepareDeployment(ctx context.Context, target BoundNamespace, deployable ru spec = spec.WithTolerations(t) } + // nodeSelector := spec.NodeSelector + nodeSelector := map[string]string{} + for _, nodeSelectorItem := range deployable.NodeSelector { + nodeSelector[nodeSelectorItem.Key] = nodeSelectorItem.Value + } + spec = spec.WithNodeSelector(nodeSelector) + // Explicitly allow all pods on all available platforms. // On GKE, workloads are not allowed on ARM nodes by default, even if all nodes are ARM. // https://cloud.google.com/kubernetes-engine/docs/how-to/prepare-arm-workloads-for-deployment#overview diff --git a/schema/server.pb.go b/schema/server.pb.go index 5daf0d1ac..084afb251 100644 --- a/schema/server.pb.go +++ b/schema/server.pb.go @@ -311,6 +311,7 @@ type ServerFragment struct { Sidecar []*Container `protobuf:"bytes,10,rep,name=sidecar,proto3" json:"sidecar,omitempty"` InitContainer []*Container `protobuf:"bytes,11,rep,name=init_container,json=initContainer,proto3" json:"init_container,omitempty"` Annotation []*NamedResolvable `protobuf:"bytes,12,rep,name=annotation,proto3" json:"annotation,omitempty"` + NodeSelector []*NodeSelectorItem `protobuf:"bytes,13,rep,name=node_selector,json=nodeSelector,proto3" json:"node_selector,omitempty"` } func (x *ServerFragment) Reset() { @@ -429,6 +430,68 @@ func (x *ServerFragment) GetAnnotation() []*NamedResolvable { return nil } +func (x *ServerFragment) GetNodeSelector() []*NodeSelectorItem { + if x != nil { + return x.NodeSelector + } + return nil +} + +type NodeSelectorItem 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 *NodeSelectorItem) Reset() { + *x = NodeSelectorItem{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_server_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeSelectorItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeSelectorItem) ProtoMessage() {} + +func (x *NodeSelectorItem) ProtoReflect() protoreflect.Message { + mi := &file_schema_server_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 NodeSelectorItem.ProtoReflect.Descriptor instead. +func (*NodeSelectorItem) Descriptor() ([]byte, []int) { + return file_schema_server_proto_rawDescGZIP(), []int{2} +} + +func (x *NodeSelectorItem) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *NodeSelectorItem) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + // Allocations for a tree of instanced values. type Allocation struct { state protoimpl.MessageState @@ -441,7 +504,7 @@ type Allocation struct { func (x *Allocation) Reset() { *x = Allocation{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[2] + mi := &file_schema_server_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -454,7 +517,7 @@ func (x *Allocation) String() string { func (*Allocation) ProtoMessage() {} func (x *Allocation) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[2] + mi := &file_schema_server_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -467,7 +530,7 @@ func (x *Allocation) ProtoReflect() protoreflect.Message { // Deprecated: Use Allocation.ProtoReflect.Descriptor instead. func (*Allocation) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{2} + return file_schema_server_proto_rawDescGZIP(), []int{3} } func (x *Allocation) GetInstance() []*Allocation_Instance { @@ -492,7 +555,7 @@ type Instantiate struct { func (x *Instantiate) Reset() { *x = Instantiate{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[3] + mi := &file_schema_server_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -505,7 +568,7 @@ func (x *Instantiate) String() string { func (*Instantiate) ProtoMessage() {} func (x *Instantiate) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[3] + mi := &file_schema_server_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -518,7 +581,7 @@ func (x *Instantiate) ProtoReflect() protoreflect.Message { // Deprecated: Use Instantiate.ProtoReflect.Descriptor instead. func (*Instantiate) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{3} + return file_schema_server_proto_rawDescGZIP(), []int{4} } func (x *Instantiate) GetPackageName() string { @@ -563,7 +626,7 @@ type RequiredStorage struct { func (x *RequiredStorage) Reset() { *x = RequiredStorage{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[4] + mi := &file_schema_server_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -576,7 +639,7 @@ func (x *RequiredStorage) String() string { func (*RequiredStorage) ProtoMessage() {} func (x *RequiredStorage) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[4] + mi := &file_schema_server_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -589,7 +652,7 @@ func (x *RequiredStorage) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredStorage.ProtoReflect.Descriptor instead. func (*RequiredStorage) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{4} + return file_schema_server_proto_rawDescGZIP(), []int{5} } func (x *RequiredStorage) GetOwner() string { @@ -631,7 +694,7 @@ type ServerPermissions struct { func (x *ServerPermissions) Reset() { *x = ServerPermissions{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[5] + mi := &file_schema_server_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -644,7 +707,7 @@ func (x *ServerPermissions) String() string { func (*ServerPermissions) ProtoMessage() {} func (x *ServerPermissions) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[5] + mi := &file_schema_server_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -657,7 +720,7 @@ func (x *ServerPermissions) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerPermissions.ProtoReflect.Descriptor instead. func (*ServerPermissions) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{5} + return file_schema_server_proto_rawDescGZIP(), []int{6} } func (x *ServerPermissions) GetClusterRole() []*ServerPermissions_ClusterRole { @@ -681,7 +744,7 @@ type ServerExtension struct { func (x *ServerExtension) Reset() { *x = ServerExtension{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[6] + mi := &file_schema_server_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -694,7 +757,7 @@ func (x *ServerExtension) String() string { func (*ServerExtension) ProtoMessage() {} func (x *ServerExtension) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[6] + mi := &file_schema_server_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -707,7 +770,7 @@ func (x *ServerExtension) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerExtension.ProtoReflect.Descriptor instead. func (*ServerExtension) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{6} + return file_schema_server_proto_rawDescGZIP(), []int{7} } func (x *ServerExtension) GetOwner() string { @@ -751,7 +814,7 @@ type Server_ServiceSpec struct { func (x *Server_ServiceSpec) Reset() { *x = Server_ServiceSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[7] + mi := &file_schema_server_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -764,7 +827,7 @@ func (x *Server_ServiceSpec) String() string { func (*Server_ServiceSpec) ProtoMessage() {} func (x *Server_ServiceSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[7] + mi := &file_schema_server_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -864,7 +927,7 @@ type Server_URLMapEntry struct { func (x *Server_URLMapEntry) Reset() { *x = Server_URLMapEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[8] + mi := &file_schema_server_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -877,7 +940,7 @@ func (x *Server_URLMapEntry) String() string { func (*Server_URLMapEntry) ProtoMessage() {} func (x *Server_URLMapEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[8] + mi := &file_schema_server_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -934,7 +997,7 @@ type Server_Description struct { func (x *Server_Description) Reset() { *x = Server_Description{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[9] + mi := &file_schema_server_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +1010,7 @@ func (x *Server_Description) String() string { func (*Server_Description) ProtoMessage() {} func (x *Server_Description) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[9] + mi := &file_schema_server_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -997,7 +1060,7 @@ type Server_EnvironmentRequirement struct { func (x *Server_EnvironmentRequirement) Reset() { *x = Server_EnvironmentRequirement{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[10] + mi := &file_schema_server_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1010,7 +1073,7 @@ func (x *Server_EnvironmentRequirement) String() string { func (*Server_EnvironmentRequirement) ProtoMessage() {} func (x *Server_EnvironmentRequirement) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[10] + mi := &file_schema_server_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1061,7 +1124,7 @@ type Server_Toleration struct { func (x *Server_Toleration) Reset() { *x = Server_Toleration{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[11] + mi := &file_schema_server_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1074,7 +1137,7 @@ func (x *Server_Toleration) String() string { func (*Server_Toleration) ProtoMessage() {} func (x *Server_Toleration) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[11] + mi := &file_schema_server_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1138,7 +1201,7 @@ type Allocation_Instance struct { func (x *Allocation_Instance) Reset() { *x = Allocation_Instance{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[12] + mi := &file_schema_server_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1151,7 +1214,7 @@ func (x *Allocation_Instance) String() string { func (*Allocation_Instance) ProtoMessage() {} func (x *Allocation_Instance) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[12] + mi := &file_schema_server_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1164,7 +1227,7 @@ func (x *Allocation_Instance) ProtoReflect() protoreflect.Message { // Deprecated: Use Allocation_Instance.ProtoReflect.Descriptor instead. func (*Allocation_Instance) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{2, 0} + return file_schema_server_proto_rawDescGZIP(), []int{3, 0} } func (x *Allocation_Instance) GetInstanceOwner() string { @@ -1214,7 +1277,7 @@ type ServerPermissions_ClusterRole struct { func (x *ServerPermissions_ClusterRole) Reset() { *x = ServerPermissions_ClusterRole{} if protoimpl.UnsafeEnabled { - mi := &file_schema_server_proto_msgTypes[13] + mi := &file_schema_server_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1227,7 +1290,7 @@ func (x *ServerPermissions_ClusterRole) String() string { func (*ServerPermissions_ClusterRole) ProtoMessage() {} func (x *ServerPermissions_ClusterRole) ProtoReflect() protoreflect.Message { - mi := &file_schema_server_proto_msgTypes[13] + mi := &file_schema_server_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1240,7 +1303,7 @@ func (x *ServerPermissions_ClusterRole) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerPermissions_ClusterRole.ProtoReflect.Descriptor instead. func (*ServerPermissions_ClusterRole) Descriptor() ([]byte, []int) { - return file_schema_server_proto_rawDescGZIP(), []int{5, 0} + return file_schema_server_proto_rawDescGZIP(), []int{6, 0} } func (x *ServerPermissions_ClusterRole) GetLabel() string { @@ -1417,7 +1480,7 @@ var file_schema_server_proto_rawDesc = []byte{ 0x13, 0x4a, 0x04, 0x08, 0x16, 0x10, 0x17, 0x4a, 0x04, 0x08, 0x24, 0x10, 0x25, 0x4a, 0x04, 0x08, 0x1a, 0x10, 0x1b, 0x4a, 0x04, 0x08, 0x21, 0x10, 0x22, 0x4a, 0x04, 0x08, 0x23, 0x10, 0x24, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x26, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x4a, 0x04, 0x08, 0x28, 0x10, - 0x29, 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x72, 0x61, 0x67, + 0x29, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0e, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, @@ -1464,78 +1527,86 @@ var file_schema_server_proto_rawDesc = []byte{ 0x0b, 0x32, 0x22, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0xde, 0x02, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x42, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x08, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, - 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x12, 0x52, - 0x0a, 0x15, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x64, 0x6f, - 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x90, 0x01, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, - 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x23, 0x0a, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x79, 0x74, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x22, 0xae, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x1a, 0x44, 0x0a, - 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x31, 0x0a, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x12, 0x50, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x66, 0x6f, 0x75, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x2a, 0x59, - 0x0a, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x15, 0x46, - 0x52, 0x41, 0x4d, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x4f, 0x10, 0x01, 0x12, 0x0a, - 0x0a, 0x06, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, - 0x41, 0x51, 0x55, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x4a, 0x53, 0x10, 0x05, 0x22, 0x04, 0x08, - 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x42, 0x25, 0x5a, 0x23, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x66, - 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x12, 0x48, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0c, 0x6e, + 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x0a, 0x10, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 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, 0xde, 0x02, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x08, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x42, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x15, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x90, 0x01, 0x0a, 0x0b, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x0f, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x79, + 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x62, 0x79, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0xae, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, + 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x1a, 0x44, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x06, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x2a, 0x59, 0x0a, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, + 0x47, 0x4f, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x04, + 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x4a, + 0x53, 0x10, 0x05, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x42, + 0x25, 0x5a, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x6c, 0x61, 0x62, 0x73, + 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1551,82 +1622,84 @@ func file_schema_server_proto_rawDescGZIP() []byte { } var file_schema_server_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_schema_server_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_schema_server_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_schema_server_proto_goTypes = []interface{}{ (Framework)(0), // 0: foundation.schema.Framework (*Server)(nil), // 1: foundation.schema.Server (*ServerFragment)(nil), // 2: foundation.schema.ServerFragment - (*Allocation)(nil), // 3: foundation.schema.Allocation - (*Instantiate)(nil), // 4: foundation.schema.Instantiate - (*RequiredStorage)(nil), // 5: foundation.schema.RequiredStorage - (*ServerPermissions)(nil), // 6: foundation.schema.ServerPermissions - (*ServerExtension)(nil), // 7: foundation.schema.ServerExtension - (*Server_ServiceSpec)(nil), // 8: foundation.schema.Server.ServiceSpec - (*Server_URLMapEntry)(nil), // 9: foundation.schema.Server.URLMapEntry - (*Server_Description)(nil), // 10: foundation.schema.Server.Description - (*Server_EnvironmentRequirement)(nil), // 11: foundation.schema.Server.EnvironmentRequirement - (*Server_Toleration)(nil), // 12: foundation.schema.Server.Toleration - (*Allocation_Instance)(nil), // 13: foundation.schema.Allocation.Instance - (*ServerPermissions_ClusterRole)(nil), // 14: foundation.schema.ServerPermissions.ClusterRole - (*anypb.Any)(nil), // 15: google.protobuf.Any - (*Reference)(nil), // 16: foundation.schema.Reference - (*Endpoint_Port)(nil), // 17: foundation.schema.Endpoint.Port - (*Naming)(nil), // 18: foundation.schema.Naming - (*Container)(nil), // 19: foundation.schema.Container - (*Probe)(nil), // 20: foundation.schema.Probe - (*Volume)(nil), // 21: foundation.schema.Volume - (*ResourcePack)(nil), // 22: foundation.schema.ResourcePack - (*NamedResolvable)(nil), // 23: foundation.schema.NamedResolvable - (*ContainerExtension)(nil), // 24: foundation.schema.ContainerExtension - (*ServiceMetadata)(nil), // 25: foundation.schema.ServiceMetadata - (Endpoint_Type)(0), // 26: foundation.schema.Endpoint.Type - (*PackageRef)(nil), // 27: foundation.schema.PackageRef - (*DomainSpec)(nil), // 28: foundation.schema.DomainSpec - (*ServiceAnnotations)(nil), // 29: foundation.schema.ServiceAnnotations - (*Label)(nil), // 30: foundation.schema.Label + (*NodeSelectorItem)(nil), // 3: foundation.schema.NodeSelectorItem + (*Allocation)(nil), // 4: foundation.schema.Allocation + (*Instantiate)(nil), // 5: foundation.schema.Instantiate + (*RequiredStorage)(nil), // 6: foundation.schema.RequiredStorage + (*ServerPermissions)(nil), // 7: foundation.schema.ServerPermissions + (*ServerExtension)(nil), // 8: foundation.schema.ServerExtension + (*Server_ServiceSpec)(nil), // 9: foundation.schema.Server.ServiceSpec + (*Server_URLMapEntry)(nil), // 10: foundation.schema.Server.URLMapEntry + (*Server_Description)(nil), // 11: foundation.schema.Server.Description + (*Server_EnvironmentRequirement)(nil), // 12: foundation.schema.Server.EnvironmentRequirement + (*Server_Toleration)(nil), // 13: foundation.schema.Server.Toleration + (*Allocation_Instance)(nil), // 14: foundation.schema.Allocation.Instance + (*ServerPermissions_ClusterRole)(nil), // 15: foundation.schema.ServerPermissions.ClusterRole + (*anypb.Any)(nil), // 16: google.protobuf.Any + (*Reference)(nil), // 17: foundation.schema.Reference + (*Endpoint_Port)(nil), // 18: foundation.schema.Endpoint.Port + (*Naming)(nil), // 19: foundation.schema.Naming + (*Container)(nil), // 20: foundation.schema.Container + (*Probe)(nil), // 21: foundation.schema.Probe + (*Volume)(nil), // 22: foundation.schema.Volume + (*ResourcePack)(nil), // 23: foundation.schema.ResourcePack + (*NamedResolvable)(nil), // 24: foundation.schema.NamedResolvable + (*ContainerExtension)(nil), // 25: foundation.schema.ContainerExtension + (*ServiceMetadata)(nil), // 26: foundation.schema.ServiceMetadata + (Endpoint_Type)(0), // 27: foundation.schema.Endpoint.Type + (*PackageRef)(nil), // 28: foundation.schema.PackageRef + (*DomainSpec)(nil), // 29: foundation.schema.DomainSpec + (*ServiceAnnotations)(nil), // 30: foundation.schema.ServiceAnnotations + (*Label)(nil), // 31: foundation.schema.Label } var file_schema_server_proto_depIdxs = []int32{ - 10, // 0: foundation.schema.Server.description:type_name -> foundation.schema.Server.Description - 15, // 1: foundation.schema.Server.ext:type_name -> google.protobuf.Any - 3, // 2: foundation.schema.Server.allocation:type_name -> foundation.schema.Allocation + 11, // 0: foundation.schema.Server.description:type_name -> foundation.schema.Server.Description + 16, // 1: foundation.schema.Server.ext:type_name -> google.protobuf.Any + 4, // 2: foundation.schema.Server.allocation:type_name -> foundation.schema.Allocation 0, // 3: foundation.schema.Server.framework:type_name -> foundation.schema.Framework - 16, // 4: foundation.schema.Server.reference:type_name -> foundation.schema.Reference - 9, // 5: foundation.schema.Server.url_map:type_name -> foundation.schema.Server.URLMapEntry - 17, // 6: foundation.schema.Server.static_port:type_name -> foundation.schema.Endpoint.Port - 11, // 7: foundation.schema.Server.environment_requirement:type_name -> foundation.schema.Server.EnvironmentRequirement + 17, // 4: foundation.schema.Server.reference:type_name -> foundation.schema.Reference + 10, // 5: foundation.schema.Server.url_map:type_name -> foundation.schema.Server.URLMapEntry + 18, // 6: foundation.schema.Server.static_port:type_name -> foundation.schema.Endpoint.Port + 12, // 7: foundation.schema.Server.environment_requirement:type_name -> foundation.schema.Server.EnvironmentRequirement 2, // 8: foundation.schema.Server.self:type_name -> foundation.schema.ServerFragment - 18, // 9: foundation.schema.Server.server_naming:type_name -> foundation.schema.Naming - 19, // 10: foundation.schema.ServerFragment.main_container:type_name -> foundation.schema.Container - 8, // 11: foundation.schema.ServerFragment.service:type_name -> foundation.schema.Server.ServiceSpec - 8, // 12: foundation.schema.ServerFragment.ingress:type_name -> foundation.schema.Server.ServiceSpec - 20, // 13: foundation.schema.ServerFragment.probe:type_name -> foundation.schema.Probe - 21, // 14: foundation.schema.ServerFragment.volume:type_name -> foundation.schema.Volume - 22, // 15: foundation.schema.ServerFragment.resource_pack:type_name -> foundation.schema.ResourcePack - 6, // 16: foundation.schema.ServerFragment.permissions:type_name -> foundation.schema.ServerPermissions - 12, // 17: foundation.schema.ServerFragment.toleration:type_name -> foundation.schema.Server.Toleration - 19, // 18: foundation.schema.ServerFragment.sidecar:type_name -> foundation.schema.Container - 19, // 19: foundation.schema.ServerFragment.init_container:type_name -> foundation.schema.Container - 23, // 20: foundation.schema.ServerFragment.annotation:type_name -> foundation.schema.NamedResolvable - 13, // 21: foundation.schema.Allocation.instance:type_name -> foundation.schema.Allocation.Instance - 15, // 22: foundation.schema.Instantiate.constructor:type_name -> google.protobuf.Any - 14, // 23: foundation.schema.ServerPermissions.cluster_role:type_name -> foundation.schema.ServerPermissions.ClusterRole - 21, // 24: foundation.schema.ServerExtension.volume:type_name -> foundation.schema.Volume - 24, // 25: foundation.schema.ServerExtension.extend_container:type_name -> foundation.schema.ContainerExtension - 25, // 26: foundation.schema.Server.ServiceSpec.metadata:type_name -> foundation.schema.ServiceMetadata - 17, // 27: foundation.schema.Server.ServiceSpec.port:type_name -> foundation.schema.Endpoint.Port - 26, // 28: foundation.schema.Server.ServiceSpec.endpoint_type:type_name -> foundation.schema.Endpoint.Type - 27, // 29: foundation.schema.Server.ServiceSpec.ingress_provider:type_name -> foundation.schema.PackageRef - 28, // 30: foundation.schema.Server.ServiceSpec.ingress_domain:type_name -> foundation.schema.DomainSpec - 29, // 31: foundation.schema.Server.ServiceSpec.ingress_annotations:type_name -> foundation.schema.ServiceAnnotations - 30, // 32: foundation.schema.Server.EnvironmentRequirement.environment_has_label:type_name -> foundation.schema.Label - 30, // 33: foundation.schema.Server.EnvironmentRequirement.environment_does_not_have_label:type_name -> foundation.schema.Label - 4, // 34: foundation.schema.Allocation.Instance.instantiated:type_name -> foundation.schema.Instantiate - 3, // 35: foundation.schema.Allocation.Instance.downstream_allocation:type_name -> foundation.schema.Allocation - 36, // [36:36] is the sub-list for method output_type - 36, // [36:36] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 19, // 9: foundation.schema.Server.server_naming:type_name -> foundation.schema.Naming + 20, // 10: foundation.schema.ServerFragment.main_container:type_name -> foundation.schema.Container + 9, // 11: foundation.schema.ServerFragment.service:type_name -> foundation.schema.Server.ServiceSpec + 9, // 12: foundation.schema.ServerFragment.ingress:type_name -> foundation.schema.Server.ServiceSpec + 21, // 13: foundation.schema.ServerFragment.probe:type_name -> foundation.schema.Probe + 22, // 14: foundation.schema.ServerFragment.volume:type_name -> foundation.schema.Volume + 23, // 15: foundation.schema.ServerFragment.resource_pack:type_name -> foundation.schema.ResourcePack + 7, // 16: foundation.schema.ServerFragment.permissions:type_name -> foundation.schema.ServerPermissions + 13, // 17: foundation.schema.ServerFragment.toleration:type_name -> foundation.schema.Server.Toleration + 20, // 18: foundation.schema.ServerFragment.sidecar:type_name -> foundation.schema.Container + 20, // 19: foundation.schema.ServerFragment.init_container:type_name -> foundation.schema.Container + 24, // 20: foundation.schema.ServerFragment.annotation:type_name -> foundation.schema.NamedResolvable + 3, // 21: foundation.schema.ServerFragment.node_selector:type_name -> foundation.schema.NodeSelectorItem + 14, // 22: foundation.schema.Allocation.instance:type_name -> foundation.schema.Allocation.Instance + 16, // 23: foundation.schema.Instantiate.constructor:type_name -> google.protobuf.Any + 15, // 24: foundation.schema.ServerPermissions.cluster_role:type_name -> foundation.schema.ServerPermissions.ClusterRole + 22, // 25: foundation.schema.ServerExtension.volume:type_name -> foundation.schema.Volume + 25, // 26: foundation.schema.ServerExtension.extend_container:type_name -> foundation.schema.ContainerExtension + 26, // 27: foundation.schema.Server.ServiceSpec.metadata:type_name -> foundation.schema.ServiceMetadata + 18, // 28: foundation.schema.Server.ServiceSpec.port:type_name -> foundation.schema.Endpoint.Port + 27, // 29: foundation.schema.Server.ServiceSpec.endpoint_type:type_name -> foundation.schema.Endpoint.Type + 28, // 30: foundation.schema.Server.ServiceSpec.ingress_provider:type_name -> foundation.schema.PackageRef + 29, // 31: foundation.schema.Server.ServiceSpec.ingress_domain:type_name -> foundation.schema.DomainSpec + 30, // 32: foundation.schema.Server.ServiceSpec.ingress_annotations:type_name -> foundation.schema.ServiceAnnotations + 31, // 33: foundation.schema.Server.EnvironmentRequirement.environment_has_label:type_name -> foundation.schema.Label + 31, // 34: foundation.schema.Server.EnvironmentRequirement.environment_does_not_have_label:type_name -> foundation.schema.Label + 5, // 35: foundation.schema.Allocation.Instance.instantiated:type_name -> foundation.schema.Instantiate + 4, // 36: foundation.schema.Allocation.Instance.downstream_allocation:type_name -> foundation.schema.Allocation + 37, // [37:37] is the sub-list for method output_type + 37, // [37:37] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_schema_server_proto_init() } @@ -1671,7 +1744,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Allocation); i { + switch v := v.(*NodeSelectorItem); i { case 0: return &v.state case 1: @@ -1683,7 +1756,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Instantiate); i { + switch v := v.(*Allocation); i { case 0: return &v.state case 1: @@ -1695,7 +1768,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequiredStorage); i { + switch v := v.(*Instantiate); i { case 0: return &v.state case 1: @@ -1707,7 +1780,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerPermissions); i { + switch v := v.(*RequiredStorage); i { case 0: return &v.state case 1: @@ -1719,7 +1792,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerExtension); i { + switch v := v.(*ServerPermissions); i { case 0: return &v.state case 1: @@ -1731,7 +1804,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_ServiceSpec); i { + switch v := v.(*ServerExtension); i { case 0: return &v.state case 1: @@ -1743,7 +1816,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_URLMapEntry); i { + switch v := v.(*Server_ServiceSpec); i { case 0: return &v.state case 1: @@ -1755,7 +1828,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_Description); i { + switch v := v.(*Server_URLMapEntry); i { case 0: return &v.state case 1: @@ -1767,7 +1840,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_EnvironmentRequirement); i { + switch v := v.(*Server_Description); i { case 0: return &v.state case 1: @@ -1779,7 +1852,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Server_Toleration); i { + switch v := v.(*Server_EnvironmentRequirement); i { case 0: return &v.state case 1: @@ -1791,7 +1864,7 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Allocation_Instance); i { + switch v := v.(*Server_Toleration); i { case 0: return &v.state case 1: @@ -1803,6 +1876,18 @@ func file_schema_server_proto_init() { } } file_schema_server_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Allocation_Instance); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_server_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerPermissions_ClusterRole); i { case 0: return &v.state @@ -1821,7 +1906,7 @@ func file_schema_server_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_server_proto_rawDesc, NumEnums: 1, - NumMessages: 14, + NumMessages: 15, NumExtensions: 0, NumServices: 0, }, diff --git a/schema/server.proto b/schema/server.proto index b707de1e4..8a0803e3c 100644 --- a/schema/server.proto +++ b/schema/server.proto @@ -135,18 +135,24 @@ message Server { } message ServerFragment { - Container main_container = 1; - repeated Server.ServiceSpec service = 2; - repeated Server.ServiceSpec ingress = 3; - repeated Probe probe = 4; - repeated Volume volume = 5; - ResourcePack resource_pack = 6; - ServerPermissions permissions = 7; - repeated Server.Toleration toleration = 8; - repeated string extension = 9; // Package name. - repeated Container sidecar = 10; - repeated Container init_container = 11; - repeated NamedResolvable annotation = 12; + Container main_container = 1; + repeated Server.ServiceSpec service = 2; + repeated Server.ServiceSpec ingress = 3; + repeated Probe probe = 4; + repeated Volume volume = 5; + ResourcePack resource_pack = 6; + ServerPermissions permissions = 7; + repeated Server.Toleration toleration = 8; + repeated string extension = 9; // Package name. + repeated Container sidecar = 10; + repeated Container init_container = 11; + repeated NamedResolvable annotation = 12; + repeated NodeSelectorItem node_selector = 13; +} + +message NodeSelectorItem { + string key = 1; + string value = 2; } // Allocations for a tree of instanced values.