diff --git a/apis/core/v1beta1/gateway_types.go b/apis/core/v1beta1/gateway_types.go deleted file mode 100644 index a2ffc1a270..0000000000 --- a/apis/core/v1beta1/gateway_types.go +++ /dev/null @@ -1,109 +0,0 @@ -package v1beta1 - -import ( - "github.com/rancher/opni/pkg/auth/openid" - cfgv1beta1 "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/noauth" - opnimeta "github.com/rancher/opni/pkg/util/meta" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type AuthSpec struct { - //+kubebuilder:validation:Required - Provider cfgv1beta1.AuthProviderType `json:"provider,omitempty"` - Openid *OpenIDConfigSpec `json:"openid,omitempty"` - Noauth *noauth.ServerConfig `json:"noauth,omitempty"` -} - -type OpenIDConfigSpec struct { - openid.OpenidConfig `json:",inline,omitempty,squash"` - ClientID string `json:"clientID,omitempty"` - ClientSecret string `json:"clientSecret,omitempty"` - Scopes []string `json:"scopes,omitempty"` - AllowedDomains []string `json:"allowedDomains,omitempty"` - RoleAttributePath string `json:"roleAttributePath,omitempty"` - - InsecureSkipVerify *bool `json:"insecureSkipVerify,omitempty"` - - // extra options from grafana config - AllowSignUp *bool `json:"allowSignUp,omitempty"` - RoleAttributeStrict *bool `json:"roleAttributeStrict,omitempty"` - EmailAttributePath string `json:"emailAttributePath,omitempty"` - TLSClientCert string `json:"tlsClientCert,omitempty"` - TLSClientKey string `json:"tlsClientKey,omitempty"` - TLSClientCA string `json:"tlsClientCA,omitempty"` -} - -type GatewaySpec struct { - Replicas *int32 `json:"replicas,omitempty"` - Image *opnimeta.ImageSpec `json:"image,omitempty"` - //+kubebuilder:validation:Required - Auth AuthSpec `json:"auth,omitempty"` - Hostname string `json:"hostname,omitempty"` - - AgentImageTagOverride string `json:"agentImageTagOverride,omitempty"` - - // Deprecated: this field is ignored. - PluginSearchDirs []string `json:"pluginSearchDirs,omitempty"` - - Alerting AlertingSpec `json:"alerting,omitempty"` - NatsRef corev1.LocalObjectReference `json:"natsCluster"` - - //+kubebuilder:default=LoadBalancer - ServiceType corev1.ServiceType `json:"serviceType,omitempty"` - ServiceAnnotations map[string]string `json:"serviceAnnotations,omitempty"` - Management cfgv1beta1.ManagementSpec `json:"management,omitempty"` - //+kubebuilder:default=jetstream - //+kubebuilder:validation:Optional - //+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Value is immutable" - StorageType cfgv1beta1.StorageType `json:"storageType,omitempty"` - //+kubebuilder:default=bsdiff - PatchEngine cfgv1beta1.PatchEngine `json:"patchEngine,omitempty"` - - NodeSelector map[string]string `json:"nodeSelector,omitempty"` - Tolerations []corev1.Toleration `json:"tolerations,omitempty"` - Affinity *corev1.Affinity `json:"affinity,omitempty"` - ExtraVolumeMounts []opnimeta.ExtraVolumeMount `json:"extraVolumeMounts,omitempty"` - ExtraEnvVars []corev1.EnvVar `json:"extraEnvVars,omitempty"` - Profiling cfgv1beta1.ProfilingSpec `json:"profiling,omitempty"` -} - -func (g *GatewaySpec) GetServiceType() corev1.ServiceType { - if g == nil || g.ServiceType == corev1.ServiceType("") { - return corev1.ServiceTypeClusterIP - } - return g.ServiceType -} - -type GatewayStatus struct { - Image string `json:"image,omitempty"` - ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"` - ServiceName string `json:"serviceName,omitempty"` - LoadBalancer *corev1.LoadBalancerIngress `json:"loadBalancer,omitempty"` - Endpoints []corev1.EndpointAddress `json:"endpoints,omitempty"` - Ready bool `json:"ready,omitempty"` - StorageType cfgv1beta1.StorageType `json:"storageType,omitempty"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -type Gateway struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - Spec GatewaySpec `json:"spec,omitempty"` - Status GatewayStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true -type GatewayList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Gateway `json:"items"` -} - -func init() { - SchemeBuilder.Register( - &Gateway{}, &GatewayList{}, - ) -} diff --git a/apis/core/v1beta1/zz_generated.deepcopy.go b/apis/core/v1beta1/zz_generated.deepcopy.go index 9003885941..3298c50719 100644 --- a/apis/core/v1beta1/zz_generated.deepcopy.go +++ b/apis/core/v1beta1/zz_generated.deepcopy.go @@ -288,30 +288,6 @@ func (in *AlertingSpec) DeepCopy() *AlertingSpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AuthSpec) DeepCopyInto(out *AuthSpec) { - *out = *in - if in.Openid != nil { - in, out := &in.Openid, &out.Openid - *out = new(OpenIDConfigSpec) - (*in).DeepCopyInto(*out) - } - if in.Noauth != nil { - in, out := &in.Noauth, &out.Noauth - *out = (*in).DeepCopy() - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthSpec. -func (in *AuthSpec) DeepCopy() *AuthSpec { - if in == nil { - return nil - } - out := new(AuthSpec) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BatchProcessorConfig) DeepCopyInto(out *BatchProcessorConfig) { *out = *in @@ -621,167 +597,6 @@ func (in *FileStorageSpec) DeepCopy() *FileStorageSpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Gateway) DeepCopyInto(out *Gateway) { - *out = *in - 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 Gateway. -func (in *Gateway) DeepCopy() *Gateway { - if in == nil { - return nil - } - out := new(Gateway) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Gateway) 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 *GatewayList) DeepCopyInto(out *GatewayList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Gateway, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GatewayList. -func (in *GatewayList) DeepCopy() *GatewayList { - if in == nil { - return nil - } - out := new(GatewayList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *GatewayList) 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 *GatewaySpec) DeepCopyInto(out *GatewaySpec) { - *out = *in - if in.Replicas != nil { - in, out := &in.Replicas, &out.Replicas - *out = new(int32) - **out = **in - } - if in.Image != nil { - in, out := &in.Image, &out.Image - *out = new(meta.ImageSpec) - (*in).DeepCopyInto(*out) - } - in.Auth.DeepCopyInto(&out.Auth) - if in.PluginSearchDirs != nil { - in, out := &in.PluginSearchDirs, &out.PluginSearchDirs - *out = make([]string, len(*in)) - copy(*out, *in) - } - in.Alerting.DeepCopyInto(&out.Alerting) - out.NatsRef = in.NatsRef - if in.ServiceAnnotations != nil { - in, out := &in.ServiceAnnotations, &out.ServiceAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - in.Management.DeepCopyInto(&out.Management) - if in.NodeSelector != nil { - in, out := &in.NodeSelector, &out.NodeSelector - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Tolerations != nil { - in, out := &in.Tolerations, &out.Tolerations - *out = make([]v1.Toleration, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Affinity != nil { - in, out := &in.Affinity, &out.Affinity - *out = new(v1.Affinity) - (*in).DeepCopyInto(*out) - } - if in.ExtraVolumeMounts != nil { - in, out := &in.ExtraVolumeMounts, &out.ExtraVolumeMounts - *out = make([]meta.ExtraVolumeMount, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.ExtraEnvVars != nil { - in, out := &in.ExtraEnvVars, &out.ExtraEnvVars - *out = make([]v1.EnvVar, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - out.Profiling = in.Profiling -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GatewaySpec. -func (in *GatewaySpec) DeepCopy() *GatewaySpec { - if in == nil { - return nil - } - out := new(GatewaySpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GatewayStatus) DeepCopyInto(out *GatewayStatus) { - *out = *in - if in.LoadBalancer != nil { - in, out := &in.LoadBalancer, &out.LoadBalancer - *out = new(v1.LoadBalancerIngress) - (*in).DeepCopyInto(*out) - } - if in.Endpoints != nil { - in, out := &in.Endpoints, &out.Endpoints - *out = make([]v1.EndpointAddress, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GatewayStatus. -func (in *GatewayStatus) DeepCopy() *GatewayStatus { - if in == nil { - return nil - } - out := new(GatewayStatus) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GrafanaSpec) DeepCopyInto(out *GrafanaSpec) { *out = *in @@ -1324,47 +1139,6 @@ func (in *OTLPHTTPExporterConfig) DeepCopy() *OTLPHTTPExporterConfig { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenIDConfigSpec) DeepCopyInto(out *OpenIDConfigSpec) { - *out = *in - in.OpenidConfig.DeepCopyInto(&out.OpenidConfig) - if in.Scopes != nil { - in, out := &in.Scopes, &out.Scopes - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.AllowedDomains != nil { - in, out := &in.AllowedDomains, &out.AllowedDomains - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.InsecureSkipVerify != nil { - in, out := &in.InsecureSkipVerify, &out.InsecureSkipVerify - *out = new(bool) - **out = **in - } - if in.AllowSignUp != nil { - in, out := &in.AllowSignUp, &out.AllowSignUp - *out = new(bool) - **out = **in - } - if in.RoleAttributeStrict != nil { - in, out := &in.RoleAttributeStrict, &out.RoleAttributeStrict - *out = new(bool) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDConfigSpec. -func (in *OpenIDConfigSpec) DeepCopy() *OpenIDConfigSpec { - if in == nil { - return nil - } - out := new(OpenIDConfigSpec) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PVCSource) DeepCopyInto(out *PVCSource) { *out = *in diff --git a/apis/scheme.go b/apis/scheme.go index 58cdb0b4f4..44d9f89552 100644 --- a/apis/scheme.go +++ b/apis/scheme.go @@ -1,6 +1,7 @@ package apis import ( + opnicorev1 "github.com/rancher/opni/apis/core/v1" opnicorev1beta1 "github.com/rancher/opni/apis/core/v1beta1" apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/runtime" @@ -22,6 +23,7 @@ func NewScheme() *runtime.Scheme { var schemeBuilders = []func(*runtime.Scheme) error{ apiextv1.AddToScheme, + opnicorev1.AddToScheme, opnicorev1beta1.AddToScheme, } diff --git a/config/crd/bases/core.opni.io_gateways.yaml b/config/crd/bases/core.opni.io_gateways.yaml index f4c2d351dd..71b52a4498 100644 --- a/config/crd/bases/core.opni.io_gateways.yaml +++ b/config/crd/bases/core.opni.io_gateways.yaml @@ -14,7 +14,7 @@ spec: singular: gateway scope: Namespaced versions: - - name: v1beta1 + - name: v1 schema: openAPIV3Schema: properties: @@ -393,938 +393,9 @@ spec: type: object agentImageTagOverride: type: string - alerting: - properties: - alertVolumeMounts: - 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: - type: string - kind: - type: string - readOnly: - 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 - path: - type: string - readOnly: - type: boolean - secretFile: - type: string - secretRef: - properties: - name: - 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: - 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 - name: - type: string - optional: - type: boolean - type: object - x-kubernetes-map-type: atomic - csi: - properties: - driver: - type: string - fsType: - type: string - nodePublishSecretRef: - properties: - name: - 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 - 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 - 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: - claims: - items: - properties: - name: - 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 - selector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - type: string - values: - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - 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 - wwids: - items: - type: string - type: array - type: object - flexVolume: - properties: - driver: - type: string - fsType: - type: string - options: - additionalProperties: - type: string - type: object - readOnly: - type: boolean - secretRef: - properties: - name: - 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 - iscsi: - properties: - chapAuthDiscovery: - type: boolean - chapAuthSession: - type: boolean - fsType: - type: string - initiatorName: - type: string - iqn: - type: string - iscsiInterface: - type: string - lun: - format: int32 - type: integer - portals: - items: - type: string - type: array - readOnly: - type: boolean - secretRef: - properties: - name: - type: string - type: object - x-kubernetes-map-type: atomic - targetPortal: - type: string - required: - - iqn - - lun - - targetPortal - type: object - mountPath: - type: string - 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: - configMap: - properties: - items: - items: - properties: - key: - type: string - mode: - format: int32 - type: integer - path: - type: string - required: - - key - - path - type: object - type: array - name: - 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 - 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 - name: - 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 - 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: - type: string - monitors: - items: - type: string - type: array - pool: - type: string - readOnly: - type: boolean - secretRef: - properties: - name: - type: string - type: object - x-kubernetes-map-type: atomic - user: - type: string - required: - - image - - monitors - type: object - readOnly: - type: boolean - scaleIO: - properties: - fsType: - type: string - gateway: - type: string - protectionDomain: - type: string - readOnly: - type: boolean - secretRef: - properties: - name: - type: string - type: object - x-kubernetes-map-type: atomic - sslEnabled: - type: boolean - storageMode: - 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 - optional: - type: boolean - secretName: - type: string - type: object - storageos: - properties: - fsType: - type: string - readOnly: - type: boolean - secretRef: - properties: - name: - 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 - type: object - type: array - clusterGossipInterval: - default: 200ms - type: string - clusterPort: - default: 9094 - type: integer - clusterPushPullInterval: - default: 1m0s - type: string - clusterSettleTimeout: - default: 1m0s - type: string - configName: - type: string - cpu: - default: 500m - type: string - dataMountPath: - default: /var/lib - type: string - enabled: - type: boolean - memory: - default: 200Mi - type: string - rawConfigMap: - type: string - rawInternalRouting: - type: string - replicas: - default: 1 - format: int32 - type: integer - serviceType: - default: ClusterIP - type: string - storage: - default: 500Mi - type: string - webPort: - default: 9093 - type: integer - type: object - auth: - properties: - noauth: - properties: - clientID: - type: string - clientSecret: - type: string - debug: - type: boolean - grafanaHostname: - type: string - issuer: - type: string - managementAPIEndpoint: - type: string - openid: - properties: - discovery: - properties: - cacert: - type: string - issuer: - type: string - path: - default: /.well-known/openid-configuration - type: string - required: - - issuer - type: object - identifyingClaim: - default: sub - type: string - wellKnownConfiguration: - properties: - authorization_endpoint: - type: string - claims_supported: - items: - type: string - type: array - end_session_endpoint: - type: string - id_token_signing_alg_values_supported: - items: - type: string - type: array - issuer: - type: string - jwks_uri: - type: string - request_uri_parameter_supported: - type: boolean - response_modes_supported: - items: - type: string - type: array - response_types_supported: - items: - type: string - type: array - revocation_endpoint: - type: string - scopes_supported: - items: - type: string - type: array - token_endpoint: - type: string - token_endpoint_auth_methods_supported: - items: - type: string - type: array - userinfo_endpoint: - type: string - type: object - type: object - port: - type: integer - redirectURI: - type: string - type: object - openid: - properties: - allowSignUp: - type: boolean - allowedDomains: - items: - type: string - type: array - clientID: - type: string - clientSecret: - type: string - discovery: - properties: - cacert: - type: string - issuer: - type: string - path: - default: /.well-known/openid-configuration - type: string - required: - - issuer - type: object - emailAttributePath: - type: string - identifyingClaim: - default: sub - type: string - insecureSkipVerify: - type: boolean - roleAttributePath: - type: string - roleAttributeStrict: - type: boolean - scopes: - items: - type: string - type: array - tlsClientCA: - type: string - tlsClientCert: - type: string - tlsClientKey: - type: string - wellKnownConfiguration: - properties: - authorization_endpoint: - type: string - claims_supported: - items: - type: string - type: array - end_session_endpoint: - type: string - id_token_signing_alg_values_supported: - items: - type: string - type: array - issuer: - type: string - jwks_uri: - type: string - request_uri_parameter_supported: - type: boolean - response_modes_supported: - items: - type: string - type: array - response_types_supported: - items: - type: string - type: array - revocation_endpoint: - type: string - scopes_supported: - items: - type: string - type: array - token_endpoint: - type: string - token_endpoint_auth_methods_supported: - items: - type: string - type: array - userinfo_endpoint: - type: string - type: object - type: object - provider: - type: string + config: type: object + x-kubernetes-preserve-unknown-fields: true extraEnvVars: items: properties: @@ -2102,8 +1173,6 @@ spec: type: object type: object type: array - hostname: - type: string image: properties: image: @@ -2119,44 +1188,6 @@ spec: x-kubernetes-map-type: atomic type: array type: object - management: - properties: - grpcAdvertiseAddress: - type: string - grpcListenAddress: - default: tcp://0.0.0.0:11090 - type: string - httpListenAddress: - default: 0.0.0.0:11080 - type: string - relayAdvertiseAddress: - type: string - relayListenAddress: - type: string - webAdvertiseAddress: - type: string - webCerts: - properties: - caCert: - type: string - caCertData: - format: byte - type: string - servingCert: - type: string - servingCertData: - format: byte - type: string - servingKey: - type: string - servingKeyData: - format: byte - type: string - type: object - webListenAddress: - default: 0.0.0.0:12080 - type: string - type: object natsCluster: properties: name: @@ -2167,19 +1198,6 @@ spec: additionalProperties: type: string type: object - patchEngine: - default: bsdiff - type: string - pluginSearchDirs: - items: - type: string - type: array - profiling: - properties: - path: - default: /debug/pprof - type: string - type: object replicas: format: int32 type: integer @@ -2188,14 +1206,7 @@ spec: type: string type: object serviceType: - default: LoadBalancer - type: string - storageType: - default: jetstream type: string - x-kubernetes-validations: - - message: Value is immutable - rule: self == oldSelf tolerations: items: properties: @@ -2283,8 +1294,6 @@ spec: type: boolean serviceName: type: string - storageType: - type: string type: object type: object served: true diff --git a/controllers/core_alerting_controller.go b/controllers/core_alerting_controller.go index e20c2316ad..c241f8ca46 100644 --- a/controllers/core_alerting_controller.go +++ b/controllers/core_alerting_controller.go @@ -4,6 +4,7 @@ import ( "context" "github.com/go-logr/logr" + apicorev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" "github.com/rancher/opni/pkg/resources/alerting" @@ -62,7 +63,7 @@ func (r *CoreAlertingReconciler) SetupWithManager(mgr ctrl.Manager) error { Owns(&corev1.Service{}). Owns(&corev1.Secret{}). Watches( - &corev1beta1.Gateway{}, + &apicorev1.Gateway{}, handler.EnqueueRequestsFromMapFunc(r.findAlertingClusters), builder.WithPredicates(predicate.ResourceVersionChangedPredicate{}), ). diff --git a/controllers/core_alerting_controller_test.go b/controllers/core_alerting_controller_test.go index c4eb80a086..eb6c4aa342 100644 --- a/controllers/core_alerting_controller_test.go +++ b/controllers/core_alerting_controller_test.go @@ -7,10 +7,10 @@ import ( . "github.com/kralicky/kmatch" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apicorev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" "github.com/rancher/opni/pkg/alerting/shared" - cfgv1beta1 "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/noauth" + "github.com/samber/lo" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -33,17 +33,12 @@ var _ = Describe("Alerting Controller", Ordered, Label("controller", "slow"), fu }) BeforeEach(func() { - gw := &corev1beta1.Gateway{ + gw := &apicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: "test", Namespace: makeTestNamespace(), }, - Spec: corev1beta1.GatewaySpec{ - Auth: corev1beta1.AuthSpec{ - Provider: cfgv1beta1.AuthProviderNoAuth, - Noauth: &noauth.ServerConfig{}, - }, - }, + Spec: apicorev1.GatewaySpec{}, } Expect(k8sClient.Create(context.Background(), gw)).To(Succeed()) Eventually(Object(gw)).Should(Exist()) diff --git a/controllers/core_gateway_controller.go b/controllers/core_gateway_controller.go index 85807dffd2..d3bb08be01 100644 --- a/controllers/core_gateway_controller.go +++ b/controllers/core_gateway_controller.go @@ -8,7 +8,7 @@ import ( cmv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1" "github.com/go-logr/logr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" - corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" + apicorev1 "github.com/rancher/opni/apis/core/v1" "github.com/rancher/opni/pkg/resources/gateway" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -41,7 +41,7 @@ type CoreGatewayReconciler struct { func (r *CoreGatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { lg := r.logger - mc := &corev1beta1.Gateway{} + mc := &apicorev1.Gateway{} err := r.Get(ctx, req.NamespacedName, mc) if err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) @@ -66,7 +66,7 @@ func (r *CoreGatewayReconciler) SetupWithManager(mgr ctrl.Manager) error { r.Client = mgr.GetClient() r.scheme = mgr.GetScheme() return ctrl.NewControllerManagedBy(mgr). - For(&corev1beta1.Gateway{}). + For(&apicorev1.Gateway{}). Owns(&appsv1.Deployment{}). Owns(&appsv1.StatefulSet{}). Owns(&corev1.ConfigMap{}). diff --git a/controllers/core_gateway_controller_test.go b/controllers/core_gateway_controller_test.go index cede545992..ee5d93bf3d 100644 --- a/controllers/core_gateway_controller_test.go +++ b/controllers/core_gateway_controller_test.go @@ -2,25 +2,192 @@ package controllers_test import ( "context" + "strings" + "time" + cmv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1" + cmmeta "github.com/cert-manager/cert-manager/pkg/apis/meta/v1" . "github.com/kralicky/kmatch" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + apicorev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" - "github.com/rancher/opni/pkg/auth/openid" - cfgv1beta1 "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/noauth" + configv1 "github.com/rancher/opni/pkg/config/v1" + "github.com/rancher/opni/pkg/test/testutil" + "github.com/rancher/opni/pkg/util/flagutil" + "github.com/rancher/opni/pkg/util/k8sutil" opnimeta "github.com/rancher/opni/pkg/util/meta" "github.com/samber/lo" + "google.golang.org/protobuf/types/known/fieldmaskpb" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) var _ = Describe("Core Gateway Controller", Ordered, Label("controller", "slow"), func() { + When("creating a new empty Gateway object", func() { + var gw *apicorev1.Gateway + It("should initialize the active configuration using SSA", func() { + ns := makeTestNamespace() + gw = &apicorev1.Gateway{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: ns, + }, + Spec: apicorev1.GatewaySpec{}, + } + gw.SetNamespace(ns) + Expect(k8sClient.Create(context.Background(), gw)).To(Succeed()) + Eventually(Object(gw)).Should(Exist()) + + // patch the certificates and create secrets to simulate cert-manager behavior + Expect(k8sClient.Create(context.Background(), &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "opni-gateway-ca-keys", + Namespace: gw.Namespace, + }, + Data: map[string][]byte{ + "ca.crt": []byte("test-ca"), + "ca.key": []byte("test-ca-key"), + }, + })).To(Succeed()) + Expect(k8sClient.Create(context.Background(), &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "opni-gateway-serving-cert", + Namespace: gw.Namespace, + }, + Data: map[string][]byte{ + "tls.crt": []byte("test-cert"), + "tls.key": []byte("test-cert-key"), + }, + })).To(Succeed()) + + cert1 := &cmv1.Certificate{ + ObjectMeta: metav1.ObjectMeta{ + Name: "opni-gateway-ca", + Namespace: gw.Namespace, + }, + } + Eventually(Object(cert1)).Should(Exist()) + Expect(k8sClient.Get(context.Background(), client.ObjectKeyFromObject(cert1), cert1)).To(Succeed()) + + cert2 := &cmv1.Certificate{ + ObjectMeta: metav1.ObjectMeta{ + Name: "opni-gateway-serving-cert", + Namespace: gw.Namespace, + }, + } + Eventually(Object(cert2)).Should(Exist()) + Expect(k8sClient.Get(context.Background(), client.ObjectKeyFromObject(cert2), cert2)).To(Succeed()) + + ready := cmv1.CertificateStatus{ + Conditions: []cmv1.CertificateCondition{ + { + ObservedGeneration: 1, + Reason: "Ready", + Type: cmv1.CertificateConditionReady, + LastTransitionTime: lo.ToPtr(metav1.NewTime(time.Now().Round(time.Second))), + Status: cmmeta.ConditionTrue, + Message: "Certificate is up to date and has not expired", + }, + }, + } + cert1.Status = ready + cert2.Status = ready + Expect(k8sClient.Status().Update(context.Background(), cert1)).To(Succeed()) + Expect(k8sClient.Status().Update(context.Background(), cert2)).To(Succeed()) + + Expect(k8sClient.Get(context.Background(), client.ObjectKeyFromObject(cert1), cert1)).To(Succeed()) + Expect(cert1.Status).To(Equal(ready)) + + defaults := &configv1.GatewayConfigSpec{} + flagutil.LoadDefaults(defaults) + Eventually(Object(gw)).Should(WithTransform(func(gw *apicorev1.Gateway) *configv1.GatewayConfigSpec { + return gw.Spec.Config + }, testutil.ProtoEqual( + &configv1.GatewayConfigSpec{ + Certs: &configv1.CertsSpec{ + CaCertData: lo.ToPtr("test-ca"), + ServingCertData: lo.ToPtr("test-cert"), + ServingKey: lo.ToPtr("/run/opni/certs/tls.key"), + }, + Server: &configv1.ServerSpec{ + HttpListenAddress: defaults.Server.HttpListenAddress, + GrpcListenAddress: defaults.Server.GrpcListenAddress, + AdvertiseAddress: lo.ToPtr("${POD_IP}:9090"), + }, + Management: &configv1.ManagementServerSpec{ + HttpListenAddress: defaults.Management.HttpListenAddress, + GrpcListenAddress: defaults.Management.GrpcListenAddress, + AdvertiseAddress: lo.ToPtr("${POD_IP}:11090"), + }, + Relay: &configv1.RelayServerSpec{ + GrpcListenAddress: defaults.Relay.GrpcListenAddress, + AdvertiseAddress: lo.ToPtr("${POD_IP}:11190"), + }, + Health: defaults.Health, + Dashboard: &configv1.DashboardServerSpec{ + HttpListenAddress: defaults.Dashboard.HttpListenAddress, + AdvertiseAddress: lo.ToPtr("${POD_IP}:12080"), + }, + Storage: &configv1.StorageSpec{ + Backend: configv1.StorageBackend_Etcd.Enum(), + Etcd: &configv1.EtcdSpec{ + Endpoints: []string{"etcd:2379"}, + Certs: &configv1.MTLSSpec{ + ServerCA: lo.ToPtr("/run/etcd/certs/server/ca.crt"), + ClientCA: lo.ToPtr("/run/etcd/certs/client/ca.crt"), + ClientCert: lo.ToPtr("/run/etcd/certs/client/tls.crt"), + ClientKey: lo.ToPtr("/run/etcd/certs/client/tls.key"), + }, + }, + }, + Plugins: defaults.Plugins, + Keyring: &configv1.KeyringSpec{ + RuntimeKeyDirs: []string{"/run/opni/keyring"}, + }, + Upgrades: defaults.Upgrades, + RateLimiting: defaults.RateLimiting, + // this defaults to nil via flags, but must be populated in ssa + Auth: &configv1.AuthSpec{}, + }, + ))) + + Eventually(Object(gw)).Should(WithTransform(func(gw *apicorev1.Gateway) []string { + set := k8sutil.DecodeManagedFieldsEntry(gw.GetManagedFields()[0]) + var paths []string + set.Iterate(func(p fieldpath.Path) { + s := p.String() + if strings.HasPrefix(s, ".spec.config.") { + paths = append(paths, strings.TrimPrefix(s, ".spec.config.")) + } + }) + mask := &fieldmaskpb.FieldMask{Paths: paths} + mask.Normalize() + return mask.GetPaths() + }, ConsistOf([]string{ + "auth", + "certs", + "dashboard", + "health", + "keyring", + "management", + "plugins", + "rateLimiting", + "relay", + "server", + "storage", + "upgrades", + }))) + }) + }) +}) + +var _ = XDescribe("Core Gateway Controller", Ordered, Label("controller", "slow"), func() { testCases := []struct { name string objects []client.Object @@ -28,19 +195,19 @@ var _ = Describe("Core Gateway Controller", Ordered, Label("controller", "slow") { name: "etcd storage backend", objects: []client.Object{ - &corev1beta1.Gateway{ + &apicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: "test", }, - Spec: corev1beta1.GatewaySpec{ + Spec: apicorev1.GatewaySpec{ Image: &opnimeta.ImageSpec{ Image: lo.ToPtr("rancher/opni:latest"), }, - Auth: corev1beta1.AuthSpec{ - Provider: cfgv1beta1.AuthProviderNoAuth, - Noauth: &noauth.ServerConfig{}, + Config: &configv1.GatewayConfigSpec{ + Storage: &configv1.StorageSpec{ + Backend: configv1.StorageBackend_Etcd.Enum(), + }, }, - StorageType: cfgv1beta1.StorageTypeEtcd, }, }, }, @@ -59,22 +226,23 @@ var _ = Describe("Core Gateway Controller", Ordered, Label("controller", "slow") }, }, }, - &corev1beta1.Gateway{ + &apicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: "test", }, - Spec: corev1beta1.GatewaySpec{ + Spec: apicorev1.GatewaySpec{ Image: &opnimeta.ImageSpec{ Image: lo.ToPtr("rancher/opni:latest"), }, - Auth: corev1beta1.AuthSpec{ - Provider: cfgv1beta1.AuthProviderNoAuth, - Noauth: &noauth.ServerConfig{}, - }, - StorageType: cfgv1beta1.StorageTypeJetStream, NatsRef: corev1.LocalObjectReference{ Name: "test", }, + Config: &configv1.GatewayConfigSpec{ + Storage: &configv1.StorageSpec{ + Backend: configv1.StorageBackend_JetStream.Enum(), + JetStream: &configv1.JetStreamSpec{}, + }, + }, }, }, }, @@ -82,29 +250,29 @@ var _ = Describe("Core Gateway Controller", Ordered, Label("controller", "slow") { name: "openid auth", objects: []client.Object{ - &corev1beta1.Gateway{ + &apicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: "test", }, - Spec: corev1beta1.GatewaySpec{ + Spec: apicorev1.GatewaySpec{ Image: &opnimeta.ImageSpec{ Image: lo.ToPtr("rancher/opni:latest"), }, - Auth: corev1beta1.AuthSpec{ - Provider: cfgv1beta1.AuthProviderOpenID, - Openid: &corev1beta1.OpenIDConfigSpec{ - ClientID: "test-client-id", - ClientSecret: "test-client-secret", - Scopes: []string{"openid", "profile", "email"}, - RoleAttributePath: "test-role-attribute-path", - OpenidConfig: openid.OpenidConfig{ - Discovery: &openid.DiscoverySpec{ - Issuer: "https://test-issuer/", - }, + Config: &configv1.GatewayConfigSpec{ + Auth: &configv1.AuthSpec{ + Backend: configv1.AuthSpec_OpenID, + Openid: &configv1.OpenIDAuthSpec{ + Issuer: lo.ToPtr("https://test-issuer/"), + ClientId: lo.ToPtr("test-client-id"), + ClientSecret: lo.ToPtr("test-client-secret"), + Scopes: []string{"openid", "profile", "email"}, }, }, + Storage: &configv1.StorageSpec{ + Backend: configv1.StorageBackend_Etcd.Enum(), + Etcd: &configv1.EtcdSpec{}, + }, }, - StorageType: cfgv1beta1.StorageTypeEtcd, }, }, }, @@ -114,11 +282,11 @@ var _ = Describe("Core Gateway Controller", Ordered, Label("controller", "slow") for _, tc := range testCases { tc := tc Context(tc.name, func() { - var gw *corev1beta1.Gateway + var gw *apicorev1.Gateway Specify("creating resources", func() { ns := makeTestNamespace() for _, obj := range tc.objects { - if g, ok := obj.(*corev1beta1.Gateway); ok { + if g, ok := obj.(*apicorev1.Gateway); ok { gw = g } obj.SetNamespace(ns) diff --git a/controllers/core_monitoring_controller.go b/controllers/core_monitoring_controller.go index 0a736783cb..86deb51958 100644 --- a/controllers/core_monitoring_controller.go +++ b/controllers/core_monitoring_controller.go @@ -14,6 +14,7 @@ import ( "github.com/go-logr/logr" "github.com/huandu/xstrings" + apicorev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" "github.com/rancher/opni/pkg/resources/monitoring" "github.com/rancher/opni/pkg/util/k8sutil" @@ -108,7 +109,7 @@ func (r *CoreMonitoringReconciler) SetupWithManager(mgr ctrl.Manager) error { Owns(&corev1.Secret{}). Owns(&corev1.Service{}). Watches( - &corev1beta1.Gateway{}, + &apicorev1.Gateway{}, handler.EnqueueRequestsFromMapFunc(r.findMonitoringClusters), builder.WithPredicates(predicate.ResourceVersionChangedPredicate{}), ). diff --git a/controllers/core_monitoring_controller_test.go b/controllers/core_monitoring_controller_test.go index 62e14374d0..3e1df50fcb 100644 --- a/controllers/core_monitoring_controller_test.go +++ b/controllers/core_monitoring_controller_test.go @@ -11,11 +11,10 @@ import ( . "github.com/kralicky/kmatch" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apicorev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" "github.com/rancher/opni/internal/cortex/config/storage" "github.com/rancher/opni/internal/cortex/config/validation" - cfgv1beta1 "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/noauth" "github.com/rancher/opni/pkg/test/testutil" "github.com/rancher/opni/pkg/util/flagutil" "github.com/rancher/opni/plugins/metrics/apis/cortexops" @@ -55,17 +54,12 @@ var _ = Describe("Monitoring Controller", Ordered, Label("controller", "slow"), }, }, } - gw := &corev1beta1.Gateway{ + gw := &apicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: "test", Namespace: ns, }, - Spec: corev1beta1.GatewaySpec{ - Auth: corev1beta1.AuthSpec{ - Provider: cfgv1beta1.AuthProviderNoAuth, - Noauth: &noauth.ServerConfig{}, - }, - StorageType: cfgv1beta1.StorageTypeEtcd, + Spec: apicorev1.GatewaySpec{ NatsRef: corev1.LocalObjectReference{ Name: "test", }, diff --git a/go.mod b/go.mod index 6305e13667..a6da2567d7 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,6 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.3 github.com/hashicorp/memberlist v0.5.0 github.com/iancoleman/strcase v0.3.0 - github.com/imdario/mergo v0.3.16 github.com/jarcoal/httpmock v1.3.0 github.com/jedib0t/go-pretty/v6 v6.4.6 github.com/jhump/protoreflect v1.15.1 @@ -364,6 +363,7 @@ require ( github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 // indirect github.com/huandu/xstrings v1.4.0 github.com/iancoleman/orderedmap v0.2.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect @@ -584,7 +584,7 @@ require ( sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 sourcegraph.com/sourcegraph/appdash v0.0.0-20211028080628-e2786a622600 // indirect ) diff --git a/packages/opni/opni/charts/crds/crds.yaml b/packages/opni/opni/charts/crds/crds.yaml index 79ac084f8f..8d099df3be 100644 --- a/packages/opni/opni/charts/crds/crds.yaml +++ b/packages/opni/opni/charts/crds/crds.yaml @@ -5,7 +5,7 @@ --- {apiVersion: apiextensions.k8s.io/v1, kind: CustomResourceDefinition, metadata: {annotations: {controller-gen.kubebuilder.io/version: v0.13.0}, name: datapreppers.logging.opni.io}, spec: {group: logging.opni.io, names: {kind: DataPrepper, listKind: DataPrepperList, plural: datapreppers, singular: dataprepper}, scope: Namespaced, versions: [{additionalPrinterColumns: [{jsonPath: .metadata.creationTimestamp, name: Age, type: date}], name: v1beta1, schema: {openAPIV3Schema: {properties: {apiVersion: {type: string}, kind: {type: string}, metadata: {type: object}, spec: {properties: {cluster: {type: string}, defaultRepo: {type: string}, enableTracing: {type: boolean}, image: {type: string}, imagePullPolicy: {type: string}, imagePullSecrets: {items: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, type: array}, nodeSelector: {additionalProperties: {type: string}, type: object}, opensearch: {properties: {endpoint: {type: string}, insecureDisableSSLVerify: {type: boolean}}, type: object}, passwordFrom: {properties: {key: {type: string}, name: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}, tolerations: {items: {properties: {effect: {type: string}, key: {type: string}, operator: {type: string}, tolerationSeconds: {format: int64, type: integer}, value: {type: string}}, type: object}, type: array}, username: {type: string}, version: {default: latest, type: string}}, required: [username, version], type: object}, status: {properties: {conditions: {items: {type: string}, type: array}, state: {type: string}}, type: object}}, type: object}}, served: true, storage: true, subresources: {status: {}}}]}} --- -{apiVersion: apiextensions.k8s.io/v1, kind: CustomResourceDefinition, metadata: {annotations: {controller-gen.kubebuilder.io/version: v0.13.0}, name: gateways.core.opni.io}, spec: {group: core.opni.io, names: {kind: Gateway, listKind: GatewayList, plural: gateways, singular: gateway}, scope: Namespaced, versions: [{name: v1beta1, schema: {openAPIV3Schema: {properties: {apiVersion: {type: string}, kind: {type: string}, metadata: {type: object}, spec: {properties: {affinity: {properties: {nodeAffinity: {properties: {preferredDuringSchedulingIgnoredDuringExecution: {items: {properties: {preference: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchFields: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}}, type: object, x-kubernetes-map-type: atomic}, weight: {format: int32, type: integer}}, required: [preference, weight], type: object}, type: array}, requiredDuringSchedulingIgnoredDuringExecution: {properties: {nodeSelectorTerms: {items: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchFields: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}}, type: object, x-kubernetes-map-type: atomic}, type: array}}, 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}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, weight: {format: int32, type: integer}}, required: [podAffinityTerm, weight], type: object}, type: array}, requiredDuringSchedulingIgnoredDuringExecution: {items: {properties: {labelSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, type: array}}, 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}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, weight: {format: int32, type: integer}}, required: [podAffinityTerm, weight], type: object}, type: array}, requiredDuringSchedulingIgnoredDuringExecution: {items: {properties: {labelSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, type: array}}, type: object}}, type: object}, agentImageTagOverride: {type: string}, alerting: {properties: {alertVolumeMounts: {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: {type: string}, kind: {type: string}, readOnly: {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}, path: {type: string}, readOnly: {type: boolean}, secretFile: {type: string}, secretRef: {properties: {name: {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: {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}, name: {type: string}, optional: {type: boolean}}, type: object, x-kubernetes-map-type: atomic}, csi: {properties: {driver: {type: string}, fsType: {type: string}, nodePublishSecretRef: {properties: {name: {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}}, 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}, 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: {claims: {items: {properties: {name: {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}, selector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, storageClassName: {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}, wwids: {items: {type: string}, type: array}}, type: object}, flexVolume: {properties: {driver: {type: string}, fsType: {type: string}, options: {additionalProperties: {type: string}, type: object}, readOnly: {type: boolean}, secretRef: {properties: {name: {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}, iscsi: {properties: {chapAuthDiscovery: {type: boolean}, chapAuthSession: {type: boolean}, fsType: {type: string}, initiatorName: {type: string}, iqn: {type: string}, iscsiInterface: {type: string}, lun: {format: int32, type: integer}, portals: {items: {type: string}, type: array}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, targetPortal: {type: string}}, required: [iqn, lun, targetPortal], type: object}, mountPath: {type: string}, 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: {configMap: {properties: {items: {items: {properties: {key: {type: string}, mode: {format: int32, type: integer}, path: {type: string}}, required: [key, path], type: object}, type: array}, name: {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}}, 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}, name: {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}}, 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: {type: string}, monitors: {items: {type: string}, type: array}, pool: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, user: {type: string}}, required: [image, monitors], type: object}, readOnly: {type: boolean}, scaleIO: {properties: {fsType: {type: string}, gateway: {type: string}, protectionDomain: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, sslEnabled: {type: boolean}, storageMode: {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}, optional: {type: boolean}, secretName: {type: string}}, type: object}, storageos: {properties: {fsType: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {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}}, type: object}, type: array}, clusterGossipInterval: {default: 200ms, type: string}, clusterPort: {default: 9094, type: integer}, clusterPushPullInterval: {default: 1m0s, type: string}, clusterSettleTimeout: {default: 1m0s, type: string}, configName: {type: string}, cpu: {default: 500m, type: string}, dataMountPath: {default: /var/lib, type: string}, enabled: {type: boolean}, memory: {default: 200Mi, type: string}, rawConfigMap: {type: string}, rawInternalRouting: {type: string}, replicas: {default: 1, format: int32, type: integer}, serviceType: {default: ClusterIP, type: string}, storage: {default: 500Mi, type: string}, webPort: {default: 9093, type: integer}}, type: object}, auth: {properties: {noauth: {properties: {clientID: {type: string}, clientSecret: {type: string}, debug: {type: boolean}, grafanaHostname: {type: string}, issuer: {type: string}, managementAPIEndpoint: {type: string}, openid: {properties: {discovery: {properties: {cacert: {type: string}, issuer: {type: string}, path: {default: /.well-known/openid-configuration, type: string}}, required: [issuer], type: object}, identifyingClaim: {default: sub, type: string}, wellKnownConfiguration: {properties: {authorization_endpoint: {type: string}, claims_supported: {items: {type: string}, type: array}, end_session_endpoint: {type: string}, id_token_signing_alg_values_supported: {items: {type: string}, type: array}, issuer: {type: string}, jwks_uri: {type: string}, request_uri_parameter_supported: {type: boolean}, response_modes_supported: {items: {type: string}, type: array}, response_types_supported: {items: {type: string}, type: array}, revocation_endpoint: {type: string}, scopes_supported: {items: {type: string}, type: array}, token_endpoint: {type: string}, token_endpoint_auth_methods_supported: {items: {type: string}, type: array}, userinfo_endpoint: {type: string}}, type: object}}, type: object}, port: {type: integer}, redirectURI: {type: string}}, type: object}, openid: {properties: {allowSignUp: {type: boolean}, allowedDomains: {items: {type: string}, type: array}, clientID: {type: string}, clientSecret: {type: string}, discovery: {properties: {cacert: {type: string}, issuer: {type: string}, path: {default: /.well-known/openid-configuration, type: string}}, required: [issuer], type: object}, emailAttributePath: {type: string}, identifyingClaim: {default: sub, type: string}, insecureSkipVerify: {type: boolean}, roleAttributePath: {type: string}, roleAttributeStrict: {type: boolean}, scopes: {items: {type: string}, type: array}, tlsClientCA: {type: string}, tlsClientCert: {type: string}, tlsClientKey: {type: string}, wellKnownConfiguration: {properties: {authorization_endpoint: {type: string}, claims_supported: {items: {type: string}, type: array}, end_session_endpoint: {type: string}, id_token_signing_alg_values_supported: {items: {type: string}, type: array}, issuer: {type: string}, jwks_uri: {type: string}, request_uri_parameter_supported: {type: boolean}, response_modes_supported: {items: {type: string}, type: array}, response_types_supported: {items: {type: string}, type: array}, revocation_endpoint: {type: string}, scopes_supported: {items: {type: string}, type: array}, token_endpoint: {type: string}, token_endpoint_auth_methods_supported: {items: {type: string}, type: array}, userinfo_endpoint: {type: string}}, type: object}}, type: object}, provider: {type: string}}, type: object}, extraEnvVars: {items: {properties: {name: {type: string}, value: {type: string}, valueFrom: {properties: {configMapKeyRef: {properties: {key: {type: string}, name: {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}, 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: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}}, type: object}}, required: [name], type: object}, type: array}, extraVolumeMounts: {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: {type: string}, kind: {type: string}, readOnly: {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}, path: {type: string}, readOnly: {type: boolean}, secretFile: {type: string}, secretRef: {properties: {name: {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: {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}, name: {type: string}, optional: {type: boolean}}, type: object, x-kubernetes-map-type: atomic}, csi: {properties: {driver: {type: string}, fsType: {type: string}, nodePublishSecretRef: {properties: {name: {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}}, 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}, 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: {claims: {items: {properties: {name: {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}, selector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, storageClassName: {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}, wwids: {items: {type: string}, type: array}}, type: object}, flexVolume: {properties: {driver: {type: string}, fsType: {type: string}, options: {additionalProperties: {type: string}, type: object}, readOnly: {type: boolean}, secretRef: {properties: {name: {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}, iscsi: {properties: {chapAuthDiscovery: {type: boolean}, chapAuthSession: {type: boolean}, fsType: {type: string}, initiatorName: {type: string}, iqn: {type: string}, iscsiInterface: {type: string}, lun: {format: int32, type: integer}, portals: {items: {type: string}, type: array}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, targetPortal: {type: string}}, required: [iqn, lun, targetPortal], type: object}, mountPath: {type: string}, 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: {configMap: {properties: {items: {items: {properties: {key: {type: string}, mode: {format: int32, type: integer}, path: {type: string}}, required: [key, path], type: object}, type: array}, name: {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}}, 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}, name: {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}}, 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: {type: string}, monitors: {items: {type: string}, type: array}, pool: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, user: {type: string}}, required: [image, monitors], type: object}, readOnly: {type: boolean}, scaleIO: {properties: {fsType: {type: string}, gateway: {type: string}, protectionDomain: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, sslEnabled: {type: boolean}, storageMode: {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}, optional: {type: boolean}, secretName: {type: string}}, type: object}, storageos: {properties: {fsType: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {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}}, type: object}, type: array}, hostname: {type: string}, image: {properties: {image: {type: string}, imagePullPolicy: {type: string}, imagePullSecrets: {items: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, type: array}}, type: object}, management: {properties: {grpcAdvertiseAddress: {type: string}, grpcListenAddress: {default: 'tcp://0.0.0.0:11090', type: string}, httpListenAddress: {default: '0.0.0.0:11080', type: string}, relayAdvertiseAddress: {type: string}, relayListenAddress: {type: string}, webAdvertiseAddress: {type: string}, webCerts: {properties: {caCert: {type: string}, caCertData: {format: byte, type: string}, servingCert: {type: string}, servingCertData: {format: byte, type: string}, servingKey: {type: string}, servingKeyData: {format: byte, type: string}}, type: object}, webListenAddress: {default: '0.0.0.0:12080', type: string}}, type: object}, natsCluster: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, nodeSelector: {additionalProperties: {type: string}, type: object}, patchEngine: {default: bsdiff, type: string}, pluginSearchDirs: {items: {type: string}, type: array}, profiling: {properties: {path: {default: /debug/pprof, type: string}}, type: object}, replicas: {format: int32, type: integer}, serviceAnnotations: {additionalProperties: {type: string}, type: object}, serviceType: {default: LoadBalancer, type: string}, storageType: {default: jetstream, type: string, x-kubernetes-validations: [{message: Value is immutable, rule: self == oldSelf}]}, tolerations: {items: {properties: {effect: {type: string}, key: {type: string}, operator: {type: string}, tolerationSeconds: {format: int64, type: integer}, value: {type: string}}, type: object}, type: array}}, required: [natsCluster], type: object}, status: {properties: {endpoints: {items: {properties: {hostname: {type: string}, ip: {type: string}, nodeName: {type: string}, targetRef: {properties: {apiVersion: {type: string}, fieldPath: {type: string}, kind: {type: string}, name: {type: string}, namespace: {type: string}, resourceVersion: {type: string}, uid: {type: string}}, type: object, x-kubernetes-map-type: atomic}}, required: [ip], type: object, x-kubernetes-map-type: atomic}, type: array}, image: {type: string}, imagePullPolicy: {type: string}, loadBalancer: {properties: {hostname: {type: string}, ip: {type: string}, ports: {items: {properties: {error: {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}, port: {format: int32, type: integer}, protocol: {default: TCP, type: string}}, required: [port, protocol], type: object}, type: array, x-kubernetes-list-type: atomic}}, type: object}, ready: {type: boolean}, serviceName: {type: string}, storageType: {type: string}}, type: object}}, type: object}}, served: true, storage: true, subresources: {status: {}}}]}} +{apiVersion: apiextensions.k8s.io/v1, kind: CustomResourceDefinition, metadata: {annotations: {controller-gen.kubebuilder.io/version: v0.13.0}, name: gateways.core.opni.io}, spec: {group: core.opni.io, names: {kind: Gateway, listKind: GatewayList, plural: gateways, singular: gateway}, scope: Namespaced, versions: [{name: v1, schema: {openAPIV3Schema: {properties: {apiVersion: {type: string}, kind: {type: string}, metadata: {type: object}, spec: {properties: {affinity: {properties: {nodeAffinity: {properties: {preferredDuringSchedulingIgnoredDuringExecution: {items: {properties: {preference: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchFields: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}}, type: object, x-kubernetes-map-type: atomic}, weight: {format: int32, type: integer}}, required: [preference, weight], type: object}, type: array}, requiredDuringSchedulingIgnoredDuringExecution: {properties: {nodeSelectorTerms: {items: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchFields: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}}, type: object, x-kubernetes-map-type: atomic}, type: array}}, 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}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, weight: {format: int32, type: integer}}, required: [podAffinityTerm, weight], type: object}, type: array}, requiredDuringSchedulingIgnoredDuringExecution: {items: {properties: {labelSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, type: array}}, 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}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, weight: {format: int32, type: integer}}, required: [podAffinityTerm, weight], type: object}, type: array}, requiredDuringSchedulingIgnoredDuringExecution: {items: {properties: {labelSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, namespaces: {items: {type: string}, type: array}, topologyKey: {type: string}}, required: [topologyKey], type: object}, type: array}}, type: object}}, type: object}, agentImageTagOverride: {type: string}, config: {type: object, x-kubernetes-preserve-unknown-fields: true}, extraEnvVars: {items: {properties: {name: {type: string}, value: {type: string}, valueFrom: {properties: {configMapKeyRef: {properties: {key: {type: string}, name: {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}, 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: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}}, type: object}}, required: [name], type: object}, type: array}, extraVolumeMounts: {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: {type: string}, kind: {type: string}, readOnly: {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}, path: {type: string}, readOnly: {type: boolean}, secretFile: {type: string}, secretRef: {properties: {name: {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: {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}, name: {type: string}, optional: {type: boolean}}, type: object, x-kubernetes-map-type: atomic}, csi: {properties: {driver: {type: string}, fsType: {type: string}, nodePublishSecretRef: {properties: {name: {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}}, 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}, 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: {claims: {items: {properties: {name: {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}, selector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, storageClassName: {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}, wwids: {items: {type: string}, type: array}}, type: object}, flexVolume: {properties: {driver: {type: string}, fsType: {type: string}, options: {additionalProperties: {type: string}, type: object}, readOnly: {type: boolean}, secretRef: {properties: {name: {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}, iscsi: {properties: {chapAuthDiscovery: {type: boolean}, chapAuthSession: {type: boolean}, fsType: {type: string}, initiatorName: {type: string}, iqn: {type: string}, iscsiInterface: {type: string}, lun: {format: int32, type: integer}, portals: {items: {type: string}, type: array}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, targetPortal: {type: string}}, required: [iqn, lun, targetPortal], type: object}, mountPath: {type: string}, 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: {configMap: {properties: {items: {items: {properties: {key: {type: string}, mode: {format: int32, type: integer}, path: {type: string}}, required: [key, path], type: object}, type: array}, name: {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}}, 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}, name: {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}}, 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: {type: string}, monitors: {items: {type: string}, type: array}, pool: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, user: {type: string}}, required: [image, monitors], type: object}, readOnly: {type: boolean}, scaleIO: {properties: {fsType: {type: string}, gateway: {type: string}, protectionDomain: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, sslEnabled: {type: boolean}, storageMode: {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}, optional: {type: boolean}, secretName: {type: string}}, type: object}, storageos: {properties: {fsType: {type: string}, readOnly: {type: boolean}, secretRef: {properties: {name: {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}}, type: object}, type: array}, image: {properties: {image: {type: string}, imagePullPolicy: {type: string}, imagePullSecrets: {items: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, type: array}}, type: object}, natsCluster: {properties: {name: {type: string}}, type: object, x-kubernetes-map-type: atomic}, nodeSelector: {additionalProperties: {type: string}, type: object}, replicas: {format: int32, type: integer}, serviceAnnotations: {additionalProperties: {type: string}, type: object}, serviceType: {type: string}, tolerations: {items: {properties: {effect: {type: string}, key: {type: string}, operator: {type: string}, tolerationSeconds: {format: int64, type: integer}, value: {type: string}}, type: object}, type: array}}, required: [natsCluster], type: object}, status: {properties: {endpoints: {items: {properties: {hostname: {type: string}, ip: {type: string}, nodeName: {type: string}, targetRef: {properties: {apiVersion: {type: string}, fieldPath: {type: string}, kind: {type: string}, name: {type: string}, namespace: {type: string}, resourceVersion: {type: string}, uid: {type: string}}, type: object, x-kubernetes-map-type: atomic}}, required: [ip], type: object, x-kubernetes-map-type: atomic}, type: array}, image: {type: string}, imagePullPolicy: {type: string}, loadBalancer: {properties: {hostname: {type: string}, ip: {type: string}, ports: {items: {properties: {error: {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}, port: {format: int32, type: integer}, protocol: {default: TCP, type: string}}, required: [port, protocol], type: object}, type: array, x-kubernetes-list-type: atomic}}, type: object}, ready: {type: boolean}, serviceName: {type: string}}, type: object}}, type: object}}, served: true, storage: true, subresources: {status: {}}}]}} --- {apiVersion: apiextensions.k8s.io/v1, kind: CustomResourceDefinition, metadata: {annotations: {controller-gen.kubebuilder.io/version: v0.12.0}, name: grafanadashboards.grafana.opni.io}, spec: {group: grafana.opni.io, names: {kind: GrafanaDashboard, listKind: GrafanaDashboardList, plural: grafanadashboards, singular: grafanadashboard}, scope: Namespaced, versions: [{additionalPrinterColumns: [{jsonPath: .status.NoMatchingInstances, name: No matching instances, type: boolean}, {format: date-time, jsonPath: .status.lastResync, name: Last resync, type: date}, {jsonPath: .metadata.creationTimestamp, name: Age, type: date}], name: v1beta1, schema: {openAPIV3Schema: {properties: {apiVersion: {type: string}, kind: {type: string}, metadata: {type: object}, spec: {properties: {allowCrossNamespaceImport: {type: boolean}, configMapRef: {properties: {key: {type: string}, name: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}, contentCacheDuration: {type: string}, datasources: {items: {properties: {datasourceName: {type: string}, inputName: {type: string}}, required: [datasourceName, inputName], type: object}, type: array}, envFrom: {items: {properties: {configMapKeyRef: {properties: {key: {type: string}, name: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}, secretKeyRef: {properties: {key: {type: string}, name: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}}, type: object}, type: array}, envs: {items: {properties: {name: {type: string}, value: {type: string}, valueFrom: {properties: {configMapKeyRef: {properties: {key: {type: string}, name: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}, secretKeyRef: {properties: {key: {type: string}, name: {type: string}, optional: {type: boolean}}, required: [key], type: object, x-kubernetes-map-type: atomic}}, type: object}}, required: [name], type: object}, type: array}, folder: {type: string}, grafanaCom: {properties: {id: {type: integer}, revision: {type: integer}}, required: [id], type: object}, gzipJson: {format: byte, type: string}, instanceSelector: {properties: {matchExpressions: {items: {properties: {key: {type: string}, operator: {type: string}, values: {items: {type: string}, type: array}}, required: [key, operator], type: object}, type: array}, matchLabels: {additionalProperties: {type: string}, type: object}}, type: object, x-kubernetes-map-type: atomic}, json: {type: string}, jsonnet: {type: string}, jsonnetLib: {properties: {fileName: {type: string}, gzipJsonnetProject: {format: byte, type: string}, jPath: {items: {type: string}, type: array}}, required: [fileName, gzipJsonnetProject], type: object}, plugins: {items: {properties: {name: {type: string}, version: {type: string}}, required: [name, version], type: object}, type: array}, resyncPeriod: {type: string}, url: {type: string}}, required: [instanceSelector], type: object}, status: {properties: {NoMatchingInstances: {type: boolean}, contentCache: {format: byte, type: string}, contentTimestamp: {format: date-time, type: string}, contentUrl: {type: string}, hash: {type: string}, lastResync: {format: date-time, type: string}, uid: {type: string}}, type: object}}, type: object}}, served: true, storage: true, subresources: {status: {}}}]}} --- diff --git a/pkg/agent/v1/agent.go b/pkg/agent/v1/agent.go deleted file mode 100644 index b94afe22b4..0000000000 --- a/pkg/agent/v1/agent.go +++ /dev/null @@ -1,414 +0,0 @@ -package agent - -import ( - "context" - "errors" - "fmt" - "log/slog" - "net" - "net/http" - "sort" - "sync" - "time" - - "github.com/cortexproject/cortex/pkg/cortexpb" - "github.com/cortexproject/cortex/pkg/util/push" - "github.com/gin-contrib/pprof" - "github.com/gin-gonic/gin" - gsync "github.com/kralicky/gpkg/sync" - controlv1 "github.com/rancher/opni/pkg/apis/control/v1" - corev1 "github.com/rancher/opni/pkg/apis/core/v1" - "github.com/rancher/opni/pkg/bootstrap" - "github.com/rancher/opni/pkg/clients" - "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/health/annotations" - "github.com/rancher/opni/pkg/ident" - "github.com/rancher/opni/pkg/keyring" - "github.com/rancher/opni/pkg/logger" - "github.com/rancher/opni/pkg/storage" - "github.com/rancher/opni/pkg/storage/crds" - "github.com/rancher/opni/pkg/storage/etcd" - "github.com/rancher/opni/pkg/trust" - "github.com/rancher/opni/pkg/util" - "github.com/rancher/opni/plugins/metrics/apis/remotewrite" - "google.golang.org/grpc/codes" - "google.golang.org/protobuf/types/known/emptypb" - "google.golang.org/protobuf/types/known/timestamppb" -) - -type conditionStatus int32 - -const ( - statusPending conditionStatus = 0 - statusFailure conditionStatus = 1 -) - -func (s conditionStatus) String() string { - switch s { - case statusPending: - return "Pending" - case statusFailure: - return "Failure" - } - return "" -} - -const ( - condRemoteWrite = "Remote Write" - condRuleSync = "Rule Sync" -) - -type Agent struct { - controlv1.UnimplementedHealthServer - AgentOptions - config v1beta1.AgentConfigSpec - router *gin.Engine - logger *slog.Logger - - tenantID string - identityProvider ident.Provider - keyringStore storage.KeyringStore - gatewayClient clients.GatewayClient - trust trust.Strategy - - remoteWriteClient clients.Locker[remotewrite.RemoteWriteClient] - - conditions gsync.Map[string, conditionStatus] -} - -type AgentOptions struct { - bootstrapper bootstrap.Bootstrapper -} - -type AgentOption func(*AgentOptions) - -func (o *AgentOptions) apply(opts ...AgentOption) { - for _, op := range opts { - op(o) - } -} - -func WithBootstrapper(bootstrapper bootstrap.Bootstrapper) AgentOption { - return func(o *AgentOptions) { - o.bootstrapper = bootstrapper - } -} - -func New(ctx context.Context, conf *v1beta1.AgentConfig, opts ...AgentOption) (*Agent, error) { - options := AgentOptions{} - options.apply(opts...) - level := logger.DefaultLogLevel.Level() - if conf.Spec.LogLevel != "" { - level = logger.ParseLevel(conf.Spec.LogLevel) - } - lg := logger.New(logger.WithLogLevel(level)).WithGroup("agent") - lg.Debug(fmt.Sprintf("using log level: %s", level.String())) - - router := gin.New() - router.Use(logger.GinLogger(lg), gin.Recovery()) - pprof.Register(router) - - router.GET("/healthz", func(ctx *gin.Context) { - ctx.Status(http.StatusOK) - }) - - initCtx, initCancel := context.WithTimeout(ctx, 10*time.Second) - defer initCancel() - - ipBuilder, err := ident.GetProviderBuilder(conf.Spec.IdentityProvider) - if err != nil { - return nil, fmt.Errorf("configuration error: %w", err) - } - ip := ipBuilder() - id, err := ip.UniqueIdentifier(initCtx) - if err != nil { - return nil, fmt.Errorf("error getting unique identifier: %w", err) - } - agent := &Agent{ - AgentOptions: options, - config: conf.Spec, - router: router, - logger: lg, - tenantID: id, - identityProvider: ip, - } - agent.initConditions() - - var keyringStoreBroker storage.KeyringStoreBroker - switch agent.config.Storage.Type { - case v1beta1.StorageTypeEtcd: - keyringStoreBroker, err = etcd.NewEtcdStore(ctx, agent.config.Storage.Etcd) - if err != nil { - return nil, fmt.Errorf("error creating etcd store: %w", err) - } - case v1beta1.StorageTypeCRDs: - keyringStoreBroker = crds.NewCRDStore() - default: - return nil, fmt.Errorf("unknown storage type: %s", agent.config.Storage.Type) - } - agent.keyringStore = keyringStoreBroker.KeyringStore("agent", &corev1.Reference{ - Id: id, - }) - - var kr keyring.Keyring - if options.bootstrapper != nil { - if kr, err = agent.bootstrap(initCtx); err != nil { - return nil, fmt.Errorf("error during bootstrap: %w", err) - } - } else { - if kr, err = agent.loadKeyring(initCtx); err != nil { - return nil, fmt.Errorf("error loading keyring: %w", err) - } - } - - if conf.Spec.GatewayAddress == "" { - return nil, errors.New("gateway address not set") - } - - agent.trust, err = agent.buildTrustStrategy(kr) - if err != nil { - return nil, fmt.Errorf("error building trust strategy: %w", err) - } - - agent.gatewayClient, err = clients.NewGatewayClient(ctx, - conf.Spec.GatewayAddress, ip, kr, agent.trust) - if err != nil { - return nil, fmt.Errorf("error configuring gateway client: %w", err) - } - controlv1.RegisterHealthServer(agent.gatewayClient, agent) - - var startRuleStreamOnce sync.Once - // var startServiceDiscoveryStreamOnce sync.Once - go func() { - isRetry := false - for ctx.Err() == nil { - if isRetry { - time.Sleep(1 * time.Second) - lg.Info("attempting to reconnect...") - } else { - lg.Info("connecting to gateway...") - } - cc, errF := agent.gatewayClient.Connect(ctx) - if !errF.IsSet() { - if isRetry { - lg.Info("gateway reconnected") - } else { - lg.Info("gateway connected") - } - agent.remoteWriteClient = clients.NewLocker(cc, remotewrite.NewRemoteWriteClient) - - startRuleStreamOnce.Do(func() { - lg.Debug("starting rule stream") - go func() { - if err := agent.streamRulesToGateway(ctx); err != nil { - lg.With( - logger.Err(err), - ).Error("error streaming rules to gateway") - } - }() - }) - - // TODO : Implement - // startServiceDiscoveryStreamOnce.Do(func() { - // go agent.streamServiceDiscoveryToGateway(ctx) - // }) - - lg.With( - logger.Err(errF.Get()), // this will block until an error is received - ).Warn("disconnected from gateway") - agent.remoteWriteClient.Close() - } else { - lg.With( - logger.Err(errF.Get()), - ).Warn("error connecting to gateway") - } - if util.StatusCode(errF.Get()) == codes.FailedPrecondition { - // Non-retriable error, e.g. the cluster was deleted, or the metrics - // capability was uninstalled. - lg.Warn("encountered non-retriable error, exiting") - break - } - isRetry = true - } - lg.With( - logger.Err(ctx.Err()), - ).Warn("shutting down gateway client") - }() - - router.POST("/api/agent/push", gin.WrapH(push.Handler(100<<20, nil, agent.pushFunc))) - - return agent, nil -} - -func (a *Agent) pushFunc(ctx context.Context, writeReq *cortexpb.WriteRequest) (writeResp *cortexpb.WriteResponse, writeErr error) { - ok := a.remoteWriteClient.Use(func(rwc remotewrite.RemoteWriteClient) { - if rwc == nil { - a.setCondition(condRemoteWrite, statusPending, "gateway not connected") - writeErr = util.StatusError(codes.Unavailable) - return - } - - writeResp, writeErr = rwc.Push(ctx, writeReq) - }) - if !ok { - a.setCondition(condRemoteWrite, statusPending, "gateway not connected") - writeErr = util.StatusError(codes.Unavailable) - } - return -} - -func (a *Agent) ListenAndServe(ctx context.Context) error { - listener, err := net.Listen("tcp4", a.config.ListenAddress) - if err != nil { - return err - } - return util.ServeHandler(ctx, a.router.Handler(), listener) -} - -func (a *Agent) bootstrap(ctx context.Context) (keyring.Keyring, error) { - lg := a.logger - - // Load the stored keyring, or bootstrap a new one if it doesn't exist - if _, err := a.keyringStore.Get(ctx); storage.IsNotFound(err) { - lg.Info("performing initial bootstrap") - newKeyring, err := a.bootstrapper.Bootstrap(ctx, a.identityProvider) - if err != nil { - return nil, err - } - lg.Info("bootstrap completed successfully") - for { - // Don't let this fail easily, otherwise we will lose the keyring forever. - // Keep retrying until it succeeds. - err = a.keyringStore.Put(ctx, newKeyring) - if err != nil { - lg.With(logger.Err(err)).Error("failed to persist keyring (retry in 1 second)") - time.Sleep(1 * time.Second) - } else { - break - } - } - } else if err != nil { - return nil, fmt.Errorf("error loading keyring: %w", err) - } else { - lg.Warn("this agent has already been bootstrapped but may have been interrupted - will use existing keyring") - } - - return a.loadKeyring(ctx) -} - -func (a *Agent) loadKeyring(ctx context.Context) (keyring.Keyring, error) { - lg := a.logger - lg.Info("loading keyring") - kr, err := a.keyringStore.Get(ctx) - if err != nil { - return nil, fmt.Errorf("error loading keyring: %w", err) - } - lg.Info("keyring loaded successfully") - return kr, nil -} - -func (a *Agent) GetHealth(context.Context, *emptypb.Empty) (*corev1.Health, error) { - conditions := []string{} - a.conditions.Range(func(key string, value conditionStatus) bool { - conditions = append(conditions, fmt.Sprintf("%s %s", key, value)) - return true - }) - - sort.Strings(conditions) - - return &corev1.Health{ - Timestamp: timestamppb.Now(), - Ready: len(conditions) == 0, - Conditions: conditions, - Annotations: map[string]string{ - annotations.AgentVersion: annotations.Version1, - }, - }, nil -} - -func (a *Agent) initConditions() { - a.conditions.Store(condRemoteWrite, statusPending) - a.conditions.Store(condRuleSync, statusPending) -} - -func (a *Agent) buildTrustStrategy(kr keyring.Keyring) (trust.Strategy, error) { - var trustStrategy trust.Strategy - var err error - switch a.config.TrustStrategy { - case v1beta1.TrustStrategyPKP: - conf := trust.StrategyConfig{ - PKP: &trust.PKPConfig{ - Pins: trust.NewKeyringPinSource(kr), - }, - } - trustStrategy, err = conf.Build() - if err != nil { - return nil, fmt.Errorf("error configuring pkp trust from keyring: %w", err) - } - case v1beta1.TrustStrategyCACerts: - conf := trust.StrategyConfig{ - CACerts: &trust.CACertsConfig{ - CACerts: trust.NewKeyringCACertsSource(kr), - }, - } - trustStrategy, err = conf.Build() - if err != nil { - return nil, fmt.Errorf("error configuring ca certs trust from keyring: %w", err) - } - case v1beta1.TrustStrategyInsecure: - conf := trust.StrategyConfig{ - Insecure: &trust.InsecureConfig{}, - } - trustStrategy, err = conf.Build() - if err != nil { - return nil, fmt.Errorf("error configuring insecure trust: %w", err) - } - default: - return nil, fmt.Errorf("unknown trust strategy: %s", a.config.TrustStrategy) - } - - return trustStrategy, nil -} - -func (a *Agent) GetKeyring(ctx context.Context) (keyring.Keyring, error) { - return a.keyringStore.Get(ctx) -} - -func (a *Agent) GetTrustStrategy() trust.Strategy { - return a.trust -} - -func (a *Agent) setCondition(key string, value conditionStatus, reason string) { - lg := a.logger.With( - "condition", key, - "status", value, - "reason", reason, - ) - if v, ok := a.conditions.Load(key); ok { - if v != value { - lg.Info("condition changed") - } - } else { - lg.Info("condition set") - } - a.conditions.Store(key, value) -} - -func (a *Agent) clearCondition(key string, reason ...string) { - lg := a.logger.With( - "condition", key, - ) - if len(reason) > 0 { - lg = lg.With("reason", reason[0]) - } - if v, ok := a.conditions.Load(key); ok { - lg.With( - "previous", v, - ).Info("condition cleared") - } - a.conditions.Delete(key) -} - -func (a *Agent) ListenAddress() string { - return a.config.ListenAddress -} diff --git a/pkg/agent/v1/rules.go b/pkg/agent/v1/rules.go deleted file mode 100644 index bcbf3d304e..0000000000 --- a/pkg/agent/v1/rules.go +++ /dev/null @@ -1,170 +0,0 @@ -package agent - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/rancher/opni/apis" - "github.com/rancher/opni/pkg/logger" - "github.com/rancher/opni/pkg/rules" - "github.com/rancher/opni/pkg/rules/prometheusrule" - "github.com/rancher/opni/pkg/util/k8sutil" - "github.com/rancher/opni/pkg/util/notifier" - "github.com/rancher/opni/plugins/metrics/apis/remotewrite" - "gopkg.in/yaml.v3" -) - -func (a *Agent) configureRuleFinder() (notifier.Finder[rules.RuleGroup], error) { - if a.config.Rules != nil { - if pr := a.config.Rules.Discovery.PrometheusRules; pr != nil { - client, err := k8sutil.NewK8sClient(k8sutil.ClientOptions{ - Kubeconfig: pr.Kubeconfig, - Scheme: apis.NewScheme(), - }) - if err != nil { - return nil, fmt.Errorf("failed to create k8s client: %w", err) - } - finder := prometheusrule.NewPrometheusRuleFinder(client, - prometheusrule.WithLogger(a.logger), - prometheusrule.WithNamespaces(pr.SearchNamespaces...), - ) - return finder, nil - } else if a.config.Rules.Discovery.Filesystem != nil { - return rules.NewFilesystemRuleFinder(a.config.Rules.Discovery.Filesystem), nil - } - } - return nil, fmt.Errorf("missing configuration") -} - -func (a *Agent) streamRuleGroupUpdates(ctx context.Context) (<-chan [][]byte, error) { - a.logger.Debug("configuring rule discovery") - finder, err := a.configureRuleFinder() - if err != nil { - return nil, fmt.Errorf("failed to configure rule discovery: %w", err) - } - a.logger.Debug("rule discovery configured") - searchInterval := time.Minute * 15 - if interval := a.config.Rules.Discovery.GetInterval(); interval != "" { - duration, err := time.ParseDuration(interval) - if err != nil { - return nil, fmt.Errorf("failed to parse discovery interval: %w", err) - } - searchInterval = duration - } - notifier := notifier.NewPeriodicUpdateNotifier(ctx, finder, searchInterval) - a.logger.With( - "interval", searchInterval.String(), - ).Debug("rule discovery notifier configured") - - notifierC := notifier.NotifyC(ctx) - a.logger.Debug("starting rule group update notifier") - groupYamlDocs := make(chan [][]byte, cap(notifierC)) - go func() { - defer close(groupYamlDocs) - for { - ruleGroups, ok := <-notifierC - if !ok { - a.logger.Debug("rule discovery channel closed") - return - } - a.logger.Debug("received updated rule groups from discovery") - go func() { - groupYamlDocs <- a.marshalRuleGroups(ruleGroups) - }() - } - }() - return groupYamlDocs, nil -} - -func (a *Agent) marshalRuleGroups(ruleGroups []rules.RuleGroup) [][]byte { - yamlDocs := make([][]byte, 0, len(ruleGroups)) - for _, ruleGroup := range ruleGroups { - doc, err := yaml.Marshal(ruleGroup) - if err != nil { - a.logger.With( - logger.Err(err), - "group", ruleGroup.Name, - ).Error("failed to marshal rule group") - continue - } - yamlDocs = append(yamlDocs, doc) - } - return yamlDocs -} - -func (a *Agent) streamRulesToGateway(actx context.Context) error { - lg := a.logger - updateC, err := a.streamRuleGroupUpdates(actx) - if err != nil { - return err - } - pending := make(chan [][]byte, 1) - defer close(pending) - ctx, ca := context.WithCancel(actx) - defer ca() - go func() { - for { - var docs [][]byte - select { - case <-ctx.Done(): - lg.Debug("rule discovery stream closed") - return - case docs = <-pending: - } - RETRY: - lg.Debug("sending alert rules to gateway") - for { - for _, doc := range docs { - reqCtx, ca := context.WithTimeout(ctx, time.Second*2) - var err error - ok := a.remoteWriteClient.Use(func(rwc remotewrite.RemoteWriteClient) { - _, err = rwc.SyncRules(reqCtx, &remotewrite.Payload{ - Headers: map[string]string{ - "Content-Type": "application/yaml", - }, - Contents: doc, - }) - }) - ca() - if !ok { - err = errors.New("not connected") - } - if err != nil { - a.setCondition(condRuleSync, statusFailure, err.Error()) - // retry, unless another update is received from the channel - lg.With( - logger.Err(err), - ).Error("failed to send alert rules to gateway (retry in 5 seconds)") - select { - case docs = <-pending: - lg.Debug("updated rules were received during backoff, retrying immediately") - goto RETRY - case <-time.After(5 * time.Second): - goto RETRY - case <-ctx.Done(): - return - } - } - } - a.clearCondition(condRuleSync, fmt.Sprintf("successfully sent %d alert rules to gateway", len(docs))) - break - } - } - }() - for { - select { - case <-ctx.Done(): - lg.Debug("rule discovery stream closed") - return nil - case yamlDocs, ok := <-updateC: - if !ok { - lg.Debug("rule discovery stream closed") - return nil - } - lg.Debug("waiting for updated rule documents...") - pending <- yamlDocs - } - } -} diff --git a/pkg/agent/v2/agent.go b/pkg/agent/v2/agent.go index 47997814aa..d15c07b89c 100644 --- a/pkg/agent/v2/agent.go +++ b/pkg/agent/v2/agent.go @@ -17,6 +17,7 @@ import ( corev1 "github.com/rancher/opni/pkg/apis/core/v1" "github.com/rancher/opni/pkg/bootstrap" "github.com/rancher/opni/pkg/clients" + configv1 "github.com/rancher/opni/pkg/config/v1" "github.com/rancher/opni/pkg/config/v1beta1" "github.com/rancher/opni/pkg/health" "github.com/rancher/opni/pkg/health/annotations" @@ -170,7 +171,7 @@ func New(ctx context.Context, conf *v1beta1.AgentConfig, opts ...AgentOption) (* pl.Hook(hooks.OnLoadM(func(p types.HTTPAPIExtensionPlugin, md meta.PluginMeta) { ctx, ca := context.WithTimeout(ctx, 10*time.Second) defer ca() - cfg, err := p.Configure(ctx, apiextensions.NewInsecureCertConfig()) + cfg, err := p.Configure(ctx, &configv1.CertsSpec{}) if err != nil { lg.With( "plugin", md.Module, @@ -181,8 +182,17 @@ func New(ctx context.Context, conf *v1beta1.AgentConfig, opts ...AgentOption) (* setupPluginRoutes(lg, routerMutex, router, cfg, md, []string{"/healthz", "/metrics"}) })) + var driver *configv1.PluginUpgradesSpec_Driver + switch conf.Spec.PluginUpgrade.Type { + case v1beta1.PluginUpgradeBinary: + driver = configv1.PluginUpgradesSpec_Binary.Enum() + case v1beta1.PluginUpgradeNoop: + driver = configv1.PluginUpgradesSpec_Noop.Enum() + } pluginUpgrader, err := machinery.ConfigurePluginUpgrader( - conf.Spec.PluginUpgrade, + &configv1.PluginUpgradesSpec{ + Driver: driver, + }, conf.Spec.PluginDir, lg.WithGroup("plugin-upgrader"), ) @@ -190,8 +200,17 @@ func New(ctx context.Context, conf *v1beta1.AgentConfig, opts ...AgentOption) (* return nil, fmt.Errorf("failed to configure plugin syncer: %w", err) } + var agentUpgradeDriver *configv1.AgentUpgradesSpec_Driver + switch conf.Spec.Upgrade.Type { + case v1beta1.AgentUpgradeKubernetes: + agentUpgradeDriver = configv1.AgentUpgradesSpec_Kubernetes.Enum() + case v1beta1.AgentUpgradeNoop: + agentUpgradeDriver = configv1.AgentUpgradesSpec_Noop.Enum() + } upgrader, err := machinery.ConfigureAgentUpgrader( - &conf.Spec.Upgrade, + &configv1.AgentUpgradesSpec{ + Driver: agentUpgradeDriver, + }, lg.WithGroup("agent-upgrader"), ) if err != nil { @@ -443,7 +462,8 @@ func (a *Agent) ListenAndServe(ctx context.Context) error { return a.runGatewayClient(ctx) }) - return util.WaitAll(ctx, ca, e1, e2) + util.WaitAll(ctx, ca, e1, e2) + return context.Cause(ctx) } func (a *Agent) ListenAddress() string { diff --git a/pkg/apis/management/v1/management.proto b/pkg/apis/management/v1/management.proto index e7a0c5d1f3..e555341a99 100644 --- a/pkg/apis/management/v1/management.proto +++ b/pkg/apis/management/v1/management.proto @@ -14,7 +14,7 @@ import "google/protobuf/empty.proto"; option go_package = "github.com/rancher/opni/pkg/apis/management/v1"; option (cli.generator) = { - generate: true + generate: true }; service LocalPassword { @@ -118,13 +118,13 @@ service Management { granularity: EditMessage }; option (google.api.http) = { - put: "/rbac/backend/{capability.name}/roles" + put: "/rbac/backend/{capability.name}/roles" body: "*" }; } rpc DeleteBackendRole(core.BackendRoleRequest) returns (google.protobuf.Empty) { option (cli.command) = { - use: "backend-roles delete" + use: "backend-roles delete" }; option (google.api.http) = { delete: "/rbac/backend/{capability.name}/roles/{roleRef.id}" @@ -132,7 +132,7 @@ service Management { } rpc GetBackendRole(core.BackendRoleRequest) returns (core.Role) { option (cli.command) = { - use: "backend-roles get" + use: "backend-roles get" }; option (google.api.http) = { get: "/rbac/backend/{capability.name}/roles/{roleRef.id}" @@ -140,7 +140,7 @@ service Management { } rpc ListBackendRoles(core.CapabilityType) returns (core.RoleList) { option (cli.command) = { - use: "backend-roles list" + use: "backend-roles list" }; option (google.api.http) = { get: "/rbac/backend/{name}/roles" diff --git a/pkg/config/adapt/conversion.go b/pkg/config/adapt/conversion.go index 6fc833f802..c805489d17 100644 --- a/pkg/config/adapt/conversion.go +++ b/pkg/config/adapt/conversion.go @@ -1,6 +1,8 @@ package adapt import ( + "strings" + configv1 "github.com/rancher/opni/pkg/config/v1" "github.com/rancher/opni/pkg/config/v1beta1" "github.com/samber/lo" @@ -14,14 +16,14 @@ func V1GatewayConfigOf[T *v1beta1.GatewayConfig | *configv1.GatewayConfigSpec](i return &configv1.GatewayConfigSpec{ Server: &configv1.ServerSpec{ HttpListenAddress: &in.Spec.HTTPListenAddress, - GrpcListenAddress: &in.Spec.GRPCListenAddress, + GrpcListenAddress: lo.ToPtr(strings.TrimPrefix(in.Spec.GRPCAdvertiseAddress, "tcp://")), }, Management: &configv1.ManagementServerSpec{ - HttpListenAddress: lo.ToPtr(in.Spec.Management.GetHTTPListenAddress()), - GrpcListenAddress: lo.ToPtr(in.Spec.Management.GetGRPCListenAddress()), + HttpListenAddress: &in.Spec.Management.HTTPListenAddress, + GrpcListenAddress: lo.ToPtr(strings.TrimPrefix(in.Spec.Management.GetGRPCListenAddress(), "tcp://")), }, Relay: &configv1.RelayServerSpec{ - GrpcListenAddress: &in.Spec.Management.RelayListenAddress, + GrpcListenAddress: lo.ToPtr(strings.TrimPrefix(in.Spec.Management.RelayListenAddress, "tcp://")), AdvertiseAddress: &in.Spec.Management.RelayAdvertiseAddress, }, Health: &configv1.HealthServerSpec{ diff --git a/pkg/config/v1/config_server.pb.go b/pkg/config/v1/config_server.pb.go new file mode 100644 index 0000000000..6a50c01250 --- /dev/null +++ b/pkg/config/v1/config_server.pb.go @@ -0,0 +1,852 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v1.0.0 +// source: github.com/rancher/opni/pkg/config/v1/config_server.proto + +package configv1 + +import ( + validate "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "github.com/rancher/opni/internal/codegen/cli" + v1 "github.com/rancher/opni/pkg/apis/core/v1" + driverutil "github.com/rancher/opni/pkg/plugins/driverutil" + _ "github.com/rancher/opni/pkg/validation" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + 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 ReactiveWatchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If true, uses [reactive.Bind] to watch all paths at once. If false, + // each path recieves updates separately. + Bind bool `protobuf:"varint,1,opt,name=bind,proto3" json:"bind,omitempty"` + // List of paths to watch. + Paths []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` +} + +func (x *ReactiveWatchRequest) Reset() { + *x = ReactiveWatchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReactiveWatchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReactiveWatchRequest) ProtoMessage() {} + +func (x *ReactiveWatchRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_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 ReactiveWatchRequest.ProtoReflect.Descriptor instead. +func (*ReactiveWatchRequest) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{0} +} + +func (x *ReactiveWatchRequest) GetBind() bool { + if x != nil { + return x.Bind + } + return false +} + +func (x *ReactiveWatchRequest) GetPaths() []string { + if x != nil { + return x.Paths + } + return nil +} + +type ReactiveEvents struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // In bind mode, this will contain one item for each path in the request, + // in order. Otherwise, this will only contain a single item. + Items []*ReactiveEvent `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` +} + +func (x *ReactiveEvents) Reset() { + *x = ReactiveEvents{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReactiveEvents) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReactiveEvents) ProtoMessage() {} + +func (x *ReactiveEvents) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_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 ReactiveEvents.ProtoReflect.Descriptor instead. +func (*ReactiveEvents) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{1} +} + +func (x *ReactiveEvents) GetItems() []*ReactiveEvent { + if x != nil { + return x.Items + } + return nil +} + +type ReactiveEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The path that triggered this event, as an index into the request path list. + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Value *v1.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *ReactiveEvent) Reset() { + *x = ReactiveEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReactiveEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReactiveEvent) ProtoMessage() {} + +func (x *ReactiveEvent) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_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 ReactiveEvent.ProtoReflect.Descriptor instead. +func (*ReactiveEvent) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{2} +} + +func (x *ReactiveEvent) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *ReactiveEvent) GetValue() *v1.Value { + if x != nil { + return x.Value + } + return nil +} + +type SetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Spec *GatewayConfigSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (x *SetRequest) Reset() { + *x = SetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetRequest) ProtoMessage() {} + +func (x *SetRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_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 SetRequest.ProtoReflect.Descriptor instead. +func (*SetRequest) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{3} +} + +func (x *SetRequest) GetSpec() *GatewayConfigSpec { + if x != nil { + return x.Spec + } + return nil +} + +type ResetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision *v1.Revision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + Mask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=mask,proto3" json:"mask,omitempty"` + Patch *GatewayConfigSpec `protobuf:"bytes,3,opt,name=patch,proto3" json:"patch,omitempty"` +} + +func (x *ResetRequest) Reset() { + *x = ResetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[4] + 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_github_com_rancher_opni_pkg_config_v1_config_server_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 ResetRequest.ProtoReflect.Descriptor instead. +func (*ResetRequest) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{4} +} + +func (x *ResetRequest) GetRevision() *v1.Revision { + if x != nil { + return x.Revision + } + return nil +} + +func (x *ResetRequest) GetMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.Mask + } + return nil +} + +func (x *ResetRequest) GetPatch() *GatewayConfigSpec { + if x != nil { + return x.Patch + } + return nil +} + +type DryRunRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target driverutil.Target `protobuf:"varint,1,opt,name=target,proto3,enum=driverutil.Target" json:"target,omitempty"` + Action driverutil.Action `protobuf:"varint,2,opt,name=action,proto3,enum=driverutil.Action" json:"action,omitempty"` + Spec *GatewayConfigSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` // Set + Revision *v1.Revision `protobuf:"bytes,4,opt,name=revision,proto3" json:"revision,omitempty"` // Reset + Patch *GatewayConfigSpec `protobuf:"bytes,5,opt,name=patch,proto3" json:"patch,omitempty"` // Reset + Mask *fieldmaskpb.FieldMask `protobuf:"bytes,6,opt,name=mask,proto3" json:"mask,omitempty"` // Reset +} + +func (x *DryRunRequest) Reset() { + *x = DryRunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DryRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DryRunRequest) ProtoMessage() {} + +func (x *DryRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_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 DryRunRequest.ProtoReflect.Descriptor instead. +func (*DryRunRequest) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{5} +} + +func (x *DryRunRequest) GetTarget() driverutil.Target { + if x != nil { + return x.Target + } + return driverutil.Target(0) +} + +func (x *DryRunRequest) GetAction() driverutil.Action { + if x != nil { + return x.Action + } + return driverutil.Action(0) +} + +func (x *DryRunRequest) GetSpec() *GatewayConfigSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *DryRunRequest) GetRevision() *v1.Revision { + if x != nil { + return x.Revision + } + return nil +} + +func (x *DryRunRequest) GetPatch() *GatewayConfigSpec { + if x != nil { + return x.Patch + } + return nil +} + +func (x *DryRunRequest) GetMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.Mask + } + return nil +} + +type DryRunResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Current *GatewayConfigSpec `protobuf:"bytes,1,opt,name=current,proto3" json:"current,omitempty"` + Modified *GatewayConfigSpec `protobuf:"bytes,2,opt,name=modified,proto3" json:"modified,omitempty"` + ValidationErrors *validate.Violations `protobuf:"bytes,3,opt,name=validationErrors,proto3" json:"validationErrors,omitempty"` +} + +func (x *DryRunResponse) Reset() { + *x = DryRunResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DryRunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DryRunResponse) ProtoMessage() {} + +func (x *DryRunResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_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 DryRunResponse.ProtoReflect.Descriptor instead. +func (*DryRunResponse) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{6} +} + +func (x *DryRunResponse) GetCurrent() *GatewayConfigSpec { + if x != nil { + return x.Current + } + return nil +} + +func (x *DryRunResponse) GetModified() *GatewayConfigSpec { + if x != nil { + return x.Modified + } + return nil +} + +func (x *DryRunResponse) GetValidationErrors() *validate.Violations { + if x != nil { + return x.ValidationErrors + } + return nil +} + +type HistoryResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Entries []*GatewayConfigSpec `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` +} + +func (x *HistoryResponse) Reset() { + *x = HistoryResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryResponse) ProtoMessage() {} + +func (x *HistoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_config_server_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 HistoryResponse.ProtoReflect.Descriptor instead. +func (*HistoryResponse) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP(), []int{7} +} + +func (x *HistoryResponse) GetEntries() []*GatewayConfigSpec { + if x != nil { + return x.Entries + } + return nil +} + +var File_github_com_rancher_opni_pkg_config_v1_config_server_proto protoreflect.FileDescriptor + +var file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDesc = []byte{ + 0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x1a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x67, 0x65, 0x6e, + 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x33, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x35, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, + 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x40, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x62, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x68, 0x73, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x48, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3e, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, + 0xb6, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x42, 0x06, 0x92, 0xc0, 0x0c, 0x02, 0x10, 0x01, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x06, + 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x05, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, + 0x01, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb1, 0x02, 0x0a, 0x0d, 0x44, 0x72, 0x79, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x06, + 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xc8, 0x01, 0x0a, + 0x0e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x12, 0x44, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, + 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x6f, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x49, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x32, 0xe6, 0x06, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x64, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x53, 0x70, 0x65, 0x63, 0x22, 0x13, 0x82, 0xc0, 0x0c, 0x0f, 0x8a, 0xc0, 0x0c, 0x0b, 0x67, + 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x61, 0x0a, 0x17, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0x82, 0xc0, 0x0c, 0x13, 0x8a, 0xc0, 0x0c, 0x0b, 0x73, 0x65, + 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x55, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x16, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x22, 0x0b, 0x82, 0xc0, 0x0c, 0x07, 0x8a, 0xc0, 0x0c, + 0x03, 0x67, 0x65, 0x74, 0x12, 0x52, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0x82, 0xc0, 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, + 0x03, 0x73, 0x65, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x62, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xc0, 0x0c, 0x11, 0x8a, 0xc0, 0x0c, 0x0d, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x58, 0x0a, 0x12, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x11, 0x82, 0xc0, 0x0c, 0x0d, 0x8a, 0xc0, 0x0c, 0x05, 0x72, 0x65, 0x73, + 0x65, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x47, 0x0a, 0x06, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x79, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x82, 0xc0, 0x0c, 0x04, 0xa0, 0xc0, 0x0c, 0x01, 0x12, + 0x6c, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xc0, + 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x5c, 0x0a, + 0x0d, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1f, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x0d, 0x82, 0xc0, 0x0c, 0x09, + 0x8a, 0xc0, 0x0c, 0x05, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, 0x1a, 0x0e, 0x82, 0xc0, 0x0c, + 0x0a, 0x8a, 0xc0, 0x0c, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x36, 0x82, 0xc0, 0x0c, + 0x02, 0x08, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescOnce sync.Once + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescData = file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDesc +) + +func file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescGZIP() []byte { + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescOnce.Do(func() { + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescData) + }) + return file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDescData +} + +var file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_github_com_rancher_opni_pkg_config_v1_config_server_proto_goTypes = []interface{}{ + (*ReactiveWatchRequest)(nil), // 0: config.v1.ReactiveWatchRequest + (*ReactiveEvents)(nil), // 1: config.v1.ReactiveEvents + (*ReactiveEvent)(nil), // 2: config.v1.ReactiveEvent + (*SetRequest)(nil), // 3: config.v1.SetRequest + (*ResetRequest)(nil), // 4: config.v1.ResetRequest + (*DryRunRequest)(nil), // 5: config.v1.DryRunRequest + (*DryRunResponse)(nil), // 6: config.v1.DryRunResponse + (*HistoryResponse)(nil), // 7: config.v1.HistoryResponse + (*v1.Value)(nil), // 8: core.Value + (*GatewayConfigSpec)(nil), // 9: config.v1.GatewayConfigSpec + (*v1.Revision)(nil), // 10: core.Revision + (*fieldmaskpb.FieldMask)(nil), // 11: google.protobuf.FieldMask + (driverutil.Target)(0), // 12: driverutil.Target + (driverutil.Action)(0), // 13: driverutil.Action + (*validate.Violations)(nil), // 14: buf.validate.Violations + (*driverutil.GetRequest)(nil), // 15: driverutil.GetRequest + (*emptypb.Empty)(nil), // 16: google.protobuf.Empty + (*driverutil.ConfigurationHistoryRequest)(nil), // 17: driverutil.ConfigurationHistoryRequest +} +var file_github_com_rancher_opni_pkg_config_v1_config_server_proto_depIdxs = []int32{ + 2, // 0: config.v1.ReactiveEvents.items:type_name -> config.v1.ReactiveEvent + 8, // 1: config.v1.ReactiveEvent.value:type_name -> core.Value + 9, // 2: config.v1.SetRequest.spec:type_name -> config.v1.GatewayConfigSpec + 10, // 3: config.v1.ResetRequest.revision:type_name -> core.Revision + 11, // 4: config.v1.ResetRequest.mask:type_name -> google.protobuf.FieldMask + 9, // 5: config.v1.ResetRequest.patch:type_name -> config.v1.GatewayConfigSpec + 12, // 6: config.v1.DryRunRequest.target:type_name -> driverutil.Target + 13, // 7: config.v1.DryRunRequest.action:type_name -> driverutil.Action + 9, // 8: config.v1.DryRunRequest.spec:type_name -> config.v1.GatewayConfigSpec + 10, // 9: config.v1.DryRunRequest.revision:type_name -> core.Revision + 9, // 10: config.v1.DryRunRequest.patch:type_name -> config.v1.GatewayConfigSpec + 11, // 11: config.v1.DryRunRequest.mask:type_name -> google.protobuf.FieldMask + 9, // 12: config.v1.DryRunResponse.current:type_name -> config.v1.GatewayConfigSpec + 9, // 13: config.v1.DryRunResponse.modified:type_name -> config.v1.GatewayConfigSpec + 14, // 14: config.v1.DryRunResponse.validationErrors:type_name -> buf.validate.Violations + 9, // 15: config.v1.HistoryResponse.entries:type_name -> config.v1.GatewayConfigSpec + 15, // 16: config.v1.GatewayConfig.GetDefaultConfiguration:input_type -> driverutil.GetRequest + 3, // 17: config.v1.GatewayConfig.SetDefaultConfiguration:input_type -> config.v1.SetRequest + 15, // 18: config.v1.GatewayConfig.GetConfiguration:input_type -> driverutil.GetRequest + 3, // 19: config.v1.GatewayConfig.SetConfiguration:input_type -> config.v1.SetRequest + 16, // 20: config.v1.GatewayConfig.ResetDefaultConfiguration:input_type -> google.protobuf.Empty + 4, // 21: config.v1.GatewayConfig.ResetConfiguration:input_type -> config.v1.ResetRequest + 5, // 22: config.v1.GatewayConfig.DryRun:input_type -> config.v1.DryRunRequest + 17, // 23: config.v1.GatewayConfig.ConfigurationHistory:input_type -> driverutil.ConfigurationHistoryRequest + 0, // 24: config.v1.GatewayConfig.WatchReactive:input_type -> config.v1.ReactiveWatchRequest + 9, // 25: config.v1.GatewayConfig.GetDefaultConfiguration:output_type -> config.v1.GatewayConfigSpec + 16, // 26: config.v1.GatewayConfig.SetDefaultConfiguration:output_type -> google.protobuf.Empty + 9, // 27: config.v1.GatewayConfig.GetConfiguration:output_type -> config.v1.GatewayConfigSpec + 16, // 28: config.v1.GatewayConfig.SetConfiguration:output_type -> google.protobuf.Empty + 16, // 29: config.v1.GatewayConfig.ResetDefaultConfiguration:output_type -> google.protobuf.Empty + 16, // 30: config.v1.GatewayConfig.ResetConfiguration:output_type -> google.protobuf.Empty + 6, // 31: config.v1.GatewayConfig.DryRun:output_type -> config.v1.DryRunResponse + 7, // 32: config.v1.GatewayConfig.ConfigurationHistory:output_type -> config.v1.HistoryResponse + 1, // 33: config.v1.GatewayConfig.WatchReactive:output_type -> config.v1.ReactiveEvents + 25, // [25:34] is the sub-list for method output_type + 16, // [16:25] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name +} + +func init() { file_github_com_rancher_opni_pkg_config_v1_config_server_proto_init() } +func file_github_com_rancher_opni_pkg_config_v1_config_server_proto_init() { + if File_github_com_rancher_opni_pkg_config_v1_config_server_proto != nil { + return + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() + if !protoimpl.UnsafeEnabled { + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReactiveWatchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReactiveEvents); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReactiveEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[4].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_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DryRunRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DryRunResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HistoryResponse); 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_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_github_com_rancher_opni_pkg_config_v1_config_server_proto_goTypes, + DependencyIndexes: file_github_com_rancher_opni_pkg_config_v1_config_server_proto_depIdxs, + MessageInfos: file_github_com_rancher_opni_pkg_config_v1_config_server_proto_msgTypes, + }.Build() + File_github_com_rancher_opni_pkg_config_v1_config_server_proto = out.File + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_rawDesc = nil + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_goTypes = nil + file_github_com_rancher_opni_pkg_config_v1_config_server_proto_depIdxs = nil +} diff --git a/pkg/config/v1/config_server.proto b/pkg/config/v1/config_server.proto new file mode 100644 index 0000000000..ac0810d68f --- /dev/null +++ b/pkg/config/v1/config_server.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; + +package config.v1; + +import "github.com/rancher/opni/internal/codegen/cli/cli.proto"; +import "github.com/rancher/opni/pkg/apis/core/v1/core.proto"; +import "github.com/rancher/opni/pkg/config/v1/gateway_config.proto"; +import "github.com/rancher/opni/pkg/plugins/driverutil/types.proto"; +import "github.com/rancher/opni/pkg/validation/validate.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/field_mask.proto"; + +option go_package = "github.com/rancher/opni/pkg/config/v1;configv1"; +option (cli.generator) = { + generate: true +}; + +// Gateway configuration management +service GatewayConfig { + option (cli.command_group) = { + use: "config" + }; + + rpc GetDefaultConfiguration(driverutil.GetRequest) returns (GatewayConfigSpec) { + option (cli.command) = { + use: "get-default" + }; + } + rpc SetDefaultConfiguration(SetRequest) returns (google.protobuf.Empty) { + option (cli.command) = { + use: "set-default" + granularity: EditMessage + }; + } + rpc GetConfiguration(driverutil.GetRequest) returns (GatewayConfigSpec) { + option (cli.command) = { + use: "get" + }; + } + rpc SetConfiguration(SetRequest) returns (google.protobuf.Empty) { + option (cli.command) = { + use: "set" + granularity: EditMessage + }; + } + rpc ResetDefaultConfiguration(google.protobuf.Empty) returns (google.protobuf.Empty) { + option (cli.command) = { + use: "reset-default" + }; + } + rpc ResetConfiguration(ResetRequest) returns (google.protobuf.Empty) { + option (cli.command) = { + use: "reset" + granularity: EditMessage + }; + } + rpc DryRun(DryRunRequest) returns (DryRunResponse) { + option (cli.command).skip = true; + } + rpc ConfigurationHistory(driverutil.ConfigurationHistoryRequest) returns (HistoryResponse) { + option (cli.command) = { + use: "history" + }; + } + rpc WatchReactive(ReactiveWatchRequest) returns (stream ReactiveEvents) { + option (cli.command) = { + use: "watch" + }; + } +} + +message ReactiveWatchRequest { + // If true, uses [reactive.Bind] to watch all paths at once. If false, + // each path recieves updates separately. + bool bind = 1; + + // List of paths to watch. + repeated string paths = 2; +} + +message ReactiveEvents { + // In bind mode, this will contain one item for each path in the request, + // in order. Otherwise, this will only contain a single item. + repeated ReactiveEvent items = 1; +} + +message ReactiveEvent { + // The path that triggered this event, as an index into the request path list. + int32 index = 1; + + core.Value value = 2; +} + +message SetRequest { + GatewayConfigSpec spec = 1; +} + +message ResetRequest { + core.Revision revision = 1 [(cli.flag_set).no_prefix = true]; + google.protobuf.FieldMask mask = 2 [(cli.flag).skip = true]; + GatewayConfigSpec patch = 3 [(cli.flag).skip = true]; +} + +message DryRunRequest { + driverutil.Target target = 1; + driverutil.Action action = 2; + + GatewayConfigSpec spec = 3; // Set + + core.Revision revision = 4; // Reset + GatewayConfigSpec patch = 5; // Reset + google.protobuf.FieldMask mask = 6 [(cli.flag).skip = true]; // Reset +} + +message DryRunResponse { + GatewayConfigSpec current = 1; + GatewayConfigSpec modified = 2; + buf.validate.Violations validationErrors = 3; +} + +message HistoryResponse { + repeated GatewayConfigSpec entries = 1; +} diff --git a/pkg/config/v1/config_server_cli.pb.go b/pkg/config/v1/config_server_cli.pb.go new file mode 100644 index 0000000000..109129d722 --- /dev/null +++ b/pkg/config/v1/config_server_cli.pb.go @@ -0,0 +1,367 @@ +// Code generated by internal/codegen/cli/generator.go. DO NOT EDIT. +// source: github.com/rancher/opni/pkg/config/v1/config_server.proto + +package configv1 + +import ( + context "context" + errors "errors" + cli "github.com/rancher/opni/internal/codegen/cli" + v1 "github.com/rancher/opni/pkg/apis/core/v1" + cliutil "github.com/rancher/opni/pkg/opni/cliutil" + driverutil "github.com/rancher/opni/pkg/plugins/driverutil" + storage "github.com/rancher/opni/pkg/storage" + lo "github.com/samber/lo" + cobra "github.com/spf13/cobra" + pflag "github.com/spf13/pflag" + errdetails "google.golang.org/genproto/googleapis/rpc/errdetails" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoiface "google.golang.org/protobuf/runtime/protoiface" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +type ( + contextKey_GatewayConfig_type struct{} + contextInjector_GatewayConfig_type struct{} +) + +var ( + contextKey_GatewayConfig contextKey_GatewayConfig_type + GatewayConfigContextInjector contextInjector_GatewayConfig_type +) + +func (contextInjector_GatewayConfig_type) NewClient(cc grpc.ClientConnInterface) GatewayConfigClient { + return NewGatewayConfigClient(cc) +} + +func (contextInjector_GatewayConfig_type) UnderlyingConn(client GatewayConfigClient) grpc.ClientConnInterface { + return client.(*gatewayConfigClient).cc +} + +func (contextInjector_GatewayConfig_type) ContextWithClient(ctx context.Context, client GatewayConfigClient) context.Context { + return context.WithValue(ctx, contextKey_GatewayConfig, client) +} + +func (contextInjector_GatewayConfig_type) ClientFromContext(ctx context.Context) (GatewayConfigClient, bool) { + client, ok := ctx.Value(contextKey_GatewayConfig).(GatewayConfigClient) + return client, ok +} + +var extraCmds_GatewayConfig []*cobra.Command + +func addExtraGatewayConfigCmd(custom *cobra.Command) { + extraCmds_GatewayConfig = append(extraCmds_GatewayConfig, custom) +} + +func BuildGatewayConfigCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "config", + Short: `Gateway configuration management`, + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + } + + cliutil.AddSubcommands(cmd, append([]*cobra.Command{ + BuildGatewayConfigGetDefaultConfigurationCmd(), + BuildGatewayConfigSetDefaultConfigurationCmd(), + BuildGatewayConfigGetConfigurationCmd(), + BuildGatewayConfigSetConfigurationCmd(), + BuildGatewayConfigResetDefaultConfigurationCmd(), + BuildGatewayConfigResetConfigurationCmd(), + BuildGatewayConfigConfigurationHistoryCmd(), + }, extraCmds_GatewayConfig...)...) + cli.AddOutputFlag(cmd) + return cmd +} + +func BuildGatewayConfigGetDefaultConfigurationCmd() *cobra.Command { + in := &driverutil.GetRequest{} + cmd := &cobra.Command{ + Use: "get-default", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + if in == nil { + return errors.New("no input provided") + } + response, err := client.GetDefaultConfiguration(cmd.Context(), in) + if err != nil { + return err + } + cli.RenderOutput(cmd, response) + return nil + }, + } + cmd.Flags().AddFlagSet(in.FlagSet()) + return cmd +} + +func BuildGatewayConfigSetDefaultConfigurationCmd() *cobra.Command { + in := &SetRequest{} + cmd := &cobra.Command{ + Use: "set-default", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + if cmd.Flags().Lookup("interactive").Value.String() == "true" { + if curValue, err := client.GetDefaultConfiguration(cmd.Context(), &driverutil.GetRequest{}); err == nil { + in.Spec = curValue + } + if edited, err := cliutil.EditInteractive(in.Spec); err != nil { + return err + } else { + in.Spec = edited + } + } else if fileName := cmd.Flags().Lookup("file").Value.String(); fileName != "" { + if in.Spec == nil { + cliutil.InitializeField(&in.Spec) + } + if err := cliutil.LoadFromFile(in.Spec, fileName); err != nil { + return err + } + } + if in == nil { + return errors.New("no input provided") + } + _, err := client.SetDefaultConfiguration(cmd.Context(), in) + if err != nil { + return err + } + return nil + }, + } + cmd.Flags().StringP("file", "f", "", "path to a file containing the config, or - to read from stdin") + cmd.Flags().BoolP("interactive", "i", false, "edit the config interactively in an editor") + cmd.MarkFlagsMutuallyExclusive("file", "interactive") + cmd.MarkFlagFilename("file") + return cmd +} + +func BuildGatewayConfigGetConfigurationCmd() *cobra.Command { + in := &driverutil.GetRequest{} + cmd := &cobra.Command{ + Use: "get", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + if in == nil { + return errors.New("no input provided") + } + response, err := client.GetConfiguration(cmd.Context(), in) + if err != nil { + return err + } + cli.RenderOutput(cmd, response) + return nil + }, + } + cmd.Flags().AddFlagSet(in.FlagSet()) + return cmd +} + +func BuildGatewayConfigSetConfigurationCmd() *cobra.Command { + in := &SetRequest{} + cmd := &cobra.Command{ + Use: "set", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + if cmd.Flags().Lookup("interactive").Value.String() == "true" { + if curValue, err := client.GetConfiguration(cmd.Context(), &driverutil.GetRequest{}); err == nil { + in.Spec = curValue + } + if edited, err := cliutil.EditInteractive(in.Spec); err != nil { + return err + } else { + in.Spec = edited + } + } else if fileName := cmd.Flags().Lookup("file").Value.String(); fileName != "" { + if in.Spec == nil { + cliutil.InitializeField(&in.Spec) + } + if err := cliutil.LoadFromFile(in.Spec, fileName); err != nil { + return err + } + } + if in == nil { + return errors.New("no input provided") + } + _, err := client.SetConfiguration(cmd.Context(), in) + if err != nil { + return err + } + return nil + }, + } + cmd.Flags().StringP("file", "f", "", "path to a file containing the config, or - to read from stdin") + cmd.Flags().BoolP("interactive", "i", false, "edit the config interactively in an editor") + cmd.MarkFlagsMutuallyExclusive("file", "interactive") + cmd.MarkFlagFilename("file") + return cmd +} + +func BuildGatewayConfigResetDefaultConfigurationCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "reset-default", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + _, err := client.ResetDefaultConfiguration(cmd.Context(), &emptypb.Empty{}) + if err != nil { + return err + } + return nil + }, + } + return cmd +} + +func BuildGatewayConfigResetConfigurationCmd() *cobra.Command { + in := &ResetRequest{} + cmd := &cobra.Command{ + Use: "reset", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + if cmd.Flags().Lookup("interactive").Value.String() == "true" { + if edited, err := cliutil.EditInteractive(in); err != nil { + return err + } else { + in = edited + } + } else if fileName := cmd.Flags().Lookup("file").Value.String(); fileName != "" { + if err := cliutil.LoadFromFile(in, fileName); err != nil { + return err + } + } + if in == nil { + return errors.New("no input provided") + } + _, err := client.ResetConfiguration(cmd.Context(), in) + if err != nil { + return err + } + return nil + }, + } + cmd.Flags().StringP("file", "f", "", "path to a file containing the config, or - to read from stdin") + cmd.Flags().BoolP("interactive", "i", false, "edit the config interactively in an editor") + cmd.MarkFlagsMutuallyExclusive("file", "interactive") + cmd.MarkFlagFilename("file") + return cmd +} + +func BuildGatewayConfigConfigurationHistoryCmd() *cobra.Command { + in := &driverutil.ConfigurationHistoryRequest{} + cmd := &cobra.Command{ + Use: "history", + Short: "", + Args: cobra.NoArgs, + ValidArgsFunction: cobra.NoFileCompletions, + RunE: func(cmd *cobra.Command, args []string) error { + client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) + if !ok { + cmd.PrintErrln("failed to get client from context") + return nil + } + if in == nil { + return errors.New("no input provided") + } + response, err := client.ConfigurationHistory(cmd.Context(), in) + if err != nil { + return err + } + cli.RenderOutput(cmd, response) + return nil + }, + } + cmd.Flags().AddFlagSet(in.FlagSet()) + cmd.RegisterFlagCompletionFunc("target", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{"ActiveConfiguration", "DefaultConfiguration"}, cobra.ShellCompDirectiveDefault + }) + return cmd +} + +func (in *SetRequest) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("SetRequest", pflag.ExitOnError) + fs.SortFlags = true + if in.Spec == nil { + in.Spec = &GatewayConfigSpec{} + } + fs.AddFlagSet(in.Spec.FlagSet(append(prefix, "spec")...)) + return fs +} + +func (in *SetRequest) RedactSecrets() { + if in == nil { + return + } + in.Spec.RedactSecrets() +} + +func (in *SetRequest) UnredactSecrets(unredacted *SetRequest) error { + if in == nil { + return nil + } + var details []protoiface.MessageV1 + if err := in.Spec.UnredactSecrets(unredacted.GetSpec()); storage.IsDiscontinuity(err) { + for _, sd := range status.Convert(err).Details() { + if info, ok := sd.(*errdetails.ErrorInfo); ok { + info.Metadata["field"] = "spec." + info.Metadata["field"] + details = append(details, info) + } + } + } + if len(details) == 0 { + return nil + } + return lo.Must(status.New(codes.InvalidArgument, "cannot unredact: missing values for secret fields").WithDetails(details...)).Err() +} + +func (in *ResetRequest) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("ResetRequest", pflag.ExitOnError) + fs.SortFlags = true + if in.Revision == nil { + in.Revision = &v1.Revision{} + } + fs.AddFlagSet(in.Revision.FlagSet(prefix...)) + return fs +} diff --git a/pkg/config/v1/gateway_config_grpc.pb.go b/pkg/config/v1/config_server_grpc.pb.go similarity index 99% rename from pkg/config/v1/gateway_config_grpc.pb.go rename to pkg/config/v1/config_server_grpc.pb.go index b4fae303f6..1a42602490 100644 --- a/pkg/config/v1/gateway_config_grpc.pb.go +++ b/pkg/config/v1/config_server_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.3.0 // - ragu v1.0.0 -// source: github.com/rancher/opni/pkg/config/v1/gateway_config.proto +// source: github.com/rancher/opni/pkg/config/v1/config_server.proto package configv1 @@ -429,5 +429,5 @@ var GatewayConfig_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "github.com/rancher/opni/pkg/config/v1/gateway_config.proto", + Metadata: "github.com/rancher/opni/pkg/config/v1/config_server.proto", } diff --git a/pkg/config/v1/extensions.go b/pkg/config/v1/extensions.go index 7811169835..93c2c8af32 100644 --- a/pkg/config/v1/extensions.go +++ b/pkg/config/v1/extensions.go @@ -36,6 +36,8 @@ func init() { )) } +var ErrInsecure = errors.New("insecure") + func (m *MTLSSpec) AsTlsConfig() (*tls.Config, error) { var serverCaData, clientCaData, clientCertData, clientKeyData []byte var err error @@ -58,7 +60,7 @@ func (m *MTLSSpec) AsTlsConfig() (*tls.Config, error) { case m.ServerCAData != nil: serverCaData = []byte(m.GetServerCAData()) default: - return nil, errors.New("no server CA configured") + return nil, fmt.Errorf("%w: no server CA configured", ErrInsecure) } switch { @@ -70,7 +72,7 @@ func (m *MTLSSpec) AsTlsConfig() (*tls.Config, error) { case m.ClientCertData != nil: clientCertData = []byte(m.GetClientCertData()) default: - return nil, errors.New("no client cert configured") + return nil, fmt.Errorf("%w: no client cert configured", ErrInsecure) } switch { @@ -82,7 +84,7 @@ func (m *MTLSSpec) AsTlsConfig() (*tls.Config, error) { case m.ClientKeyData != nil: clientKeyData = []byte(m.GetClientKeyData()) default: - return nil, errors.New("no client key configured") + return nil, fmt.Errorf("%w: no client key configured", ErrInsecure) } clientCert, err := tls.X509KeyPair(clientCertData, clientKeyData) @@ -119,7 +121,7 @@ func (c *CertsSpec) AsTlsConfig(clientAuth tls.ClientAuthType) (*tls.Config, err case c.CaCertData != nil: caCertData = []byte(c.GetCaCertData()) default: - return nil, errors.New("no CA cert configured") + return nil, fmt.Errorf("%w: no CA cert configured", ErrInsecure) } switch { case c.ServingCert != nil: @@ -131,7 +133,7 @@ func (c *CertsSpec) AsTlsConfig(clientAuth tls.ClientAuthType) (*tls.Config, err case c.ServingCertData != nil: servingCertData = []byte(c.GetServingCertData()) default: - return nil, errors.New("no serving cert configured") + return nil, fmt.Errorf("%w: no serving cert configured", ErrInsecure) } switch { case c.ServingKey != nil: @@ -143,7 +145,7 @@ func (c *CertsSpec) AsTlsConfig(clientAuth tls.ClientAuthType) (*tls.Config, err case c.ServingKeyData != nil: servingKeyData = []byte(c.GetServingKeyData()) default: - return nil, errors.New("no serving key configured") + return nil, fmt.Errorf("%w: no serving key configured", ErrInsecure) } var block *pem.Block diff --git a/pkg/config/v1/gateway_config.pb.go b/pkg/config/v1/gateway_config.pb.go index 4c19b88375..ac41c97ccb 100644 --- a/pkg/config/v1/gateway_config.pb.go +++ b/pkg/config/v1/gateway_config.pb.go @@ -7,17 +7,11 @@ package configv1 import ( - validate "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" _ "github.com/rancher/opni/internal/codegen/cli" v1 "github.com/rancher/opni/pkg/apis/core/v1" - driverutil "github.com/rancher/opni/pkg/plugins/driverutil" _ "github.com/rancher/opni/pkg/validation" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - _ "google.golang.org/protobuf/types/known/anypb" - emptypb "google.golang.org/protobuf/types/known/emptypb" - fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" - _ "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -209,7 +203,7 @@ func (x AgentUpgradesSpec_Driver) Number() protoreflect.EnumNumber { // Deprecated: Use AgentUpgradesSpec_Driver.Descriptor instead. func (AgentUpgradesSpec_Driver) EnumDescriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20, 0} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{17, 0} } type PluginUpgradesSpec_Driver int32 @@ -255,7 +249,7 @@ func (x PluginUpgradesSpec_Driver) Number() protoreflect.EnumNumber { // Deprecated: Use PluginUpgradesSpec_Driver.Descriptor instead. func (PluginUpgradesSpec_Driver) EnumDescriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{21, 0} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{18, 0} } type KubernetesAgentUpgradeSpec_ImageResolver int32 @@ -301,7 +295,7 @@ func (x KubernetesAgentUpgradeSpec_ImageResolver) Number() protoreflect.EnumNumb // Deprecated: Use KubernetesAgentUpgradeSpec_ImageResolver.Descriptor instead. func (KubernetesAgentUpgradeSpec_ImageResolver) EnumDescriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{23, 0} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20, 0} } type AuthSpec_Backend int32 @@ -347,170 +341,7 @@ func (x AuthSpec_Backend) Number() protoreflect.EnumNumber { // Deprecated: Use AuthSpec_Backend.Descriptor instead. func (AuthSpec_Backend) EnumDescriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{25, 0} -} - -type ReactiveWatchRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // If true, uses [reactive.Bind] to watch all paths at once. If false, - // each path recieves updates separately. - Bind bool `protobuf:"varint,1,opt,name=bind,proto3" json:"bind,omitempty"` - // List of paths to watch. - Paths []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` -} - -func (x *ReactiveWatchRequest) Reset() { - *x = ReactiveWatchRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReactiveWatchRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReactiveWatchRequest) ProtoMessage() {} - -func (x *ReactiveWatchRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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 ReactiveWatchRequest.ProtoReflect.Descriptor instead. -func (*ReactiveWatchRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{0} -} - -func (x *ReactiveWatchRequest) GetBind() bool { - if x != nil { - return x.Bind - } - return false -} - -func (x *ReactiveWatchRequest) GetPaths() []string { - if x != nil { - return x.Paths - } - return nil -} - -type ReactiveEvents struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // In bind mode, this will contain one item for each path in the request, - // in order. Otherwise, this will only contain a single item. - Items []*ReactiveEvent `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` -} - -func (x *ReactiveEvents) Reset() { - *x = ReactiveEvents{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReactiveEvents) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReactiveEvents) ProtoMessage() {} - -func (x *ReactiveEvents) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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 ReactiveEvents.ProtoReflect.Descriptor instead. -func (*ReactiveEvents) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{1} -} - -func (x *ReactiveEvents) GetItems() []*ReactiveEvent { - if x != nil { - return x.Items - } - return nil -} - -type ReactiveEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The path that triggered this event, as an index into the request path list. - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Value *v1.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *ReactiveEvent) Reset() { - *x = ReactiveEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReactiveEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReactiveEvent) ProtoMessage() {} - -func (x *ReactiveEvent) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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 ReactiveEvent.ProtoReflect.Descriptor instead. -func (*ReactiveEvent) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{2} -} - -func (x *ReactiveEvent) GetIndex() int32 { - if x != nil { - return x.Index - } - return 0 -} - -func (x *ReactiveEvent) GetValue() *v1.Value { - if x != nil { - return x.Value - } - return nil + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{22, 0} } type GatewayConfigSpec struct { @@ -536,7 +367,7 @@ type GatewayConfigSpec struct { func (x *GatewayConfigSpec) Reset() { *x = GatewayConfigSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -549,7 +380,7 @@ func (x *GatewayConfigSpec) String() string { func (*GatewayConfigSpec) ProtoMessage() {} func (x *GatewayConfigSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -562,7 +393,7 @@ func (x *GatewayConfigSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayConfigSpec.ProtoReflect.Descriptor instead. func (*GatewayConfigSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{3} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{0} } func (x *GatewayConfigSpec) GetRevision() *v1.Revision { @@ -672,7 +503,7 @@ type ServerSpec struct { func (x *ServerSpec) Reset() { *x = ServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +516,7 @@ func (x *ServerSpec) String() string { func (*ServerSpec) ProtoMessage() {} func (x *ServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +529,7 @@ func (x *ServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerSpec.ProtoReflect.Descriptor instead. func (*ServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{4} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{1} } func (x *ServerSpec) GetHttpListenAddress() string { @@ -740,7 +571,7 @@ type ManagementServerSpec struct { func (x *ManagementServerSpec) Reset() { *x = ManagementServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -753,7 +584,7 @@ func (x *ManagementServerSpec) String() string { func (*ManagementServerSpec) ProtoMessage() {} func (x *ManagementServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -766,7 +597,7 @@ func (x *ManagementServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use ManagementServerSpec.ProtoReflect.Descriptor instead. func (*ManagementServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{5} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{2} } func (x *ManagementServerSpec) GetHttpListenAddress() string { @@ -806,7 +637,7 @@ type RelayServerSpec struct { func (x *RelayServerSpec) Reset() { *x = RelayServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -819,7 +650,7 @@ func (x *RelayServerSpec) String() string { func (*RelayServerSpec) ProtoMessage() {} func (x *RelayServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -832,7 +663,7 @@ func (x *RelayServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use RelayServerSpec.ProtoReflect.Descriptor instead. func (*RelayServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{6} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{3} } func (x *RelayServerSpec) GetGrpcListenAddress() string { @@ -861,7 +692,7 @@ type HealthServerSpec struct { func (x *HealthServerSpec) Reset() { *x = HealthServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -874,7 +705,7 @@ func (x *HealthServerSpec) String() string { func (*HealthServerSpec) ProtoMessage() {} func (x *HealthServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -887,7 +718,7 @@ func (x *HealthServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthServerSpec.ProtoReflect.Descriptor instead. func (*HealthServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{7} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{4} } func (x *HealthServerSpec) GetHttpListenAddress() string { @@ -916,7 +747,7 @@ type DashboardServerSpec struct { func (x *DashboardServerSpec) Reset() { *x = DashboardServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -929,7 +760,7 @@ func (x *DashboardServerSpec) String() string { func (*DashboardServerSpec) ProtoMessage() {} func (x *DashboardServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -942,7 +773,7 @@ func (x *DashboardServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use DashboardServerSpec.ProtoReflect.Descriptor instead. func (*DashboardServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{8} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{5} } func (x *DashboardServerSpec) GetHttpListenAddress() string { @@ -987,7 +818,7 @@ type StorageSpec struct { func (x *StorageSpec) Reset() { *x = StorageSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1000,7 +831,7 @@ func (x *StorageSpec) String() string { func (*StorageSpec) ProtoMessage() {} func (x *StorageSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1013,7 +844,7 @@ func (x *StorageSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use StorageSpec.ProtoReflect.Descriptor instead. func (*StorageSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{9} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{6} } func (x *StorageSpec) GetBackend() StorageBackend { @@ -1051,7 +882,7 @@ type EtcdSpec struct { func (x *EtcdSpec) Reset() { *x = EtcdSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1064,7 +895,7 @@ func (x *EtcdSpec) String() string { func (*EtcdSpec) ProtoMessage() {} func (x *EtcdSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1077,7 +908,7 @@ func (x *EtcdSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EtcdSpec.ProtoReflect.Descriptor instead. func (*EtcdSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{10} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{7} } func (x *EtcdSpec) GetEndpoints() []string { @@ -1120,7 +951,7 @@ type MTLSSpec struct { func (x *MTLSSpec) Reset() { *x = MTLSSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1133,7 +964,7 @@ func (x *MTLSSpec) String() string { func (*MTLSSpec) ProtoMessage() {} func (x *MTLSSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1146,7 +977,7 @@ func (x *MTLSSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSSpec.ProtoReflect.Descriptor instead. func (*MTLSSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{11} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{8} } func (x *MTLSSpec) GetServerCA() string { @@ -1219,7 +1050,7 @@ type JetStreamSpec struct { func (x *JetStreamSpec) Reset() { *x = JetStreamSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1232,7 +1063,7 @@ func (x *JetStreamSpec) String() string { func (*JetStreamSpec) ProtoMessage() {} func (x *JetStreamSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1245,7 +1076,7 @@ func (x *JetStreamSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use JetStreamSpec.ProtoReflect.Descriptor instead. func (*JetStreamSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{12} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{9} } func (x *JetStreamSpec) GetEndpoint() string { @@ -1284,7 +1115,7 @@ type CertsSpec struct { func (x *CertsSpec) Reset() { *x = CertsSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1297,7 +1128,7 @@ func (x *CertsSpec) String() string { func (*CertsSpec) ProtoMessage() {} func (x *CertsSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1310,7 +1141,7 @@ func (x *CertsSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use CertsSpec.ProtoReflect.Descriptor instead. func (*CertsSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{13} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{10} } func (x *CertsSpec) GetCaCert() string { @@ -1372,7 +1203,7 @@ type PluginsSpec struct { func (x *PluginsSpec) Reset() { *x = PluginsSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1385,7 +1216,7 @@ func (x *PluginsSpec) String() string { func (*PluginsSpec) ProtoMessage() {} func (x *PluginsSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1398,7 +1229,7 @@ func (x *PluginsSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginsSpec.ProtoReflect.Descriptor instead. func (*PluginsSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{14} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{11} } func (x *PluginsSpec) GetDir() string { @@ -1434,7 +1265,7 @@ type PluginFilters struct { func (x *PluginFilters) Reset() { *x = PluginFilters{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1447,7 +1278,7 @@ func (x *PluginFilters) String() string { func (*PluginFilters) ProtoMessage() {} func (x *PluginFilters) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1460,7 +1291,7 @@ func (x *PluginFilters) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginFilters.ProtoReflect.Descriptor instead. func (*PluginFilters) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{15} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{12} } func (x *PluginFilters) GetExclude() []string { @@ -1484,7 +1315,7 @@ type CacheSpec struct { func (x *CacheSpec) Reset() { *x = CacheSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1497,7 +1328,7 @@ func (x *CacheSpec) String() string { func (*CacheSpec) ProtoMessage() {} func (x *CacheSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1510,7 +1341,7 @@ func (x *CacheSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheSpec.ProtoReflect.Descriptor instead. func (*CacheSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{16} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{13} } func (x *CacheSpec) GetBackend() CacheBackend { @@ -1539,7 +1370,7 @@ type FilesystemCacheSpec struct { func (x *FilesystemCacheSpec) Reset() { *x = FilesystemCacheSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1552,7 +1383,7 @@ func (x *FilesystemCacheSpec) String() string { func (*FilesystemCacheSpec) ProtoMessage() {} func (x *FilesystemCacheSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1565,7 +1396,7 @@ func (x *FilesystemCacheSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use FilesystemCacheSpec.ProtoReflect.Descriptor instead. func (*FilesystemCacheSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{17} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{14} } func (x *FilesystemCacheSpec) GetDir() string { @@ -1589,7 +1420,7 @@ type KeyringSpec struct { func (x *KeyringSpec) Reset() { *x = KeyringSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1602,7 +1433,7 @@ func (x *KeyringSpec) String() string { func (*KeyringSpec) ProtoMessage() {} func (x *KeyringSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1615,7 +1446,7 @@ func (x *KeyringSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyringSpec.ProtoReflect.Descriptor instead. func (*KeyringSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{18} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{15} } func (x *KeyringSpec) GetRuntimeKeyDirs() []string { @@ -1637,7 +1468,7 @@ type UpgradesSpec struct { func (x *UpgradesSpec) Reset() { *x = UpgradesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1650,7 +1481,7 @@ func (x *UpgradesSpec) String() string { func (*UpgradesSpec) ProtoMessage() {} func (x *UpgradesSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1663,7 +1494,7 @@ func (x *UpgradesSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use UpgradesSpec.ProtoReflect.Descriptor instead. func (*UpgradesSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{19} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{16} } func (x *UpgradesSpec) GetAgents() *AgentUpgradesSpec { @@ -1694,7 +1525,7 @@ type AgentUpgradesSpec struct { func (x *AgentUpgradesSpec) Reset() { *x = AgentUpgradesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1707,7 +1538,7 @@ func (x *AgentUpgradesSpec) String() string { func (*AgentUpgradesSpec) ProtoMessage() {} func (x *AgentUpgradesSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1720,7 +1551,7 @@ func (x *AgentUpgradesSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentUpgradesSpec.ProtoReflect.Descriptor instead. func (*AgentUpgradesSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{17} } func (x *AgentUpgradesSpec) GetDriver() AgentUpgradesSpec_Driver { @@ -1751,7 +1582,7 @@ type PluginUpgradesSpec struct { func (x *PluginUpgradesSpec) Reset() { *x = PluginUpgradesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1764,7 +1595,7 @@ func (x *PluginUpgradesSpec) String() string { func (*PluginUpgradesSpec) ProtoMessage() {} func (x *PluginUpgradesSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1777,7 +1608,7 @@ func (x *PluginUpgradesSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginUpgradesSpec.ProtoReflect.Descriptor instead. func (*PluginUpgradesSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{21} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{18} } func (x *PluginUpgradesSpec) GetDriver() PluginUpgradesSpec_Driver { @@ -1806,7 +1637,7 @@ type BinaryPluginUpgradeSpec struct { func (x *BinaryPluginUpgradeSpec) Reset() { *x = BinaryPluginUpgradeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1819,7 +1650,7 @@ func (x *BinaryPluginUpgradeSpec) String() string { func (*BinaryPluginUpgradeSpec) ProtoMessage() {} func (x *BinaryPluginUpgradeSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1832,7 +1663,7 @@ func (x *BinaryPluginUpgradeSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use BinaryPluginUpgradeSpec.ProtoReflect.Descriptor instead. func (*BinaryPluginUpgradeSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{22} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{19} } func (x *BinaryPluginUpgradeSpec) GetPatchEngine() PatchEngine { @@ -1856,7 +1687,7 @@ type KubernetesAgentUpgradeSpec struct { func (x *KubernetesAgentUpgradeSpec) Reset() { *x = KubernetesAgentUpgradeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1869,7 +1700,7 @@ func (x *KubernetesAgentUpgradeSpec) String() string { func (*KubernetesAgentUpgradeSpec) ProtoMessage() {} func (x *KubernetesAgentUpgradeSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1882,7 +1713,7 @@ func (x *KubernetesAgentUpgradeSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KubernetesAgentUpgradeSpec.ProtoReflect.Descriptor instead. func (*KubernetesAgentUpgradeSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{23} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20} } func (x *KubernetesAgentUpgradeSpec) GetImageResolver() KubernetesAgentUpgradeSpec_ImageResolver { @@ -1920,7 +1751,7 @@ type RateLimitingSpec struct { func (x *RateLimitingSpec) Reset() { *x = RateLimitingSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1933,7 +1764,7 @@ func (x *RateLimitingSpec) String() string { func (*RateLimitingSpec) ProtoMessage() {} func (x *RateLimitingSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1946,7 +1777,7 @@ func (x *RateLimitingSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use RateLimitingSpec.ProtoReflect.Descriptor instead. func (*RateLimitingSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{24} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{21} } func (x *RateLimitingSpec) GetRate() float64 { @@ -1979,7 +1810,7 @@ type AuthSpec struct { func (x *AuthSpec) Reset() { *x = AuthSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1992,7 +1823,7 @@ func (x *AuthSpec) String() string { func (*AuthSpec) ProtoMessage() {} func (x *AuthSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2005,7 +1836,7 @@ func (x *AuthSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthSpec.ProtoReflect.Descriptor instead. func (*AuthSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{25} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{22} } func (x *AuthSpec) GetBackend() AuthSpec_Backend { @@ -2056,7 +1887,7 @@ type OpenIDAuthSpec struct { func (x *OpenIDAuthSpec) Reset() { *x = OpenIDAuthSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2069,7 +1900,7 @@ func (x *OpenIDAuthSpec) String() string { func (*OpenIDAuthSpec) ProtoMessage() {} func (x *OpenIDAuthSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2082,7 +1913,7 @@ func (x *OpenIDAuthSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenIDAuthSpec.ProtoReflect.Descriptor instead. func (*OpenIDAuthSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{26} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{23} } func (x *OpenIDAuthSpec) GetIssuer() string { @@ -2136,7 +1967,7 @@ type BasicAuthSpec struct { func (x *BasicAuthSpec) Reset() { *x = BasicAuthSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[27] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2149,7 +1980,7 @@ func (x *BasicAuthSpec) String() string { func (*BasicAuthSpec) ProtoMessage() {} func (x *BasicAuthSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[27] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2162,314 +1993,7 @@ func (x *BasicAuthSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use BasicAuthSpec.ProtoReflect.Descriptor instead. func (*BasicAuthSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{27} -} - -type SetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Spec *GatewayConfigSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` -} - -func (x *SetRequest) Reset() { - *x = SetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetRequest) ProtoMessage() {} - -func (x *SetRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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) -} - -// Deprecated: Use SetRequest.ProtoReflect.Descriptor instead. -func (*SetRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{28} -} - -func (x *SetRequest) GetSpec() *GatewayConfigSpec { - if x != nil { - return x.Spec - } - return nil -} - -type ResetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Revision *v1.Revision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - Mask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=mask,proto3" json:"mask,omitempty"` - Patch *GatewayConfigSpec `protobuf:"bytes,3,opt,name=patch,proto3" json:"patch,omitempty"` -} - -func (x *ResetRequest) Reset() { - *x = ResetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[29] - 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_github_com_rancher_opni_pkg_config_v1_gateway_config_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) -} - -// Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. -func (*ResetRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{29} -} - -func (x *ResetRequest) GetRevision() *v1.Revision { - if x != nil { - return x.Revision - } - return nil -} - -func (x *ResetRequest) GetMask() *fieldmaskpb.FieldMask { - if x != nil { - return x.Mask - } - return nil -} - -func (x *ResetRequest) GetPatch() *GatewayConfigSpec { - if x != nil { - return x.Patch - } - return nil -} - -type DryRunRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Target driverutil.Target `protobuf:"varint,1,opt,name=target,proto3,enum=driverutil.Target" json:"target,omitempty"` - Action driverutil.Action `protobuf:"varint,2,opt,name=action,proto3,enum=driverutil.Action" json:"action,omitempty"` - Spec *GatewayConfigSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` // Set - Revision *v1.Revision `protobuf:"bytes,4,opt,name=revision,proto3" json:"revision,omitempty"` // Reset - Patch *GatewayConfigSpec `protobuf:"bytes,5,opt,name=patch,proto3" json:"patch,omitempty"` // Reset - Mask *fieldmaskpb.FieldMask `protobuf:"bytes,6,opt,name=mask,proto3" json:"mask,omitempty"` // Reset -} - -func (x *DryRunRequest) Reset() { - *x = DryRunRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DryRunRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DryRunRequest) ProtoMessage() {} - -func (x *DryRunRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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 DryRunRequest.ProtoReflect.Descriptor instead. -func (*DryRunRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{30} -} - -func (x *DryRunRequest) GetTarget() driverutil.Target { - if x != nil { - return x.Target - } - return driverutil.Target(0) -} - -func (x *DryRunRequest) GetAction() driverutil.Action { - if x != nil { - return x.Action - } - return driverutil.Action(0) -} - -func (x *DryRunRequest) GetSpec() *GatewayConfigSpec { - if x != nil { - return x.Spec - } - return nil -} - -func (x *DryRunRequest) GetRevision() *v1.Revision { - if x != nil { - return x.Revision - } - return nil -} - -func (x *DryRunRequest) GetPatch() *GatewayConfigSpec { - if x != nil { - return x.Patch - } - return nil -} - -func (x *DryRunRequest) GetMask() *fieldmaskpb.FieldMask { - if x != nil { - return x.Mask - } - return nil -} - -type DryRunResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Current *GatewayConfigSpec `protobuf:"bytes,1,opt,name=current,proto3" json:"current,omitempty"` - Modified *GatewayConfigSpec `protobuf:"bytes,2,opt,name=modified,proto3" json:"modified,omitempty"` - ValidationErrors *validate.Violations `protobuf:"bytes,3,opt,name=validationErrors,proto3" json:"validationErrors,omitempty"` -} - -func (x *DryRunResponse) Reset() { - *x = DryRunResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DryRunResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DryRunResponse) ProtoMessage() {} - -func (x *DryRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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 DryRunResponse.ProtoReflect.Descriptor instead. -func (*DryRunResponse) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{31} -} - -func (x *DryRunResponse) GetCurrent() *GatewayConfigSpec { - if x != nil { - return x.Current - } - return nil -} - -func (x *DryRunResponse) GetModified() *GatewayConfigSpec { - if x != nil { - return x.Modified - } - return nil -} - -func (x *DryRunResponse) GetValidationErrors() *validate.Violations { - if x != nil { - return x.ValidationErrors - } - return nil -} - -type HistoryResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Entries []*GatewayConfigSpec `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` -} - -func (x *HistoryResponse) Reset() { - *x = HistoryResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HistoryResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HistoryResponse) ProtoMessage() {} - -func (x *HistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_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 HistoryResponse.ProtoReflect.Descriptor instead. -func (*HistoryResponse) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{32} -} - -func (x *HistoryResponse) GetEntries() []*GatewayConfigSpec { - if x != nil { - return x.Entries - } - return nil + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{24} } var File_github_com_rancher_opni_pkg_config_v1_gateway_config_proto protoreflect.FileDescriptor @@ -2486,234 +2010,170 @@ var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDesc = [] 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x75, 0x74, 0x69, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x40, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x62, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, - 0x73, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x22, 0x48, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xac, 0x08, - 0x0a, 0x11, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x3c, - 0x0a, 0x09, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, - 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x09, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x07, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2a, - 0x0a, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x07, - 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x72, 0x69, 0x6e, - 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x33, - 0x0a, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, - 0x04, 0x61, 0x75, 0x74, 0x68, 0x3a, 0xe4, 0x02, 0xba, 0x48, 0xe0, 0x02, 0x1a, 0xdd, 0x02, 0x0a, - 0x1b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x1a, 0x91, 0x02, 0x5b, 0x20, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x74, - 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, - 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x5d, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x61, 0x2c, - 0x20, 0x21, 0x61, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, - 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x28, 0x29, 0x22, 0xda, 0x04, 0x0a, - 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, + 0x67, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb4, 0x08, 0x0a, 0x11, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x09, + 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x73, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x09, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x07, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x65, 0x72, 0x74, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, + 0x12, 0x30, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x6b, 0x65, 0x79, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x72, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x04, 0x61, 0x75, + 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, 0x8a, + 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x3a, 0xe4, 0x02, 0xba, 0x48, + 0xe0, 0x02, 0x1a, 0xdd, 0x02, 0x0a, 0x1b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x12, 0x2a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x1a, 0x91, + 0x02, 0x5b, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, - 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, - 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, - 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, - 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, - 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x39, 0x30, 0x39, - 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xfc, 0x01, 0x0a, 0x10, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0xca, 0x01, 0xba, 0x48, 0xc0, 0x01, 0xba, 0x01, 0x3c, 0x0a, 0x1d, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7e, 0x0a, 0x22, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, - 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, - 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, - 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, - 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, - 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, - 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xde, 0x04, 0x0a, 0x14, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, - 0xba, 0x48, 0x3a, 0xba, 0x01, 0x37, 0x0a, 0x18, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, - 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x30, 0x38, 0x30, + 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5d, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x28, 0x61, 0x2c, 0x20, 0x21, 0x61, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x28, 0x29, 0x22, 0xda, 0x04, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, + 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, + 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, + 0x2e, 0x30, 0x3a, 0x39, 0x30, 0x39, 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, + 0xfc, 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0xca, 0x01, 0xba, 0x48, 0xc0, + 0x01, 0xba, 0x01, 0x3c, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, + 0xba, 0x01, 0x7e, 0x0a, 0x22, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, + 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, + 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, + 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, + 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, + 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0xde, 0x04, 0x0a, 0x14, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, 0xba, 0x48, 0x3a, 0xba, 0x01, 0x37, 0x0a, 0x18, 0x6d, 0x67, - 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, + 0x6d, 0x74, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, - 0x3a, 0x31, 0x31, 0x30, 0x39, 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xf8, - 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc6, 0x01, 0xba, 0x48, 0xbc, 0x01, - 0xba, 0x01, 0x3a, 0x0a, 0x1b, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, - 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7c, - 0x0a, 0x20, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, - 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, - 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, - 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, - 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, - 0x28, 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, - 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, - 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xc0, 0x03, 0x0a, 0x0f, 0x52, - 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, + 0x3a, 0x31, 0x31, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3b, 0xba, - 0x01, 0x38, 0x0a, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, - 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x31, 0x39, 0x30, 0x48, 0x00, 0x52, - 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xfa, 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, - 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x42, 0xc8, 0x01, 0xba, 0x48, 0xbe, 0x01, 0xba, 0x01, 0x3b, 0x0a, 0x1c, 0x72, 0x65, 0x6c, 0x61, - 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, - 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7d, 0x0a, 0x21, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, 0xba, 0x48, 0x3a, 0xba, + 0x01, 0x37, 0x0a, 0x18, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, + 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x30, 0x39, 0x30, 0x48, 0x01, 0x52, 0x11, + 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x88, 0x01, 0x01, 0x12, 0xf8, 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0xc6, 0x01, 0xba, 0x48, 0xbc, 0x01, 0xba, 0x01, 0x3a, 0x0a, 0x1b, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, - 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, - 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, - 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, - 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x01, - 0x0a, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, - 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x68, - 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, - 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x38, 0x30, 0x38, - 0x36, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, - 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x90, 0x05, 0x0a, 0x13, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, 0x3f, 0xba, 0x01, 0x3c, 0x0a, 0x1d, 0x64, 0x61, 0x73, - 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, - 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x32, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, - 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x83, 0x02, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xd1, 0x01, - 0xba, 0x48, 0xc7, 0x01, 0xba, 0x01, 0x3f, 0x0a, 0x20, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, - 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x81, 0x01, 0x0a, 0x25, 0x64, 0x61, 0x73, 0x68, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x28, 0x29, 0xba, 0x01, 0x7c, 0x0a, 0x20, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, + 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, + 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, + 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, + 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x22, 0xc0, 0x03, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x51, 0xba, 0x48, 0x3b, 0xba, 0x01, 0x38, 0x0a, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, + 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, + 0x31, 0x39, 0x30, 0x48, 0x00, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xfa, 0x01, 0x0a, 0x10, + 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc8, 0x01, 0xba, 0x48, 0xbe, 0x01, 0xba, 0x01, 0x3b, + 0x0a, 0x1c, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7d, 0x0a, 0x21, + 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, @@ -2722,521 +2182,455 @@ var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDesc = [] 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, - 0x02, 0x68, 0x01, 0x48, 0x02, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x72, - 0x6f, 0x78, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5d, 0xba, 0x48, 0x5a, - 0x92, 0x01, 0x57, 0x22, 0x55, 0xba, 0x01, 0x52, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x6f, 0x72, 0x5f, - 0x63, 0x69, 0x64, 0x72, 0x12, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x20, 0x6f, 0x72, 0x20, 0x43, 0x49, 0x44, 0x52, 0x1a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, - 0x73, 0x49, 0x70, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, - 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x29, 0x52, 0x0e, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, - 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0xc9, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x12, - 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x06, 0x0a, 0x04, 0x45, 0x74, - 0x63, 0x64, 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x48, 0x0a, 0x04, 0x65, 0x74, 0x63, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x63, 0x64, 0x53, - 0x70, 0x65, 0x63, 0x42, 0x1f, 0xba, 0x48, 0x1c, 0xda, 0x01, 0x19, 0x0a, 0x04, 0x65, 0x74, 0x63, - 0x64, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, - 0x21, 0x3d, 0x20, 0x30, 0x52, 0x04, 0x65, 0x74, 0x63, 0x64, 0x12, 0x5c, 0x0a, 0x09, 0x6a, 0x65, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x42, 0x24, 0xba, 0x48, 0x21, 0xda, 0x01, 0x1e, 0x0a, - 0x09, 0x6a, 0x65, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x31, 0x52, 0x09, 0x6a, - 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0xb7, 0x01, 0xba, 0x48, 0xb3, 0x01, 0x1a, - 0xb0, 0x01, 0x0a, 0x1a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x12, 0x3d, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, - 0x76, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x1a, 0x53, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, - 0x30, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x74, - 0x63, 0x64, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, - 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x29, 0x29, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x66, - 0x0a, 0x08, 0x45, 0x74, 0x63, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, 0x0a, 0x09, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x11, 0xba, - 0x48, 0x0e, 0x92, 0x01, 0x0b, 0x08, 0x01, 0x18, 0x01, 0x22, 0x05, 0x72, 0x03, 0x90, 0x01, 0x01, - 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x63, - 0x65, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x22, 0x9f, 0x0b, 0x0a, 0x08, 0x4d, 0x54, 0x4c, 0x53, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, - 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, 0xba, - 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, + 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, + 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, + 0x2e, 0x30, 0x3a, 0x38, 0x30, 0x38, 0x36, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, + 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x90, 0x05, 0x0a, 0x13, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x88, 0x01, + 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, 0x3f, 0xba, 0x01, + 0x3c, 0x0a, 0x1d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, + 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x32, 0x30, 0x38, 0x30, + 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x83, 0x02, 0x0a, 0x10, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0xd1, 0x01, 0xba, 0x48, 0xc7, 0x01, 0xba, 0x01, 0x3f, 0x0a, 0x20, 0x64, + 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, + 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x81, 0x01, + 0x0a, 0x25, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, + 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, + 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x68, 0x01, 0x48, 0x02, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x5d, 0xba, 0x48, 0x5a, 0x92, 0x01, 0x57, 0x22, 0x55, 0xba, 0x01, 0x52, 0x0a, 0x0a, + 0x69, 0x70, 0x5f, 0x6f, 0x72, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x12, 0x22, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x43, 0x49, 0x44, 0x52, 0x1a, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x29, + 0x52, 0x0e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc9, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x12, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, + 0x0c, 0x06, 0x0a, 0x04, 0x45, 0x74, 0x63, 0x64, 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x04, 0x65, 0x74, 0x63, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x74, 0x63, 0x64, 0x53, 0x70, 0x65, 0x63, 0x42, 0x1f, 0xba, 0x48, 0x1c, 0xda, 0x01, + 0x19, 0x0a, 0x04, 0x65, 0x74, 0x63, 0x64, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x04, 0x65, 0x74, 0x63, 0x64, + 0x12, 0x5c, 0x0a, 0x09, 0x6a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x42, 0x24, 0xba, + 0x48, 0x21, 0xda, 0x01, 0x1e, 0x0a, 0x09, 0x6a, 0x65, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, + 0x3d, 0x20, 0x31, 0x52, 0x09, 0x6a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0xb7, + 0x01, 0xba, 0x48, 0xb3, 0x01, 0x1a, 0xb0, 0x01, 0x0a, 0x1a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x65, 0x64, 0x12, 0x3d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x65, 0x74, 0x1a, 0x53, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x74, 0x63, 0x64, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, + 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x65, 0x74, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x29, 0x29, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x66, 0x0a, 0x08, 0x45, 0x74, 0x63, 0x64, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x2f, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x42, 0x11, 0xba, 0x48, 0x0e, 0x92, 0x01, 0x0b, 0x08, 0x01, 0x18, 0x01, 0x22, + 0x05, 0x72, 0x03, 0x90, 0x01, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x54, 0x4c, + 0x53, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x22, 0x9f, 0x0b, 0x0a, + 0x08, 0x4d, 0x54, 0x4c, 0x53, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x43, 0x41, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x35, 0xba, 0x48, 0x2c, 0xba, 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, + 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, 0xba, 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x64, 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x37, 0xba, 0x48, 0x2e, 0xba, 0x01, 0x2b, + 0x0a, 0x15, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, - 0x01, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, - 0x61, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x41, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, - 0xba, 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, - 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, - 0x18, 0x01, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, - 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0a, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x64, 0x0a, 0x0e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x37, 0xba, 0x48, 0x2e, 0xba, 0x01, 0x2b, 0x0a, 0x15, 0x78, 0x35, 0x30, 0x39, - 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x05, 0x52, 0x0e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, - 0x12, 0x21, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, - 0x88, 0x01, 0x01, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0xba, 0x48, 0x2b, 0xba, - 0x01, 0x28, 0x0a, 0x13, 0x70, 0x65, 0x6d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x65, - 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, - 0x48, 0x07, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, - 0x61, 0x88, 0x01, 0x01, 0x3a, 0x83, 0x06, 0xba, 0x48, 0xff, 0x05, 0x1a, 0x8e, 0x01, 0x0a, 0x22, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, - 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x2f, 0x21, 0x28, 0x68, - 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, - 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x8e, 0x01, 0x0a, - 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, - 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x41, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, - 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x2f, 0x21, 0x28, - 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x41, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x98, 0x01, - 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, - 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, - 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x93, 0x01, 0x0a, 0x23, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x6b, 0x65, 0x79, - 0x12, 0x39, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, - 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, - 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x31, 0x21, 0x28, 0x68, - 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, - 0x79, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0xa9, - 0x01, 0x0a, 0x19, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x1a, 0x8b, 0x01, 0x28, - 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, - 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x28, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, - 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, - 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8c, 0x01, 0x0a, 0x0d, 0x4a, 0x65, 0x74, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, - 0x08, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x90, 0x01, 0x01, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x0c, 0x6e, 0x6b, 0x65, 0x79, - 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x01, 0x52, 0x0c, 0x6e, 0x6b, 0x65, 0x79, 0x53, 0x65, - 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x6b, 0x65, 0x79, 0x53, - 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x22, 0xe4, 0x08, 0x0a, 0x09, 0x43, 0x65, 0x72, 0x74, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x58, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xba, 0x48, 0x2a, 0xba, 0x01, 0x27, 0x0a, 0x11, - 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x01, 0x52, 0x0a, 0x63, - 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x02, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x67, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x38, 0xba, 0x48, - 0x2f, 0xba, 0x01, 0x2c, 0x0a, 0x16, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, - 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x04, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x88, 0x01, - 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, 0xba, 0x01, - 0x29, 0x0a, 0x14, 0x70, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x65, - 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, - 0x48, 0x05, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x88, 0x01, 0x01, 0x3a, 0xe6, 0x04, 0xba, 0x48, 0xe2, 0x04, 0x1a, 0x80, 0x01, 0x0a, - 0x1c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, - 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x12, 0x33, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x01, 0x48, 0x05, 0x52, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x09, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x34, 0xba, 0x48, 0x2b, 0xba, 0x01, 0x28, 0x0a, 0x13, 0x70, 0x65, 0x6d, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x70, 0x65, 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, + 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x07, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x3a, 0x83, 0x06, 0xba, 0x48, 0xff, + 0x05, 0x1a, 0x8e, 0x01, 0x0a, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, + 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, + 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x1a, 0x2f, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, + 0x29, 0x29, 0x1a, 0x8e, 0x01, 0x0a, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, + 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x76, 0x65, 0x1a, 0x2b, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x61, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, - 0x9d, 0x01, 0x0a, 0x25, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, - 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3d, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x35, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, - 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, - 0x98, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, - 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x29, 0x20, 0x26, 0x26, - 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0xa1, 0x01, 0x0a, 0x13, 0x78, - 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x1a, 0x89, 0x01, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, - 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, - 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x76, 0x65, 0x1a, 0x2f, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, + 0x61, 0x29, 0x29, 0x1a, 0x98, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, + 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3b, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, + 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x93, + 0x01, 0x0a, 0x23, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, + 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, + 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x1a, 0x31, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x29, 0x29, 0x1a, 0xa9, 0x01, 0x0a, 0x19, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x1a, 0x8b, 0x01, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, 0x26, + 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, 0x30, 0x39, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x28, 0x78, 0x35, 0x30, - 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, - 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x42, 0x11, 0x0a, 0x0f, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x22, 0xd4, - 0x02, 0x0a, 0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x38, - 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x17, 0x0a, 0x15, 0x2f, 0x76, 0x61, 0x72, 0x2f, 0x6c, 0x69, - 0x62, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x48, 0x00, - 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x3a, 0xa2, 0x01, 0xba, 0x48, 0x9e, 0x01, 0x1a, - 0x9b, 0x01, 0x0a, 0x12, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x73, 0x5f, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x3d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x64, 0x69, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x64, - 0x69, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x61, 0x6d, 0x65, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x3f, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x06, 0x0a, - 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6f, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, 0x52, 0x92, 0x01, 0x4f, - 0x22, 0x4d, 0xba, 0x01, 0x4a, 0x0a, 0x0e, 0x67, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x67, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x20, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x18, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x52, - 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x65, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x25, 0xba, 0x48, - 0x22, 0xda, 0x01, 0x1f, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, - 0x3d, 0x20, 0x30, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x5c, 0x0a, 0x13, 0x46, + 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8c, + 0x01, 0x0a, 0x0d, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x2c, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x90, 0x01, 0x01, 0x48, + 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, + 0x0a, 0x0c, 0x6e, 0x6b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x01, 0x52, 0x0c, + 0x6e, 0x6b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x6e, 0x6b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x22, 0xe4, 0x08, + 0x0a, 0x09, 0x43, 0x65, 0x72, 0x74, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x06, 0x63, + 0x61, 0x43, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x63, + 0x61, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xba, 0x48, + 0x2a, 0xba, 0x01, 0x27, 0x0a, 0x11, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, + 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, + 0x01, 0x48, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, + 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x67, 0x0a, 0x0f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x38, 0xba, 0x48, 0x2f, 0xba, 0x01, 0x2c, 0x0a, 0x16, 0x78, 0x35, 0x30, 0x39, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, + 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, + 0x67, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x35, 0xba, 0x48, 0x2c, 0xba, 0x01, 0x29, 0x0a, 0x14, 0x70, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x70, 0x65, 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, + 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x05, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, + 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x3a, 0xe6, 0x04, 0xba, 0x48, + 0xe2, 0x04, 0x1a, 0x80, 0x01, 0x0a, 0x1c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, + 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x61, 0x12, 0x33, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x61, 0x43, 0x65, + 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x2b, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, + 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x9d, 0x01, 0x0a, 0x25, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x63, 0x65, 0x72, 0x74, 0x12, + 0x3d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, + 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x35, + 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x98, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x6b, 0x65, 0x79, 0x12, 0x3b, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, + 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, + 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, + 0x65, 0x79, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, + 0x1a, 0xa1, 0x01, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x1a, 0x89, 0x01, 0x28, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3f, 0x20, + 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x72, + 0x6f, 0x6d, 0x28, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x42, 0x12, + 0x0a, 0x10, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, + 0x79, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x22, 0xd4, 0x02, 0x0a, 0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x38, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x21, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x17, 0x0a, 0x15, 0x2f, + 0x76, 0x61, 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x32, + 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x3a, 0xa2, + 0x01, 0xba, 0x48, 0x9e, 0x01, 0x1a, 0x9b, 0x01, 0x0a, 0x12, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x5f, 0x64, 0x69, 0x72, 0x73, 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x3d, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x64, 0x69, 0x72, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x1a, 0x46, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, + 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x64, 0x69, 0x72, + 0x20, 0x21, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x0d, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6f, 0x0a, + 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x55, + 0xba, 0x48, 0x52, 0x92, 0x01, 0x4f, 0x22, 0x4d, 0xba, 0x01, 0x4a, 0x0a, 0x0e, 0x67, 0x6f, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x67, 0x6f, 0x20, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x18, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x28, 0x29, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0xd0, + 0x01, 0x0a, 0x09, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x07, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x65, + 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x26, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x1c, 0x0a, 0x1a, 0x2f, 0x76, 0x61, - 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x48, 0x00, 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, - 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, 0x3f, 0x0a, 0x0b, 0x4b, 0x65, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x30, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x55, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x06, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x06, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x01, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x11, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x5a, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, - 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, - 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, - 0x48, 0x00, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, - 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, - 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x06, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x22, 0xd4, 0x01, 0x0a, 0x12, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x57, 0x0a, 0x06, 0x64, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x42, 0x14, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x08, 0x0a, 0x06, - 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x22, - 0x1e, 0x0a, 0x06, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6f, - 0x70, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x10, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0x7c, 0x0a, 0x17, 0x42, 0x69, - 0x6e, 0x61, 0x72, 0x79, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x42, 0x12, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x06, - 0x0a, 0x04, 0x5a, 0x73, 0x74, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x45, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0xbe, 0x02, 0x0a, 0x1a, 0x4b, 0x75, 0x62, - 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x72, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, - 0x0c, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, - 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x72, 0x65, - 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x88, 0x01, 0x01, 0x22, 0x29, 0x0a, - 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x70, - 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x10, 0x52, 0x61, 0x74, - 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, - 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x42, 0x0a, 0x8a, 0xc0, 0x0c, - 0x06, 0x0a, 0x04, 0x31, 0x30, 0x2e, 0x30, 0x48, 0x00, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x23, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x42, 0x08, 0x8a, 0xc0, 0x0c, 0x04, 0x0a, 0x02, 0x35, 0x30, 0x48, 0x01, 0x52, 0x05, 0x62, - 0x75, 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x22, 0xa0, 0x02, 0x0a, 0x08, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4a, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x13, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, - 0xc0, 0x0c, 0x07, 0x0a, 0x05, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x05, 0x62, 0x61, 0x73, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x20, 0xba, 0x48, - 0x1d, 0xda, 0x01, 0x1a, 0x0a, 0x05, 0x62, 0x61, 0x73, 0x69, 0x63, 0x1a, 0x11, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x05, - 0x62, 0x61, 0x73, 0x69, 0x63, 0x12, 0x54, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, - 0x42, 0x21, 0xba, 0x48, 0x1e, 0xda, 0x01, 0x1b, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, - 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, - 0x3d, 0x20, 0x31, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x22, 0x20, 0x0a, 0x07, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x61, 0x73, 0x69, 0x63, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x10, 0x01, 0x22, 0x83, 0x04, - 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x15, 0xba, 0x48, 0x12, 0xc8, 0x01, 0x01, 0x72, 0x0d, 0x3a, 0x08, 0x68, 0x74, 0x74, 0x70, - 0x73, 0x3a, 0x2f, 0x2f, 0x90, 0x01, 0x01, 0x48, 0x00, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0xba, 0x48, 0x33, 0xba, 0x01, 0x30, - 0x0a, 0x1a, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, - 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, - 0x48, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, - 0x01, 0x12, 0x27, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x02, 0x52, 0x08, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0c, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, - 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x40, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, - 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x05, 0x0a, 0x03, 0x73, 0x75, 0x62, 0x48, 0x04, 0x52, 0x10, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, - 0x88, 0x01, 0x01, 0x12, 0x71, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, 0x56, 0xba, 0x01, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x12, 0x1a, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x27, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0x17, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28, 0x27, 0x6f, 0x70, - 0x65, 0x6e, 0x69, 0x64, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x92, 0x01, 0x02, 0x18, 0x01, 0x52, 0x06, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x0f, 0x0a, - 0x0d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x13, - 0x0a, 0x11, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x22, 0x0f, 0x0a, 0x0d, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, - 0x53, 0x70, 0x65, 0x63, 0x22, 0x3e, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x22, 0xb6, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x92, 0xc0, 0x0c, 0x02, 0x10, 0x01, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, - 0x6b, 0x12, 0x3a, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, - 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb1, 0x02, - 0x0a, 0x0d, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, - 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, - 0x6b, 0x22, 0xc8, 0x01, 0x0a, 0x0e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x49, 0x0a, 0x0f, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x36, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2a, 0x29, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x74, 0x63, - 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x10, 0x01, 0x2a, 0x23, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x73, 0x64, 0x69, 0x66, 0x66, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x5a, 0x73, 0x74, 0x64, 0x10, 0x01, 0x2a, 0x1e, 0x0a, 0x0c, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x10, 0x00, 0x32, 0xe6, 0x06, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x64, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x22, 0x13, 0x82, 0xc0, 0x0c, 0x0f, - 0x8a, 0xc0, 0x0c, 0x0b, 0x67, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, - 0x61, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0x82, 0xc0, 0x0c, 0x13, 0x8a, - 0xc0, 0x0c, 0x0b, 0x73, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xb0, 0xc0, - 0x0c, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, - 0x74, 0x69, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x22, 0x0b, 0x82, 0xc0, - 0x0c, 0x07, 0x8a, 0xc0, 0x0c, 0x03, 0x67, 0x65, 0x74, 0x12, 0x52, 0x0a, 0x10, 0x53, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0x82, 0xc0, - 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, 0x03, 0x73, 0x65, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x62, 0x0a, - 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xc0, 0x0c, 0x11, - 0x8a, 0xc0, 0x0c, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x58, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x11, 0x82, 0xc0, 0x0c, 0x0d, 0x8a, 0xc0, - 0x0c, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x47, 0x0a, 0x06, 0x44, - 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x82, 0xc0, 0x0c, 0x04, - 0xa0, 0xc0, 0x0c, 0x01, 0x12, 0x6c, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x64, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0f, 0x82, 0xc0, 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x0d, 0x82, 0xc0, 0x0c, 0x09, 0x8a, 0xc0, 0x0c, 0x05, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, - 0x1a, 0x0e, 0x82, 0xc0, 0x0c, 0x0a, 0x8a, 0xc0, 0x0c, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x42, 0x36, 0x82, 0xc0, 0x0c, 0x02, 0x08, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, - 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x3b, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x63, 0x42, 0x25, 0xba, 0x48, 0x22, 0xda, 0x01, 0x1f, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x22, 0x5c, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, + 0x1c, 0x0a, 0x1a, 0x2f, 0x76, 0x61, 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x6f, 0x70, 0x6e, 0x69, + 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x48, 0x00, 0x52, + 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, + 0x3f, 0x0a, 0x0b, 0x4b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x30, + 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x18, 0x01, + 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, 0x73, + 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x39, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, + 0x00, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x07, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x01, 0x52, 0x07, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5a, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x18, 0xba, 0x48, + 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, + 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x06, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0xd4, 0x01, 0x0a, 0x12, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x57, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x14, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x8a, 0xc0, 0x0c, 0x08, 0x0a, 0x06, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, + 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x06, 0x62, 0x69, 0x6e, + 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x62, + 0x69, 0x6e, 0x61, 0x72, 0x79, 0x22, 0x1e, 0x0a, 0x06, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x69, 0x6e, + 0x61, 0x72, 0x79, 0x10, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x22, 0x7c, 0x0a, 0x17, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x0b, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, + 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x12, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x06, 0x0a, 0x04, 0x5a, 0x73, 0x74, 0x64, 0x48, 0x00, 0x52, 0x0b, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0xbe, + 0x02, 0x0a, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x78, 0x0a, + 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, + 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x72, 0x65, + 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x02, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x88, 0x01, 0x01, 0x22, 0x29, 0x0a, 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, + 0x6f, 0x0a, 0x10, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x01, 0x42, 0x0a, 0x8a, 0xc0, 0x0c, 0x06, 0x0a, 0x04, 0x31, 0x30, 0x2e, 0x30, 0x48, 0x00, 0x52, + 0x04, 0x72, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x08, 0x8a, 0xc0, 0x0c, 0x04, 0x0a, 0x02, 0x35, + 0x30, 0x48, 0x01, 0x52, 0x05, 0x62, 0x75, 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, + 0x05, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, + 0x22, 0xa0, 0x02, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4a, 0x0a, + 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x13, 0xba, 0x48, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x07, 0x0a, 0x05, 0x42, 0x61, 0x73, 0x69, 0x63, + 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x05, 0x62, 0x61, 0x73, + 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, + 0x65, 0x63, 0x42, 0x20, 0xba, 0x48, 0x1d, 0xda, 0x01, 0x1a, 0x0a, 0x05, 0x62, 0x61, 0x73, 0x69, + 0x63, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x52, 0x05, 0x62, 0x61, 0x73, 0x69, 0x63, 0x12, 0x54, 0x0a, 0x06, 0x6f, + 0x70, 0x65, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x41, 0x75, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x21, 0xba, 0x48, 0x1e, 0xda, 0x01, 0x1b, 0x0a, 0x06, + 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x31, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, + 0x64, 0x22, 0x20, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, + 0x42, 0x61, 0x73, 0x69, 0x63, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x44, 0x10, 0x01, 0x22, 0x83, 0x04, 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x41, 0x75, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xba, 0x48, 0x12, 0xc8, 0x01, 0x01, 0x72, 0x0d, + 0x3a, 0x08, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x90, 0x01, 0x01, 0x48, 0x00, 0x52, + 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x63, 0x61, + 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, + 0xba, 0x48, 0x33, 0xba, 0x01, 0x30, 0x0a, 0x1a, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x5f, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x48, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x48, 0x02, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, + 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0f, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x05, 0x0a, 0x03, 0x73, + 0x75, 0x62, 0x48, 0x04, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, + 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x71, 0x0a, 0x06, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, 0x56, 0xba, 0x01, + 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x69, + 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1a, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, + 0x27, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x1a, 0x17, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x28, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x92, + 0x01, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x22, 0x0f, 0x0a, 0x0d, 0x42, 0x61, 0x73, + 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x2a, 0x29, 0x0a, 0x0e, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, + 0x45, 0x74, 0x63, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x10, 0x01, 0x2a, 0x23, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x73, 0x64, 0x69, 0x66, 0x66, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x73, 0x74, 0x64, 0x10, 0x01, 0x2a, 0x1e, 0x0a, 0x0c, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x10, 0x00, 0x42, 0x38, 0x82, 0xc0, 0x0c, 0x04, + 0x08, 0x01, 0x18, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3252,130 +2646,80 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP } var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes = make([]protoimpl.MessageInfo, 33) +var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_goTypes = []interface{}{ - (StorageBackend)(0), // 0: config.v1.StorageBackend - (PatchEngine)(0), // 1: config.v1.PatchEngine - (CacheBackend)(0), // 2: config.v1.CacheBackend - (AgentUpgradesSpec_Driver)(0), // 3: config.v1.AgentUpgradesSpec.Driver - (PluginUpgradesSpec_Driver)(0), // 4: config.v1.PluginUpgradesSpec.Driver - (KubernetesAgentUpgradeSpec_ImageResolver)(0), // 5: config.v1.KubernetesAgentUpgradeSpec.ImageResolver - (AuthSpec_Backend)(0), // 6: config.v1.AuthSpec.Backend - (*ReactiveWatchRequest)(nil), // 7: config.v1.ReactiveWatchRequest - (*ReactiveEvents)(nil), // 8: config.v1.ReactiveEvents - (*ReactiveEvent)(nil), // 9: config.v1.ReactiveEvent - (*GatewayConfigSpec)(nil), // 10: config.v1.GatewayConfigSpec - (*ServerSpec)(nil), // 11: config.v1.ServerSpec - (*ManagementServerSpec)(nil), // 12: config.v1.ManagementServerSpec - (*RelayServerSpec)(nil), // 13: config.v1.RelayServerSpec - (*HealthServerSpec)(nil), // 14: config.v1.HealthServerSpec - (*DashboardServerSpec)(nil), // 15: config.v1.DashboardServerSpec - (*StorageSpec)(nil), // 16: config.v1.StorageSpec - (*EtcdSpec)(nil), // 17: config.v1.EtcdSpec - (*MTLSSpec)(nil), // 18: config.v1.MTLSSpec - (*JetStreamSpec)(nil), // 19: config.v1.JetStreamSpec - (*CertsSpec)(nil), // 20: config.v1.CertsSpec - (*PluginsSpec)(nil), // 21: config.v1.PluginsSpec - (*PluginFilters)(nil), // 22: config.v1.PluginFilters - (*CacheSpec)(nil), // 23: config.v1.CacheSpec - (*FilesystemCacheSpec)(nil), // 24: config.v1.FilesystemCacheSpec - (*KeyringSpec)(nil), // 25: config.v1.KeyringSpec - (*UpgradesSpec)(nil), // 26: config.v1.UpgradesSpec - (*AgentUpgradesSpec)(nil), // 27: config.v1.AgentUpgradesSpec - (*PluginUpgradesSpec)(nil), // 28: config.v1.PluginUpgradesSpec - (*BinaryPluginUpgradeSpec)(nil), // 29: config.v1.BinaryPluginUpgradeSpec - (*KubernetesAgentUpgradeSpec)(nil), // 30: config.v1.KubernetesAgentUpgradeSpec - (*RateLimitingSpec)(nil), // 31: config.v1.RateLimitingSpec - (*AuthSpec)(nil), // 32: config.v1.AuthSpec - (*OpenIDAuthSpec)(nil), // 33: config.v1.OpenIDAuthSpec - (*BasicAuthSpec)(nil), // 34: config.v1.BasicAuthSpec - (*SetRequest)(nil), // 35: config.v1.SetRequest - (*ResetRequest)(nil), // 36: config.v1.ResetRequest - (*DryRunRequest)(nil), // 37: config.v1.DryRunRequest - (*DryRunResponse)(nil), // 38: config.v1.DryRunResponse - (*HistoryResponse)(nil), // 39: config.v1.HistoryResponse - (*v1.Value)(nil), // 40: core.Value - (*v1.Revision)(nil), // 41: core.Revision - (*fieldmaskpb.FieldMask)(nil), // 42: google.protobuf.FieldMask - (driverutil.Target)(0), // 43: driverutil.Target - (driverutil.Action)(0), // 44: driverutil.Action - (*validate.Violations)(nil), // 45: buf.validate.Violations - (*driverutil.GetRequest)(nil), // 46: driverutil.GetRequest - (*emptypb.Empty)(nil), // 47: google.protobuf.Empty - (*driverutil.ConfigurationHistoryRequest)(nil), // 48: driverutil.ConfigurationHistoryRequest + (StorageBackend)(0), // 0: config.v1.StorageBackend + (PatchEngine)(0), // 1: config.v1.PatchEngine + (CacheBackend)(0), // 2: config.v1.CacheBackend + (AgentUpgradesSpec_Driver)(0), // 3: config.v1.AgentUpgradesSpec.Driver + (PluginUpgradesSpec_Driver)(0), // 4: config.v1.PluginUpgradesSpec.Driver + (KubernetesAgentUpgradeSpec_ImageResolver)(0), // 5: config.v1.KubernetesAgentUpgradeSpec.ImageResolver + (AuthSpec_Backend)(0), // 6: config.v1.AuthSpec.Backend + (*GatewayConfigSpec)(nil), // 7: config.v1.GatewayConfigSpec + (*ServerSpec)(nil), // 8: config.v1.ServerSpec + (*ManagementServerSpec)(nil), // 9: config.v1.ManagementServerSpec + (*RelayServerSpec)(nil), // 10: config.v1.RelayServerSpec + (*HealthServerSpec)(nil), // 11: config.v1.HealthServerSpec + (*DashboardServerSpec)(nil), // 12: config.v1.DashboardServerSpec + (*StorageSpec)(nil), // 13: config.v1.StorageSpec + (*EtcdSpec)(nil), // 14: config.v1.EtcdSpec + (*MTLSSpec)(nil), // 15: config.v1.MTLSSpec + (*JetStreamSpec)(nil), // 16: config.v1.JetStreamSpec + (*CertsSpec)(nil), // 17: config.v1.CertsSpec + (*PluginsSpec)(nil), // 18: config.v1.PluginsSpec + (*PluginFilters)(nil), // 19: config.v1.PluginFilters + (*CacheSpec)(nil), // 20: config.v1.CacheSpec + (*FilesystemCacheSpec)(nil), // 21: config.v1.FilesystemCacheSpec + (*KeyringSpec)(nil), // 22: config.v1.KeyringSpec + (*UpgradesSpec)(nil), // 23: config.v1.UpgradesSpec + (*AgentUpgradesSpec)(nil), // 24: config.v1.AgentUpgradesSpec + (*PluginUpgradesSpec)(nil), // 25: config.v1.PluginUpgradesSpec + (*BinaryPluginUpgradeSpec)(nil), // 26: config.v1.BinaryPluginUpgradeSpec + (*KubernetesAgentUpgradeSpec)(nil), // 27: config.v1.KubernetesAgentUpgradeSpec + (*RateLimitingSpec)(nil), // 28: config.v1.RateLimitingSpec + (*AuthSpec)(nil), // 29: config.v1.AuthSpec + (*OpenIDAuthSpec)(nil), // 30: config.v1.OpenIDAuthSpec + (*BasicAuthSpec)(nil), // 31: config.v1.BasicAuthSpec + (*v1.Revision)(nil), // 32: core.Revision } var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_depIdxs = []int32{ - 9, // 0: config.v1.ReactiveEvents.items:type_name -> config.v1.ReactiveEvent - 40, // 1: config.v1.ReactiveEvent.value:type_name -> core.Value - 41, // 2: config.v1.GatewayConfigSpec.revision:type_name -> core.Revision - 11, // 3: config.v1.GatewayConfigSpec.server:type_name -> config.v1.ServerSpec - 12, // 4: config.v1.GatewayConfigSpec.management:type_name -> config.v1.ManagementServerSpec - 13, // 5: config.v1.GatewayConfigSpec.relay:type_name -> config.v1.RelayServerSpec - 14, // 6: config.v1.GatewayConfigSpec.health:type_name -> config.v1.HealthServerSpec - 15, // 7: config.v1.GatewayConfigSpec.dashboard:type_name -> config.v1.DashboardServerSpec - 16, // 8: config.v1.GatewayConfigSpec.storage:type_name -> config.v1.StorageSpec - 20, // 9: config.v1.GatewayConfigSpec.certs:type_name -> config.v1.CertsSpec - 21, // 10: config.v1.GatewayConfigSpec.plugins:type_name -> config.v1.PluginsSpec - 25, // 11: config.v1.GatewayConfigSpec.keyring:type_name -> config.v1.KeyringSpec - 26, // 12: config.v1.GatewayConfigSpec.upgrades:type_name -> config.v1.UpgradesSpec - 31, // 13: config.v1.GatewayConfigSpec.rateLimiting:type_name -> config.v1.RateLimitingSpec - 32, // 14: config.v1.GatewayConfigSpec.auth:type_name -> config.v1.AuthSpec - 0, // 15: config.v1.StorageSpec.backend:type_name -> config.v1.StorageBackend - 17, // 16: config.v1.StorageSpec.etcd:type_name -> config.v1.EtcdSpec - 19, // 17: config.v1.StorageSpec.jetStream:type_name -> config.v1.JetStreamSpec - 18, // 18: config.v1.EtcdSpec.certs:type_name -> config.v1.MTLSSpec - 22, // 19: config.v1.PluginsSpec.filters:type_name -> config.v1.PluginFilters - 23, // 20: config.v1.PluginsSpec.cache:type_name -> config.v1.CacheSpec - 2, // 21: config.v1.CacheSpec.backend:type_name -> config.v1.CacheBackend - 24, // 22: config.v1.CacheSpec.filesystem:type_name -> config.v1.FilesystemCacheSpec - 27, // 23: config.v1.UpgradesSpec.agents:type_name -> config.v1.AgentUpgradesSpec - 28, // 24: config.v1.UpgradesSpec.plugins:type_name -> config.v1.PluginUpgradesSpec - 3, // 25: config.v1.AgentUpgradesSpec.driver:type_name -> config.v1.AgentUpgradesSpec.Driver - 30, // 26: config.v1.AgentUpgradesSpec.kubernetes:type_name -> config.v1.KubernetesAgentUpgradeSpec - 4, // 27: config.v1.PluginUpgradesSpec.driver:type_name -> config.v1.PluginUpgradesSpec.Driver - 29, // 28: config.v1.PluginUpgradesSpec.binary:type_name -> config.v1.BinaryPluginUpgradeSpec - 1, // 29: config.v1.BinaryPluginUpgradeSpec.patchEngine:type_name -> config.v1.PatchEngine - 5, // 30: config.v1.KubernetesAgentUpgradeSpec.imageResolver:type_name -> config.v1.KubernetesAgentUpgradeSpec.ImageResolver - 6, // 31: config.v1.AuthSpec.backend:type_name -> config.v1.AuthSpec.Backend - 34, // 32: config.v1.AuthSpec.basic:type_name -> config.v1.BasicAuthSpec - 33, // 33: config.v1.AuthSpec.openid:type_name -> config.v1.OpenIDAuthSpec - 10, // 34: config.v1.SetRequest.spec:type_name -> config.v1.GatewayConfigSpec - 41, // 35: config.v1.ResetRequest.revision:type_name -> core.Revision - 42, // 36: config.v1.ResetRequest.mask:type_name -> google.protobuf.FieldMask - 10, // 37: config.v1.ResetRequest.patch:type_name -> config.v1.GatewayConfigSpec - 43, // 38: config.v1.DryRunRequest.target:type_name -> driverutil.Target - 44, // 39: config.v1.DryRunRequest.action:type_name -> driverutil.Action - 10, // 40: config.v1.DryRunRequest.spec:type_name -> config.v1.GatewayConfigSpec - 41, // 41: config.v1.DryRunRequest.revision:type_name -> core.Revision - 10, // 42: config.v1.DryRunRequest.patch:type_name -> config.v1.GatewayConfigSpec - 42, // 43: config.v1.DryRunRequest.mask:type_name -> google.protobuf.FieldMask - 10, // 44: config.v1.DryRunResponse.current:type_name -> config.v1.GatewayConfigSpec - 10, // 45: config.v1.DryRunResponse.modified:type_name -> config.v1.GatewayConfigSpec - 45, // 46: config.v1.DryRunResponse.validationErrors:type_name -> buf.validate.Violations - 10, // 47: config.v1.HistoryResponse.entries:type_name -> config.v1.GatewayConfigSpec - 46, // 48: config.v1.GatewayConfig.GetDefaultConfiguration:input_type -> driverutil.GetRequest - 35, // 49: config.v1.GatewayConfig.SetDefaultConfiguration:input_type -> config.v1.SetRequest - 46, // 50: config.v1.GatewayConfig.GetConfiguration:input_type -> driverutil.GetRequest - 35, // 51: config.v1.GatewayConfig.SetConfiguration:input_type -> config.v1.SetRequest - 47, // 52: config.v1.GatewayConfig.ResetDefaultConfiguration:input_type -> google.protobuf.Empty - 36, // 53: config.v1.GatewayConfig.ResetConfiguration:input_type -> config.v1.ResetRequest - 37, // 54: config.v1.GatewayConfig.DryRun:input_type -> config.v1.DryRunRequest - 48, // 55: config.v1.GatewayConfig.ConfigurationHistory:input_type -> driverutil.ConfigurationHistoryRequest - 7, // 56: config.v1.GatewayConfig.WatchReactive:input_type -> config.v1.ReactiveWatchRequest - 10, // 57: config.v1.GatewayConfig.GetDefaultConfiguration:output_type -> config.v1.GatewayConfigSpec - 47, // 58: config.v1.GatewayConfig.SetDefaultConfiguration:output_type -> google.protobuf.Empty - 10, // 59: config.v1.GatewayConfig.GetConfiguration:output_type -> config.v1.GatewayConfigSpec - 47, // 60: config.v1.GatewayConfig.SetConfiguration:output_type -> google.protobuf.Empty - 47, // 61: config.v1.GatewayConfig.ResetDefaultConfiguration:output_type -> google.protobuf.Empty - 47, // 62: config.v1.GatewayConfig.ResetConfiguration:output_type -> google.protobuf.Empty - 38, // 63: config.v1.GatewayConfig.DryRun:output_type -> config.v1.DryRunResponse - 39, // 64: config.v1.GatewayConfig.ConfigurationHistory:output_type -> config.v1.HistoryResponse - 8, // 65: config.v1.GatewayConfig.WatchReactive:output_type -> config.v1.ReactiveEvents - 57, // [57:66] is the sub-list for method output_type - 48, // [48:57] is the sub-list for method input_type - 48, // [48:48] is the sub-list for extension type_name - 48, // [48:48] is the sub-list for extension extendee - 0, // [0:48] is the sub-list for field type_name + 32, // 0: config.v1.GatewayConfigSpec.revision:type_name -> core.Revision + 8, // 1: config.v1.GatewayConfigSpec.server:type_name -> config.v1.ServerSpec + 9, // 2: config.v1.GatewayConfigSpec.management:type_name -> config.v1.ManagementServerSpec + 10, // 3: config.v1.GatewayConfigSpec.relay:type_name -> config.v1.RelayServerSpec + 11, // 4: config.v1.GatewayConfigSpec.health:type_name -> config.v1.HealthServerSpec + 12, // 5: config.v1.GatewayConfigSpec.dashboard:type_name -> config.v1.DashboardServerSpec + 13, // 6: config.v1.GatewayConfigSpec.storage:type_name -> config.v1.StorageSpec + 17, // 7: config.v1.GatewayConfigSpec.certs:type_name -> config.v1.CertsSpec + 18, // 8: config.v1.GatewayConfigSpec.plugins:type_name -> config.v1.PluginsSpec + 22, // 9: config.v1.GatewayConfigSpec.keyring:type_name -> config.v1.KeyringSpec + 23, // 10: config.v1.GatewayConfigSpec.upgrades:type_name -> config.v1.UpgradesSpec + 28, // 11: config.v1.GatewayConfigSpec.rateLimiting:type_name -> config.v1.RateLimitingSpec + 29, // 12: config.v1.GatewayConfigSpec.auth:type_name -> config.v1.AuthSpec + 0, // 13: config.v1.StorageSpec.backend:type_name -> config.v1.StorageBackend + 14, // 14: config.v1.StorageSpec.etcd:type_name -> config.v1.EtcdSpec + 16, // 15: config.v1.StorageSpec.jetStream:type_name -> config.v1.JetStreamSpec + 15, // 16: config.v1.EtcdSpec.certs:type_name -> config.v1.MTLSSpec + 19, // 17: config.v1.PluginsSpec.filters:type_name -> config.v1.PluginFilters + 20, // 18: config.v1.PluginsSpec.cache:type_name -> config.v1.CacheSpec + 2, // 19: config.v1.CacheSpec.backend:type_name -> config.v1.CacheBackend + 21, // 20: config.v1.CacheSpec.filesystem:type_name -> config.v1.FilesystemCacheSpec + 24, // 21: config.v1.UpgradesSpec.agents:type_name -> config.v1.AgentUpgradesSpec + 25, // 22: config.v1.UpgradesSpec.plugins:type_name -> config.v1.PluginUpgradesSpec + 3, // 23: config.v1.AgentUpgradesSpec.driver:type_name -> config.v1.AgentUpgradesSpec.Driver + 27, // 24: config.v1.AgentUpgradesSpec.kubernetes:type_name -> config.v1.KubernetesAgentUpgradeSpec + 4, // 25: config.v1.PluginUpgradesSpec.driver:type_name -> config.v1.PluginUpgradesSpec.Driver + 26, // 26: config.v1.PluginUpgradesSpec.binary:type_name -> config.v1.BinaryPluginUpgradeSpec + 1, // 27: config.v1.BinaryPluginUpgradeSpec.patchEngine:type_name -> config.v1.PatchEngine + 5, // 28: config.v1.KubernetesAgentUpgradeSpec.imageResolver:type_name -> config.v1.KubernetesAgentUpgradeSpec.ImageResolver + 6, // 29: config.v1.AuthSpec.backend:type_name -> config.v1.AuthSpec.Backend + 31, // 30: config.v1.AuthSpec.basic:type_name -> config.v1.BasicAuthSpec + 30, // 31: config.v1.AuthSpec.openid:type_name -> config.v1.OpenIDAuthSpec + 32, // [32:32] is the sub-list for method output_type + 32, // [32:32] is the sub-list for method input_type + 32, // [32:32] is the sub-list for extension type_name + 32, // [32:32] is the sub-list for extension extendee + 0, // [0:32] is the sub-list for field type_name } func init() { file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() } @@ -3385,42 +2729,6 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } if !protoimpl.UnsafeEnabled { file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReactiveWatchRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReactiveEvents); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReactiveEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayConfigSpec); i { case 0: return &v.state @@ -3432,7 +2740,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerSpec); i { case 0: return &v.state @@ -3444,7 +2752,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ManagementServerSpec); i { case 0: return &v.state @@ -3456,7 +2764,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RelayServerSpec); i { case 0: return &v.state @@ -3468,7 +2776,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HealthServerSpec); i { case 0: return &v.state @@ -3480,7 +2788,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DashboardServerSpec); i { case 0: return &v.state @@ -3492,7 +2800,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StorageSpec); i { case 0: return &v.state @@ -3504,7 +2812,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EtcdSpec); i { case 0: return &v.state @@ -3516,7 +2824,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MTLSSpec); i { case 0: return &v.state @@ -3528,7 +2836,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JetStreamSpec); i { case 0: return &v.state @@ -3540,7 +2848,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CertsSpec); i { case 0: return &v.state @@ -3552,7 +2860,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PluginsSpec); i { case 0: return &v.state @@ -3564,7 +2872,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PluginFilters); i { case 0: return &v.state @@ -3576,7 +2884,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CacheSpec); i { case 0: return &v.state @@ -3588,7 +2896,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilesystemCacheSpec); i { case 0: return &v.state @@ -3600,7 +2908,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyringSpec); i { case 0: return &v.state @@ -3612,7 +2920,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpgradesSpec); i { case 0: return &v.state @@ -3624,7 +2932,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AgentUpgradesSpec); i { case 0: return &v.state @@ -3636,7 +2944,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PluginUpgradesSpec); i { case 0: return &v.state @@ -3648,7 +2956,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BinaryPluginUpgradeSpec); i { case 0: return &v.state @@ -3660,7 +2968,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KubernetesAgentUpgradeSpec); i { case 0: return &v.state @@ -3672,7 +2980,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RateLimitingSpec); i { case 0: return &v.state @@ -3684,7 +2992,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthSpec); i { case 0: return &v.state @@ -3696,7 +3004,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenIDAuthSpec); i { case 0: return &v.state @@ -3708,7 +3016,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BasicAuthSpec); i { case 0: return &v.state @@ -3720,95 +3028,35 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { return nil } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[29].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_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DryRunRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DryRunResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDesc, NumEnums: 7, - NumMessages: 33, + NumMessages: 25, NumExtensions: 0, - NumServices: 1, + NumServices: 0, }, GoTypes: file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_goTypes, DependencyIndexes: file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_depIdxs, diff --git a/pkg/config/v1/gateway_config.proto b/pkg/config/v1/gateway_config.proto index 5e8b854086..19dc3abef9 100644 --- a/pkg/config/v1/gateway_config.proto +++ b/pkg/config/v1/gateway_config.proto @@ -4,94 +4,14 @@ package config.v1; import "github.com/rancher/opni/internal/codegen/cli/cli.proto"; import "github.com/rancher/opni/pkg/apis/core/v1/core.proto"; -import "github.com/rancher/opni/pkg/plugins/driverutil/types.proto"; import "github.com/rancher/opni/pkg/validation/validate.proto"; -import "google/protobuf/any.proto"; -import "google/protobuf/empty.proto"; -import "google/protobuf/field_mask.proto"; -import "google/protobuf/struct.proto"; option go_package = "github.com/rancher/opni/pkg/config/v1;configv1"; option (cli.generator) = { - generate: true + generate: true + generate_flags_for_all_messages: true }; -// Gateway configuration management -service GatewayConfig { - option (cli.command_group) = { - use: "config" - }; - - rpc GetDefaultConfiguration(driverutil.GetRequest) returns (GatewayConfigSpec) { - option (cli.command) = { - use: "get-default" - }; - } - rpc SetDefaultConfiguration(SetRequest) returns (google.protobuf.Empty) { - option (cli.command) = { - use: "set-default" - granularity: EditMessage - }; - } - rpc GetConfiguration(driverutil.GetRequest) returns (GatewayConfigSpec) { - option (cli.command) = { - use: "get" - }; - } - rpc SetConfiguration(SetRequest) returns (google.protobuf.Empty) { - option (cli.command) = { - use: "set" - granularity: EditMessage - }; - } - rpc ResetDefaultConfiguration(google.protobuf.Empty) returns (google.protobuf.Empty) { - option (cli.command) = { - use: "reset-default" - }; - } - rpc ResetConfiguration(ResetRequest) returns (google.protobuf.Empty) { - option (cli.command) = { - use: "reset" - granularity: EditMessage - }; - } - rpc DryRun(DryRunRequest) returns (DryRunResponse) { - option (cli.command).skip = true; - } - rpc ConfigurationHistory(driverutil.ConfigurationHistoryRequest) returns (HistoryResponse) { - option (cli.command) = { - use: "history" - }; - } - rpc WatchReactive(ReactiveWatchRequest) returns (stream ReactiveEvents) { - option (cli.command) = { - use: "watch" - }; - } -} - -message ReactiveWatchRequest { - // If true, uses [reactive.Bind] to watch all paths at once. If false, - // each path recieves updates separately. - bool bind = 1; - - // List of paths to watch. - repeated string paths = 2; -} - -message ReactiveEvents { - // In bind mode, this will contain one item for each path in the request, - // in order. Otherwise, this will only contain a single item. - repeated ReactiveEvent items = 1; -} - -message ReactiveEvent { - // The path that triggered this event, as an index into the request path list. - int32 index = 1; - - core.Value value = 2; -} - message GatewayConfigSpec { option (buf.validate.message) = { cel: { @@ -115,7 +35,7 @@ message GatewayConfigSpec { RelayServerSpec relay = 4; HealthServerSpec health = 5; DashboardServerSpec dashboard = 6; - StorageSpec storage = 7; + StorageSpec storage = 7 [(cli.flag).skip = true]; CertsSpec certs = 8; PluginsSpec plugins = 9; KeyringSpec keyring = 10; @@ -725,34 +645,3 @@ message OpenIDAuthSpec { } message BasicAuthSpec {} - -message SetRequest { - GatewayConfigSpec spec = 1; -} - -message ResetRequest { - core.Revision revision = 1 [(cli.flag_set).no_prefix = true]; - google.protobuf.FieldMask mask = 2 [(cli.flag).skip = true]; - GatewayConfigSpec patch = 3 [(cli.flag).skip = true]; -} - -message DryRunRequest { - driverutil.Target target = 1; - driverutil.Action action = 2; - - GatewayConfigSpec spec = 3; // Set - - core.Revision revision = 4; // Reset - GatewayConfigSpec patch = 5; // Reset - google.protobuf.FieldMask mask = 6 [(cli.flag).skip = true]; // Reset -} - -message DryRunResponse { - GatewayConfigSpec current = 1; - GatewayConfigSpec modified = 2; - buf.validate.Violations validationErrors = 3; -} - -message HistoryResponse { - repeated GatewayConfigSpec entries = 1; -} diff --git a/pkg/config/v1/gateway_config_cli.pb.go b/pkg/config/v1/gateway_config_cli.pb.go index 49194ff2c2..b1d203b13c 100644 --- a/pkg/config/v1/gateway_config_cli.pb.go +++ b/pkg/config/v1/gateway_config_cli.pb.go @@ -4,360 +4,17 @@ package configv1 import ( - context "context" - errors "errors" - cli "github.com/rancher/opni/internal/codegen/cli" - v1 "github.com/rancher/opni/pkg/apis/core/v1" - cliutil "github.com/rancher/opni/pkg/opni/cliutil" - driverutil "github.com/rancher/opni/pkg/plugins/driverutil" storage "github.com/rancher/opni/pkg/storage" flagutil "github.com/rancher/opni/pkg/util/flagutil" lo "github.com/samber/lo" - cobra "github.com/spf13/cobra" pflag "github.com/spf13/pflag" errdetails "google.golang.org/genproto/googleapis/rpc/errdetails" - grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoiface "google.golang.org/protobuf/runtime/protoiface" - emptypb "google.golang.org/protobuf/types/known/emptypb" strings "strings" ) -type ( - contextKey_GatewayConfig_type struct{} - contextInjector_GatewayConfig_type struct{} -) - -var ( - contextKey_GatewayConfig contextKey_GatewayConfig_type - GatewayConfigContextInjector contextInjector_GatewayConfig_type -) - -func (contextInjector_GatewayConfig_type) NewClient(cc grpc.ClientConnInterface) GatewayConfigClient { - return NewGatewayConfigClient(cc) -} - -func (contextInjector_GatewayConfig_type) UnderlyingConn(client GatewayConfigClient) grpc.ClientConnInterface { - return client.(*gatewayConfigClient).cc -} - -func (contextInjector_GatewayConfig_type) ContextWithClient(ctx context.Context, client GatewayConfigClient) context.Context { - return context.WithValue(ctx, contextKey_GatewayConfig, client) -} - -func (contextInjector_GatewayConfig_type) ClientFromContext(ctx context.Context) (GatewayConfigClient, bool) { - client, ok := ctx.Value(contextKey_GatewayConfig).(GatewayConfigClient) - return client, ok -} - -var extraCmds_GatewayConfig []*cobra.Command - -func addExtraGatewayConfigCmd(custom *cobra.Command) { - extraCmds_GatewayConfig = append(extraCmds_GatewayConfig, custom) -} - -func BuildGatewayConfigCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "config", - Short: `Gateway configuration management`, - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - } - - cliutil.AddSubcommands(cmd, append([]*cobra.Command{ - BuildGatewayConfigGetDefaultConfigurationCmd(), - BuildGatewayConfigSetDefaultConfigurationCmd(), - BuildGatewayConfigGetConfigurationCmd(), - BuildGatewayConfigSetConfigurationCmd(), - BuildGatewayConfigResetDefaultConfigurationCmd(), - BuildGatewayConfigResetConfigurationCmd(), - BuildGatewayConfigConfigurationHistoryCmd(), - }, extraCmds_GatewayConfig...)...) - cli.AddOutputFlag(cmd) - return cmd -} - -func BuildGatewayConfigGetDefaultConfigurationCmd() *cobra.Command { - in := &driverutil.GetRequest{} - cmd := &cobra.Command{ - Use: "get-default", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - if in == nil { - return errors.New("no input provided") - } - response, err := client.GetDefaultConfiguration(cmd.Context(), in) - if err != nil { - return err - } - cli.RenderOutput(cmd, response) - return nil - }, - } - cmd.Flags().AddFlagSet(in.FlagSet()) - return cmd -} - -func BuildGatewayConfigSetDefaultConfigurationCmd() *cobra.Command { - in := &SetRequest{} - cmd := &cobra.Command{ - Use: "set-default", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - if cmd.Flags().Lookup("interactive").Value.String() == "true" { - if curValue, err := client.GetDefaultConfiguration(cmd.Context(), &driverutil.GetRequest{}); err == nil { - in.Spec = curValue - } - if edited, err := cliutil.EditInteractive(in.Spec); err != nil { - return err - } else { - in.Spec = edited - } - } else if fileName := cmd.Flags().Lookup("file").Value.String(); fileName != "" { - if in.Spec == nil { - cliutil.InitializeField(&in.Spec) - } - if err := cliutil.LoadFromFile(in.Spec, fileName); err != nil { - return err - } - } - if in == nil { - return errors.New("no input provided") - } - _, err := client.SetDefaultConfiguration(cmd.Context(), in) - if err != nil { - return err - } - return nil - }, - } - cmd.Flags().StringP("file", "f", "", "path to a file containing the config, or - to read from stdin") - cmd.Flags().BoolP("interactive", "i", false, "edit the config interactively in an editor") - cmd.MarkFlagsMutuallyExclusive("file", "interactive") - cmd.MarkFlagFilename("file") - return cmd -} - -func BuildGatewayConfigGetConfigurationCmd() *cobra.Command { - in := &driverutil.GetRequest{} - cmd := &cobra.Command{ - Use: "get", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - if in == nil { - return errors.New("no input provided") - } - response, err := client.GetConfiguration(cmd.Context(), in) - if err != nil { - return err - } - cli.RenderOutput(cmd, response) - return nil - }, - } - cmd.Flags().AddFlagSet(in.FlagSet()) - return cmd -} - -func BuildGatewayConfigSetConfigurationCmd() *cobra.Command { - in := &SetRequest{} - cmd := &cobra.Command{ - Use: "set", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - if cmd.Flags().Lookup("interactive").Value.String() == "true" { - if curValue, err := client.GetConfiguration(cmd.Context(), &driverutil.GetRequest{}); err == nil { - in.Spec = curValue - } - if edited, err := cliutil.EditInteractive(in.Spec); err != nil { - return err - } else { - in.Spec = edited - } - } else if fileName := cmd.Flags().Lookup("file").Value.String(); fileName != "" { - if in.Spec == nil { - cliutil.InitializeField(&in.Spec) - } - if err := cliutil.LoadFromFile(in.Spec, fileName); err != nil { - return err - } - } - if in == nil { - return errors.New("no input provided") - } - _, err := client.SetConfiguration(cmd.Context(), in) - if err != nil { - return err - } - return nil - }, - } - cmd.Flags().StringP("file", "f", "", "path to a file containing the config, or - to read from stdin") - cmd.Flags().BoolP("interactive", "i", false, "edit the config interactively in an editor") - cmd.MarkFlagsMutuallyExclusive("file", "interactive") - cmd.MarkFlagFilename("file") - return cmd -} - -func BuildGatewayConfigResetDefaultConfigurationCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "reset-default", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - _, err := client.ResetDefaultConfiguration(cmd.Context(), &emptypb.Empty{}) - if err != nil { - return err - } - return nil - }, - } - return cmd -} - -func BuildGatewayConfigResetConfigurationCmd() *cobra.Command { - in := &ResetRequest{} - cmd := &cobra.Command{ - Use: "reset", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - if cmd.Flags().Lookup("interactive").Value.String() == "true" { - if edited, err := cliutil.EditInteractive(in); err != nil { - return err - } else { - in = edited - } - } else if fileName := cmd.Flags().Lookup("file").Value.String(); fileName != "" { - if err := cliutil.LoadFromFile(in, fileName); err != nil { - return err - } - } - if in == nil { - return errors.New("no input provided") - } - _, err := client.ResetConfiguration(cmd.Context(), in) - if err != nil { - return err - } - return nil - }, - } - cmd.Flags().StringP("file", "f", "", "path to a file containing the config, or - to read from stdin") - cmd.Flags().BoolP("interactive", "i", false, "edit the config interactively in an editor") - cmd.MarkFlagsMutuallyExclusive("file", "interactive") - cmd.MarkFlagFilename("file") - return cmd -} - -func BuildGatewayConfigConfigurationHistoryCmd() *cobra.Command { - in := &driverutil.ConfigurationHistoryRequest{} - cmd := &cobra.Command{ - Use: "history", - Short: "", - Args: cobra.NoArgs, - ValidArgsFunction: cobra.NoFileCompletions, - RunE: func(cmd *cobra.Command, args []string) error { - client, ok := GatewayConfigContextInjector.ClientFromContext(cmd.Context()) - if !ok { - cmd.PrintErrln("failed to get client from context") - return nil - } - if in == nil { - return errors.New("no input provided") - } - response, err := client.ConfigurationHistory(cmd.Context(), in) - if err != nil { - return err - } - cli.RenderOutput(cmd, response) - return nil - }, - } - cmd.Flags().AddFlagSet(in.FlagSet()) - cmd.RegisterFlagCompletionFunc("target", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{"ActiveConfiguration", "DefaultConfiguration"}, cobra.ShellCompDirectiveDefault - }) - return cmd -} - -func (in *SetRequest) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("SetRequest", pflag.ExitOnError) - fs.SortFlags = true - if in.Spec == nil { - in.Spec = &GatewayConfigSpec{} - } - fs.AddFlagSet(in.Spec.FlagSet(append(prefix, "spec")...)) - return fs -} - -func (in *SetRequest) RedactSecrets() { - if in == nil { - return - } - in.Spec.RedactSecrets() -} - -func (in *SetRequest) UnredactSecrets(unredacted *SetRequest) error { - if in == nil { - return nil - } - var details []protoiface.MessageV1 - if err := in.Spec.UnredactSecrets(unredacted.GetSpec()); storage.IsDiscontinuity(err) { - for _, sd := range status.Convert(err).Details() { - if info, ok := sd.(*errdetails.ErrorInfo); ok { - info.Metadata["field"] = "spec." + info.Metadata["field"] - details = append(details, info) - } - } - } - if len(details) == 0 { - return nil - } - return lo.Must(status.New(codes.InvalidArgument, "cannot unredact: missing values for secret fields").WithDetails(details...)).Err() -} - func (in *GatewayConfigSpec) FlagSet(prefix ...string) *pflag.FlagSet { fs := pflag.NewFlagSet("GatewayConfigSpec", pflag.ExitOnError) fs.SortFlags = true @@ -381,10 +38,6 @@ func (in *GatewayConfigSpec) FlagSet(prefix ...string) *pflag.FlagSet { in.Dashboard = &DashboardServerSpec{} } fs.AddFlagSet(in.Dashboard.FlagSet(append(prefix, "dashboard")...)) - if in.Storage == nil { - in.Storage = &StorageSpec{} - } - fs.AddFlagSet(in.Storage.FlagSet(append(prefix, "storage")...)) if in.Certs == nil { in.Certs = &CertsSpec{} } @@ -412,7 +65,6 @@ func (in *GatewayConfigSpec) RedactSecrets() { if in == nil { return } - in.Storage.RedactSecrets() in.Certs.RedactSecrets() } @@ -421,14 +73,6 @@ func (in *GatewayConfigSpec) UnredactSecrets(unredacted *GatewayConfigSpec) erro return nil } var details []protoiface.MessageV1 - if err := in.Storage.UnredactSecrets(unredacted.GetStorage()); storage.IsDiscontinuity(err) { - for _, sd := range status.Convert(err).Details() { - if info, ok := sd.(*errdetails.ErrorInfo); ok { - info.Metadata["field"] = "storage." + info.Metadata["field"] - details = append(details, info) - } - } - } if err := in.Certs.UnredactSecrets(unredacted.GetCerts()); storage.IsDiscontinuity(err) { for _, sd := range status.Convert(err).Details() { if info, ok := sd.(*errdetails.ErrorInfo); ok { @@ -482,6 +126,181 @@ func (in *DashboardServerSpec) FlagSet(prefix ...string) *pflag.FlagSet { return fs } +func (in *CertsSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("CertsSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.StringPtrValue(nil, &in.CaCert), strings.Join(append(prefix, "ca-cert"), "."), "Path to a PEM encoded CA certificate file. Mutually exclusive with caCertData.") + fs.Var(flagutil.StringPtrValue(nil, &in.CaCertData), strings.Join(append(prefix, "ca-cert-data"), "."), "\x1b[31m[secret]\x1b[0m PEM encoded CA certificate data. Mutually exclusive with caCert.") + fs.Var(flagutil.StringPtrValue(nil, &in.ServingCert), strings.Join(append(prefix, "serving-cert"), "."), "Path to a PEM encoded server certificate file. Mutually exclusive with servingCertData.") + fs.Var(flagutil.StringPtrValue(nil, &in.ServingCertData), strings.Join(append(prefix, "serving-cert-data"), "."), "\x1b[31m[secret]\x1b[0m PEM encoded server certificate data. Mutually exclusive with servingCert.") + fs.Var(flagutil.StringPtrValue(nil, &in.ServingKey), strings.Join(append(prefix, "serving-key"), "."), "Path to a PEM encoded server key file. Mutually exclusive with servingKeyData.") + fs.Var(flagutil.StringPtrValue(nil, &in.ServingKeyData), strings.Join(append(prefix, "serving-key-data"), "."), "\x1b[31m[secret]\x1b[0m String containing PEM encoded server key data. Mutually exclusive with servingKey.") + return fs +} + +func (in *CertsSpec) RedactSecrets() { + if in == nil { + return + } + if in.GetCaCertData() != "" { + in.CaCertData = flagutil.Ptr("***") + } + if in.GetServingCertData() != "" { + in.ServingCertData = flagutil.Ptr("***") + } + if in.GetServingKeyData() != "" { + in.ServingKeyData = flagutil.Ptr("***") + } +} + +func (in *CertsSpec) UnredactSecrets(unredacted *CertsSpec) error { + if in == nil { + return nil + } + var details []protoiface.MessageV1 + if in.GetCaCertData() == "***" { + if unredacted.GetCaCertData() == "" { + details = append(details, &errdetails.ErrorInfo{ + Reason: "DISCONTINUITY", + Metadata: map[string]string{"field": "caCertData"}, + }) + } else { + *in.CaCertData = *unredacted.CaCertData + } + } + if in.GetServingCertData() == "***" { + if unredacted.GetServingCertData() == "" { + details = append(details, &errdetails.ErrorInfo{ + Reason: "DISCONTINUITY", + Metadata: map[string]string{"field": "servingCertData"}, + }) + } else { + *in.ServingCertData = *unredacted.ServingCertData + } + } + if in.GetServingKeyData() == "***" { + if unredacted.GetServingKeyData() == "" { + details = append(details, &errdetails.ErrorInfo{ + Reason: "DISCONTINUITY", + Metadata: map[string]string{"field": "servingKeyData"}, + }) + } else { + *in.ServingKeyData = *unredacted.ServingKeyData + } + } + if len(details) == 0 { + return nil + } + return lo.Must(status.New(codes.InvalidArgument, "cannot unredact: missing values for secret fields").WithDetails(details...)).Err() +} + +func (in *PluginsSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("PluginsSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.StringPtrValue(flagutil.Ptr("/var/lib/opni/plugins"), &in.Dir), strings.Join(append(prefix, "dir"), "."), "Directory to search for plugin binaries.") + if in.Filters == nil { + in.Filters = &PluginFilters{} + } + fs.AddFlagSet(in.Filters.FlagSet(append(prefix, "filters")...)) + if in.Cache == nil { + in.Cache = &CacheSpec{} + } + fs.AddFlagSet(in.Cache.FlagSet(append(prefix, "cache")...)) + return fs +} + +func (in *PluginFilters) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("PluginFilters", pflag.ExitOnError) + fs.SortFlags = true + fs.StringSliceVar(&in.Exclude, strings.Join(append(prefix, "exclude"), "."), nil, "List of plugin go module paths not to load.") + return fs +} + +func (in *CacheSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("CacheSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(CacheBackend_Filesystem), &in.Backend), strings.Join(append(prefix, "backend"), "."), "Cache backend to use for storing plugin binaries and patches.") + if in.Filesystem == nil { + in.Filesystem = &FilesystemCacheSpec{} + } + fs.AddFlagSet(in.Filesystem.FlagSet(append(prefix, "filesystem")...)) + return fs +} + +func (in *FilesystemCacheSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("FilesystemCacheSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.StringPtrValue(flagutil.Ptr("/var/lib/opni/plugin-cache"), &in.Dir), strings.Join(append(prefix, "dir"), "."), "Directory to store plugin binaries and patches in.") + return fs +} + +func (in *KeyringSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("KeyringSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.StringSliceVar(&in.RuntimeKeyDirs, strings.Join(append(prefix, "runtime-key-dirs"), "."), nil, "Directories to search for files containing runtime keys.") + return fs +} + +func (in *UpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("UpgradesSpec", pflag.ExitOnError) + fs.SortFlags = true + if in.Agents == nil { + in.Agents = &AgentUpgradesSpec{} + } + fs.AddFlagSet(in.Agents.FlagSet(append(prefix, "agents")...)) + if in.Plugins == nil { + in.Plugins = &PluginUpgradesSpec{} + } + fs.AddFlagSet(in.Plugins.FlagSet(append(prefix, "plugins")...)) + return fs +} + +func (in *AgentUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("AgentUpgradesSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(AgentUpgradesSpec_Kubernetes), &in.Driver), strings.Join(append(prefix, "driver"), "."), "Agent upgrade driver to use.") + if in.Kubernetes == nil { + in.Kubernetes = &KubernetesAgentUpgradeSpec{} + } + fs.AddFlagSet(in.Kubernetes.FlagSet(append(prefix, "kubernetes")...)) + return fs +} + +func (in *KubernetesAgentUpgradeSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("KubernetesAgentUpgradeSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(KubernetesAgentUpgradeSpec_Kubernetes), &in.ImageResolver), strings.Join(append(prefix, "image-resolver"), "."), "Agent image resolver to use.") + fs.Var(flagutil.StringPtrValue(nil, &in.Namespace), strings.Join(append(prefix, "namespace"), "."), "") + fs.Var(flagutil.StringPtrValue(nil, &in.RepoOverride), strings.Join(append(prefix, "repo-override"), "."), "") + return fs +} + +func (in *PluginUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("PluginUpgradesSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PluginUpgradesSpec_Binary), &in.Driver), strings.Join(append(prefix, "driver"), "."), "Plugin upgrade driver to use.") + if in.Binary == nil { + in.Binary = &BinaryPluginUpgradeSpec{} + } + fs.AddFlagSet(in.Binary.FlagSet(append(prefix, "binary")...)) + return fs +} + +func (in *BinaryPluginUpgradeSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("BinaryPluginUpgradeSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PatchEngine_Zstd), &in.PatchEngine), strings.Join(append(prefix, "patch-engine"), "."), "Patch engine to use for calculating plugin patches.") + return fs +} + +func (in *RateLimitingSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("RateLimitingSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.FloatPtrValue(flagutil.Ptr[float64](10.0), &in.Rate), strings.Join(append(prefix, "rate"), "."), "Base event rate used for rate limiting agent connection attempts.") + fs.Var(flagutil.IntPtrValue(flagutil.Ptr[int32](50), &in.Burst), strings.Join(append(prefix, "burst"), "."), "Burst event rate.") + return fs +} + func (in *StorageSpec) FlagSet(prefix ...string) *pflag.FlagSet { fs := pflag.NewFlagSet("StorageSpec", pflag.ExitOnError) fs.SortFlags = true @@ -651,66 +470,35 @@ func (in *JetStreamSpec) FlagSet(prefix ...string) *pflag.FlagSet { return fs } -func (in *CertsSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("CertsSpec", pflag.ExitOnError) +func (in *AuthSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("AuthSpec", pflag.ExitOnError) fs.SortFlags = true - fs.Var(flagutil.StringPtrValue(nil, &in.CaCert), strings.Join(append(prefix, "ca-cert"), "."), "Path to a PEM encoded CA certificate file. Mutually exclusive with caCertData.") - fs.Var(flagutil.StringPtrValue(nil, &in.CaCertData), strings.Join(append(prefix, "ca-cert-data"), "."), "\x1b[31m[secret]\x1b[0m PEM encoded CA certificate data. Mutually exclusive with caCert.") - fs.Var(flagutil.StringPtrValue(nil, &in.ServingCert), strings.Join(append(prefix, "serving-cert"), "."), "Path to a PEM encoded server certificate file. Mutually exclusive with servingCertData.") - fs.Var(flagutil.StringPtrValue(nil, &in.ServingCertData), strings.Join(append(prefix, "serving-cert-data"), "."), "\x1b[31m[secret]\x1b[0m PEM encoded server certificate data. Mutually exclusive with servingCert.") - fs.Var(flagutil.StringPtrValue(nil, &in.ServingKey), strings.Join(append(prefix, "serving-key"), "."), "Path to a PEM encoded server key file. Mutually exclusive with servingKeyData.") - fs.Var(flagutil.StringPtrValue(nil, &in.ServingKeyData), strings.Join(append(prefix, "serving-key-data"), "."), "\x1b[31m[secret]\x1b[0m String containing PEM encoded server key data. Mutually exclusive with servingKey.") + fs.Var(flagutil.EnumValue(AuthSpec_Basic, &in.Backend), strings.Join(append(prefix, "backend"), "."), "Auth backend to use.") + if in.Openid == nil { + in.Openid = &OpenIDAuthSpec{} + } + fs.AddFlagSet(in.Openid.FlagSet(append(prefix, "openid")...)) return fs } -func (in *CertsSpec) RedactSecrets() { +func (in *AuthSpec) RedactSecrets() { if in == nil { return } - if in.GetCaCertData() != "" { - in.CaCertData = flagutil.Ptr("***") - } - if in.GetServingCertData() != "" { - in.ServingCertData = flagutil.Ptr("***") - } - if in.GetServingKeyData() != "" { - in.ServingKeyData = flagutil.Ptr("***") - } + in.Openid.RedactSecrets() } -func (in *CertsSpec) UnredactSecrets(unredacted *CertsSpec) error { +func (in *AuthSpec) UnredactSecrets(unredacted *AuthSpec) error { if in == nil { return nil } var details []protoiface.MessageV1 - if in.GetCaCertData() == "***" { - if unredacted.GetCaCertData() == "" { - details = append(details, &errdetails.ErrorInfo{ - Reason: "DISCONTINUITY", - Metadata: map[string]string{"field": "caCertData"}, - }) - } else { - *in.CaCertData = *unredacted.CaCertData - } - } - if in.GetServingCertData() == "***" { - if unredacted.GetServingCertData() == "" { - details = append(details, &errdetails.ErrorInfo{ - Reason: "DISCONTINUITY", - Metadata: map[string]string{"field": "servingCertData"}, - }) - } else { - *in.ServingCertData = *unredacted.ServingCertData - } - } - if in.GetServingKeyData() == "***" { - if unredacted.GetServingKeyData() == "" { - details = append(details, &errdetails.ErrorInfo{ - Reason: "DISCONTINUITY", - Metadata: map[string]string{"field": "servingKeyData"}, - }) - } else { - *in.ServingKeyData = *unredacted.ServingKeyData + if err := in.Openid.UnredactSecrets(unredacted.GetOpenid()); storage.IsDiscontinuity(err) { + for _, sd := range status.Convert(err).Details() { + if info, ok := sd.(*errdetails.ErrorInfo); ok { + info.Metadata["field"] = "openid." + info.Metadata["field"] + details = append(details, info) + } } } if len(details) == 0 { @@ -719,119 +507,44 @@ func (in *CertsSpec) UnredactSecrets(unredacted *CertsSpec) error { return lo.Must(status.New(codes.InvalidArgument, "cannot unredact: missing values for secret fields").WithDetails(details...)).Err() } -func (in *PluginsSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("PluginsSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.StringPtrValue(flagutil.Ptr("/var/lib/opni/plugins"), &in.Dir), strings.Join(append(prefix, "dir"), "."), "Directory to search for plugin binaries.") - if in.Filters == nil { - in.Filters = &PluginFilters{} - } - fs.AddFlagSet(in.Filters.FlagSet(append(prefix, "filters")...)) - if in.Cache == nil { - in.Cache = &CacheSpec{} - } - fs.AddFlagSet(in.Cache.FlagSet(append(prefix, "cache")...)) - return fs -} - -func (in *PluginFilters) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("PluginFilters", pflag.ExitOnError) - fs.SortFlags = true - fs.StringSliceVar(&in.Exclude, strings.Join(append(prefix, "exclude"), "."), nil, "List of plugin go module paths not to load.") - return fs -} - -func (in *CacheSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("CacheSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(CacheBackend_Filesystem), &in.Backend), strings.Join(append(prefix, "backend"), "."), "Cache backend to use for storing plugin binaries and patches.") - if in.Filesystem == nil { - in.Filesystem = &FilesystemCacheSpec{} - } - fs.AddFlagSet(in.Filesystem.FlagSet(append(prefix, "filesystem")...)) - return fs -} - -func (in *FilesystemCacheSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("FilesystemCacheSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.StringPtrValue(flagutil.Ptr("/var/lib/opni/plugin-cache"), &in.Dir), strings.Join(append(prefix, "dir"), "."), "Directory to store plugin binaries and patches in.") - return fs -} - -func (in *KeyringSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("KeyringSpec", pflag.ExitOnError) +func (in *OpenIDAuthSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("OpenIDAuthSpec", pflag.ExitOnError) fs.SortFlags = true - fs.StringSliceVar(&in.RuntimeKeyDirs, strings.Join(append(prefix, "runtime-key-dirs"), "."), nil, "Directories to search for files containing runtime keys.") + fs.Var(flagutil.StringPtrValue(nil, &in.Issuer), strings.Join(append(prefix, "issuer"), "."), "The OP's Issuer identifier. This must exactly match the issuer URL") + fs.Var(flagutil.StringPtrValue(nil, &in.CaCertData), strings.Join(append(prefix, "ca-cert-data"), "."), "Optional PEM-encoded CA certificate data for the issuer.") + fs.Var(flagutil.StringPtrValue(nil, &in.ClientId), strings.Join(append(prefix, "client-id"), "."), "The RP's client ID.") + fs.Var(flagutil.StringPtrValue(nil, &in.ClientSecret), strings.Join(append(prefix, "client-secret"), "."), "\x1b[31m[secret]\x1b[0m The RP's client secret.") + fs.Var(flagutil.StringPtrValue(flagutil.Ptr("sub"), &in.IdentifyingClaim), strings.Join(append(prefix, "identifying-claim"), "."), "IdentifyingClaim is the claim that will be used to identify the user") + fs.StringSliceVar(&in.Scopes, strings.Join(append(prefix, "scopes"), "."), nil, "Scope specifies optional requested permissions.") return fs } -func (in *UpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("UpgradesSpec", pflag.ExitOnError) - fs.SortFlags = true - if in.Agents == nil { - in.Agents = &AgentUpgradesSpec{} +func (in *OpenIDAuthSpec) RedactSecrets() { + if in == nil { + return } - fs.AddFlagSet(in.Agents.FlagSet(append(prefix, "agents")...)) - if in.Plugins == nil { - in.Plugins = &PluginUpgradesSpec{} + if in.GetClientSecret() != "" { + in.ClientSecret = flagutil.Ptr("***") } - fs.AddFlagSet(in.Plugins.FlagSet(append(prefix, "plugins")...)) - return fs } -func (in *AgentUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("AgentUpgradesSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(AgentUpgradesSpec_Kubernetes), &in.Driver), strings.Join(append(prefix, "driver"), "."), "Agent upgrade driver to use.") - if in.Kubernetes == nil { - in.Kubernetes = &KubernetesAgentUpgradeSpec{} +func (in *OpenIDAuthSpec) UnredactSecrets(unredacted *OpenIDAuthSpec) error { + if in == nil { + return nil } - fs.AddFlagSet(in.Kubernetes.FlagSet(append(prefix, "kubernetes")...)) - return fs -} - -func (in *KubernetesAgentUpgradeSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("KubernetesAgentUpgradeSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(KubernetesAgentUpgradeSpec_Kubernetes), &in.ImageResolver), strings.Join(append(prefix, "image-resolver"), "."), "Agent image resolver to use.") - fs.Var(flagutil.StringPtrValue(nil, &in.Namespace), strings.Join(append(prefix, "namespace"), "."), "") - fs.Var(flagutil.StringPtrValue(nil, &in.RepoOverride), strings.Join(append(prefix, "repo-override"), "."), "") - return fs -} - -func (in *PluginUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("PluginUpgradesSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PluginUpgradesSpec_Binary), &in.Driver), strings.Join(append(prefix, "driver"), "."), "Plugin upgrade driver to use.") - if in.Binary == nil { - in.Binary = &BinaryPluginUpgradeSpec{} + var details []protoiface.MessageV1 + if in.GetClientSecret() == "***" { + if unredacted.GetClientSecret() == "" { + details = append(details, &errdetails.ErrorInfo{ + Reason: "DISCONTINUITY", + Metadata: map[string]string{"field": "clientSecret"}, + }) + } else { + *in.ClientSecret = *unredacted.ClientSecret + } } - fs.AddFlagSet(in.Binary.FlagSet(append(prefix, "binary")...)) - return fs -} - -func (in *BinaryPluginUpgradeSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("BinaryPluginUpgradeSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PatchEngine_Zstd), &in.PatchEngine), strings.Join(append(prefix, "patch-engine"), "."), "Patch engine to use for calculating plugin patches.") - return fs -} - -func (in *RateLimitingSpec) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("RateLimitingSpec", pflag.ExitOnError) - fs.SortFlags = true - fs.Var(flagutil.FloatPtrValue(flagutil.Ptr[float64](10.0), &in.Rate), strings.Join(append(prefix, "rate"), "."), "Base event rate used for rate limiting agent connection attempts.") - fs.Var(flagutil.IntPtrValue(flagutil.Ptr[int32](50), &in.Burst), strings.Join(append(prefix, "burst"), "."), "Burst event rate.") - return fs -} - -func (in *ResetRequest) FlagSet(prefix ...string) *pflag.FlagSet { - fs := pflag.NewFlagSet("ResetRequest", pflag.ExitOnError) - fs.SortFlags = true - if in.Revision == nil { - in.Revision = &v1.Revision{} + if len(details) == 0 { + return nil } - fs.AddFlagSet(in.Revision.FlagSet(prefix...)) - return fs + return lo.Must(status.New(codes.InvalidArgument, "cannot unredact: missing values for secret fields").WithDetails(details...)).Err() } diff --git a/pkg/logger/color_handler.go b/pkg/logger/color_handler.go index 127b8106d0..9ce739a4af 100644 --- a/pkg/logger/color_handler.go +++ b/pkg/logger/color_handler.go @@ -7,6 +7,7 @@ import ( "io" "log/slog" "path/filepath" + "reflect" "runtime" "strconv" "sync" @@ -335,6 +336,10 @@ func (h *colorHandler) appendValue(buf *buffer, v slog.Value, shouldQuote bool) case slog.Level: h.appendLevel(buf, cv) case encoding.TextMarshaler: + if reflect.ValueOf(cv).IsNil() { + h.appendString(buf, "nil", shouldQuote) + break + } data, err := cv.MarshalText() if err != nil { break diff --git a/pkg/oci/kubernetes/images.go b/pkg/oci/kubernetes/images.go index 52d4e43172..15e6e858d9 100644 --- a/pkg/oci/kubernetes/images.go +++ b/pkg/oci/kubernetes/images.go @@ -6,7 +6,7 @@ import ( "os" "time" - corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" + apicorev1 "github.com/rancher/opni/apis/core/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" @@ -25,7 +25,7 @@ var retryBackoff = wait.Backoff{ } func (d *kubernetesResolveImageDriver) getOpniImageString(ctx context.Context) (string, error) { - gateway := &corev1beta1.Gateway{} + gateway := &apicorev1.Gateway{} retryFunc := func() error { err := d.k8sClient.Get(ctx, client.ObjectKey{ Namespace: d.namespace, diff --git a/pkg/oci/kubernetes/kubernetes_test.go b/pkg/oci/kubernetes/kubernetes_test.go index df35c7e061..4f5aed8d38 100644 --- a/pkg/oci/kubernetes/kubernetes_test.go +++ b/pkg/oci/kubernetes/kubernetes_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" + apicorev1 "github.com/rancher/opni/apis/core/v1" "github.com/rancher/opni/pkg/oci" "github.com/rancher/opni/pkg/oci/kubernetes" "github.com/rancher/opni/pkg/versions" @@ -21,16 +21,16 @@ const ( var _ = Describe("Kubernetes OCI handler", Ordered, Label("unit", "slow"), func() { var ( - gateway *corev1beta1.Gateway + gateway *apicorev1.Gateway k8sOCI oci.Fetcher ) BeforeAll(func() { - gateway = &corev1beta1.Gateway{ + gateway = &apicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: "opni-gateway", Namespace: namespace, }, - Spec: corev1beta1.GatewaySpec{}, + Spec: apicorev1.GatewaySpec{}, } Expect(k8sClient.Create(context.Background(), gateway)).To(Succeed()) @@ -71,7 +71,7 @@ var _ = Describe("Kubernetes OCI handler", Ordered, Label("unit", "slow"), func( When("gateway status is set", Ordered, func() { BeforeEach(func() { - gateway.Status = corev1beta1.GatewayStatus{ + gateway.Status = apicorev1.GatewayStatus{ Image: fmt.Sprintf("rancher/opni-test@%s", imageDigest), } Expect(k8sClient.Status().Update(context.Background(), gateway)).To(Succeed()) diff --git a/pkg/opni/commands/config.go b/pkg/opni/commands/config.go new file mode 100644 index 0000000000..d76d337442 --- /dev/null +++ b/pkg/opni/commands/config.go @@ -0,0 +1,19 @@ +//go:build !minimal + +package commands + +import ( + configv1 "github.com/rancher/opni/pkg/config/v1" + "github.com/spf13/cobra" +) + +func BuildConfigCmd() *cobra.Command { + cmd := configv1.BuildGatewayConfigCmd() + ConfigureManagementCommand(cmd) + ConfigureGatewayConfigCmd(cmd) + return cmd +} + +func init() { + AddCommandsToGroup(ManagementAPI, BuildConfigCmd()) +} diff --git a/pkg/opni/commands/gateway.go b/pkg/opni/commands/gateway.go index 085d7e117f..7acf662405 100644 --- a/pkg/opni/commands/gateway.go +++ b/pkg/opni/commands/gateway.go @@ -7,227 +7,503 @@ import ( "errors" "fmt" "os" - "sync/atomic" - "github.com/hashicorp/go-plugin" - "github.com/rancher/opni/pkg/config" - "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/dashboard" - "github.com/rancher/opni/pkg/features" + "github.com/bufbuild/protovalidate-go" + "github.com/nsf/jsondiff" + opnicorev1 "github.com/rancher/opni/apis/core/v1" + corev1 "github.com/rancher/opni/pkg/apis/core/v1" + "github.com/rancher/opni/pkg/config/reactive" + "github.com/rancher/opni/pkg/config/reactive/subtle" + configv1 "github.com/rancher/opni/pkg/config/v1" "github.com/rancher/opni/pkg/gateway" "github.com/rancher/opni/pkg/logger" "github.com/rancher/opni/pkg/machinery" "github.com/rancher/opni/pkg/management" - "github.com/rancher/opni/pkg/noauth" - "github.com/rancher/opni/pkg/opni/cliutil" "github.com/rancher/opni/pkg/plugins" - "github.com/rancher/opni/pkg/plugins/hooks" + "github.com/rancher/opni/pkg/storage" "github.com/rancher/opni/pkg/tracing" "github.com/rancher/opni/pkg/update/noop" - "github.com/samber/lo" + "github.com/rancher/opni/pkg/util" + "github.com/rancher/opni/pkg/util/fieldmask" + "github.com/rancher/opni/pkg/util/flagutil" + "github.com/rancher/opni/pkg/validation" "github.com/spf13/cobra" - "github.com/ttacon/chalk" "golang.org/x/sync/errgroup" - "k8s.io/client-go/rest" + "k8s.io/apimachinery/pkg/types" _ "github.com/rancher/opni/pkg/oci/kubernetes" _ "github.com/rancher/opni/pkg/oci/noop" _ "github.com/rancher/opni/pkg/plugins/apis" + "github.com/rancher/opni/pkg/plugins/driverutil" + "github.com/rancher/opni/pkg/plugins/hooks" + "github.com/rancher/opni/pkg/storage/crds" _ "github.com/rancher/opni/pkg/storage/crds" _ "github.com/rancher/opni/pkg/storage/etcd" + "github.com/rancher/opni/pkg/storage/inmemory" _ "github.com/rancher/opni/pkg/storage/jetstream" + "github.com/rancher/opni/pkg/storage/kvutil" ) +// func BuildGatewayCmd() *cobra.Command { +// lg := logger.New() +// var configLocation string + +// run := func(ctx context.Context) error { +// tracing.Configure("gateway") + +// objects := cliutil.LoadConfigObjectsOrDie(configLocation, lg) + +// inCluster := true +// restconfig, err := rest.InClusterConfig() +// if err != nil { +// if errors.Is(err, rest.ErrNotInCluster) { +// inCluster = false +// } else { +// lg.Error(fmt.Sprintf("failed to create config: %s", err)) +// os.Exit(1) +// } +// } + +// if inCluster { +// features.PopulateFeatures(ctx, restconfig) +// fCancel := features.FeatureList.WatchConfigMap() +// context.AfterFunc(ctx, fCancel) +// } + +// machinery.LoadAuthProviders(ctx, objects) +// var gatewayConfig *v1beta1.GatewayConfig +// var noauthServer *noauth.Server +// found := objects.Visit( +// func(config *v1beta1.GatewayConfig) { +// if gatewayConfig == nil { +// gatewayConfig = config +// } +// }, +// func(ap *v1beta1.AuthProvider) { +// if ap.Name == "noauth" { +// noauthServer = machinery.NewNoauthServer(ctx, ap) +// } +// }, +// ) +// if !found { +// lg.With( +// "config", configLocation, +// ).Error("config file does not contain a GatewayConfig object") +// os.Exit(1) +// } + +// lg.With( +// "dir", gatewayConfig.Spec.Plugins.Dir, +// ).Info("loading plugins") +// pluginLoader := plugins.NewPluginLoader(plugins.WithLogger(lg.WithGroup("gateway"))) + +// lifecycler := config.NewLifecycler(objects) +// g := gateway.NewGateway(ctx, gatewayConfig, pluginLoader, +// gateway.WithLifecycler(lifecycler), +// gateway.WithExtraUpdateHandlers(noop.NewSyncServer()), +// ) + +// m := management.NewServer(ctx, &gatewayConfig.Spec.Management, g, pluginLoader, +// management.WithCapabilitiesDataSource(g.CapabilitiesDataSource()), +// management.WithHealthStatusDataSource(g), +// management.WithLifecycler(lifecycler), +// ) + +// g.MustRegisterCollector(m) + +// doneLoadingPlugins := make(chan struct{}) +// pluginLoader.Hook(hooks.OnLoadingCompleted(func(numLoaded int) { +// lg.Info(fmt.Sprintf("loaded %d plugins", numLoaded)) +// close(doneLoadingPlugins) +// })) +// pluginLoader.LoadPlugins(ctx, gatewayConfig.Spec.Plugins.Dir, plugins.GatewayScheme) +// select { +// case <-doneLoadingPlugins: +// case <-ctx.Done(): +// return ctx.Err() +// } + +// var eg errgroup.Group +// eg.Go(func() error { +// err := g.ListenAndServe(ctx) +// if errors.Is(err, context.Canceled) { +// lg.Info("gateway server stopped") +// } else if err != nil { +// lg.With(logger.Err(err)).Warn("gateway server exited with error") +// } +// return err +// }) +// eg.Go(func() error { +// err := m.ListenAndServe(ctx) +// if errors.Is(err, context.Canceled) { +// lg.Info("management server stopped") +// } else if err != nil { +// lg.With(logger.Err(err)).Warn("management server exited with error") +// } +// return err +// }) + +// d, err := dashboard.NewServer(&gatewayConfig.Spec.Management, pluginLoader, g) +// if err != nil { +// lg.With(logger.Err(err)).Error("failed to start dashboard server") +// } else { +// eg.Go(func() error { +// err := d.ListenAndServe(ctx) +// if errors.Is(err, context.Canceled) { +// lg.Info("dashboard server stopped") +// } else if err != nil { +// lg.With(logger.Err(err)).Warn("dashboard server exited with error") +// } +// return err +// }) +// } + +// if noauthServer != nil { +// eg.Go(func() error { +// err := noauthServer.ListenAndServe(ctx) +// if errors.Is(err, context.Canceled) { +// lg.Info("noauth server stopped") +// } else if err != nil { +// lg.With(logger.Err(err)).Warn("noauth server exited with error") +// } +// return err +// }) +// } + +// errC := lo.Async(eg.Wait) + +// style := chalk.Yellow.NewStyle(). +// WithBackground(chalk.ResetColor). +// WithTextStyle(chalk.Bold) +// reloadC := make(chan struct{}) +// go func() { +// c, err := lifecycler.ReloadC() + +// fNotify := make(<-chan struct{}) +// if inCluster { +// fNotify = features.FeatureList.NotifyChange() +// } + +// if err != nil { +// lg.With( +// logger.Err(err), +// ).Error("failed to get reload channel from lifecycler") +// os.Exit(1) +// } +// select { +// case <-c: +// lg.Info(style.Style("--- received reload signal ---")) +// close(reloadC) +// case <-fNotify: +// lg.Info(style.Style("--- received feature update signal ---")) +// close(reloadC) +// } +// }() + +// shutDownPlugins := func() { +// lg.Info("shutting down plugins") +// plugin.CleanupClients() +// lg.Info("all plugins shut down") +// } +// select { +// case <-reloadC: +// shutDownPlugins() +// atomic.StoreUint32(&plugin.Killed, 0) +// lg.Info(style.Style("--- reloading ---")) +// return nil +// case err := <-errC: +// shutDownPlugins() +// return err +// } +// } + +// serveCmd := &cobra.Command{ +// Use: "gateway", +// Short: "Run the Opni Gateway", +// RunE: func(cmd *cobra.Command, args []string) error { +// for { +// if err := run(cmd.Context()); err != nil { +// if err == cmd.Context().Err() { +// return nil +// } +// return err +// } +// } +// }, +// } + +// serveCmd.Flags().StringVar(&configLocation, "config", "", "Absolute path to a config file") +// return serveCmd +// } + func BuildGatewayCmd() *cobra.Command { - lg := logger.New() - var configLocation string + var inCluster bool + host, hostOk := os.LookupEnv("KUBERNETES_SERVICE_HOST") + port, portOk := os.LookupEnv("KUBERNETES_SERVICE_PORT") + if hostOk && portOk && host != "" && port != "" { + inCluster = true + } + + var applyDefaultFlags bool + var ignoreValidationErrors bool + storageConfig := &configv1.StorageSpec{} + config := &configv1.GatewayConfigSpec{} + cmd := &cobra.Command{ + Use: "gateway", + Short: "Run the Opni Gateway", + Long: ` +Flags and Configuration +=========================== +Flags for this command are split into two categories: 'storage' flags and +'default' flags. Though the storage spec is contained within the complete +gateway configuration, but is separated for startup and initialization purposes, + + +Storage flags (--storage.*) +=========================== +These flags configure the storage backend used to persist and retrieve +the active configuration. The values set by these flags will take precedence +over the corresponding values in the active configuration, if it exists. +* If running in Kubernetes, these flags are ignored. + + +Default flags (--default.*) +=========================== +These flags allow adjusting the default values used when starting up the +gateway for the first time. They are all optional, and are ignored once +an active configuration has been created. However, if --apply-default-flags +is set, if there is an existing active configuration, any --default.* flags +listed on the command line will be applied to the active configuration before +starting the gateway. + +* If running in Kubernetes, these flags are ignored, and --apply-default-flags + has no effect. + + +Startup Logic +=========================== +If the gateway is running inside a Kubernetes cluster, see the section below +for startup logic specific to Kubernetes. Regardless of runtime environment, +the runtime config APIs work the same way. + +The gateway startup logic is as follows: + +When the gateway starts up, it uses its storage flags (--storage.*) to connect +to a KV store and look for an active configuration. +- If there is no existing active config in the KV store, it will create one + with the default values from its flags (--default.*). +- If there is an existing active config, it will use that. Additionally, before + starting the gateway, if --apply-default-flags is set, it will apply any + --default.* flags listed on the command line to the active configuration, + overwriting any existing values, and persisting the changes to the KV store. - run := func(ctx context.Context) error { - tracing.Configure("gateway") - objects := cliutil.LoadConfigObjectsOrDie(configLocation, lg) +Startup Logic (Kubernetes) +=========================== +When the gateway is running inside Kubernetes, it will look for the Gateway +custom resource that controls the running pod. Because this custom resource +controls the deployment of the gateway pod itself, it assumes it will always +exist. If it does not exist, the gateway will exit with an error. + +When running in Kubernetes, the 'config' field in the Gateway custom resource +is the corresponding "active" configuration. Using the dashboard or CLI to +change these settings will update the custom resource; if possible, avoid +editing it directly. + +In Kubernetes, all flags are ignored. Because the active configuration is +always present in the Gateway custom resource, it does not need to supply +its own default values or storage settings. + + +Runtime Config APIs +=========================== +Once the gateway has started, the active configuration can be modified at +runtime using the dashboard UI or the 'opni config' CLI command. + +Changes to the active configuration will be persisted to the KV store, and +relevant components will be notified of changed fields and will reload their +configuration accordingly (restarting servers, etc). + +Changes to the default configuration, while possible, will not be persisted +across restarts. The gateway only stores its default configuration in-memory. +Note that similar configuration APIs for other Opni components generally do +persist their default configurations in the KV store. +`[1:], + RunE: func(cmd *cobra.Command, args []string) error { + lg := logger.New() + ctx := cmd.Context() + tracing.Configure("gateway") + + var storageBackend storage.Backend + + defaultStore := inmemory.NewValueStore[*configv1.GatewayConfigSpec](util.ProtoClone) + + if !inCluster { + v, err := validation.NewValidator() + if err != nil { + return err + } + if err := v.Validate(config); err != nil { + fmt.Fprintln(cmd.ErrOrStderr(), err.Error()) + return errors.New("exiting due to validation errors") + } + if err := defaultStore.Put(ctx, config); err != nil { + return fmt.Errorf("failed to set defaults from flags: %w", err) + } + } + var activeStore storage.ValueStoreT[*configv1.GatewayConfigSpec] - inCluster := true - restconfig, err := rest.InClusterConfig() - if err != nil { - if errors.Is(err, rest.ErrNotInCluster) { - inCluster = false + if inCluster { + lg.Info("loading config (in-cluster)") + activeStore = crds.NewCRDValueStore[*opnicorev1.Gateway, *configv1.GatewayConfigSpec](types.NamespacedName{ + Namespace: os.Getenv("POD_NAMESPACE"), + Name: os.Getenv("GATEWAY_NAME"), + }, opnicorev1.ValueStoreMethods{}) + active, err := activeStore.Get(ctx) + if err != nil { + return err + } + storageBackend, err = machinery.ConfigureStorageBackendV1(ctx, active.GetStorage()) + if err != nil { + return err + } } else { - lg.Error(fmt.Sprintf("failed to create config: %s", err)) - os.Exit(1) + lg.Info("loading config") + var err error + storageBackend, err = machinery.ConfigureStorageBackendV1(ctx, config.GetStorage()) + if err != nil { + return err + } + lg.Info("storage configured", "backend", config.Storage.GetBackend().String()) } - } - - if inCluster { - features.PopulateFeatures(ctx, restconfig) - fCancel := features.FeatureList.WatchConfigMap() - context.AfterFunc(ctx, fCancel) - } - - machinery.LoadAuthProviders(ctx, objects) - var gatewayConfig *v1beta1.GatewayConfig - var noauthServer *noauth.Server - found := objects.Visit( - func(config *v1beta1.GatewayConfig) { - if gatewayConfig == nil { - gatewayConfig = config + activeStore = kvutil.WithMessageCodec[*configv1.GatewayConfigSpec]( + kvutil.WithKey(storageBackend.KeyValueStore("gateway"), "config")) + + mgr := configv1.NewGatewayConfigManager( + defaultStore, activeStore, + flagutil.LoadDefaults, + configv1.WithControllerOptions( + reactive.WithLogger(lg.WithGroup("config")), + reactive.WithDiffMode(reactive.DiffFull), + ), + ) + + if !inCluster { + var rev *corev1.Revision + if ac, err := mgr.Tracker().ActiveStore().Get(context.Background()); err != nil { + if storage.IsNotFound(err) { + lg.Info("no previous configuration found, creating from defaults") + _, err := mgr.SetConfiguration(context.Background(), &configv1.SetRequest{}) + if err != nil { + return fmt.Errorf("failed to set configuration: %w", err) + } + } + } else { + rev = ac.GetRevision() + lg.Info("loaded existing configuration", "rev", ac.GetRevision().GetRevision()) } - }, - func(ap *v1beta1.AuthProvider) { - if ap.Name == "noauth" { - noauthServer = machinery.NewNoauthServer(ctx, ap) + + if applyDefaultFlags { + mask := fieldmask.ByPresence(config.ProtoReflect()) + resp, err := mgr.DryRun(ctx, &configv1.DryRunRequest{ + Target: driverutil.Target_ActiveConfiguration, + Action: driverutil.Action_Reset, + Revision: rev, + Patch: config, + Mask: mask, + }) + if err != nil { + return err + } + opts := jsondiff.DefaultConsoleOptions() + opts.SkipMatches = true + diff, anyChanges := driverutil.RenderJsonDiff(resp.Current, resp.Modified, opts) + stat := driverutil.DiffStat(diff, opts) + if anyChanges { + lg.Info("applying default flags to active configuration", "diff", stat) + lg.Info("⤷ diff:\n" + diff) + } else { + lg.Warn("--apply-default-flags was set, but no changes would be made to the active configuration") + } + if resp.GetValidationErrors() != nil { + lg.Error("refusing to apply default flags due to validation errors (re-run with --ignore-validation-errors to skip this check)") + return (*protovalidate.ValidationError)(resp.ValidationErrors) + } + if anyChanges { + _, err := mgr.ResetConfiguration(ctx, &configv1.ResetRequest{ + Revision: rev, + Mask: mask, + Patch: config, + }) + if err != nil { + return err + } + } } - }, - ) - if !found { - lg.With( - "config", configLocation, - ).Error("config file does not contain a GatewayConfig object") - os.Exit(1) - } - - lg.With( - "dir", gatewayConfig.Spec.Plugins.Dir, - ).Info("loading plugins") - pluginLoader := plugins.NewPluginLoader(plugins.WithLogger(lg.WithGroup("gateway"))) - - lifecycler := config.NewLifecycler(objects) - g := gateway.NewGateway(ctx, gatewayConfig, pluginLoader, - gateway.WithLifecycler(lifecycler), - gateway.WithExtraUpdateHandlers(noop.NewSyncServer()), - ) - - m := management.NewServer(ctx, &gatewayConfig.Spec.Management, g, pluginLoader, - management.WithCapabilitiesDataSource(g.CapabilitiesDataSource()), - management.WithHealthStatusDataSource(g), - management.WithLifecycler(lifecycler), - ) - - g.MustRegisterCollector(m) - - doneLoadingPlugins := make(chan struct{}) - pluginLoader.Hook(hooks.OnLoadingCompleted(func(numLoaded int) { - lg.Info(fmt.Sprintf("loaded %d plugins", numLoaded)) - close(doneLoadingPlugins) - })) - pluginLoader.LoadPlugins(ctx, gatewayConfig.Spec.Plugins.Dir, plugins.GatewayScheme) - select { - case <-doneLoadingPlugins: - case <-ctx.Done(): - return ctx.Err() - } - - var eg errgroup.Group - eg.Go(func() error { - err := g.ListenAndServe(ctx) - if errors.Is(err, context.Canceled) { - lg.Info("gateway server stopped") - } else if err != nil { - lg.With(logger.Err(err)).Warn("gateway server exited with error") } - return err - }) - eg.Go(func() error { - err := m.ListenAndServe(ctx) - if errors.Is(err, context.Canceled) { - lg.Info("management server stopped") - } else if err != nil { - lg.With(logger.Err(err)).Warn("management server exited with error") + + if err := mgr.Start(ctx); err != nil { + return fmt.Errorf("failed to start config manager: %w", err) } - return err - }) - d, err := dashboard.NewServer(&gatewayConfig.Spec.Management, pluginLoader, g) - if err != nil { - lg.With(logger.Err(err)).Error("failed to start dashboard server") - } else { + pluginLoader := plugins.NewPluginLoader(plugins.WithLogger(lg.WithGroup("gateway"))) + + g := gateway.NewGateway(ctx, mgr, storageBackend, pluginLoader, + gateway.WithExtraUpdateHandlers(noop.NewSyncServer()), + ) + + m := management.NewServer(ctx, g, mgr, pluginLoader, + management.WithCapabilitiesDataSource(g.CapabilitiesDataSource()), + management.WithHealthStatusDataSource(g), + ) + + g.MustRegisterCollector(m) + + doneLoadingPlugins := make(chan struct{}) + dir := subtle.WaitOne(ctx, mgr.Reactive(config.ProtoPath().Plugins().Dir())).String() + pluginLoader.Hook(hooks.OnLoadingCompleted(func(numLoaded int) { + lg.Info(fmt.Sprintf("loaded %d plugins", numLoaded)) + close(doneLoadingPlugins) + })) + pluginLoader.LoadPlugins(ctx, dir, plugins.GatewayScheme) + select { + case <-doneLoadingPlugins: + case <-ctx.Done(): + return ctx.Err() + } + + var eg errgroup.Group eg.Go(func() error { - err := d.ListenAndServe(ctx) + err := g.ListenAndServe(ctx) if errors.Is(err, context.Canceled) { - lg.Info("dashboard server stopped") + lg.Info("gateway server stopped") } else if err != nil { - lg.With(logger.Err(err)).Warn("dashboard server exited with error") + lg.With(logger.Err(err)).Warn("gateway server exited with error") } return err }) - } - - if noauthServer != nil { eg.Go(func() error { - err := noauthServer.ListenAndServe(ctx) + err := m.ListenAndServe(ctx) if errors.Is(err, context.Canceled) { - lg.Info("noauth server stopped") + lg.Info("management server stopped") } else if err != nil { - lg.With(logger.Err(err)).Warn("noauth server exited with error") + lg.With(logger.Err(err)).Warn("management server exited with error") } return err }) - } - - errC := lo.Async(eg.Wait) - - style := chalk.Yellow.NewStyle(). - WithBackground(chalk.ResetColor). - WithTextStyle(chalk.Bold) - reloadC := make(chan struct{}) - go func() { - c, err := lifecycler.ReloadC() - fNotify := make(<-chan struct{}) - if inCluster { - fNotify = features.FeatureList.NotifyChange() - } - - if err != nil { - lg.With( - logger.Err(err), - ).Error("failed to get reload channel from lifecycler") - os.Exit(1) - } - select { - case <-c: - lg.Info(style.Style("--- received reload signal ---")) - close(reloadC) - case <-fNotify: - lg.Info(style.Style("--- received feature update signal ---")) - close(reloadC) - } - }() - - shutDownPlugins := func() { - lg.Info("shutting down plugins") - plugin.CleanupClients() - lg.Info("all plugins shut down") - } - select { - case <-reloadC: - shutDownPlugins() - atomic.StoreUint32(&plugin.Killed, 0) - lg.Info(style.Style("--- reloading ---")) - return nil - case err := <-errC: - shutDownPlugins() - return err - } - } - - serveCmd := &cobra.Command{ - Use: "gateway", - Short: "Run the Opni Gateway", - RunE: func(cmd *cobra.Command, args []string) error { - for { - if err := run(cmd.Context()); err != nil { - if err == cmd.Context().Err() { - return nil - } - return err - } - } + return eg.Wait() }, } - - serveCmd.Flags().StringVar(&configLocation, "config", "", "Absolute path to a config file") - return serveCmd + if !inCluster { + cmd.Flags().AddFlagSet(storageConfig.FlagSet("storage")) + cmd.Flags().AddFlagSet(config.FlagSet("defaults")) + cmd.Flags().BoolVar(&applyDefaultFlags, "apply-default-flags", false, + "Apply default flags listed on the command-line to the active configuration on startup") + cmd.Flags().BoolVar(&ignoreValidationErrors, "ignore-validation-errors", false, "Ignore validation errors when applying default flags") + cmd.Flags().MarkHidden("ignore-validation-errors") + } + return cmd } func init() { diff --git a/pkg/opni/commands/setup_config.go b/pkg/opni/commands/setup_config.go new file mode 100644 index 0000000000..0021ea7161 --- /dev/null +++ b/pkg/opni/commands/setup_config.go @@ -0,0 +1,31 @@ +//go:build !minimal + +package commands + +import ( + managementv1 "github.com/rancher/opni/pkg/apis/management/v1" + configv1 "github.com/rancher/opni/pkg/config/v1" + "github.com/spf13/cobra" +) + +var configClient configv1.GatewayConfigClient + +func ConfigureGatewayConfigCmd(cmd *cobra.Command) { + if cmd.PersistentPreRunE == nil { + cmd.PersistentPreRunE = gatewayConfigPreRunE + } else { + oldPreRunE := cmd.PersistentPreRunE + cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + if err := oldPreRunE(cmd, args); err != nil { + return err + } + return gatewayConfigPreRunE(cmd, args) + } + } +} + +func gatewayConfigPreRunE(cmd *cobra.Command, _ []string) error { + configClient = configv1.NewGatewayConfigClient(managementv1.UnderlyingConn(mgmtClient)) + cmd.SetContext(configv1.GatewayConfigContextInjector.ContextWithClient(cmd.Context(), configClient)) + return nil +} diff --git a/pkg/resources/alerting/alerting.go b/pkg/resources/alerting/alerting.go index 906d5a4267..6e92deb14d 100644 --- a/pkg/resources/alerting/alerting.go +++ b/pkg/resources/alerting/alerting.go @@ -6,6 +6,7 @@ import ( "log/slog" "github.com/cisco-open/operator-tools/pkg/reconciler" + corev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" "github.com/rancher/opni/pkg/logger" "github.com/rancher/opni/pkg/resources" @@ -20,7 +21,7 @@ type Reconciler struct { ctx context.Context client client.Client ac *corev1beta1.AlertingCluster - gw *corev1beta1.Gateway + gw *corev1.Gateway lg *slog.Logger } @@ -46,7 +47,7 @@ func NewReconciler( } func (r *Reconciler) Reconcile() (reconcile.Result, error) { - gw := &corev1beta1.Gateway{} + gw := &corev1.Gateway{} err := r.client.Get(r.ctx, client.ObjectKey{ Name: r.ac.Spec.Gateway.Name, Namespace: r.ac.Namespace, diff --git a/pkg/resources/alerting/service.go b/pkg/resources/alerting/service.go index 83bb4558ab..e035005499 100644 --- a/pkg/resources/alerting/service.go +++ b/pkg/resources/alerting/service.go @@ -175,7 +175,7 @@ func (r *Reconciler) alertmanagerWorkerArgs() []string { func (r *Reconciler) syncerArgs() []string { _, gatewayPort, _ := net.SplitHostPort(strings.TrimPrefix( - r.gw.Spec.Management.GetGRPCListenAddress(), "tcp://")) + r.gw.Spec.Config.GetManagement().GetGrpcListenAddress(), "tcp://")) return []string{ fmt.Sprintf("--syncer.alertmanager.config.file=%s", r.configPath()), fmt.Sprintf("--syncer.listen.address=:%d", 4000), diff --git a/pkg/resources/gateway/certs.go b/pkg/resources/gateway/certs.go index 335a6b61bf..6cceec4df0 100644 --- a/pkg/resources/gateway/certs.go +++ b/pkg/resources/gateway/certs.go @@ -118,6 +118,16 @@ func (r *Reconciler) gatewayCAIssuer() client.Object { } func (r *Reconciler) gatewayServingCert() client.Object { + advertiseAddress := r.gw.Spec.Config.GetServer().GetAdvertiseAddress() + dnsNames := []string{ + fmt.Sprintf("opni.%s.svc", r.gw.Namespace), + fmt.Sprintf("opni.%s.svc.cluster.local", r.gw.Namespace), + fmt.Sprintf("opni-internal.%s.svc", r.gw.Namespace), + fmt.Sprintf("opni-internal.%s.svc.cluster.local", r.gw.Namespace), + } + if advertiseAddress != "" { + dnsNames = append(dnsNames, advertiseAddress) + } return &cmv1.Certificate{ ObjectMeta: metav1.ObjectMeta{ Name: "opni-gateway-serving-cert", @@ -134,13 +144,7 @@ func (r *Reconciler) gatewayServingCert() client.Object { Kind: "Issuer", Name: "opni-gateway-ca-issuer", }, - DNSNames: []string{ - r.gw.Spec.Hostname, - fmt.Sprintf("opni.%s.svc", r.gw.Namespace), - fmt.Sprintf("opni.%s.svc.cluster.local", r.gw.Namespace), - fmt.Sprintf("opni-internal.%s.svc", r.gw.Namespace), - fmt.Sprintf("opni-internal.%s.svc.cluster.local", r.gw.Namespace), - }, + DNSNames: dnsNames, IPAddresses: []string{ "127.0.0.1", }, diff --git a/pkg/resources/gateway/config.go b/pkg/resources/gateway/config.go new file mode 100644 index 0000000000..b31a6cde28 --- /dev/null +++ b/pkg/resources/gateway/config.go @@ -0,0 +1,221 @@ +package gateway + +import ( + "fmt" + "net/url" + "path/filepath" + "time" + + apicorev1 "github.com/rancher/opni/apis/core/v1" + "github.com/rancher/opni/pkg/logger" + "github.com/rancher/opni/pkg/storage/crds" + + cmv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1" + v1 "github.com/cert-manager/cert-manager/pkg/apis/meta/v1" + promcommon "github.com/prometheus/common/config" + opnicorev1beta1 "github.com/rancher/opni/apis/core/v1beta1" + configv1 "github.com/rancher/opni/pkg/config/v1" + "github.com/rancher/opni/pkg/resources" + "github.com/rancher/opni/pkg/util/flagutil" + "github.com/rancher/opni/pkg/util/k8sutil" + natsutil "github.com/rancher/opni/pkg/util/nats" + "github.com/samber/lo" + yamlv3 "gopkg.in/yaml.v3" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" +) + +func (r *Reconciler) checkCertificateReady(cert *cmv1.Certificate) k8sutil.RequeueOp { + lg := r.lg.With("name", cert.Name) + for _, cond := range cert.Status.Conditions { + if cond.Type == cmv1.CertificateConditionReady { + if cond.Status == v1.ConditionTrue { + return k8sutil.DoNotRequeue() + } + lg.Info("certificate not ready", "message", cond.Message) + break + } + } + lg.Info("certificate not ready (no status reported yet)") + return k8sutil.RequeueAfter(5 * time.Second) +} + +func (r *Reconciler) checkConfiguration() k8sutil.RequeueOp { + gatewayCa := r.gatewayCA().(*cmv1.Certificate) + gatewayServingCert := r.gatewayServingCert().(*cmv1.Certificate) + if err := r.client.Get(r.ctx, client.ObjectKeyFromObject(gatewayCa), gatewayCa); err != nil { + return k8sutil.RequeueAfter(1 * time.Second) + } + if err := r.client.Get(r.ctx, client.ObjectKeyFromObject(gatewayServingCert), gatewayServingCert); err != nil { + return k8sutil.RequeueAfter(1 * time.Second) + } + if op := r.checkCertificateReady(gatewayCa); op.ShouldRequeue() { + return op + } + if op := r.checkCertificateReady(gatewayServingCert); op.ShouldRequeue() { + return op + } + + caCert := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: gatewayCa.Spec.SecretName, + Namespace: r.gw.Namespace, + }, + } + servingCert := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: gatewayServingCert.Spec.SecretName, + Namespace: r.gw.Namespace, + }, + } + if err := r.client.Get(r.ctx, client.ObjectKeyFromObject(caCert), caCert); err != nil { + return k8sutil.RequeueErr(err) + } + if err := r.client.Get(r.ctx, client.ObjectKeyFromObject(servingCert), servingCert); err != nil { + return k8sutil.RequeueErr(err) + } + + clear(caCert.Data["ca.key"]) + clear(servingCert.Data["tls.key"]) + + certs := &configv1.CertsSpec{ + CaCertData: lo.ToPtr(string(caCert.Data["ca.crt"])), + ServingCertData: lo.ToPtr(string(servingCert.Data["tls.crt"])), + ServingKey: lo.ToPtr("/run/opni/certs/tls.key"), + } + + if shouldInitializeConfig(r.gw) { + return r.initDefaultActiveConfig(certs) + } + + // if certificates have changed, update the config and requeue + if r.gw.Spec.Config.Certs.GetCaCertData() != certs.GetCaCertData() || + r.gw.Spec.Config.Certs.GetServingCertData() != certs.GetServingCertData() { + r.lg.Info("gateway certificates have changed, updating config") + r.gw.Spec.Config.Certs = certs + err := r.client.Patch(r.ctx, r.gw, client.Apply, client.ForceOwnership, client.FieldOwner(crds.FieldManagerName)) + + if err != nil { + return k8sutil.RequeueErr(err) + } + return k8sutil.Requeue() + } + return k8sutil.DoNotRequeue() +} + +func shouldInitializeConfig(gw *apicorev1.Gateway) bool { + if gw.Spec.Config == nil { + return true + } + return k8sutil.FieldManagerForPath(gw, fieldpath.MakePathOrDie("spec", "config")) != crds.FieldManagerName +} + +func (r *Reconciler) initDefaultActiveConfig(certs *configv1.CertsSpec) k8sutil.RequeueOp { + conf := &configv1.GatewayConfigSpec{} + flagutil.LoadDefaults(conf) + + // ensure fields which do not have flags in GatewayConfigSpec are initialized + conf.Storage = &configv1.StorageSpec{ + Backend: r.gw.Spec.Config.GetStorage().GetBackend().Enum(), + } + conf.Auth = &configv1.AuthSpec{} + + conf.Server.AdvertiseAddress = lo.ToPtr("${POD_IP}:9090") + conf.Management.AdvertiseAddress = lo.ToPtr("${POD_IP}:11090") + conf.Relay.AdvertiseAddress = lo.ToPtr("${POD_IP}:11190") + conf.Dashboard.AdvertiseAddress = lo.ToPtr("${POD_IP}:12080") + conf.Keyring.RuntimeKeyDirs = []string{"/run/opni/keyring"} + conf.Plugins.Dir = lo.ToPtr("/var/lib/opni/plugins") + conf.Certs = certs + + // config.storage.backend can be set before initial setup, otherwise + // GetStorage().GetBackend() will return the default enum value + switch conf.Storage.GetBackend() { + case configv1.StorageBackend_Etcd: + conf.Storage.Etcd = &configv1.EtcdSpec{ + Endpoints: []string{"etcd:2379"}, + Certs: &configv1.MTLSSpec{ + ServerCA: lo.ToPtr("/run/etcd/certs/server/ca.crt"), + ClientCA: lo.ToPtr("/run/etcd/certs/client/ca.crt"), + ClientCert: lo.ToPtr("/run/etcd/certs/client/tls.crt"), + ClientKey: lo.ToPtr("/run/etcd/certs/client/tls.key"), + }, + } + case configv1.StorageBackend_JetStream: + nats := &opnicorev1beta1.NatsCluster{} + if err := r.client.Get(r.ctx, types.NamespacedName{ + Namespace: r.gw.Namespace, + Name: r.gw.Spec.NatsRef.Name, + }, nats); err != nil { + return k8sutil.RequeueErr(fmt.Errorf("failed to look up nats cluster, cannot configure jetstream storage: %w", err)) + } + conf.Storage.JetStream = &configv1.JetStreamSpec{ + Endpoint: lo.ToPtr(natsutil.BuildK8sServiceUrl(nats.Name, nats.Namespace)), + NkeySeedPath: lo.ToPtr(filepath.Join(natsutil.NkeyDir, natsutil.NkeySeedFilename)), + } + } + + err := r.client.Patch(r.ctx, &apicorev1.Gateway{ + TypeMeta: r.gw.TypeMeta, + ObjectMeta: metav1.ObjectMeta{ + Name: r.gw.Name, + Namespace: r.gw.Namespace, + UID: r.gw.UID, + }, + Spec: apicorev1.GatewaySpec{ + Config: conf, + }, + }, client.Apply, client.ForceOwnership, client.FieldOwner(crds.FieldManagerName)) + if err != nil { + return k8sutil.RequeueErr(err) + } + return k8sutil.Requeue() +} + +func (r *Reconciler) amtoolConfigMap() resources.Resource { + mgmtHost := "127.0.0.1:8080" + alertmanagerURL := url.URL{ + Scheme: "https", + Host: mgmtHost, + Path: "/plugin_alerting/alertmanager", + } + + amToolConfig := map[string]string{ + "alertmanager.url": alertmanagerURL.String(), + "http.config.file": "/etc/amtool/http.yml", + } + + amToolConfigBytes, err := yamlv3.Marshal(amToolConfig) + if err != nil { + r.lg.Error("failed to marshal amtool config", logger.Err(err)) + amToolConfigBytes = []byte{} + } + + httpConfig := promcommon.HTTPClientConfig{ + TLSConfig: promcommon.TLSConfig{ + CAFile: "/run/opni/certs/ca.crt", + CertFile: "/run/opni/certs/tls.crt", + KeyFile: "/run/opni/certs/tls.key", + }, + FollowRedirects: true, + } + httpBytes, err := yamlv3.Marshal(httpConfig) + if err != nil { + r.lg.Error("failed to marshal http config", logger.Err(err)) + httpBytes = []byte{} + } + cm := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "amtool-config", + Namespace: r.gw.Namespace, + }, + Data: map[string]string{ + "config.yml": string(amToolConfigBytes), + "http.yml": string(httpBytes), + }, + } + return resources.Present(cm) +} diff --git a/pkg/resources/gateway/configmap.go b/pkg/resources/gateway/configmap.go deleted file mode 100644 index b79467b988..0000000000 --- a/pkg/resources/gateway/configmap.go +++ /dev/null @@ -1,281 +0,0 @@ -package gateway - -import ( - "crypto/sha256" - "encoding/hex" - "fmt" - "net/url" - "path/filepath" - - "github.com/rancher/opni/pkg/alerting/shared" - "github.com/rancher/opni/pkg/logger" - - "emperror.dev/errors" - opnicorev1beta1 "github.com/rancher/opni/apis/core/v1beta1" - "github.com/rancher/opni/pkg/auth/openid" - cfgmeta "github.com/rancher/opni/pkg/config/meta" - cfgv1beta1 "github.com/rancher/opni/pkg/config/v1beta1" - "github.com/rancher/opni/pkg/noauth" - "github.com/rancher/opni/pkg/resources" - "github.com/rancher/opni/pkg/util" - natsutil "github.com/rancher/opni/pkg/util/nats" - "github.com/samber/lo" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/util/retry" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/yaml" - - promcommon "github.com/prometheus/common/config" - yamlv3 "gopkg.in/yaml.v3" -) - -func (r *Reconciler) configMap() (resources.Resource, string, error) { - gatewayConf := &cfgv1beta1.GatewayConfig{ - TypeMeta: cfgmeta.TypeMeta{ - Kind: "GatewayConfig", - APIVersion: "v1beta1", - }, - Spec: cfgv1beta1.GatewayConfigSpec{ - Plugins: cfgv1beta1.PluginsSpec{ - Dir: "/var/lib/opni/plugins", - Binary: cfgv1beta1.BinaryPluginsSpec{ - Cache: cfgv1beta1.CacheSpec{ - PatchEngine: r.gw.Spec.PatchEngine, - Backend: cfgv1beta1.CacheBackendFilesystem, - Filesystem: cfgv1beta1.FilesystemCacheSpec{ - Dir: "/var/lib/opni/plugin-cache", - }, - }, - }, - }, - Hostname: r.gw.Spec.Hostname, - Cortex: cfgv1beta1.CortexSpec{ - Management: cfgv1beta1.ClusterManagementSpec{ - ClusterDriver: "opni-manager", - }, - Certs: cfgv1beta1.MTLSSpec{ - ServerCA: "/run/cortex/certs/server/ca.crt", - ClientCA: "/run/cortex/certs/client/ca.crt", - ClientCert: "/run/cortex/certs/client/tls.crt", - ClientKey: "/run/cortex/certs/client/tls.key", - }, - }, - AuthProvider: string(r.gw.Spec.Auth.Provider), - Certs: cfgv1beta1.CertsSpec{ - CACert: lo.ToPtr("/run/opni/certs/ca.crt"), - ServingCert: lo.ToPtr("/run/opni/certs/tls.crt"), - ServingKey: lo.ToPtr("/run/opni/certs/tls.key"), - }, - Storage: cfgv1beta1.StorageSpec{ - Type: r.gw.Spec.StorageType, - }, - Alerting: cfgv1beta1.AlertingSpec{ - Certs: cfgv1beta1.MTLSSpec{ - ServerCA: "/run/alerting/certs/server/ca.crt", - ClientCA: "/run/alerting/certs/client/ca.crt", - ClientCert: "/run/alerting/certs/client/tls.crt", - ClientKey: "/run/alerting/certs/client/tls.key", - }, - Namespace: r.gw.Namespace, - WorkerNodeService: shared.AlertmanagerService, - WorkerPort: r.gw.Spec.Alerting.WebPort, - WorkerStatefulSet: shared.AlertmanagerService + "-internal", - ControllerNodeService: shared.AlertmanagerService, - ControllerStatefulSet: shared.AlertmanagerService + "-internal", - ControllerNodePort: r.gw.Spec.Alerting.WebPort, - ControllerClusterPort: r.gw.Spec.Alerting.ClusterPort, - ConfigMap: "alertmanager-config", - }, - Keyring: cfgv1beta1.KeyringSpec{ - EphemeralKeyDirs: []string{ - "/run/opni/keyring", - }, - }, - GRPCListenAddress: "0.0.0.0:9090", - GRPCAdvertiseAddress: "${POD_IP}:9090", - Management: cfgv1beta1.ManagementSpec{ - GRPCListenAddress: "tcp://0.0.0.0:11090", - GRPCAdvertiseAddress: "tcp://${POD_IP}:11090", - RelayListenAddress: "tcp://0.0.0.0:11190", - RelayAdvertiseAddress: "tcp://${POD_IP}:11190", - WebListenAddress: "0.0.0.0:12080", - WebAdvertiseAddress: "${POD_IP}:12080", - HTTPListenAddress: "0.0.0.0:11080", - }, - AgentUpgrades: cfgv1beta1.AgentUpgradesSpec{ - Kubernetes: cfgv1beta1.KubernetesAgentUpgradeSpec{ - ImageResolver: cfgv1beta1.ImageResolverKubernetes, - }, - }, - }, - } - gatewayConf.Spec.SetDefaults() - - if r.gw.Status.StorageType != "" && r.gw.Status.StorageType != r.gw.Spec.StorageType { - return nil, "", fmt.Errorf("storage type cannot be changed once set") - } else if r.gw.Status.StorageType == "" { - err := retry.RetryOnConflict(retry.DefaultRetry, func() error { - err := r.client.Get(r.ctx, client.ObjectKeyFromObject(r.gw), r.gw) - if err != nil { - return err - } - r.gw.Status.StorageType = r.gw.Spec.StorageType - return r.client.Status().Update(r.ctx, r.gw) - }) - if err != nil { - return nil, "", err - } - } - - switch r.gw.Spec.StorageType { - case cfgv1beta1.StorageTypeEtcd: - gatewayConf.Spec.Storage.Etcd = &cfgv1beta1.EtcdStorageSpec{ - Endpoints: []string{"etcd:2379"}, - Certs: &cfgv1beta1.MTLSSpec{ - ServerCA: "/run/etcd/certs/server/ca.crt", - ClientCA: "/run/etcd/certs/client/ca.crt", - ClientCert: "/run/etcd/certs/client/tls.crt", - ClientKey: "/run/etcd/certs/client/tls.key", - }, - } - case cfgv1beta1.StorageTypeJetStream: - nats := &opnicorev1beta1.NatsCluster{} - if err := r.client.Get(r.ctx, types.NamespacedName{ - Namespace: r.gw.Namespace, - Name: r.gw.Spec.NatsRef.Name, - }, nats); err != nil { - return nil, "", fmt.Errorf("failed to look up nats cluster, cannot configure jetstream storage: %w", err) - } - gatewayConf.Spec.Storage.JetStream = &cfgv1beta1.JetStreamStorageSpec{ - Endpoint: natsutil.BuildK8sServiceUrl(nats.Name, nats.Namespace), - NkeySeedPath: filepath.Join(natsutil.NkeyDir, natsutil.NkeySeedFilename), - } - case cfgv1beta1.StorageTypeCRDs: - gatewayConf.Spec.Storage.CustomResources = &cfgv1beta1.CustomResourcesStorageSpec{ - Namespace: r.gw.Namespace, - } - } - - var apSpec cfgv1beta1.AuthProviderSpec - switch t := cfgv1beta1.AuthProviderType(r.gw.Spec.Auth.Provider); t { - case cfgv1beta1.AuthProviderOpenID: - apSpec.Type = cfgv1beta1.AuthProviderOpenID - options, err := util.DecodeStruct[map[string]any](r.gw.Spec.Auth.Openid.OpenidConfig) - if err != nil { - return nil, "", errors.WrapIf(err, "failed to decode openid auth provider options") - } - apSpec.Options = *options - - case cfgv1beta1.AuthProviderNoAuth: - apSpec.Type = cfgv1beta1.AuthProviderNoAuth - issuer := fmt.Sprintf("http://%s:4000/oauth2", r.gw.Spec.Hostname) - r.gw.Spec.Auth.Noauth = &noauth.ServerConfig{ - Issuer: issuer, - ClientID: "grafana", - ClientSecret: "noauth", - RedirectURI: func() string { - if r.gw.Spec.Auth.Noauth != nil { - return fmt.Sprintf("https://%s/login/generic_oauth", r.gw.Spec.Auth.Noauth.GrafanaHostname) - } - return fmt.Sprintf("https://grafana.%s/login/generic_oauth", r.gw.Spec.Hostname) - }(), - ManagementAPIEndpoint: "opni-internal:11090", - Port: 4000, - OpenID: openid.OpenidConfig{ - Discovery: &openid.DiscoverySpec{ - Issuer: issuer, - }, - }, - } - options, err := util.DecodeStruct[map[string]any](r.gw.Spec.Auth.Noauth) - if err != nil { - return nil, "", errors.WrapIf(err, "failed to decode noauth auth provider options") - } - apSpec.Options = *options - default: - return nil, "", errors.Errorf("unsupported auth provider: %s", t) - } - - authProvider := &cfgv1beta1.AuthProvider{ - TypeMeta: cfgmeta.TypeMeta{ - Kind: "AuthProvider", - APIVersion: "v1beta1", - }, - ObjectMeta: cfgmeta.ObjectMeta{ - Name: string(r.gw.Spec.Auth.Provider), - }, - Spec: apSpec, - } - - gatewayConfData, err := yaml.Marshal(gatewayConf) - if err != nil { - return nil, "", errors.WrapIf(err, "failed to marshal gateway config") - } - authProviderData, err := yaml.Marshal(authProvider) - if err != nil { - return nil, "", errors.WrapIf(err, "failed to marshal auth provider") - } - - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "opni-gateway", - Namespace: r.gw.Namespace, - Labels: resources.NewGatewayLabels(), - }, - Data: map[string]string{ - "config.yaml": fmt.Sprintf("%s\n---\n%s", gatewayConfData, authProviderData), - }, - } - digest := sha256.Sum256([]byte(cm.Data["config.yaml"])) - - ctrl.SetControllerReference(r.gw, cm, r.client.Scheme()) - return resources.Present(cm), hex.EncodeToString(digest[:]), nil -} - -func (r *Reconciler) amtoolConfigMap() resources.Resource { - mgmtHost := "127.0.0.1:8080" - alertmanagerURL := url.URL{ - Scheme: "https", - Host: mgmtHost, - Path: "/plugin_alerting/alertmanager", - } - - amToolConfig := map[string]string{ - "alertmanager.url": alertmanagerURL.String(), - "http.config.file": "/etc/amtool/http.yml", - } - - amToolConfigBytes, err := yamlv3.Marshal(amToolConfig) - if err != nil { - r.lg.Error("failed to marshal amtool config", logger.Err(err)) - amToolConfigBytes = []byte{} - } - - httpConfig := promcommon.HTTPClientConfig{ - TLSConfig: promcommon.TLSConfig{ - CAFile: "/run/opni/certs/ca.crt", - CertFile: "/run/opni/certs/tls.crt", - KeyFile: "/run/opni/certs/tls.key", - }, - FollowRedirects: true, - } - httpBytes, err := yamlv3.Marshal(httpConfig) - if err != nil { - r.lg.Error("failed to marshal http config", logger.Err(err)) - httpBytes = []byte{} - } - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "amtool-config", - Namespace: r.gw.Namespace, - }, - Data: map[string]string{ - "config.yml": string(amToolConfigBytes), - "http.yml": string(httpBytes), - }, - } - return resources.Present(cm) -} diff --git a/pkg/resources/gateway/deployment.go b/pkg/resources/gateway/deployment.go index 180839fa52..f22e75674a 100644 --- a/pkg/resources/gateway/deployment.go +++ b/pkg/resources/gateway/deployment.go @@ -28,10 +28,6 @@ func (r *Reconciler) deployment(extraAnnotations map[string]string) ([]resources if err != nil { return nil, err } - // pvc, err := r.pluginCachePVC() - // if err != nil { - // return nil, err - // } gatewayApiVersion := r.gw.APIVersion replicas := r.gw.Spec.Replicas @@ -103,10 +99,6 @@ func (r *Reconciler) deployment(extraAnnotations map[string]string) ([]resources }, ), VolumeMounts: []corev1.VolumeMount{ - { - Name: "config", - MountPath: "/etc/opni", - }, { Name: "amtool", MountPath: "/etc/amtool", @@ -144,10 +136,8 @@ func (r *Reconciler) deployment(extraAnnotations map[string]string) ([]resources MountPath: "/var/lib/opni/plugin-cache", }, { - Name: "local-agent-key", - MountPath: "/run/opni/keyring/session-attribute.json", - SubPathExpr: "session-attribute.json", - ReadOnly: true, + Name: "local-agent-key", + MountPath: "/run/opni/keyring", }, }, Ports: append(append(publicPorts, internalPorts...), adminDashboardPorts...), @@ -190,17 +180,6 @@ func (r *Reconciler) deployment(extraAnnotations map[string]string) ([]resources }, }, Volumes: []corev1.Volume{ - { - Name: "config", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "opni-gateway", - }, - DefaultMode: lo.ToPtr[int32](0400), - }, - }, - }, { Name: "amtool", VolumeSource: corev1.VolumeSource{ @@ -216,7 +195,13 @@ func (r *Reconciler) deployment(extraAnnotations map[string]string) ([]resources Name: "certs", VolumeSource: corev1.VolumeSource{ Secret: &corev1.SecretVolumeSource{ - SecretName: "opni-gateway-serving-cert", + SecretName: "opni-gateway-serving-cert", + Items: []corev1.KeyToPath{ + { + Key: "tls.key", + Path: "tls.key", + }, + }, DefaultMode: lo.ToPtr[int32](0400), }, }, @@ -403,21 +388,23 @@ func (r *Reconciler) deployment(extraAnnotations map[string]string) ([]resources gatewayStatefulSet.Spec.Template.Spec.Containers[0].VolumeMounts = append(gatewayStatefulSet.Spec.Template.Spec.Containers[0].VolumeMounts, volMount) } - // add additional volumes for alerting - if r.gw.Spec.Alerting.Enabled && r.gw.Spec.Alerting.GatewayVolumeMounts != nil { - for _, alertVol := range r.gw.Spec.Alerting.GatewayVolumeMounts { - vol := corev1.Volume{ - Name: alertVol.Name, - VolumeSource: alertVol.VolumeSource, - } - volMount := corev1.VolumeMount{ - Name: alertVol.Name, - MountPath: alertVol.MountPath, - } - gatewayStatefulSet.Spec.Template.Spec.Volumes = append(gatewayStatefulSet.Spec.Template.Spec.Volumes, vol) - gatewayStatefulSet.Spec.Template.Spec.Containers[0].VolumeMounts = append(gatewayStatefulSet.Spec.Template.Spec.Containers[0].VolumeMounts, volMount) - } - } + + // TODO(config) + // // add additional volumes for alerting + // if r.gw.Spec.Alerting.Enabled && r.gw.Spec.Alerting.GatewayVolumeMounts != nil { + // for _, alertVol := range r.gw.Spec.Alerting.GatewayVolumeMounts { + // vol := corev1.Volume{ + // Name: alertVol.Name, + // VolumeSource: alertVol.VolumeSource, + // } + // volMount := corev1.VolumeMount{ + // Name: alertVol.Name, + // MountPath: alertVol.MountPath, + // } + // gatewayStatefulSet.Spec.Template.Spec.Volumes = append(gatewayStatefulSet.Spec.Template.Spec.Volumes, vol) + // gatewayStatefulSet.Spec.Template.Spec.Containers[0].VolumeMounts = append(gatewayStatefulSet.Spec.Template.Spec.Containers[0].VolumeMounts, volMount) + // } + // } ctrl.SetControllerReference(r.gw, gatewayStatefulSet, r.client.Scheme()) return []resources.Resource{ diff --git a/pkg/resources/gateway/etcd.go b/pkg/resources/gateway/etcd.go index 1f749b02a6..40b7a48d41 100644 --- a/pkg/resources/gateway/etcd.go +++ b/pkg/resources/gateway/etcd.go @@ -9,7 +9,7 @@ import ( "fmt" "strings" - "github.com/rancher/opni/pkg/config/v1beta1" + configv1 "github.com/rancher/opni/pkg/config/v1" "github.com/rancher/opni/pkg/resources" "github.com/rancher/opni/pkg/util" "github.com/samber/lo" @@ -356,7 +356,7 @@ func (r *Reconciler) etcdStatefulSet() (resources.Resource, error) { ctrl.SetControllerReference(r.gw, statefulset, r.client.Scheme()) - return resources.PresentIff(r.gw.Spec.StorageType == v1beta1.StorageTypeEtcd, statefulset), nil + return resources.PresentIff(r.gw.Spec.Config.GetStorage().GetBackend() == configv1.StorageBackend_Etcd, statefulset), nil } func (r *Reconciler) etcdSecrets() ([]resources.Resource, error) { @@ -399,8 +399,8 @@ func (r *Reconciler) etcdSecrets() ([]resources.Resource, error) { ctrl.SetControllerReference(r.gw, password, r.client.Scheme()) return []resources.Resource{ - resources.PresentIff(r.gw.Spec.StorageType == v1beta1.StorageTypeEtcd, password), - resources.PresentIff(r.gw.Spec.StorageType == v1beta1.StorageTypeEtcd, token), + resources.PresentIff(r.gw.Spec.Config.GetStorage().GetBackend() == configv1.StorageBackend_Etcd, password), + resources.PresentIff(r.gw.Spec.Config.GetStorage().GetBackend() == configv1.StorageBackend_Etcd, token), }, nil } @@ -449,7 +449,7 @@ func (r *Reconciler) etcdServices() ([]resources.Resource, error) { ctrl.SetControllerReference(r.gw, headless, r.client.Scheme()) ctrl.SetControllerReference(r.gw, svc, r.client.Scheme()) return []resources.Resource{ - resources.PresentIff(r.gw.Spec.StorageType == v1beta1.StorageTypeEtcd, headless), - resources.PresentIff(r.gw.Spec.StorageType == v1beta1.StorageTypeEtcd, svc), + resources.PresentIff(r.gw.Spec.Config.GetStorage().GetBackend() == configv1.StorageBackend_Etcd, headless), + resources.PresentIff(r.gw.Spec.Config.GetStorage().GetBackend() == configv1.StorageBackend_Etcd, svc), }, nil } diff --git a/pkg/resources/gateway/gateway.go b/pkg/resources/gateway/gateway.go index 356c500db3..2061a6965b 100644 --- a/pkg/resources/gateway/gateway.go +++ b/pkg/resources/gateway/gateway.go @@ -6,7 +6,7 @@ import ( "log/slog" "github.com/cisco-open/operator-tools/pkg/reconciler" - corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" + apicorev1 "github.com/rancher/opni/apis/core/v1" "github.com/rancher/opni/pkg/logger" "github.com/rancher/opni/pkg/resources" "github.com/rancher/opni/pkg/util/k8sutil" @@ -21,14 +21,14 @@ type Reconciler struct { reconciler.ResourceReconciler ctx context.Context client client.Client - gw *corev1beta1.Gateway + gw *apicorev1.Gateway lg *slog.Logger } func NewReconciler( ctx context.Context, client client.Client, - instance *corev1beta1.Gateway, + instance *apicorev1.Gateway, ) *Reconciler { return &Reconciler{ ResourceReconciler: reconciler.NewReconcilerWith(client, @@ -53,30 +53,30 @@ func (r *Reconciler) Reconcile() (retResult reconcile.Result, retErr error) { return k8sutil.Requeue().Result() } - allResources := []resources.Resource{} - etcdResources, err := r.etcd() + certs, err := r.certs() if err != nil { return k8sutil.RequeueErr(err).Result() } - allResources = append(allResources, etcdResources...) - configMap, configDigest, err := r.configMap() - if err != nil { - return k8sutil.RequeueErr(err).Result() + if op := resources.ReconcileAll(r, certs); op.ShouldRequeue() { + return op.Result() } - allResources = append(allResources, configMap) - certs, err := r.certs() + if res := r.checkConfiguration(); res.ShouldRequeue() { + return res.Result() + } + + allResources := []resources.Resource{} + etcdResources, err := r.etcd() if err != nil { return k8sutil.RequeueErr(err).Result() } - allResources = append(allResources, certs...) + allResources = append(allResources, etcdResources...) + keys, err := r.ephemeralKeys() if err != nil { return k8sutil.RequeueErr(err).Result() } allResources = append(allResources, keys...) - deployment, err := r.deployment(map[string]string{ - resources.OpniConfigHash: configDigest, - }) + deployment, err := r.deployment(nil) if err != nil { return k8sutil.RequeueErr(err).Result() } diff --git a/pkg/resources/gateway/ports.go b/pkg/resources/gateway/ports.go index 8633f7c451..a6cef958a8 100644 --- a/pkg/resources/gateway/ports.go +++ b/pkg/resources/gateway/ports.go @@ -5,14 +5,11 @@ import ( "strconv" "strings" - cfgv1beta1 "github.com/rancher/opni/pkg/config/v1beta1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/apimachinery/pkg/util/validation/field" ) func (r *Reconciler) publicContainerPorts() ([]corev1.ContainerPort, error) { - lg := r.lg ports := []corev1.ContainerPort{ { Name: "grpc", @@ -20,22 +17,6 @@ func (r *Reconciler) publicContainerPorts() ([]corev1.ContainerPort, error) { Protocol: corev1.ProtocolTCP, }, } - if r.gw.Spec.Auth.Provider == cfgv1beta1.AuthProviderNoAuth { - if r.gw.Spec.Auth.Noauth == nil { - return nil, field.Required(field.NewPath("spec", "auth", "noauth"), - "must provide noauth config when it is used as the auth provider") - } - noauthPort := r.gw.Spec.Auth.Noauth.Port - if noauthPort == 0 { - lg.Warn("noauth port is not set, using default port 4000") - noauthPort = 4000 - } - ports = append(ports, corev1.ContainerPort{ - Name: "noauth", - ContainerPort: int32(noauthPort), - Protocol: corev1.ProtocolTCP, - }) - } return ports, nil } @@ -52,14 +33,14 @@ func (r *Reconciler) internalContainerPorts() ([]corev1.ContainerPort, error) { Protocol: corev1.ProtocolTCP, }, } - if addr := r.gw.Spec.Management.GetGRPCListenAddress(); strings.HasPrefix(addr, "tcp://") { + if addr := r.gw.Spec.Config.GetManagement().GetGrpcListenAddress(); addr != "" { parts := strings.Split(addr, ":") - if len(parts) != 3 { - return nil, fmt.Errorf("invalid GRPC listen address %q", addr) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid HTTP listen address %q", addr) } - portNum, err := strconv.ParseInt(parts[2], 10, 32) + portNum, err := strconv.ParseInt(parts[1], 10, 32) if err != nil { - return nil, fmt.Errorf("invalid GRPC listen address %q", addr) + return nil, fmt.Errorf("invalid HTTP listen address %q", addr) } ports = append(ports, corev1.ContainerPort{ Name: "management-grpc", @@ -67,7 +48,7 @@ func (r *Reconciler) internalContainerPorts() ([]corev1.ContainerPort, error) { Protocol: corev1.ProtocolTCP, }) } - if addr := r.gw.Spec.Management.GetHTTPListenAddress(); addr != "" { + if addr := r.gw.Spec.Config.GetManagement().GetHttpListenAddress(); addr != "" { parts := strings.Split(addr, ":") if len(parts) != 2 { return nil, fmt.Errorf("invalid HTTP listen address %q", addr) @@ -87,7 +68,7 @@ func (r *Reconciler) internalContainerPorts() ([]corev1.ContainerPort, error) { func (r *Reconciler) adminDashboardContainerPorts() ([]corev1.ContainerPort, error) { var ports []corev1.ContainerPort - if addr := r.gw.Spec.Management.GetWebListenAddress(); addr != "" { + if addr := r.gw.Spec.Config.GetDashboard().GetHttpListenAddress(); addr != "" { parts := strings.Split(addr, ":") if len(parts) != 2 { return nil, fmt.Errorf("invalid Web listen address %q", addr) diff --git a/pkg/resources/monitoring/grafana.go b/pkg/resources/monitoring/grafana.go index 4246397454..4a45eb9ad7 100644 --- a/pkg/resources/monitoring/grafana.go +++ b/pkg/resources/monitoring/grafana.go @@ -1,3 +1,5 @@ +//go:build ignore + package monitoring import ( diff --git a/pkg/resources/monitoring/monitoring.go b/pkg/resources/monitoring/monitoring.go index 4072158c10..40c6831071 100644 --- a/pkg/resources/monitoring/monitoring.go +++ b/pkg/resources/monitoring/monitoring.go @@ -6,6 +6,7 @@ import ( "log/slog" "github.com/cisco-open/operator-tools/pkg/reconciler" + apicorev1 "github.com/rancher/opni/apis/core/v1" corev1beta1 "github.com/rancher/opni/apis/core/v1beta1" "github.com/rancher/opni/pkg/logger" "github.com/rancher/opni/pkg/resources" @@ -22,7 +23,7 @@ type Reconciler struct { ctx context.Context client client.Client mc *corev1beta1.MonitoringCluster - gw *corev1beta1.Gateway + gw *apicorev1.Gateway lg *slog.Logger } @@ -47,7 +48,7 @@ func NewReconciler( } func (r *Reconciler) Reconcile() (reconcile.Result, error) { - gw := &corev1beta1.Gateway{} + gw := &apicorev1.Gateway{} err := r.client.Get(r.ctx, types.NamespacedName{ Name: r.mc.Spec.Gateway.Name, Namespace: r.mc.Namespace, @@ -71,11 +72,11 @@ func (r *Reconciler) Reconcile() (reconcile.Result, error) { allResources := []resources.Resource{} - grafanaResources, err := r.grafana() - if err != nil { - return k8sutil.RequeueErr(err).Result() - } - allResources = append(allResources, grafanaResources...) + // grafanaResources, err := r.grafana() + // if err != nil { + // return k8sutil.RequeueErr(err).Result() + // } + // allResources = append(allResources, grafanaResources...) if op := resources.ReconcileAll(r, allResources); op.ShouldRequeue() { return op.Result() diff --git a/pkg/storage/crds/crds_suite_test.go b/pkg/storage/crds/crds_suite_test.go index f75d81d9ca..b96050d05f 100644 --- a/pkg/storage/crds/crds_suite_test.go +++ b/pkg/storage/crds/crds_suite_test.go @@ -9,6 +9,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/onsi/gomega/types" + opnicorev1 "github.com/rancher/opni/apis/core/v1" opnicorev1beta1 "github.com/rancher/opni/apis/core/v1beta1" monitoringv1beta1 "github.com/rancher/opni/apis/monitoring/v1beta1" "github.com/rancher/opni/pkg/storage" @@ -133,6 +134,7 @@ var _ = BeforeSuite(func() { testruntime.IfLabelFilterMatches(Label("integration", "slow"), func() { ctx, ca := context.WithCancel(context.Background()) s := scheme.Scheme + opnicorev1.AddToScheme(s) opnicorev1beta1.AddToScheme(s) monitoringv1beta1.AddToScheme(s) config, _, err := testk8s.StartK8s(ctx, []string{"../../../config/crd/bases"}, s) @@ -142,6 +144,7 @@ var _ = BeforeSuite(func() { k8sClient, err := k8sutil.NewK8sClient(k8sutil.ClientOptions{ RestConfig: config, + Scheme: s, }) Expect(err).NotTo(HaveOccurred()) @@ -154,6 +157,6 @@ var _ = BeforeSuite(func() { var _ = Describe("CRD Token Store", Ordered, Label("integration", "slow"), TokenStoreTestSuite(store)) var _ = Describe("CRD RBAC Store", Ordered, Label("integration", "slow"), RBACStoreTestSuite(store)) var _ = Describe("CRD Keyring Store", Ordered, Label("integration", "slow"), KeyringStoreTestSuite(store)) -var _ = Describe("CRD Value Store", Ordered, Label("integration", "slow"), KeyValueStoreTestSuite(kvStore, newObject, func(a any) types.GomegaMatcher { +var _ = FDescribe("CRD Value Store", Ordered, Label("integration", "slow"), KeyValueStoreTestSuite(kvStore, newObject, func(a any) types.GomegaMatcher { return testutil.ProtoEqual(a.(proto.Message)) })) diff --git a/pkg/storage/crds/value_store.go b/pkg/storage/crds/value_store.go index 4cc348ea20..e1ae232dc3 100644 --- a/pkg/storage/crds/value_store.go +++ b/pkg/storage/crds/value_store.go @@ -26,6 +26,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) +const FieldManagerName = "opni-crd-value-store" + type ValueStoreMethods[O client.Object, T driverutil.ConfigType[T]] interface { ControllerReference() (client.Object, bool) FillObjectFromConfig(obj O, conf T) @@ -154,7 +156,7 @@ func (s *CRDValueStore[O, T]) Put(ctx context.Context, value T, opts ...storage. s.methods.FillObjectFromConfig(obj, value) if !exists { - err := s.client.Create(ctx, obj) + err := s.client.Create(ctx, obj, client.FieldOwner(FieldManagerName)) if err != nil { return toGrpcError(err) } @@ -166,7 +168,8 @@ func (s *CRDValueStore[O, T]) Put(ctx context.Context, value T, opts ...storage. obj.SetResourceVersion(strconv.FormatInt(*putOptions.Revision, 10)) } - err := s.client.Update(ctx, obj) + obj.GetObjectKind().SetGroupVersionKind(s.gvk) + err := s.client.Update(ctx, obj, client.FieldOwner(FieldManagerName)) if err != nil { return toGrpcError(err) } diff --git a/pkg/test/environment.go b/pkg/test/environment.go index 798093b8a8..62e80bf1ed 100644 --- a/pkg/test/environment.go +++ b/pkg/test/environment.go @@ -51,7 +51,7 @@ import ( "github.com/rancher/opni/pkg/bootstrap" "github.com/rancher/opni/pkg/caching" "github.com/rancher/opni/pkg/clients" - "github.com/rancher/opni/pkg/config" + "github.com/rancher/opni/pkg/config/adapt" "github.com/rancher/opni/pkg/config/meta" configv1 "github.com/rancher/opni/pkg/config/v1" "github.com/rancher/opni/pkg/config/v1beta1" @@ -59,6 +59,7 @@ import ( "github.com/rancher/opni/pkg/ident" "github.com/rancher/opni/pkg/keyring/ephemeral" "github.com/rancher/opni/pkg/logger" + "github.com/rancher/opni/pkg/machinery" "github.com/rancher/opni/pkg/management" "github.com/rancher/opni/pkg/otel" "github.com/rancher/opni/pkg/pkp" @@ -74,6 +75,7 @@ import ( "github.com/rancher/opni/pkg/tokens" "github.com/rancher/opni/pkg/trust" "github.com/rancher/opni/pkg/util" + "github.com/rancher/opni/pkg/util/flagutil" "github.com/rancher/opni/plugins/metrics/pkg/cortex/configutil" "github.com/samber/lo" clientv3 "go.etcd.io/etcd/client/v3" @@ -88,7 +90,9 @@ import ( _ "github.com/rancher/opni/pkg/oci/noop" _ "github.com/rancher/opni/pkg/storage/etcd" + "github.com/rancher/opni/pkg/storage/inmemory" _ "github.com/rancher/opni/pkg/storage/jetstream" + "github.com/rancher/opni/pkg/storage/kvutil" "github.com/rancher/opni/pkg/update/noop" ) @@ -1898,28 +1902,31 @@ func (e *Environment) startGateway() { e.gatewayConfig = e.NewGatewayConfig() e.pluginLoader = plugins.NewPluginLoader() - lifecycler := config.NewLifecycler(meta.ObjectList{e.gatewayConfig, &v1beta1.AuthProvider{ - TypeMeta: meta.TypeMeta{ - APIVersion: "v1beta1", - Kind: "AuthProvider", - }, - ObjectMeta: meta.ObjectMeta{ - Name: "test", - }, - Spec: v1beta1.AuthProviderSpec{ - Type: "test", - }, - }}) - e.gw = gateway.NewGateway(e.ctx, e.gatewayConfig, e.pluginLoader, + cfgv1 := adapt.V1GatewayConfigOf(e.gatewayConfig) + + storageBackend, err := machinery.ConfigureStorageBackendV1(e.ctx, cfgv1.GetStorage()) + if err != nil { + panic(err) + } + + activeStore := kvutil.WithMessageCodec[*configv1.GatewayConfigSpec]( + kvutil.WithKey(storageBackend.KeyValueStore("gateway"), "config")) + + defaultStore := inmemory.NewValueStore[*configv1.GatewayConfigSpec](util.ProtoClone) + + mgr := configv1.NewGatewayConfigManager(defaultStore, activeStore, flagutil.LoadDefaults) + if err := mgr.Start(e.ctx); err != nil { + panic(fmt.Errorf("failed to start config manager: %w", err)) + } + + e.gw = gateway.NewGateway(e.ctx, mgr, storageBackend, e.pluginLoader, gateway.WithLogger(lg.WithGroup("gateway")), - gateway.WithLifecycler(lifecycler), gateway.WithExtraUpdateHandlers(noop.NewSyncServer()), ) - m := management.NewServer(e.ctx, &e.gatewayConfig.Spec.Management, e.gw, e.pluginLoader, + m := management.NewServer(e.ctx, e.gw, mgr, e.pluginLoader, management.WithCapabilitiesDataSource(e.gw.CapabilitiesDataSource()), management.WithHealthStatusDataSource(e.gw), - management.WithLifecycler(lifecycler), ) e.gw.MustRegisterCollector(m) @@ -1965,7 +1972,7 @@ func (e *Environment) startGateway() { started := false for i := 0; i < 100; i++ { req, _ := http.NewRequest(http.MethodGet, fmt.Sprintf("http://%s/healthz", - e.gatewayConfig.Spec.MetricsListenAddress), nil) + cfgv1.Health.GetHttpListenAddress()), nil) resp, err := http.DefaultClient.Do(req) if err == nil { resp.Body.Close() @@ -2283,28 +2290,6 @@ func (e *Environment) GetAgent(id string) RunningAgent { return e.runningAgents[id] } -func (e *Environment) GatewayTLSConfig() *tls.Config { - pool := x509.NewCertPool() - switch { - case e.gatewayConfig.Spec.Certs.CACert != nil: - data, err := os.ReadFile(*e.gatewayConfig.Spec.Certs.CACert) - if err != nil { - panic("gateway panic") - } - if !pool.AppendCertsFromPEM(data) { - panic("failed to load gateway CA cert") - } - case e.gatewayConfig.Spec.Certs.CACertData != nil: - if !pool.AppendCertsFromPEM(e.gatewayConfig.Spec.Certs.CACertData) { - panic("failed to load gateway CA cert") - } - } - return &tls.Config{ - MinVersion: tls.VersionTLS12, - RootCAs: pool, - } -} - func (e *Environment) GatewayClientTLSConfig() *tls.Config { pool := x509.NewCertPool() diff --git a/pkg/util/k8sutil/ssa.go b/pkg/util/k8sutil/ssa.go new file mode 100644 index 0000000000..41bc4262aa --- /dev/null +++ b/pkg/util/k8sutil/ssa.go @@ -0,0 +1,28 @@ +package k8sutil + +import ( + "bytes" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" +) + +// Returns the field manager name for the given path, or "" if no manager is +// associated with the path. +func FieldManagerForPath(obj client.Object, path fieldpath.Path) string { + for _, entry := range obj.GetManagedFields() { + if DecodeManagedFieldsEntry(entry).Has(path) { + return entry.Manager + } + } + return "" +} + +func DecodeManagedFieldsEntry(e metav1.ManagedFieldsEntry) *fieldpath.Set { + var set fieldpath.Set + if e.FieldsV1 != nil { + set.FromJSON(bytes.NewReader(e.FieldsV1.Raw)) + } + return &set +} diff --git a/plugins/metrics/pkg/gateway/drivers/opni_manager/opni_manager.go b/plugins/metrics/pkg/gateway/drivers/opni_manager/opni_manager.go index 7c4856a9be..dab631daec 100644 --- a/plugins/metrics/pkg/gateway/drivers/opni_manager/opni_manager.go +++ b/plugins/metrics/pkg/gateway/drivers/opni_manager/opni_manager.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + opnicorev1 "github.com/rancher/opni/apis/core/v1" opnicorev1beta1 "github.com/rancher/opni/apis/core/v1beta1" corev1 "github.com/rancher/opni/pkg/apis/core/v1" "github.com/rancher/opni/pkg/plugins/driverutil" @@ -39,8 +40,8 @@ func (k OpniManagerClusterDriverOptions) newMonitoringCluster() *opnicorev1beta1 } } -func (k OpniManagerClusterDriverOptions) newGateway() *opnicorev1beta1.Gateway { - return &opnicorev1beta1.Gateway{ +func (k OpniManagerClusterDriverOptions) newGateway() *opnicorev1.Gateway { + return &opnicorev1.Gateway{ ObjectMeta: metav1.ObjectMeta{ Name: k.GatewayRef.Name, Namespace: k.GatewayRef.Namespace,