Merge pull request #894 from Random-Liu/support-masked-readonly-paths

Support masked readonly paths
This commit is contained in:
Lantao Liu 2018-09-05 10:32:40 -07:00 committed by GitHub
commit 67c0b3e5e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 4249 additions and 3727 deletions

View File

@ -357,6 +357,24 @@ func (c *criService) generateContainerSpec(id string, sandboxID string, sandboxP
return nil, errors.Wrapf(err, "failed to set OCI bind mounts %+v", mounts) return nil, errors.Wrapf(err, "failed to set OCI bind mounts %+v", mounts)
} }
// Apply masked paths if specified.
// When `MaskedPaths` is not specified, keep runtime default for backward compatibility;
// When `MaskedPaths` is specified, but length is zero, clear masked path list.
if securityContext.GetMaskedPaths() != nil {
g.Config.Linux.MaskedPaths = nil
for _, path := range securityContext.GetMaskedPaths() {
g.AddLinuxMaskedPaths(path)
}
}
// Apply readonly paths if specified.
if securityContext.GetReadonlyPaths() != nil {
g.Config.Linux.ReadonlyPaths = nil
for _, path := range securityContext.GetReadonlyPaths() {
g.AddLinuxReadonlyPaths(path)
}
}
if securityContext.GetPrivileged() { if securityContext.GetPrivileged() {
if !sandboxConfig.GetLinux().GetSecurityContext().GetPrivileged() { if !sandboxConfig.GetLinux().GetSecurityContext().GetPrivileged() {
return nil, errors.New("no privileged container allowed in sandbox") return nil, errors.New("no privileged container allowed in sandbox")

View File

@ -248,7 +248,6 @@ func TestContainerCapabilities(t *testing.T) {
spec, err := c.generateContainerSpec(testID, testSandboxID, testPid, config, sandboxConfig, imageConfig, nil) spec, err := c.generateContainerSpec(testID, testSandboxID, testPid, config, sandboxConfig, imageConfig, nil)
require.NoError(t, err) require.NoError(t, err)
specCheck(t, testID, testSandboxID, testPid, spec) specCheck(t, testID, testSandboxID, testPid, spec)
t.Log(spec.Process.Capabilities.Bounding)
for _, include := range test.includes { for _, include := range test.includes {
assert.Contains(t, spec.Process.Capabilities.Bounding, include) assert.Contains(t, spec.Process.Capabilities.Bounding, include)
assert.Contains(t, spec.Process.Capabilities.Effective, include) assert.Contains(t, spec.Process.Capabilities.Effective, include)
@ -913,3 +912,45 @@ func TestGenerateApparmorSpecOpts(t *testing.T) {
} }
} }
} }
func TestMaskedAndReadonlyPaths(t *testing.T) {
testID := "test-id"
testSandboxID := "sandbox-id"
testPid := uint32(1234)
config, sandboxConfig, imageConfig, specCheck := getCreateContainerTestData()
c := newTestCRIService()
defaultSpec, err := defaultRuntimeSpec(testID)
require.NoError(t, err)
for desc, test := range map[string]struct {
masked []string
readonly []string
expectedMasked []string
expectedReadonly []string
}{
"should apply default if not specified": {
expectedMasked: defaultSpec.Linux.MaskedPaths,
expectedReadonly: defaultSpec.Linux.ReadonlyPaths,
},
"should be able to specify empty paths": {
masked: []string{},
readonly: []string{},
expectedMasked: nil,
expectedReadonly: nil,
},
"should apply CRI specified paths": {
masked: []string{"/proc"},
readonly: []string{"/sys"},
expectedMasked: []string{"/proc"},
expectedReadonly: []string{"/sys"},
},
} {
t.Logf("TestCase %q", desc)
config.Linux.SecurityContext.MaskedPaths = test.masked
config.Linux.SecurityContext.ReadonlyPaths = test.readonly
spec, err := c.generateContainerSpec(testID, testSandboxID, testPid, config, sandboxConfig, imageConfig, nil)
require.NoError(t, err)
specCheck(t, testID, testSandboxID, testPid, spec)
assert.Equal(t, test.expectedMasked, spec.Linux.MaskedPaths)
assert.Equal(t, test.expectedReadonly, spec.Linux.ReadonlyPaths)
}
}

View File

@ -69,9 +69,9 @@ google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
google.golang.org/grpc v1.12.0 google.golang.org/grpc v1.12.0
gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4 gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
gopkg.in/yaml.v2 53feefa2559fb8dfa8d81baad31be332c97d6c77 gopkg.in/yaml.v2 53feefa2559fb8dfa8d81baad31be332c97d6c77
k8s.io/api 9e5ffd1f1320950b238cfce291b926411f0af722 k8s.io/api 12ee108019c2efdc50febb4937fe054aede5d660
k8s.io/apimachinery ed135c5b96450fd24e5e981c708114fbbd950697 k8s.io/apimachinery c6b66c9c507abbefa93ad83f7fe8c9b52ca1ae30
k8s.io/apiserver a90e3a95c2e91b944bfca8225c4e0d12e42a9eb5 k8s.io/apiserver ecbc9eada272b5735d74d2dd0f944dfdefdbb2a5
k8s.io/client-go 03bfb9bdcfe5482795b999f39ca3ed9ad42ce5bb k8s.io/client-go 22e1ddcc4852ed93b2c34ef13fbb287f794200ae
k8s.io/kubernetes v1.11.0 k8s.io/kubernetes 6b7c39a4f8d4c38e8724550cc3e6e41b7ac7a276
k8s.io/utils 733eca437aa39379e4bcc25e726439dfca40fcff k8s.io/utils 982821ea41da7e7c15f3d3738921eb2e7e241ccd

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,6 @@ syntax = 'proto2';
package k8s.io.api.core.v1; package k8s.io.api.core.v1;
import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto";
import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; import "k8s.io/apimachinery/pkg/api/resource/generated.proto";
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto";
@ -188,7 +187,7 @@ message CSIPersistentVolumeSource {
// Filesystem type to mount. // Filesystem type to mount.
// Must be a filesystem type supported by the host operating system. // Must be a filesystem type supported by the host operating system.
// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // Ex. "ext4", "xfs", "ntfs".
// +optional // +optional
optional string fsType = 4; optional string fsType = 4;
@ -627,7 +626,7 @@ message Container {
// Compute Resources required by this container. // Compute Resources required by this container.
// Cannot be updated. // Cannot be updated.
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
// +optional // +optional
optional ResourceRequirements resources = 8; optional ResourceRequirements resources = 8;
@ -750,7 +749,7 @@ message ContainerPort {
// This must be a valid port number, 0 < x < 65536. // This must be a valid port number, 0 < x < 65536.
optional int32 containerPort = 3; optional int32 containerPort = 3;
// Protocol for port. Must be UDP or TCP. // Protocol for port. Must be UDP, TCP, or SCTP.
// Defaults to "TCP". // Defaults to "TCP".
// +optional // +optional
optional string protocol = 4; optional string protocol = 4;
@ -969,7 +968,7 @@ message EndpointPort {
optional int32 port = 2; optional int32 port = 2;
// The IP protocol for this port. // The IP protocol for this port.
// Must be UDP or TCP. // Must be UDP, TCP, or SCTP.
// Default is TCP. // Default is TCP.
// +optional // +optional
optional string protocol = 3; optional string protocol = 3;
@ -2293,6 +2292,17 @@ message PersistentVolumeClaimSpec {
// This is an alpha feature and may change in the future. // This is an alpha feature and may change in the future.
// +optional // +optional
optional string volumeMode = 6; optional string volumeMode = 6;
// This field requires the VolumeSnapshotDataSource alpha feature gate to be
// enabled and currently VolumeSnapshot is the only supported data source.
// If the provisioner can support VolumeSnapshot data source, it will create
// a new volume and data will be restored to the volume at the same time.
// If the provisioner does not support VolumeSnapshot data source, volume will
// not be created and the failure will be reported as an event.
// In the future, we plan to support more data source types and the behavior
// of the provisioner may change.
// +optional
optional TypedLocalObjectReference dataSource = 7;
} }
// PersistentVolumeClaimStatus is the current status of a persistent volume claim. // PersistentVolumeClaimStatus is the current status of a persistent volume claim.
@ -3025,7 +3035,7 @@ message PodSpec {
// in the same pod, and the first process in each container will not be assigned PID 1. // in the same pod, and the first process in each container will not be assigned PID 1.
// HostPID and ShareProcessNamespace cannot both be set. // HostPID and ShareProcessNamespace cannot both be set.
// Optional: Default to false. // Optional: Default to false.
// This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature. // This field is beta-level and may be disabled with the PodShareProcessNamespace feature.
// +k8s:conversion-gen=false // +k8s:conversion-gen=false
// +optional // +optional
optional bool shareProcessNamespace = 27; optional bool shareProcessNamespace = 27;
@ -3103,6 +3113,15 @@ message PodSpec {
// More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md
// +optional // +optional
repeated PodReadinessGate readinessGates = 28; repeated PodReadinessGate readinessGates = 28;
// RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used
// to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run.
// If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an
// empty definition that uses the default runtime handler.
// More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md
// This is an alpha feature and may change in the future.
// +optional
optional string runtimeClassName = 29;
} }
// PodStatus represents information about the status of a pod. Status may trail the actual // PodStatus represents information about the status of a pod. Status may trail the actual
@ -4021,6 +4040,13 @@ message SecurityContext {
// 2) has CAP_SYS_ADMIN // 2) has CAP_SYS_ADMIN
// +optional // +optional
optional bool allowPrivilegeEscalation = 7; optional bool allowPrivilegeEscalation = 7;
// procMount denotes the type of proc mount to use for the containers.
// The default is DefaultProcMount which uses the container runtime defaults for
// readonly paths and masked paths.
// This requires the ProcMountType feature flag to be enabled.
// +optional
optional string procMount = 9;
} }
// SerializedReference is a reference to serialized object. // SerializedReference is a reference to serialized object.
@ -4140,7 +4166,7 @@ message ServicePort {
// +optional // +optional
optional string name = 1; optional string name = 1;
// The IP protocol for this port. Supports "TCP" and "UDP". // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP".
// Default is TCP. // Default is TCP.
// +optional // +optional
optional string protocol = 2; optional string protocol = 2;
@ -4470,6 +4496,19 @@ message TopologySelectorTerm {
repeated TopologySelectorLabelRequirement matchLabelExpressions = 1; repeated TopologySelectorLabelRequirement matchLabelExpressions = 1;
} }
// TypedLocalObjectReference contains enough information to let you locate the
// typed referenced object inside the same namespace.
message TypedLocalObjectReference {
// APIGroup is the group for the resource being referenced
optional string apiGroup = 1;
// Kind is the type of resource being referenced
optional string kind = 2;
// Name is the name of resource being referenced
optional string name = 3;
}
// Volume represents a named volume in a pod that may be accessed by any container in the pod. // Volume represents a named volume in a pod that may be accessed by any container in the pod.
message Volume { message Volume {
// Volume's name. // Volume's name.
@ -4513,7 +4552,7 @@ message VolumeMount {
// mountPropagation determines how mounts are propagated from the host // mountPropagation determines how mounts are propagated from the host
// to container and the other way around. // to container and the other way around.
// When not set, MountPropagationHostToContainer is used. // When not set, MountPropagationNone is used.
// This field is beta in 1.10. // This field is beta in 1.10.
// +optional // +optional
optional string mountPropagation = 5; optional string mountPropagation = 5;

67
vendor/k8s.io/api/core/v1/types.go generated vendored
View File

@ -28,6 +28,8 @@ const (
NamespaceDefault string = "default" NamespaceDefault string = "default"
// NamespaceAll is the default argument to specify on a context when you want to list or filter resources across all namespaces // NamespaceAll is the default argument to specify on a context when you want to list or filter resources across all namespaces
NamespaceAll string = "" NamespaceAll string = ""
// NamespaceNodeLease is the namespace where we place node lease objects (used for node heartbeats)
NamespaceNodeLease string = "kube-node-lease"
) )
// Volume represents a named volume in a pod that may be accessed by any container in the pod. // Volume represents a named volume in a pod that may be accessed by any container in the pod.
@ -456,6 +458,16 @@ type PersistentVolumeClaimSpec struct {
// This is an alpha feature and may change in the future. // This is an alpha feature and may change in the future.
// +optional // +optional
VolumeMode *PersistentVolumeMode `json:"volumeMode,omitempty" protobuf:"bytes,6,opt,name=volumeMode,casttype=PersistentVolumeMode"` VolumeMode *PersistentVolumeMode `json:"volumeMode,omitempty" protobuf:"bytes,6,opt,name=volumeMode,casttype=PersistentVolumeMode"`
// This field requires the VolumeSnapshotDataSource alpha feature gate to be
// enabled and currently VolumeSnapshot is the only supported data source.
// If the provisioner can support VolumeSnapshot data source, it will create
// a new volume and data will be restored to the volume at the same time.
// If the provisioner does not support VolumeSnapshot data source, volume will
// not be created and the failure will be reported as an event.
// In the future, we plan to support more data source types and the behavior
// of the provisioner may change.
// +optional
DataSource *TypedLocalObjectReference `json:"dataSource" protobuf:"bytes,7,opt,name=dataSource"`
} }
// PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type // PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type
@ -859,6 +871,8 @@ const (
ProtocolTCP Protocol = "TCP" ProtocolTCP Protocol = "TCP"
// ProtocolUDP is the UDP protocol. // ProtocolUDP is the UDP protocol.
ProtocolUDP Protocol = "UDP" ProtocolUDP Protocol = "UDP"
// ProtocolSCTP is the SCTP protocol.
ProtocolSCTP Protocol = "SCTP"
) )
// Represents a Persistent Disk resource in Google Compute Engine. // Represents a Persistent Disk resource in Google Compute Engine.
@ -1611,7 +1625,7 @@ type CSIPersistentVolumeSource struct {
// Filesystem type to mount. // Filesystem type to mount.
// Must be a filesystem type supported by the host operating system. // Must be a filesystem type supported by the host operating system.
// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // Ex. "ext4", "xfs", "ntfs".
// +optional // +optional
FSType string `json:"fsType,omitempty" protobuf:"bytes,4,opt,name=fsType"` FSType string `json:"fsType,omitempty" protobuf:"bytes,4,opt,name=fsType"`
@ -1660,7 +1674,7 @@ type ContainerPort struct {
// Number of port to expose on the pod's IP address. // Number of port to expose on the pod's IP address.
// This must be a valid port number, 0 < x < 65536. // This must be a valid port number, 0 < x < 65536.
ContainerPort int32 `json:"containerPort" protobuf:"varint,3,opt,name=containerPort"` ContainerPort int32 `json:"containerPort" protobuf:"varint,3,opt,name=containerPort"`
// Protocol for port. Must be UDP or TCP. // Protocol for port. Must be UDP, TCP, or SCTP.
// Defaults to "TCP". // Defaults to "TCP".
// +optional // +optional
Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,4,opt,name=protocol,casttype=Protocol"` Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,4,opt,name=protocol,casttype=Protocol"`
@ -1686,7 +1700,7 @@ type VolumeMount struct {
SubPath string `json:"subPath,omitempty" protobuf:"bytes,4,opt,name=subPath"` SubPath string `json:"subPath,omitempty" protobuf:"bytes,4,opt,name=subPath"`
// mountPropagation determines how mounts are propagated from the host // mountPropagation determines how mounts are propagated from the host
// to container and the other way around. // to container and the other way around.
// When not set, MountPropagationHostToContainer is used. // When not set, MountPropagationNone is used.
// This field is beta in 1.10. // This field is beta in 1.10.
// +optional // +optional
MountPropagation *MountPropagationMode `json:"mountPropagation,omitempty" protobuf:"bytes,5,opt,name=mountPropagation,casttype=MountPropagationMode"` MountPropagation *MountPropagationMode `json:"mountPropagation,omitempty" protobuf:"bytes,5,opt,name=mountPropagation,casttype=MountPropagationMode"`
@ -2059,7 +2073,7 @@ type Container struct {
Env []EnvVar `json:"env,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=env"` Env []EnvVar `json:"env,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=env"`
// Compute Resources required by this container. // Compute Resources required by this container.
// Cannot be updated. // Cannot be updated.
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
// +optional // +optional
Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,8,opt,name=resources"` Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,8,opt,name=resources"`
// Pod volumes to mount into the container's filesystem. // Pod volumes to mount into the container's filesystem.
@ -2798,7 +2812,7 @@ type PodSpec struct {
// in the same pod, and the first process in each container will not be assigned PID 1. // in the same pod, and the first process in each container will not be assigned PID 1.
// HostPID and ShareProcessNamespace cannot both be set. // HostPID and ShareProcessNamespace cannot both be set.
// Optional: Default to false. // Optional: Default to false.
// This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature. // This field is beta-level and may be disabled with the PodShareProcessNamespace feature.
// +k8s:conversion-gen=false // +k8s:conversion-gen=false
// +optional // +optional
ShareProcessNamespace *bool `json:"shareProcessNamespace,omitempty" protobuf:"varint,27,opt,name=shareProcessNamespace"` ShareProcessNamespace *bool `json:"shareProcessNamespace,omitempty" protobuf:"varint,27,opt,name=shareProcessNamespace"`
@ -2865,6 +2879,14 @@ type PodSpec struct {
// More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md
// +optional // +optional
ReadinessGates []PodReadinessGate `json:"readinessGates,omitempty" protobuf:"bytes,28,opt,name=readinessGates"` ReadinessGates []PodReadinessGate `json:"readinessGates,omitempty" protobuf:"bytes,28,opt,name=readinessGates"`
// RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used
// to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run.
// If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an
// empty definition that uses the default runtime handler.
// More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md
// This is an alpha feature and may change in the future.
// +optional
RuntimeClassName *string `json:"runtimeClassName,omitempty" protobuf:"bytes,29,opt,name=runtimeClassName"`
} }
// HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the // HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the
@ -3505,7 +3527,7 @@ type ServicePort struct {
// +optional // +optional
Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`
// The IP protocol for this port. Supports "TCP" and "UDP". // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP".
// Default is TCP. // Default is TCP.
// +optional // +optional
Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,2,opt,name=protocol,casttype=Protocol"` Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,2,opt,name=protocol,casttype=Protocol"`
@ -3719,7 +3741,7 @@ type EndpointPort struct {
Port int32 `json:"port" protobuf:"varint,2,opt,name=port"` Port int32 `json:"port" protobuf:"varint,2,opt,name=port"`
// The IP protocol for this port. // The IP protocol for this port.
// Must be UDP or TCP. // Must be UDP, TCP, or SCTP.
// Default is TCP. // Default is TCP.
// +optional // +optional
Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,3,opt,name=protocol,casttype=Protocol"` Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,3,opt,name=protocol,casttype=Protocol"`
@ -4466,6 +4488,17 @@ type LocalObjectReference struct {
Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`
} }
// TypedLocalObjectReference contains enough information to let you locate the
// typed referenced object inside the same namespace.
type TypedLocalObjectReference struct {
// APIGroup is the group for the resource being referenced
APIGroup string `json:"apiGroup" protobuf:"bytes,1,opt,name=apiGroup"`
// Kind is the type of resource being referenced
Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"`
// Name is the name of resource being referenced
Name string `json:"name" protobuf:"bytes,3,opt,name=name"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// SerializedReference is a reference to serialized object. // SerializedReference is a reference to serialized object.
@ -5165,8 +5198,28 @@ type SecurityContext struct {
// 2) has CAP_SYS_ADMIN // 2) has CAP_SYS_ADMIN
// +optional // +optional
AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,7,opt,name=allowPrivilegeEscalation"` AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,7,opt,name=allowPrivilegeEscalation"`
// procMount denotes the type of proc mount to use for the containers.
// The default is DefaultProcMount which uses the container runtime defaults for
// readonly paths and masked paths.
// This requires the ProcMountType feature flag to be enabled.
// +optional
ProcMount *ProcMountType `json:"procMount,omitEmpty" protobuf:"bytes,9,opt,name=procMount"`
} }
type ProcMountType string
const (
// DefaultProcMount uses the container runtime defaults for readonly and masked
// paths for /proc. Most container runtimes mask certain paths in /proc to avoid
// accidental security exposure of special devices or information.
DefaultProcMount ProcMountType = "Default"
// UnmaskedProcMount bypasses the default masking behavior of the container
// runtime and ensures the newly created /proc the container stays in tact with
// no modifications.
UnmaskedProcMount ProcMountType = "Unmasked"
)
// SELinuxOptions are the labels to be applied to the container // SELinuxOptions are the labels to be applied to the container
type SELinuxOptions struct { type SELinuxOptions struct {
// User is a SELinux user label that applies to the container. // User is a SELinux user label that applies to the container.

View File

@ -121,7 +121,7 @@ var map_CSIPersistentVolumeSource = map[string]string{
"driver": "Driver is the name of the driver to use for this volume. Required.", "driver": "Driver is the name of the driver to use for this volume. Required.",
"volumeHandle": "VolumeHandle is the unique volume name returned by the CSI volume plugins CreateVolume to refer to the volume on all subsequent calls. Required.", "volumeHandle": "VolumeHandle is the unique volume name returned by the CSI volume plugins CreateVolume to refer to the volume on all subsequent calls. Required.",
"readOnly": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).", "readOnly": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).",
"fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\".",
"volumeAttributes": "Attributes of the volume to publish.", "volumeAttributes": "Attributes of the volume to publish.",
"controllerPublishSecretRef": "ControllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", "controllerPublishSecretRef": "ControllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.",
"nodeStageSecretRef": "NodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", "nodeStageSecretRef": "NodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.",
@ -319,7 +319,7 @@ var map_Container = map[string]string{
"ports": "List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", "ports": "List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.",
"envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
"env": "List of environment variables to set in the container. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.",
"resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources", "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/",
"volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.",
"volumeDevices": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.",
"livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", "livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes",
@ -353,7 +353,7 @@ var map_ContainerPort = map[string]string{
"name": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.", "name": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.",
"hostPort": "Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.", "hostPort": "Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.",
"containerPort": "Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536.", "containerPort": "Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536.",
"protocol": "Protocol for port. Must be UDP or TCP. Defaults to \"TCP\".", "protocol": "Protocol for port. Must be UDP, TCP, or SCTP. Defaults to \"TCP\".",
"hostIP": "What host IP to bind the external port to.", "hostIP": "What host IP to bind the external port to.",
} }
@ -488,7 +488,7 @@ var map_EndpointPort = map[string]string{
"": "EndpointPort is a tuple that describes a single port.", "": "EndpointPort is a tuple that describes a single port.",
"name": "The name of this port (corresponds to ServicePort.Name). Must be a DNS_LABEL. Optional only if one port is defined.", "name": "The name of this port (corresponds to ServicePort.Name). Must be a DNS_LABEL. Optional only if one port is defined.",
"port": "The port number of the endpoint.", "port": "The port number of the endpoint.",
"protocol": "The IP protocol for this port. Must be UDP or TCP. Default is TCP.", "protocol": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.",
} }
func (EndpointPort) SwaggerDoc() map[string]string { func (EndpointPort) SwaggerDoc() map[string]string {
@ -1210,6 +1210,7 @@ var map_PersistentVolumeClaimSpec = map[string]string{
"volumeName": "VolumeName is the binding reference to the PersistentVolume backing this claim.", "volumeName": "VolumeName is the binding reference to the PersistentVolume backing this claim.",
"storageClassName": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "storageClassName": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1",
"volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.", "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.",
"dataSource": "This field requires the VolumeSnapshotDataSource alpha feature gate to be enabled and currently VolumeSnapshot is the only supported data source. If the provisioner can support VolumeSnapshot data source, it will create a new volume and data will be restored to the volume at the same time. If the provisioner does not support VolumeSnapshot data source, volume will not be created and the failure will be reported as an event. In the future, we plan to support more data source types and the behavior of the provisioner may change.",
} }
func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string {
@ -1512,7 +1513,7 @@ var map_PodSpec = map[string]string{
"hostNetwork": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", "hostNetwork": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.",
"hostPID": "Use the host's pid namespace. Optional: Default to false.", "hostPID": "Use the host's pid namespace. Optional: Default to false.",
"hostIPC": "Use the host's ipc namespace. Optional: Default to false.", "hostIPC": "Use the host's ipc namespace. Optional: Default to false.",
"shareProcessNamespace": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false. This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature.", "shareProcessNamespace": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false. This field is beta-level and may be disabled with the PodShareProcessNamespace feature.",
"securityContext": "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.", "securityContext": "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.",
"imagePullSecrets": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod", "imagePullSecrets": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod",
"hostname": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", "hostname": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.",
@ -1525,6 +1526,7 @@ var map_PodSpec = map[string]string{
"priority": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.", "priority": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.",
"dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.", "dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.",
"readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", "readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md",
"runtimeClassName": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future.",
} }
func (PodSpec) SwaggerDoc() map[string]string { func (PodSpec) SwaggerDoc() map[string]string {
@ -1985,6 +1987,7 @@ var map_SecurityContext = map[string]string{
"runAsNonRoot": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", "runAsNonRoot": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.",
"readOnlyRootFilesystem": "Whether this container has a read-only root filesystem. Default is false.", "readOnlyRootFilesystem": "Whether this container has a read-only root filesystem. Default is false.",
"allowPrivilegeEscalation": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN", "allowPrivilegeEscalation": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN",
"procMount": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.",
} }
func (SecurityContext) SwaggerDoc() map[string]string { func (SecurityContext) SwaggerDoc() map[string]string {
@ -2057,7 +2060,7 @@ func (ServiceList) SwaggerDoc() map[string]string {
var map_ServicePort = map[string]string{ var map_ServicePort = map[string]string{
"": "ServicePort contains information on service's port.", "": "ServicePort contains information on service's port.",
"name": "The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. This maps to the 'Name' field in EndpointPort objects. Optional if only one ServicePort is defined on this service.", "name": "The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. This maps to the 'Name' field in EndpointPort objects. Optional if only one ServicePort is defined on this service.",
"protocol": "The IP protocol for this port. Supports \"TCP\" and \"UDP\". Default is TCP.", "protocol": "The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\". Default is TCP.",
"port": "The port that will be exposed by this service.", "port": "The port that will be exposed by this service.",
"targetPort": "Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service", "targetPort": "Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service",
"nodePort": "The port on each node on which this service is exposed when type=NodePort or LoadBalancer. Usually assigned by the system. If specified, it will be allocated to the service if unused or else creation of the service will fail. Default is to auto-allocate a port if the ServiceType of this Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport", "nodePort": "The port on each node on which this service is exposed when type=NodePort or LoadBalancer. Usually assigned by the system. If specified, it will be allocated to the service if unused or else creation of the service will fail. Default is to auto-allocate a port if the ServiceType of this Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport",
@ -2205,6 +2208,17 @@ func (TopologySelectorTerm) SwaggerDoc() map[string]string {
return map_TopologySelectorTerm return map_TopologySelectorTerm
} }
var map_TypedLocalObjectReference = map[string]string{
"": "TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace.",
"apiGroup": "APIGroup is the group for the resource being referenced",
"kind": "Kind is the type of resource being referenced",
"name": "Name is the name of resource being referenced",
}
func (TypedLocalObjectReference) SwaggerDoc() map[string]string {
return map_TypedLocalObjectReference
}
var map_Volume = map[string]string{ var map_Volume = map[string]string{
"": "Volume represents a named volume in a pod that may be accessed by any container in the pod.", "": "Volume represents a named volume in a pod that may be accessed by any container in the pod.",
"name": "Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", "name": "Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
@ -2230,7 +2244,7 @@ var map_VolumeMount = map[string]string{
"readOnly": "Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.", "readOnly": "Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.",
"mountPath": "Path within the container at which the volume should be mounted. Must not contain ':'.", "mountPath": "Path within the container at which the volume should be mounted. Must not contain ':'.",
"subPath": "Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).", "subPath": "Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).",
"mountPropagation": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationHostToContainer is used. This field is beta in 1.10.", "mountPropagation": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10.",
} }
func (VolumeMount) SwaggerDoc() map[string]string { func (VolumeMount) SwaggerDoc() map[string]string {

View File

@ -21,7 +21,7 @@ limitations under the License.
package v1 package v1
import ( import (
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
types "k8s.io/apimachinery/pkg/types" types "k8s.io/apimachinery/pkg/types"
) )
@ -2665,7 +2665,7 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec
} }
if in.Selector != nil { if in.Selector != nil {
in, out := &in.Selector, &out.Selector in, out := &in.Selector, &out.Selector
*out = new(meta_v1.LabelSelector) *out = new(metav1.LabelSelector)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
in.Resources.DeepCopyInto(&out.Resources) in.Resources.DeepCopyInto(&out.Resources)
@ -2679,6 +2679,11 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec
*out = new(PersistentVolumeMode) *out = new(PersistentVolumeMode)
**out = **in **out = **in
} }
if in.DataSource != nil {
in, out := &in.DataSource, &out.DataSource
*out = new(TypedLocalObjectReference)
**out = **in
}
return return
} }
@ -3046,7 +3051,7 @@ func (in *PodAffinityTerm) DeepCopyInto(out *PodAffinityTerm) {
*out = *in *out = *in
if in.LabelSelector != nil { if in.LabelSelector != nil {
in, out := &in.LabelSelector, &out.LabelSelector in, out := &in.LabelSelector, &out.LabelSelector
*out = new(meta_v1.LabelSelector) *out = new(metav1.LabelSelector)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
if in.Namespaces != nil { if in.Namespaces != nil {
@ -3428,7 +3433,7 @@ func (in *PodSignature) DeepCopyInto(out *PodSignature) {
*out = *in *out = *in
if in.PodController != nil { if in.PodController != nil {
in, out := &in.PodController, &out.PodController in, out := &in.PodController, &out.PodController
*out = new(meta_v1.OwnerReference) *out = new(metav1.OwnerReference)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)
} }
return return
@ -3539,6 +3544,11 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) {
*out = make([]PodReadinessGate, len(*in)) *out = make([]PodReadinessGate, len(*in))
copy(*out, *in) copy(*out, *in)
} }
if in.RuntimeClassName != nil {
in, out := &in.RuntimeClassName, &out.RuntimeClassName
*out = new(string)
**out = **in
}
return return
} }
@ -4589,6 +4599,11 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) {
*out = new(bool) *out = new(bool)
**out = **in **out = **in
} }
if in.ProcMount != nil {
in, out := &in.ProcMount, &out.ProcMount
*out = new(ProcMountType)
**out = **in
}
return return
} }
@ -5067,6 +5082,22 @@ func (in *TopologySelectorTerm) DeepCopy() *TopologySelectorTerm {
return out return out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TypedLocalObjectReference) DeepCopyInto(out *TypedLocalObjectReference) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TypedLocalObjectReference.
func (in *TypedLocalObjectReference) DeepCopy() *TypedLocalObjectReference {
if in == nil {
return nil
}
out := new(TypedLocalObjectReference)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Volume) DeepCopyInto(out *Volume) { func (in *Volume) DeepCopyInto(out *Volume) {
*out = *in *out = *in

View File

@ -19,13 +19,13 @@ limitations under the License.
// DO NOT EDIT! // DO NOT EDIT!
/* /*
Package resource is a generated protocol buffer package. Package resource is a generated protocol buffer package.
It is generated from these files: It is generated from these files:
k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto
It has these top-level messages: It has these top-level messages:
Quantity Quantity
*/ */
package resource package resource
@ -57,21 +57,20 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 255 bytes of a gzipped FileDescriptorProto // 237 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x8f, 0xa1, 0x4e, 0x03, 0x41, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8e, 0xb1, 0x4e, 0xc3, 0x30,
0x10, 0x86, 0x77, 0x0d, 0x29, 0x95, 0x0d, 0x21, 0xa4, 0x62, 0xaf, 0x21, 0x08, 0x0c, 0x3b, 0x02, 0x10, 0x40, 0xcf, 0x0b, 0x2a, 0x19, 0x2b, 0x84, 0x10, 0xc3, 0xa5, 0x42, 0x0c, 0x2c, 0xd8, 0x6b,
0xd3, 0x20, 0xf1, 0x08, 0x90, 0xb8, 0xbb, 0xeb, 0xb0, 0xdd, 0x1c, 0xdd, 0xbd, 0xcc, 0xce, 0x92, 0xc5, 0xc8, 0xce, 0x00, 0x23, 0x5b, 0x92, 0x1e, 0xae, 0x15, 0xd5, 0x8e, 0x2e, 0x36, 0x52, 0xb7,
0xd4, 0x55, 0x22, 0x2b, 0x91, 0xbd, 0xb7, 0xa9, 0xac, 0xac, 0x40, 0x70, 0xcb, 0x8b, 0x90, 0x5e, 0x8e, 0x8c, 0x1d, 0x19, 0x9b, 0xbf, 0xe9, 0xd8, 0xb1, 0x03, 0x03, 0x31, 0x3f, 0x82, 0xea, 0x36,
0xdb, 0x84, 0x90, 0xe0, 0xe6, 0xfb, 0x27, 0xdf, 0xe4, 0x9f, 0xfe, 0x43, 0x35, 0x0e, 0xda, 0x7a, 0x52, 0xb7, 0x7b, 0xef, 0xf4, 0x4e, 0x97, 0xbd, 0xd4, 0xd3, 0x56, 0x1a, 0xa7, 0xea, 0x50, 0x12,
0xa8, 0x62, 0x81, 0xe4, 0x90, 0x31, 0xc0, 0x1b, 0xba, 0x89, 0x27, 0x38, 0x2c, 0xf2, 0xda, 0xce, 0x5b, 0xf2, 0xd4, 0xaa, 0x4f, 0xb2, 0x33, 0xc7, 0xea, 0xb4, 0x28, 0x1a, 0xb3, 0x28, 0xaa, 0xb9,
0xf2, 0x72, 0x6a, 0x1d, 0xd2, 0x1c, 0xea, 0xca, 0xec, 0x02, 0x20, 0x0c, 0x3e, 0x52, 0x89, 0x60, 0xb1, 0xc4, 0x4b, 0xd5, 0xd4, 0xfa, 0x20, 0x14, 0x53, 0xeb, 0x02, 0x57, 0xa4, 0x34, 0x59, 0xe2,
0xd0, 0x21, 0xe5, 0x8c, 0x13, 0x5d, 0x93, 0x67, 0x3f, 0xb8, 0xda, 0x5b, 0xfa, 0xb7, 0xa5, 0xeb, 0xc2, 0xd3, 0x4c, 0x36, 0xec, 0xbc, 0x1b, 0xdf, 0x1f, 0x2b, 0x79, 0x5e, 0xc9, 0xa6, 0xd6, 0x07,
0xca, 0xec, 0x02, 0x7d, 0xb4, 0x86, 0x37, 0xc6, 0xf2, 0x34, 0x16, 0xba, 0xf4, 0x33, 0x30, 0xde, 0x21, 0x87, 0xea, 0xf6, 0x51, 0x1b, 0x3f, 0x0f, 0xa5, 0xac, 0xdc, 0x42, 0x69, 0xa7, 0x9d, 0x4a,
0x78, 0xe8, 0xe4, 0x22, 0xbe, 0x74, 0xd4, 0x41, 0x37, 0xed, 0x8f, 0x0e, 0x6f, 0xff, 0xab, 0x12, 0x71, 0x19, 0x3e, 0x12, 0x25, 0x48, 0xd3, 0xf1, 0xe8, 0xdd, 0x34, 0x1b, 0xbd, 0x86, 0xc2, 0x7a,
0xd9, 0xbe, 0x82, 0x75, 0x1c, 0x98, 0xfe, 0x36, 0xb9, 0x1c, 0xf7, 0x7b, 0x8f, 0x31, 0x77, 0x6c, 0xe3, 0x97, 0xe3, 0xeb, 0xec, 0xa2, 0xf5, 0x6c, 0xac, 0xbe, 0x11, 0x13, 0xf1, 0x70, 0xf9, 0x76,
0x79, 0x3e, 0x38, 0xef, 0x9f, 0x04, 0x26, 0xeb, 0xcc, 0x85, 0x1c, 0xc9, 0xeb, 0xd3, 0xa7, 0x03, 0xa2, 0xa7, 0xab, 0xef, 0x4d, 0x0e, 0x5f, 0x5d, 0x0e, 0xeb, 0x2e, 0x87, 0x4d, 0x97, 0xc3, 0xea,
0xdd, 0x9d, 0x7d, 0xac, 0x32, 0xf1, 0xde, 0x64, 0x62, 0xd9, 0x64, 0x62, 0xd5, 0x64, 0x62, 0xf1, 0x67, 0x02, 0xcf, 0x72, 0xdb, 0x23, 0xec, 0x7a, 0x84, 0x7d, 0x8f, 0xb0, 0x8a, 0x28, 0xb6, 0x11,
0x39, 0x12, 0xf7, 0x7a, 0xdd, 0x2a, 0xb1, 0x69, 0x95, 0xd8, 0xb6, 0x4a, 0x2c, 0x92, 0x92, 0xeb, 0xc5, 0x2e, 0xa2, 0xd8, 0x47, 0x14, 0xbf, 0x11, 0xc5, 0xfa, 0x0f, 0xe1, 0x7d, 0x34, 0x3c, 0xf6,
0xa4, 0xe4, 0x26, 0x29, 0xb9, 0x4d, 0x4a, 0x7e, 0x25, 0x25, 0x97, 0xdf, 0x4a, 0x3c, 0xf7, 0x8e, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x08, 0x88, 0x49, 0x0e, 0x01, 0x00, 0x00,
0xdf, 0xfc, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x5e, 0xda, 0xf9, 0x43, 0x01, 0x00, 0x00,
} }

View File

@ -21,8 +21,6 @@ syntax = 'proto2';
package k8s.io.apimachinery.pkg.api.resource; package k8s.io.apimachinery.pkg.api.resource;
import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
// Package-wide variables from generator "generated". // Package-wide variables from generator "generated".
option go_package = "resource"; option go_package = "resource";

View File

@ -21,7 +21,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"math/big" "math/big"
"regexp"
"strconv" "strconv"
"strings" "strings"
@ -137,9 +136,6 @@ const (
) )
var ( var (
// splitRE is used to get the various parts of a number.
splitRE = regexp.MustCompile(splitREString)
// Errors that could happen while parsing a string. // Errors that could happen while parsing a string.
ErrFormatWrong = errors.New("quantities must match the regular expression '" + splitREString + "'") ErrFormatWrong = errors.New("quantities must match the regular expression '" + splitREString + "'")
ErrNumeric = errors.New("unable to parse numeric part of quantity") ErrNumeric = errors.New("unable to parse numeric part of quantity")

View File

@ -17,11 +17,8 @@ limitations under the License.
package internalversion package internalversion
import ( import (
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/conversion"
"k8s.io/apimachinery/pkg/util/validation/field"
) )
func Convert_internalversion_ListOptions_To_v1_ListOptions(in *ListOptions, out *metav1.ListOptions, s conversion.Scope) error { func Convert_internalversion_ListOptions_To_v1_ListOptions(in *ListOptions, out *metav1.ListOptions, s conversion.Scope) error {
@ -55,23 +52,3 @@ func Convert_v1_ListOptions_To_internalversion_ListOptions(in *metav1.ListOption
out.Continue = in.Continue out.Continue = in.Continue
return nil return nil
} }
func Convert_map_to_v1_LabelSelector(in *map[string]string, out *metav1.LabelSelector, s conversion.Scope) error {
if in == nil {
return nil
}
out = new(metav1.LabelSelector)
for labelKey, labelValue := range *in {
metav1.AddLabelToSelector(out, labelKey, labelValue)
}
return nil
}
func Convert_v1_LabelSelector_to_map(in *metav1.LabelSelector, out *map[string]string, s conversion.Scope) error {
var err error
*out, err = metav1.LabelSelectorAsMap(in)
if err != nil {
err = field.Invalid(field.NewPath("labelSelector"), *in, fmt.Sprintf("cannot convert to old selector: %v", err))
}
return err
}

View File

@ -57,19 +57,22 @@ func addToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion)
if err := scheme.AddIgnoredConversionType(&metav1.TypeMeta{}, &metav1.TypeMeta{}); err != nil { if err := scheme.AddIgnoredConversionType(&metav1.TypeMeta{}, &metav1.TypeMeta{}); err != nil {
return err return err
} }
scheme.AddConversionFuncs( err := scheme.AddConversionFuncs(
metav1.Convert_string_To_labels_Selector, metav1.Convert_string_To_labels_Selector,
metav1.Convert_labels_Selector_To_string, metav1.Convert_labels_Selector_To_string,
metav1.Convert_string_To_fields_Selector, metav1.Convert_string_To_fields_Selector,
metav1.Convert_fields_Selector_To_string, metav1.Convert_fields_Selector_To_string,
Convert_map_to_v1_LabelSelector, metav1.Convert_Map_string_To_string_To_v1_LabelSelector,
Convert_v1_LabelSelector_to_map, metav1.Convert_v1_LabelSelector_To_Map_string_To_string,
Convert_internalversion_ListOptions_To_v1_ListOptions, Convert_internalversion_ListOptions_To_v1_ListOptions,
Convert_v1_ListOptions_To_internalversion_ListOptions, Convert_v1_ListOptions_To_internalversion_ListOptions,
) )
if err != nil {
return err
}
// ListOptions is the only options struct which needs conversion (it exposes labels and fields // ListOptions is the only options struct which needs conversion (it exposes labels and fields
// as selectors for convenience). The other types have only a single representation today. // as selectors for convenience). The other types have only a single representation today.
scheme.AddKnownTypes(SchemeGroupVersion, scheme.AddKnownTypes(SchemeGroupVersion,
@ -77,6 +80,8 @@ func addToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion)
&metav1.GetOptions{}, &metav1.GetOptions{},
&metav1.ExportOptions{}, &metav1.ExportOptions{},
&metav1.DeleteOptions{}, &metav1.DeleteOptions{},
&metav1.CreateOptions{},
&metav1.UpdateOptions{},
) )
scheme.AddKnownTypes(SchemeGroupVersion, scheme.AddKnownTypes(SchemeGroupVersion,
&metav1beta1.Table{}, &metav1beta1.Table{},
@ -91,7 +96,10 @@ func addToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion)
&metav1beta1.PartialObjectMetadataList{}, &metav1beta1.PartialObjectMetadataList{},
) )
// Allow delete options to be decoded across all version in this scheme (we may want to be more clever than this) // Allow delete options to be decoded across all version in this scheme (we may want to be more clever than this)
scheme.AddUnversionedTypes(SchemeGroupVersion, &metav1.DeleteOptions{}) scheme.AddUnversionedTypes(SchemeGroupVersion,
&metav1.DeleteOptions{},
&metav1.CreateOptions{},
&metav1.UpdateOptions{})
metav1.AddToGroupVersion(scheme, metav1.SchemeGroupVersion) metav1.AddToGroupVersion(scheme, metav1.SchemeGroupVersion)
return nil return nil
} }

View File

@ -34,13 +34,38 @@ func init() {
// RegisterConversions adds conversion functions to the given scheme. // RegisterConversions adds conversion functions to the given scheme.
// Public to allow building arbitrary schemes. // Public to allow building arbitrary schemes.
func RegisterConversions(scheme *runtime.Scheme) error { func RegisterConversions(s *runtime.Scheme) error {
return scheme.AddGeneratedConversionFuncs( if err := s.AddGeneratedConversionFunc((*List)(nil), (*v1.List)(nil), func(a, b interface{}, scope conversion.Scope) error {
Convert_internalversion_List_To_v1_List, return Convert_internalversion_List_To_v1_List(a.(*List), b.(*v1.List), scope)
Convert_v1_List_To_internalversion_List, }); err != nil {
Convert_internalversion_ListOptions_To_v1_ListOptions, return err
Convert_v1_ListOptions_To_internalversion_ListOptions, }
) if err := s.AddGeneratedConversionFunc((*v1.List)(nil), (*List)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1_List_To_internalversion_List(a.(*v1.List), b.(*List), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*ListOptions)(nil), (*v1.ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_internalversion_ListOptions_To_v1_ListOptions(a.(*ListOptions), b.(*v1.ListOptions), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*v1.ListOptions)(nil), (*ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1_ListOptions_To_internalversion_ListOptions(a.(*v1.ListOptions), b.(*ListOptions), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*ListOptions)(nil), (*v1.ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_internalversion_ListOptions_To_v1_ListOptions(a.(*ListOptions), b.(*v1.ListOptions), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*v1.ListOptions)(nil), (*ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1_ListOptions_To_internalversion_ListOptions(a.(*v1.ListOptions), b.(*ListOptions), scope)
}); err != nil {
return err
}
return nil
} }
func autoConvert_internalversion_List_To_v1_List(in *List, out *v1.List, s conversion.Scope) error { func autoConvert_internalversion_List_To_v1_List(in *List, out *v1.List, s conversion.Scope) error {

View File

@ -33,9 +33,7 @@ func (in *List) DeepCopyInto(out *List) {
in, out := &in.Items, &out.Items in, out := &in.Items, &out.Items
*out = make([]runtime.Object, len(*in)) *out = make([]runtime.Object, len(*in))
for i := range *in { for i := range *in {
if (*in)[i] == nil { if (*in)[i] != nil {
(*out)[i] = nil
} else {
(*out)[i] = (*in)[i].DeepCopyObject() (*out)[i] = (*in)[i].DeepCopyObject()
} }
} }
@ -65,14 +63,10 @@ func (in *List) DeepCopyObject() runtime.Object {
func (in *ListOptions) DeepCopyInto(out *ListOptions) { func (in *ListOptions) DeepCopyInto(out *ListOptions) {
*out = *in *out = *in
out.TypeMeta = in.TypeMeta out.TypeMeta = in.TypeMeta
if in.LabelSelector == nil { if in.LabelSelector != nil {
out.LabelSelector = nil
} else {
out.LabelSelector = in.LabelSelector.DeepCopySelector() out.LabelSelector = in.LabelSelector.DeepCopySelector()
} }
if in.FieldSelector == nil { if in.FieldSelector != nil {
out.FieldSelector = nil
} else {
out.FieldSelector = in.FieldSelector.DeepCopySelector() out.FieldSelector = in.FieldSelector.DeepCopySelector()
} }
if in.TimeoutSeconds != nil { if in.TimeoutSeconds != nil {

View File

@ -33,17 +33,17 @@ func AddConversionFuncs(scheme *runtime.Scheme) error {
return scheme.AddConversionFuncs( return scheme.AddConversionFuncs(
Convert_v1_TypeMeta_To_v1_TypeMeta, Convert_v1_TypeMeta_To_v1_TypeMeta,
Convert_unversioned_ListMeta_To_unversioned_ListMeta, Convert_v1_ListMeta_To_v1_ListMeta,
Convert_intstr_IntOrString_To_intstr_IntOrString, Convert_intstr_IntOrString_To_intstr_IntOrString,
Convert_unversioned_Time_To_unversioned_Time,
Convert_unversioned_MicroTime_To_unversioned_MicroTime,
Convert_Pointer_v1_Duration_To_v1_Duration, Convert_Pointer_v1_Duration_To_v1_Duration,
Convert_v1_Duration_To_Pointer_v1_Duration, Convert_v1_Duration_To_Pointer_v1_Duration,
Convert_Slice_string_To_unversioned_Time, Convert_Slice_string_To_v1_Time,
Convert_v1_Time_To_v1_Time,
Convert_v1_MicroTime_To_v1_MicroTime,
Convert_resource_Quantity_To_resource_Quantity, Convert_resource_Quantity_To_resource_Quantity,
@ -71,8 +71,8 @@ func AddConversionFuncs(scheme *runtime.Scheme) error {
Convert_Pointer_float64_To_float64, Convert_Pointer_float64_To_float64,
Convert_float64_To_Pointer_float64, Convert_float64_To_Pointer_float64,
Convert_map_to_unversioned_LabelSelector, Convert_Map_string_To_string_To_v1_LabelSelector,
Convert_unversioned_LabelSelector_to_map, Convert_v1_LabelSelector_To_Map_string_To_string,
Convert_Slice_string_To_Slice_int32, Convert_Slice_string_To_Slice_int32,
@ -187,7 +187,7 @@ func Convert_v1_TypeMeta_To_v1_TypeMeta(in, out *TypeMeta, s conversion.Scope) e
} }
// +k8s:conversion-fn=copy-only // +k8s:conversion-fn=copy-only
func Convert_unversioned_ListMeta_To_unversioned_ListMeta(in, out *ListMeta, s conversion.Scope) error { func Convert_v1_ListMeta_To_v1_ListMeta(in, out *ListMeta, s conversion.Scope) error {
*out = *in *out = *in
return nil return nil
} }
@ -199,7 +199,14 @@ func Convert_intstr_IntOrString_To_intstr_IntOrString(in, out *intstr.IntOrStrin
} }
// +k8s:conversion-fn=copy-only // +k8s:conversion-fn=copy-only
func Convert_unversioned_Time_To_unversioned_Time(in *Time, out *Time, s conversion.Scope) error { func Convert_v1_Time_To_v1_Time(in *Time, out *Time, s conversion.Scope) error {
// Cannot deep copy these, because time.Time has unexported fields.
*out = *in
return nil
}
// +k8s:conversion-fn=copy-only
func Convert_v1_MicroTime_To_v1_MicroTime(in *MicroTime, out *MicroTime, s conversion.Scope) error {
// Cannot deep copy these, because time.Time has unexported fields. // Cannot deep copy these, because time.Time has unexported fields.
*out = *in *out = *in
return nil return nil
@ -220,14 +227,8 @@ func Convert_v1_Duration_To_Pointer_v1_Duration(in *Duration, out **Duration, s
return nil return nil
} }
func Convert_unversioned_MicroTime_To_unversioned_MicroTime(in *MicroTime, out *MicroTime, s conversion.Scope) error { // Convert_Slice_string_To_v1_Time allows converting a URL query parameter value
// Cannot deep copy these, because time.Time has unexported fields. func Convert_Slice_string_To_v1_Time(input *[]string, out *Time, s conversion.Scope) error {
*out = *in
return nil
}
// Convert_Slice_string_To_unversioned_Time allows converting a URL query parameter value
func Convert_Slice_string_To_unversioned_Time(input *[]string, out *Time, s conversion.Scope) error {
str := "" str := ""
if len(*input) > 0 { if len(*input) > 0 {
str = (*input)[0] str = (*input)[0]
@ -275,7 +276,7 @@ func Convert_resource_Quantity_To_resource_Quantity(in *resource.Quantity, out *
return nil return nil
} }
func Convert_map_to_unversioned_LabelSelector(in *map[string]string, out *LabelSelector, s conversion.Scope) error { func Convert_Map_string_To_string_To_v1_LabelSelector(in *map[string]string, out *LabelSelector, s conversion.Scope) error {
if in == nil { if in == nil {
return nil return nil
} }
@ -285,7 +286,7 @@ func Convert_map_to_unversioned_LabelSelector(in *map[string]string, out *LabelS
return nil return nil
} }
func Convert_unversioned_LabelSelector_to_map(in *LabelSelector, out *map[string]string, s conversion.Scope) error { func Convert_v1_LabelSelector_To_Map_string_To_string(in *LabelSelector, out *map[string]string, s conversion.Scope) error {
var err error var err error
*out, err = LabelSelectorAsMap(in) *out, err = LabelSelectorAsMap(in)
return err return err

View File

@ -30,6 +30,7 @@ limitations under the License.
APIResource APIResource
APIResourceList APIResourceList
APIVersions APIVersions
CreateOptions
DeleteOptions DeleteOptions
Duration Duration
ExportOptions ExportOptions
@ -60,6 +61,7 @@ limitations under the License.
Time Time
Timestamp Timestamp
TypeMeta TypeMeta
UpdateOptions
Verbs Verbs
WatchEvent WatchEvent
*/ */
@ -113,139 +115,147 @@ func (m *APIVersions) Reset() { *m = APIVersions{} }
func (*APIVersions) ProtoMessage() {} func (*APIVersions) ProtoMessage() {}
func (*APIVersions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } func (*APIVersions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} }
func (m *CreateOptions) Reset() { *m = CreateOptions{} }
func (*CreateOptions) ProtoMessage() {}
func (*CreateOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} }
func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (m *DeleteOptions) Reset() { *m = DeleteOptions{} }
func (*DeleteOptions) ProtoMessage() {} func (*DeleteOptions) ProtoMessage() {}
func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} }
func (m *Duration) Reset() { *m = Duration{} } func (m *Duration) Reset() { *m = Duration{} }
func (*Duration) ProtoMessage() {} func (*Duration) ProtoMessage() {}
func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} }
func (m *ExportOptions) Reset() { *m = ExportOptions{} } func (m *ExportOptions) Reset() { *m = ExportOptions{} }
func (*ExportOptions) ProtoMessage() {} func (*ExportOptions) ProtoMessage() {}
func (*ExportOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } func (*ExportOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} }
func (m *GetOptions) Reset() { *m = GetOptions{} } func (m *GetOptions) Reset() { *m = GetOptions{} }
func (*GetOptions) ProtoMessage() {} func (*GetOptions) ProtoMessage() {}
func (*GetOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } func (*GetOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} }
func (m *GroupKind) Reset() { *m = GroupKind{} } func (m *GroupKind) Reset() { *m = GroupKind{} }
func (*GroupKind) ProtoMessage() {} func (*GroupKind) ProtoMessage() {}
func (*GroupKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (*GroupKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} }
func (m *GroupResource) Reset() { *m = GroupResource{} } func (m *GroupResource) Reset() { *m = GroupResource{} }
func (*GroupResource) ProtoMessage() {} func (*GroupResource) ProtoMessage() {}
func (*GroupResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } func (*GroupResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} }
func (m *GroupVersion) Reset() { *m = GroupVersion{} } func (m *GroupVersion) Reset() { *m = GroupVersion{} }
func (*GroupVersion) ProtoMessage() {} func (*GroupVersion) ProtoMessage() {}
func (*GroupVersion) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (*GroupVersion) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} }
func (m *GroupVersionForDiscovery) Reset() { *m = GroupVersionForDiscovery{} } func (m *GroupVersionForDiscovery) Reset() { *m = GroupVersionForDiscovery{} }
func (*GroupVersionForDiscovery) ProtoMessage() {} func (*GroupVersionForDiscovery) ProtoMessage() {}
func (*GroupVersionForDiscovery) Descriptor() ([]byte, []int) { func (*GroupVersionForDiscovery) Descriptor() ([]byte, []int) {
return fileDescriptorGenerated, []int{12} return fileDescriptorGenerated, []int{13}
} }
func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} }
func (*GroupVersionKind) ProtoMessage() {} func (*GroupVersionKind) ProtoMessage() {}
func (*GroupVersionKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (*GroupVersionKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} }
func (m *GroupVersionResource) Reset() { *m = GroupVersionResource{} } func (m *GroupVersionResource) Reset() { *m = GroupVersionResource{} }
func (*GroupVersionResource) ProtoMessage() {} func (*GroupVersionResource) ProtoMessage() {}
func (*GroupVersionResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (*GroupVersionResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} }
func (m *Initializer) Reset() { *m = Initializer{} } func (m *Initializer) Reset() { *m = Initializer{} }
func (*Initializer) ProtoMessage() {} func (*Initializer) ProtoMessage() {}
func (*Initializer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (*Initializer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} }
func (m *Initializers) Reset() { *m = Initializers{} } func (m *Initializers) Reset() { *m = Initializers{} }
func (*Initializers) ProtoMessage() {} func (*Initializers) ProtoMessage() {}
func (*Initializers) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (*Initializers) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} }
func (m *LabelSelector) Reset() { *m = LabelSelector{} } func (m *LabelSelector) Reset() { *m = LabelSelector{} }
func (*LabelSelector) ProtoMessage() {} func (*LabelSelector) ProtoMessage() {}
func (*LabelSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (*LabelSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} }
func (m *LabelSelectorRequirement) Reset() { *m = LabelSelectorRequirement{} } func (m *LabelSelectorRequirement) Reset() { *m = LabelSelectorRequirement{} }
func (*LabelSelectorRequirement) ProtoMessage() {} func (*LabelSelectorRequirement) ProtoMessage() {}
func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) { func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) {
return fileDescriptorGenerated, []int{18} return fileDescriptorGenerated, []int{19}
} }
func (m *List) Reset() { *m = List{} } func (m *List) Reset() { *m = List{} }
func (*List) ProtoMessage() {} func (*List) ProtoMessage() {}
func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} }
func (m *ListMeta) Reset() { *m = ListMeta{} } func (m *ListMeta) Reset() { *m = ListMeta{} }
func (*ListMeta) ProtoMessage() {} func (*ListMeta) ProtoMessage() {}
func (*ListMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (*ListMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} }
func (m *ListOptions) Reset() { *m = ListOptions{} } func (m *ListOptions) Reset() { *m = ListOptions{} }
func (*ListOptions) ProtoMessage() {} func (*ListOptions) ProtoMessage() {}
func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} }
func (m *MicroTime) Reset() { *m = MicroTime{} } func (m *MicroTime) Reset() { *m = MicroTime{} }
func (*MicroTime) ProtoMessage() {} func (*MicroTime) ProtoMessage() {}
func (*MicroTime) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (*MicroTime) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} }
func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} }
func (*ObjectMeta) ProtoMessage() {} func (*ObjectMeta) ProtoMessage() {}
func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} }
func (m *OwnerReference) Reset() { *m = OwnerReference{} } func (m *OwnerReference) Reset() { *m = OwnerReference{} }
func (*OwnerReference) ProtoMessage() {} func (*OwnerReference) ProtoMessage() {}
func (*OwnerReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (*OwnerReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} }
func (m *Patch) Reset() { *m = Patch{} } func (m *Patch) Reset() { *m = Patch{} }
func (*Patch) ProtoMessage() {} func (*Patch) ProtoMessage() {}
func (*Patch) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (*Patch) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} }
func (m *Preconditions) Reset() { *m = Preconditions{} } func (m *Preconditions) Reset() { *m = Preconditions{} }
func (*Preconditions) ProtoMessage() {} func (*Preconditions) ProtoMessage() {}
func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} }
func (m *RootPaths) Reset() { *m = RootPaths{} } func (m *RootPaths) Reset() { *m = RootPaths{} }
func (*RootPaths) ProtoMessage() {} func (*RootPaths) ProtoMessage() {}
func (*RootPaths) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (*RootPaths) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} }
func (m *ServerAddressByClientCIDR) Reset() { *m = ServerAddressByClientCIDR{} } func (m *ServerAddressByClientCIDR) Reset() { *m = ServerAddressByClientCIDR{} }
func (*ServerAddressByClientCIDR) ProtoMessage() {} func (*ServerAddressByClientCIDR) ProtoMessage() {}
func (*ServerAddressByClientCIDR) Descriptor() ([]byte, []int) { func (*ServerAddressByClientCIDR) Descriptor() ([]byte, []int) {
return fileDescriptorGenerated, []int{28} return fileDescriptorGenerated, []int{29}
} }
func (m *Status) Reset() { *m = Status{} } func (m *Status) Reset() { *m = Status{} }
func (*Status) ProtoMessage() {} func (*Status) ProtoMessage() {}
func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} }
func (m *StatusCause) Reset() { *m = StatusCause{} } func (m *StatusCause) Reset() { *m = StatusCause{} }
func (*StatusCause) ProtoMessage() {} func (*StatusCause) ProtoMessage() {}
func (*StatusCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (*StatusCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} }
func (m *StatusDetails) Reset() { *m = StatusDetails{} } func (m *StatusDetails) Reset() { *m = StatusDetails{} }
func (*StatusDetails) ProtoMessage() {} func (*StatusDetails) ProtoMessage() {}
func (*StatusDetails) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (*StatusDetails) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} }
func (m *Time) Reset() { *m = Time{} } func (m *Time) Reset() { *m = Time{} }
func (*Time) ProtoMessage() {} func (*Time) ProtoMessage() {}
func (*Time) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (*Time) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} }
func (m *Timestamp) Reset() { *m = Timestamp{} } func (m *Timestamp) Reset() { *m = Timestamp{} }
func (*Timestamp) ProtoMessage() {} func (*Timestamp) ProtoMessage() {}
func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} }
func (m *TypeMeta) Reset() { *m = TypeMeta{} } func (m *TypeMeta) Reset() { *m = TypeMeta{} }
func (*TypeMeta) ProtoMessage() {} func (*TypeMeta) ProtoMessage() {}
func (*TypeMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (*TypeMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} }
func (m *UpdateOptions) Reset() { *m = UpdateOptions{} }
func (*UpdateOptions) ProtoMessage() {}
func (*UpdateOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} }
func (m *Verbs) Reset() { *m = Verbs{} } func (m *Verbs) Reset() { *m = Verbs{} }
func (*Verbs) ProtoMessage() {} func (*Verbs) ProtoMessage() {}
func (*Verbs) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (*Verbs) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} }
func (m *WatchEvent) Reset() { *m = WatchEvent{} } func (m *WatchEvent) Reset() { *m = WatchEvent{} }
func (*WatchEvent) ProtoMessage() {} func (*WatchEvent) ProtoMessage() {}
func (*WatchEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (*WatchEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} }
func init() { func init() {
proto.RegisterType((*APIGroup)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIGroup") proto.RegisterType((*APIGroup)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIGroup")
@ -253,6 +263,7 @@ func init() {
proto.RegisterType((*APIResource)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResource") proto.RegisterType((*APIResource)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResource")
proto.RegisterType((*APIResourceList)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResourceList") proto.RegisterType((*APIResourceList)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResourceList")
proto.RegisterType((*APIVersions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIVersions") proto.RegisterType((*APIVersions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIVersions")
proto.RegisterType((*CreateOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.CreateOptions")
proto.RegisterType((*DeleteOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.DeleteOptions") proto.RegisterType((*DeleteOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.DeleteOptions")
proto.RegisterType((*Duration)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Duration") proto.RegisterType((*Duration)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Duration")
proto.RegisterType((*ExportOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ExportOptions") proto.RegisterType((*ExportOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ExportOptions")
@ -283,6 +294,7 @@ func init() {
proto.RegisterType((*Time)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Time") proto.RegisterType((*Time)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Time")
proto.RegisterType((*Timestamp)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Timestamp") proto.RegisterType((*Timestamp)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Timestamp")
proto.RegisterType((*TypeMeta)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.TypeMeta") proto.RegisterType((*TypeMeta)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.TypeMeta")
proto.RegisterType((*UpdateOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.UpdateOptions")
proto.RegisterType((*Verbs)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Verbs") proto.RegisterType((*Verbs)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Verbs")
proto.RegisterType((*WatchEvent)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.WatchEvent") proto.RegisterType((*WatchEvent)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.WatchEvent")
} }
@ -535,6 +547,47 @@ func (m *APIVersions) MarshalTo(dAtA []byte) (int, error) {
return i, nil return i, nil
} }
func (m *CreateOptions) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *CreateOptions) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.DryRun) > 0 {
for _, s := range m.DryRun {
dAtA[i] = 0xa
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
dAtA[i] = 0x10
i++
if m.IncludeUninitialized {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i++
return i, nil
}
func (m *DeleteOptions) Marshal() (dAtA []byte, err error) { func (m *DeleteOptions) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
@ -581,6 +634,21 @@ func (m *DeleteOptions) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PropagationPolicy))) i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PropagationPolicy)))
i += copy(dAtA[i:], *m.PropagationPolicy) i += copy(dAtA[i:], *m.PropagationPolicy)
} }
if len(m.DryRun) > 0 {
for _, s := range m.DryRun {
dAtA[i] = 0x2a
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
return i, nil return i, nil
} }
@ -1604,6 +1672,39 @@ func (m *TypeMeta) MarshalTo(dAtA []byte) (int, error) {
return i, nil return i, nil
} }
func (m *UpdateOptions) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *UpdateOptions) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.DryRun) > 0 {
for _, s := range m.DryRun {
dAtA[i] = 0xa
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
return i, nil
}
func (m Verbs) Marshal() (dAtA []byte, err error) { func (m Verbs) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
@ -1793,6 +1894,19 @@ func (m *APIVersions) Size() (n int) {
return n return n
} }
func (m *CreateOptions) Size() (n int) {
var l int
_ = l
if len(m.DryRun) > 0 {
for _, s := range m.DryRun {
l = len(s)
n += 1 + l + sovGenerated(uint64(l))
}
}
n += 2
return n
}
func (m *DeleteOptions) Size() (n int) { func (m *DeleteOptions) Size() (n int) {
var l int var l int
_ = l _ = l
@ -1810,6 +1924,12 @@ func (m *DeleteOptions) Size() (n int) {
l = len(*m.PropagationPolicy) l = len(*m.PropagationPolicy)
n += 1 + l + sovGenerated(uint64(l)) n += 1 + l + sovGenerated(uint64(l))
} }
if len(m.DryRun) > 0 {
for _, s := range m.DryRun {
l = len(s)
n += 1 + l + sovGenerated(uint64(l))
}
}
return n return n
} }
@ -2197,6 +2317,18 @@ func (m *TypeMeta) Size() (n int) {
return n return n
} }
func (m *UpdateOptions) Size() (n int) {
var l int
_ = l
if len(m.DryRun) > 0 {
for _, s := range m.DryRun {
l = len(s)
n += 1 + l + sovGenerated(uint64(l))
}
}
return n
}
func (m Verbs) Size() (n int) { func (m Verbs) Size() (n int) {
var l int var l int
_ = l _ = l
@ -2284,6 +2416,17 @@ func (this *APIResourceList) String() string {
}, "") }, "")
return s return s
} }
func (this *CreateOptions) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&CreateOptions{`,
`DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`,
`IncludeUninitialized:` + fmt.Sprintf("%v", this.IncludeUninitialized) + `,`,
`}`,
}, "")
return s
}
func (this *DeleteOptions) String() string { func (this *DeleteOptions) String() string {
if this == nil { if this == nil {
return "nil" return "nil"
@ -2293,6 +2436,7 @@ func (this *DeleteOptions) String() string {
`Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`, `Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`,
`OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`, `OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`,
`PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`, `PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`,
`DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -2598,6 +2742,16 @@ func (this *TypeMeta) String() string {
}, "") }, "")
return s return s
} }
func (this *UpdateOptions) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&UpdateOptions{`,
`DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`,
`}`,
}, "")
return s
}
func (this *WatchEvent) String() string { func (this *WatchEvent) String() string {
if this == nil { if this == nil {
return "nil" return "nil"
@ -3395,6 +3549,105 @@ func (m *APIVersions) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *CreateOptions) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: CreateOptions: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: CreateOptions: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field IncludeUninitialized", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.IncludeUninitialized = bool(v != 0)
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthGenerated
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *DeleteOptions) Unmarshal(dAtA []byte) error { func (m *DeleteOptions) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0
@ -3528,6 +3781,35 @@ func (m *DeleteOptions) Unmarshal(dAtA []byte) error {
s := DeletionPropagation(dAtA[iNdEx:postIndex]) s := DeletionPropagation(dAtA[iNdEx:postIndex])
m.PropagationPolicy = &s m.PropagationPolicy = &s
iNdEx = postIndex iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:]) skippy, err := skipGenerated(dAtA[iNdEx:])
@ -7506,6 +7788,85 @@ func (m *TypeMeta) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *UpdateOptions) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: UpdateOptions: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: UpdateOptions: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthGenerated
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *Verbs) Unmarshal(dAtA []byte) error { func (m *Verbs) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0
@ -7804,158 +8165,160 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 2435 bytes of a gzipped FileDescriptorProto // 2465 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4d, 0x6c, 0x23, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4d, 0x6c, 0x23, 0x49,
0x15, 0x4e, 0xdb, 0xb1, 0x63, 0x3f, 0xc7, 0xf9, 0xa9, 0xcd, 0x80, 0x37, 0x02, 0x3b, 0xdb, 0x8b, 0xf5, 0x4f, 0xdb, 0xb1, 0x63, 0x3f, 0xc7, 0xf9, 0xa8, 0xcd, 0xfe, 0xff, 0xde, 0x08, 0xec, 0x6c,
0x56, 0x59, 0x98, 0xb5, 0x49, 0x16, 0x56, 0xc3, 0x00, 0x03, 0xe9, 0x38, 0x33, 0x8a, 0x76, 0x32, 0x2f, 0x5a, 0x65, 0x61, 0xd6, 0x26, 0x59, 0x58, 0x0d, 0x03, 0x2c, 0xc4, 0x71, 0x66, 0x14, 0xed,
0x63, 0x55, 0x76, 0x06, 0x31, 0x8c, 0x10, 0x9d, 0x76, 0xc5, 0x69, 0xd2, 0xee, 0xf6, 0x56, 0x95, 0x64, 0xc6, 0xaa, 0xec, 0x0c, 0x62, 0x18, 0x21, 0x3a, 0xdd, 0x15, 0xa7, 0x49, 0xbb, 0xdb, 0x5b,
0x33, 0x09, 0x1c, 0xd8, 0x03, 0x48, 0x1c, 0x10, 0x9a, 0x23, 0x27, 0xb4, 0x23, 0xb8, 0x70, 0xe5, 0xd5, 0xce, 0x8c, 0xe1, 0xc0, 0x1e, 0x40, 0x70, 0x40, 0x68, 0x8e, 0x9c, 0xd0, 0x8e, 0xe0, 0xc2,
0xc4, 0x05, 0x4e, 0x48, 0xcc, 0x71, 0x24, 0x2e, 0x7b, 0x40, 0xd6, 0x8e, 0xf7, 0xc0, 0x09, 0x71, 0x95, 0x13, 0x17, 0x38, 0x21, 0x31, 0xc7, 0x91, 0xb8, 0xec, 0x01, 0x59, 0x3b, 0xe6, 0xc0, 0x09,
0xcf, 0x09, 0x55, 0x75, 0xf5, 0x9f, 0x1d, 0x4f, 0xda, 0x3b, 0x0b, 0xe2, 0x14, 0xf7, 0xfb, 0xf9, 0x71, 0xcf, 0x09, 0x55, 0x75, 0x75, 0x75, 0xb7, 0x1d, 0x4f, 0xda, 0x3b, 0xbb, 0x88, 0x53, 0xd2,
0xde, 0xab, 0x57, 0xaf, 0x5e, 0xbd, 0x7a, 0x81, 0xbd, 0xe3, 0x6b, 0xac, 0x6e, 0x7b, 0x8d, 0xe3, 0xef, 0xe3, 0xf7, 0x5e, 0x55, 0xbd, 0x7a, 0xef, 0xd5, 0x33, 0x1c, 0x9c, 0x5e, 0x65, 0x75, 0xdb,
0xfe, 0x01, 0xa1, 0x2e, 0xe1, 0x84, 0x35, 0x4e, 0x88, 0xdb, 0xf6, 0x68, 0x43, 0x31, 0xcc, 0x9e, 0x6b, 0x9c, 0xf6, 0x8f, 0x08, 0x75, 0x89, 0x4f, 0x58, 0xe3, 0x8c, 0xb8, 0x96, 0x47, 0x1b, 0x92,
0xdd, 0x35, 0xad, 0x23, 0xdb, 0x25, 0xf4, 0xac, 0xd1, 0x3b, 0xee, 0x08, 0x02, 0x6b, 0x74, 0x09, 0x61, 0xf4, 0xec, 0xae, 0x61, 0x9e, 0xd8, 0x2e, 0xa1, 0x83, 0x46, 0xef, 0xb4, 0xc3, 0x09, 0xac,
0x37, 0x1b, 0x27, 0x1b, 0x8d, 0x0e, 0x71, 0x09, 0x35, 0x39, 0x69, 0xd7, 0x7b, 0xd4, 0xe3, 0x1e, 0xd1, 0x25, 0xbe, 0xd1, 0x38, 0xdb, 0x6a, 0x74, 0x88, 0x4b, 0xa8, 0xe1, 0x13, 0xab, 0xde, 0xa3,
0xfa, 0x92, 0xaf, 0x55, 0x8f, 0x6b, 0xd5, 0x7b, 0xc7, 0x1d, 0x41, 0x60, 0x75, 0xa1, 0x55, 0x3f, 0x9e, 0xef, 0xa1, 0x2f, 0x04, 0x5a, 0xf5, 0xb8, 0x56, 0xbd, 0x77, 0xda, 0xe1, 0x04, 0x56, 0xe7,
0xd9, 0x58, 0x7d, 0xab, 0x63, 0xf3, 0xa3, 0xfe, 0x41, 0xdd, 0xf2, 0xba, 0x8d, 0x8e, 0xd7, 0xf1, 0x5a, 0xf5, 0xb3, 0xad, 0xf5, 0x37, 0x3b, 0xb6, 0x7f, 0xd2, 0x3f, 0xaa, 0x9b, 0x5e, 0xb7, 0xd1,
0x1a, 0x52, 0xf9, 0xa0, 0x7f, 0x28, 0xbf, 0xe4, 0x87, 0xfc, 0xe5, 0x83, 0xae, 0x4e, 0x74, 0x85, 0xf1, 0x3a, 0x5e, 0x43, 0x28, 0x1f, 0xf5, 0x8f, 0xc5, 0x97, 0xf8, 0x10, 0xff, 0x05, 0xa0, 0xeb,
0xf6, 0x5d, 0x6e, 0x77, 0xc9, 0xa8, 0x17, 0xab, 0xef, 0x5c, 0xa6, 0xc0, 0xac, 0x23, 0xd2, 0x35, 0x53, 0x5d, 0xa1, 0x7d, 0xd7, 0xb7, 0xbb, 0x64, 0xdc, 0x8b, 0xf5, 0xb7, 0x2f, 0x53, 0x60, 0xe6,
0xc7, 0xf4, 0xde, 0x9e, 0xa4, 0xd7, 0xe7, 0xb6, 0xd3, 0xb0, 0x5d, 0xce, 0x38, 0x1d, 0x55, 0xd2, 0x09, 0xe9, 0x1a, 0xe3, 0x7a, 0xfa, 0x5f, 0xb3, 0x50, 0xd8, 0x69, 0xef, 0xdf, 0xa0, 0x5e, 0xbf,
0xff, 0x96, 0x85, 0xc2, 0x56, 0x6b, 0xf7, 0x16, 0xf5, 0xfa, 0x3d, 0xb4, 0x06, 0xb3, 0xae, 0xd9, 0x87, 0x36, 0x60, 0xde, 0x35, 0xba, 0xa4, 0xa2, 0x6d, 0x68, 0x9b, 0xc5, 0xe6, 0xe2, 0x93, 0x61,
0x25, 0x15, 0x6d, 0x4d, 0x5b, 0x2f, 0x1a, 0xf3, 0x4f, 0x07, 0xb5, 0x99, 0xe1, 0xa0, 0x36, 0x7b, 0x6d, 0x6e, 0x34, 0xac, 0xcd, 0xdf, 0x32, 0xba, 0x04, 0x0b, 0x0e, 0x72, 0xa0, 0x70, 0x46, 0x28,
0xc7, 0xec, 0x12, 0x2c, 0x39, 0xc8, 0x81, 0xc2, 0x09, 0xa1, 0xcc, 0xf6, 0x5c, 0x56, 0xc9, 0xac, 0xb3, 0x3d, 0x97, 0x55, 0x32, 0x1b, 0xd9, 0xcd, 0xd2, 0xf6, 0x3b, 0xf5, 0x34, 0xeb, 0xaf, 0x0b,
0x65, 0xd7, 0x4b, 0x9b, 0x37, 0xea, 0x69, 0x82, 0x56, 0x97, 0x06, 0xee, 0xfb, 0xaa, 0x37, 0x3d, 0x03, 0x77, 0x03, 0xd5, 0xeb, 0x1e, 0x6d, 0xd9, 0xcc, 0xf4, 0xce, 0x08, 0x1d, 0x34, 0x57, 0xa4,
0xda, 0xb4, 0x99, 0xe5, 0x9d, 0x10, 0x7a, 0x66, 0x2c, 0x29, 0x2b, 0x05, 0xc5, 0x64, 0x38, 0xb4, 0x95, 0x82, 0x64, 0x32, 0xac, 0x2c, 0xa0, 0x9f, 0x6a, 0xb0, 0xd2, 0xa3, 0xe4, 0x98, 0x50, 0x4a,
0x80, 0x7e, 0xae, 0xc1, 0x52, 0x8f, 0x92, 0x43, 0x42, 0x29, 0x69, 0x2b, 0x7e, 0x25, 0xbb, 0xa6, 0x2c, 0xc9, 0xaf, 0x64, 0x37, 0xb4, 0x4f, 0xc1, 0x6c, 0x45, 0x9a, 0x5d, 0x69, 0x8f, 0xe1, 0xe3,
0x7d, 0x06, 0x66, 0x2b, 0xca, 0xec, 0x52, 0x6b, 0x04, 0x1f, 0x8f, 0x59, 0x44, 0xbf, 0xd3, 0x60, 0x09, 0x8b, 0xe8, 0xb7, 0x1a, 0xac, 0x33, 0x42, 0xcf, 0x08, 0xdd, 0xb1, 0x2c, 0x4a, 0x18, 0x6b,
0x95, 0x11, 0x7a, 0x42, 0xe8, 0x56, 0xbb, 0x4d, 0x09, 0x63, 0xc6, 0xd9, 0xb6, 0x63, 0x13, 0x97, 0x0e, 0x76, 0x1d, 0x9b, 0xb8, 0xfe, 0xee, 0x7e, 0x0b, 0xb3, 0xca, 0xbc, 0xd8, 0x87, 0x6f, 0xa5,
0x6f, 0xef, 0x36, 0x31, 0xab, 0xcc, 0xca, 0x38, 0x7c, 0x27, 0x9d, 0x43, 0xfb, 0x93, 0x70, 0x0c, 0x73, 0xe8, 0x70, 0x1a, 0x4e, 0x53, 0x97, 0x1e, 0xad, 0x4f, 0x15, 0x61, 0xf8, 0x39, 0x6e, 0xe8,
0x5d, 0x79, 0xb4, 0x3a, 0x51, 0x84, 0xe1, 0x17, 0xb8, 0xa1, 0x1f, 0xc2, 0x7c, 0xb0, 0x91, 0xb7, 0xc7, 0xb0, 0x18, 0x1e, 0xe4, 0x4d, 0x9b, 0xf9, 0xe8, 0x2e, 0xe4, 0x3b, 0xfc, 0x83, 0x55, 0x34,
0x6d, 0xc6, 0xd1, 0x7d, 0xc8, 0x77, 0xc4, 0x07, 0xab, 0x68, 0xd2, 0xc1, 0x7a, 0x3a, 0x07, 0x03, 0xe1, 0x60, 0x3d, 0x9d, 0x83, 0x21, 0x46, 0x73, 0x49, 0xfa, 0x93, 0x17, 0x9f, 0x0c, 0x4b, 0x34,
0x0c, 0x63, 0x41, 0xf9, 0x93, 0x97, 0x9f, 0x0c, 0x2b, 0x34, 0xfd, 0xcf, 0x59, 0x28, 0x6d, 0xb5, 0xfd, 0x4f, 0x59, 0x28, 0xed, 0xb4, 0xf7, 0x31, 0x61, 0x5e, 0x9f, 0x9a, 0x24, 0x45, 0xd0, 0x6c,
0x76, 0x31, 0x61, 0x5e, 0x9f, 0x5a, 0x24, 0x45, 0xd2, 0x6c, 0x02, 0x88, 0xbf, 0xac, 0x67, 0x5a, 0x03, 0xf0, 0xbf, 0xac, 0x67, 0x98, 0xc4, 0xaa, 0x64, 0x36, 0xb4, 0xcd, 0x42, 0x13, 0x49, 0x39,
0xa4, 0x5d, 0xc9, 0xac, 0x69, 0xeb, 0x05, 0x03, 0x29, 0x39, 0xb8, 0x13, 0x72, 0x70, 0x4c, 0x4a, 0xb8, 0xa5, 0x38, 0x38, 0x26, 0xc5, 0x51, 0x4f, 0x6d, 0xd7, 0x12, 0xa7, 0x1d, 0x43, 0x7d, 0xd7,
0xa0, 0x1e, 0xdb, 0x6e, 0x5b, 0xee, 0x76, 0x0c, 0xf5, 0x5d, 0xdb, 0x6d, 0x63, 0xc9, 0x41, 0xb7, 0x76, 0x2d, 0x2c, 0x38, 0xe8, 0x26, 0xe4, 0xce, 0x08, 0x3d, 0xe2, 0xfb, 0xcf, 0x03, 0xe2, 0x4b,
0x21, 0x77, 0x42, 0xe8, 0x81, 0x88, 0xbf, 0x48, 0x88, 0xaf, 0xa4, 0x5b, 0xde, 0x7d, 0xa1, 0x62, 0xe9, 0x96, 0x77, 0x97, 0xab, 0x34, 0x8b, 0xa3, 0x61, 0x2d, 0x27, 0xfe, 0xc5, 0x01, 0x08, 0xaa,
0x14, 0x87, 0x83, 0x5a, 0x4e, 0xfe, 0xc4, 0x3e, 0x08, 0xaa, 0x03, 0xb0, 0x23, 0x8f, 0x72, 0xe9, 0x03, 0xb0, 0x13, 0x8f, 0xfa, 0xc2, 0x9d, 0x4a, 0x6e, 0x23, 0xbb, 0x59, 0x6c, 0x2e, 0x71, 0xff,
0x4e, 0x25, 0xb7, 0x96, 0x5d, 0x2f, 0x1a, 0x0b, 0xc2, 0xbf, 0xfd, 0x90, 0x8a, 0x63, 0x12, 0xe8, 0x0e, 0x15, 0x15, 0xc7, 0x24, 0xd0, 0x55, 0x58, 0x64, 0xb6, 0xdb, 0xe9, 0x3b, 0x06, 0xe5, 0x84,
0x1a, 0xcc, 0x33, 0xdb, 0xed, 0xf4, 0x1d, 0x93, 0x0a, 0x42, 0x25, 0x2f, 0xfd, 0x5c, 0x51, 0x7e, 0x4a, 0x5e, 0xf8, 0xb9, 0x26, 0xfd, 0x5c, 0x3c, 0x8c, 0xf1, 0x70, 0x42, 0x92, 0x5b, 0x32, 0x0d,
0xce, 0xef, 0xc7, 0x78, 0x38, 0x21, 0x29, 0x2c, 0x59, 0x26, 0x27, 0x1d, 0x8f, 0xda, 0x84, 0x55, 0x9f, 0x74, 0x3c, 0x6a, 0x13, 0x56, 0x59, 0x88, 0x2c, 0xed, 0x2a, 0x2a, 0x8e, 0x49, 0xa0, 0xd7,
0xe6, 0x22, 0x4b, 0xdb, 0x21, 0x15, 0xc7, 0x24, 0xd0, 0xeb, 0x90, 0x93, 0x91, 0xaf, 0x14, 0xa4, 0x20, 0x27, 0x76, 0xbe, 0x52, 0x10, 0x26, 0xca, 0xd2, 0x44, 0x4e, 0x1c, 0x0b, 0x0e, 0x78, 0xe8,
0x89, 0xb2, 0x32, 0x91, 0x93, 0xdb, 0x82, 0x7d, 0x1e, 0x7a, 0x13, 0xe6, 0xd4, 0xa9, 0xa9, 0x14, 0x0d, 0x58, 0x90, 0xb7, 0xa6, 0x52, 0x14, 0x62, 0xcb, 0x52, 0x6c, 0x21, 0x0c, 0xeb, 0x90, 0xaf,
0xa5, 0xd8, 0xa2, 0x12, 0x9b, 0x0b, 0xd2, 0x3a, 0xe0, 0xeb, 0x7f, 0xd4, 0x60, 0x31, 0xb6, 0x7f, 0xff, 0x41, 0x83, 0xe5, 0xd8, 0xf9, 0x89, 0x58, 0xb9, 0x0a, 0x8b, 0x9d, 0xd8, 0x4d, 0x91, 0x67,
0x32, 0x57, 0xae, 0xc1, 0x7c, 0x27, 0x76, 0x52, 0xd4, 0x5e, 0x86, 0xab, 0x89, 0x9f, 0x22, 0x9c, 0xa9, 0x56, 0x13, 0xbf, 0x45, 0x38, 0x21, 0x89, 0x08, 0x14, 0xa9, 0x44, 0x0a, 0x33, 0xc2, 0x56,
0x90, 0x44, 0x04, 0x8a, 0x54, 0x21, 0x05, 0x15, 0x61, 0x23, 0x75, 0xa2, 0x05, 0x3e, 0x44, 0x96, 0xea, 0x40, 0x0b, 0x7d, 0x88, 0x2c, 0xc5, 0x88, 0x0c, 0x47, 0xc8, 0xfa, 0x3f, 0x35, 0x11, 0x74,
0x62, 0x44, 0x86, 0x23, 0x64, 0xfd, 0x9f, 0x9a, 0x4c, 0xba, 0xa0, 0x46, 0xa0, 0xf5, 0x58, 0x1d, 0x61, 0x8e, 0x40, 0x9b, 0xb1, 0x3c, 0xa4, 0x89, 0x2d, 0x5c, 0x9c, 0x92, 0x43, 0x2e, 0xb9, 0xbc,
0xd2, 0x64, 0x08, 0xe7, 0x27, 0xd4, 0x90, 0x4b, 0x0e, 0x6f, 0xe6, 0xff, 0xe2, 0xf0, 0x5e, 0x2f, 0x99, 0xff, 0x89, 0xcb, 0x7b, 0xad, 0xf0, 0xeb, 0x0f, 0x6b, 0x73, 0x1f, 0xfc, 0x7d, 0x63, 0x4e,
0xfc, 0xe6, 0xc3, 0xda, 0xcc, 0x07, 0xff, 0x58, 0x9b, 0xd1, 0x3f, 0xc9, 0x40, 0xb9, 0x49, 0x1c, 0xff, 0x99, 0x06, 0xe5, 0x5d, 0x4a, 0x0c, 0x9f, 0xdc, 0xee, 0xf9, 0x62, 0x05, 0x3a, 0xe4, 0x2d,
0xc2, 0xc9, 0xdd, 0x1e, 0x97, 0x2b, 0xb8, 0x09, 0xa8, 0x43, 0x4d, 0x8b, 0xb4, 0x08, 0xb5, 0xbd, 0x3a, 0xc0, 0x7d, 0x57, 0xae, 0x14, 0xf8, 0xa5, 0x6c, 0x09, 0x0a, 0x96, 0x1c, 0xd4, 0x86, 0x35,
0xf6, 0x3e, 0xb1, 0x3c, 0xb7, 0xcd, 0xe4, 0x16, 0x65, 0x8d, 0xcf, 0x0d, 0x07, 0x35, 0x74, 0x6b, 0xdb, 0x35, 0x9d, 0xbe, 0x45, 0xee, 0xb8, 0xb6, 0x6b, 0xfb, 0xb6, 0xe1, 0xd8, 0x3f, 0x52, 0x97,
0x8c, 0x8b, 0x2f, 0xd0, 0x40, 0x0e, 0x94, 0x7b, 0x54, 0xfe, 0xb6, 0xb9, 0x2a, 0xe0, 0xe2, 0xe0, 0xed, 0x73, 0xd2, 0xbb, 0xb5, 0xfd, 0x0b, 0x64, 0xf0, 0x85, 0x9a, 0xfa, 0xcf, 0xb3, 0x50, 0x6e,
0xbc, 0x9d, 0x6e, 0xed, 0xad, 0xb8, 0xaa, 0xb1, 0x3c, 0x1c, 0xd4, 0xca, 0x09, 0x12, 0x4e, 0x82, 0x11, 0x87, 0x44, 0x7e, 0x5c, 0x07, 0xd4, 0xa1, 0x86, 0x49, 0xda, 0x84, 0xda, 0x9e, 0x75, 0x48,
0xa3, 0xef, 0xc2, 0x92, 0x47, 0x7b, 0x47, 0xa6, 0xdb, 0x24, 0x3d, 0xe2, 0xb6, 0x89, 0xcb, 0x99, 0x4c, 0xcf, 0xb5, 0x98, 0x08, 0x95, 0x6c, 0xf3, 0xff, 0x46, 0xc3, 0x1a, 0xba, 0x31, 0xc1, 0xc5,
0x3c, 0xcc, 0x05, 0x63, 0x45, 0x94, 0xdd, 0xbb, 0x23, 0x3c, 0x3c, 0x26, 0x8d, 0x1e, 0xc0, 0x72, 0x17, 0x68, 0x20, 0x07, 0xca, 0x3d, 0x2a, 0xfe, 0xb7, 0x7d, 0x59, 0x48, 0xf8, 0x05, 0x7e, 0x2b,
0x8f, 0x7a, 0x3d, 0xb3, 0x63, 0x0a, 0xc4, 0x96, 0xe7, 0xd8, 0xd6, 0x99, 0x3c, 0xec, 0x45, 0xe3, 0xdd, 0x19, 0xb4, 0xe3, 0xaa, 0xcd, 0xd5, 0xd1, 0xb0, 0x56, 0x4e, 0x90, 0x70, 0x12, 0x1c, 0x7d,
0xea, 0x70, 0x50, 0x5b, 0x6e, 0x8d, 0x32, 0xcf, 0x07, 0xb5, 0x57, 0x64, 0xe8, 0x04, 0x25, 0x62, 0x1b, 0x56, 0x3c, 0xda, 0x3b, 0x31, 0xdc, 0x16, 0xe9, 0x11, 0xd7, 0x22, 0xae, 0xcf, 0x44, 0x52,
0xe2, 0x71, 0x18, 0x7d, 0x17, 0x0a, 0xcd, 0x3e, 0x95, 0x14, 0xf4, 0x6d, 0x28, 0xb4, 0xd5, 0x6f, 0x29, 0x34, 0xd7, 0x78, 0xfa, 0xbf, 0x3d, 0xc6, 0xc3, 0x13, 0xd2, 0xe8, 0x1e, 0xac, 0xf6, 0xa8,
0x15, 0xd5, 0xd7, 0x82, 0x3b, 0x29, 0x90, 0x39, 0x1f, 0xd4, 0xca, 0xe2, 0xea, 0xad, 0x07, 0x04, 0xd7, 0x33, 0x3a, 0x06, 0x47, 0x6c, 0x7b, 0x8e, 0x6d, 0x0e, 0x44, 0xd2, 0x29, 0x36, 0xaf, 0x8c,
0x1c, 0xaa, 0xe8, 0x0f, 0xa1, 0xbc, 0x73, 0xda, 0xf3, 0x28, 0x0f, 0xf6, 0xeb, 0x0d, 0xc8, 0x13, 0x86, 0xb5, 0xd5, 0xf6, 0x38, 0xf3, 0x7c, 0x58, 0x7b, 0x49, 0x6c, 0x1d, 0xa7, 0x44, 0x4c, 0x3c,
0x49, 0x90, 0x68, 0x85, 0xa8, 0x90, 0xfa, 0x62, 0x58, 0x71, 0xc5, 0xc1, 0x26, 0xa7, 0xa6, 0xc5, 0x09, 0x13, 0x3b, 0xdb, 0xdc, 0xb4, 0xb3, 0xd5, 0xf7, 0xa1, 0xd0, 0xea, 0x53, 0xa1, 0x85, 0xbe,
0x55, 0x45, 0x0c, 0x0f, 0xf6, 0x8e, 0x20, 0x62, 0x9f, 0xa7, 0x3f, 0xd1, 0x00, 0x6e, 0x91, 0x10, 0x09, 0x05, 0x4b, 0xfe, 0x2f, 0x77, 0xfe, 0xd5, 0xb0, 0x7e, 0x86, 0x32, 0xe7, 0xc3, 0x5a, 0x99,
0x7b, 0x0b, 0x16, 0x83, 0x43, 0x91, 0x3c, 0xab, 0x9f, 0x57, 0xda, 0x8b, 0x38, 0xc9, 0xc6, 0xa3, 0x57, 0xfc, 0x7a, 0x48, 0xc0, 0x4a, 0x45, 0xbf, 0x0f, 0xe5, 0xbd, 0x87, 0x3d, 0x8f, 0xfa, 0xe1,
0xf2, 0xa8, 0x05, 0x2b, 0xb6, 0x6b, 0x39, 0xfd, 0x36, 0xb9, 0xe7, 0xda, 0xae, 0xcd, 0x6d, 0xd3, 0x99, 0xbe, 0x0e, 0x79, 0x22, 0x08, 0x02, 0xad, 0x10, 0x25, 0xfd, 0x40, 0x0c, 0x4b, 0x2e, 0x4f,
0xb1, 0x7f, 0x12, 0xd6, 0xe5, 0x2f, 0x28, 0x9c, 0x95, 0xdd, 0x0b, 0x64, 0xf0, 0x85, 0x9a, 0xfa, 0x42, 0xe4, 0xa1, 0x61, 0xfa, 0x32, 0xa0, 0x54, 0x12, 0xda, 0xe3, 0x44, 0x1c, 0xf0, 0xf4, 0xc7,
0x43, 0x28, 0xca, 0x0a, 0x21, 0x8a, 0x73, 0x54, 0xae, 0xb4, 0x17, 0x94, 0xab, 0xa0, 0xba, 0x67, 0x1a, 0xc0, 0x0d, 0xa2, 0xb0, 0x77, 0x60, 0x39, 0xbc, 0xc0, 0xc9, 0xbc, 0xf2, 0xff, 0x52, 0x7b,
0x26, 0x55, 0xf7, 0xd8, 0x81, 0x70, 0xa0, 0xec, 0xeb, 0x06, 0x17, 0x4e, 0x2a, 0x0b, 0x57, 0xa1, 0x19, 0x27, 0xd9, 0x78, 0x5c, 0xfe, 0x33, 0x08, 0xeb, 0xfb, 0x50, 0x14, 0xd9, 0x8c, 0x17, 0x92,
0x10, 0x2c, 0x5c, 0x59, 0x09, 0x1b, 0x8d, 0x00, 0x08, 0x87, 0x12, 0x31, 0x6b, 0x47, 0x90, 0xa8, 0x28, 0xb5, 0x6a, 0xcf, 0x49, 0xad, 0x61, 0x25, 0xca, 0x4c, 0xab, 0x44, 0xb1, 0xcb, 0xeb, 0x40,
0x76, 0xe9, 0x8c, 0xc5, 0xaa, 0x6f, 0xe6, 0xc5, 0xd5, 0x37, 0x66, 0xe9, 0x67, 0x50, 0x99, 0xd4, 0x39, 0xd0, 0x0d, 0x8b, 0x63, 0x2a, 0x0b, 0x57, 0xa0, 0x10, 0x2e, 0x5c, 0x5a, 0x51, 0x4d, 0x51,
0x9d, 0xbc, 0x44, 0x3d, 0x4e, 0xef, 0x8a, 0xfe, 0x6b, 0x0d, 0x96, 0xe2, 0x48, 0xe9, 0xb7, 0x2f, 0x08, 0x84, 0x95, 0x44, 0xcc, 0xda, 0x09, 0x24, 0x32, 0x73, 0x3a, 0x63, 0xb1, 0x4a, 0x91, 0x79,
0xbd, 0x91, 0xcb, 0xef, 0xf1, 0x58, 0x44, 0x7e, 0xab, 0xc1, 0x4a, 0x62, 0x69, 0x53, 0xed, 0xf8, 0x7e, 0xa5, 0x88, 0x59, 0xfa, 0x09, 0x54, 0xa6, 0x75, 0x52, 0x2f, 0x50, 0x3b, 0xd2, 0xbb, 0xa2,
0x14, 0x4e, 0xc5, 0x93, 0x23, 0x3b, 0x45, 0x72, 0x34, 0xa0, 0xb4, 0x1b, 0xe6, 0x3d, 0xbd, 0xbc, 0xff, 0x4a, 0x83, 0x95, 0x38, 0x52, 0xfa, 0xe3, 0x4b, 0x6f, 0xe4, 0xf2, 0x9e, 0x23, 0xb6, 0x23,
0xf3, 0xd1, 0xff, 0xa2, 0xc1, 0x7c, 0x4c, 0x83, 0xa1, 0x87, 0x30, 0x27, 0xea, 0x9b, 0xed, 0x76, 0xbf, 0xd1, 0x60, 0x2d, 0xb1, 0xb4, 0x99, 0x4e, 0x7c, 0x06, 0xa7, 0xe2, 0xc1, 0x91, 0x9d, 0x21,
0x54, 0x57, 0x96, 0xf2, 0xb2, 0x8c, 0x81, 0x44, 0xeb, 0x6a, 0xf9, 0x48, 0x38, 0x80, 0x44, 0x2d, 0x38, 0x1a, 0x50, 0xda, 0x57, 0x71, 0x4f, 0x2f, 0xef, 0xd2, 0xf4, 0x3f, 0x6b, 0xb0, 0x18, 0xd3,
0xc8, 0x53, 0xc2, 0xfa, 0x0e, 0x57, 0xa5, 0xfd, 0x6a, 0xca, 0x6b, 0x8d, 0x9b, 0xbc, 0xcf, 0x0c, 0x60, 0xe8, 0x3e, 0x2c, 0xf0, 0x1c, 0x68, 0xbb, 0x1d, 0xd9, 0x41, 0xa6, 0x2c, 0xec, 0x31, 0x90,
0x10, 0x35, 0x0a, 0x4b, 0x7d, 0xac, 0x70, 0xf4, 0xbf, 0x67, 0xa0, 0x7c, 0xdb, 0x3c, 0x20, 0xce, 0x68, 0x5d, 0xed, 0x00, 0x09, 0x87, 0x90, 0xa8, 0x0d, 0x79, 0x4a, 0x58, 0xdf, 0xf1, 0x65, 0xfa,
0x3e, 0x71, 0x88, 0xc5, 0x3d, 0x8a, 0x7e, 0x0a, 0xa5, 0xae, 0xc9, 0xad, 0x23, 0x49, 0x0d, 0x7a, 0xbf, 0x92, 0xb2, 0x04, 0xfb, 0x86, 0xdf, 0x67, 0x41, 0x9e, 0xc4, 0x42, 0x1f, 0x4b, 0x1c, 0xfd,
0xcb, 0x66, 0x3a, 0x43, 0x09, 0xa4, 0xfa, 0x5e, 0x04, 0xb3, 0xe3, 0x72, 0x7a, 0x66, 0xbc, 0xa2, 0x6f, 0x19, 0x28, 0xdf, 0x34, 0x8e, 0x88, 0x73, 0x48, 0x1c, 0x62, 0xfa, 0x1e, 0x45, 0x3f, 0x86,
0x16, 0x56, 0x8a, 0x71, 0x70, 0xdc, 0x9a, 0x7c, 0x10, 0xc8, 0xef, 0x9d, 0xd3, 0x9e, 0xb8, 0x44, 0x52, 0xd7, 0xf0, 0xcd, 0x13, 0x41, 0x0d, 0xfb, 0xe0, 0x56, 0x3a, 0x43, 0x09, 0xa4, 0xfa, 0x41,
0xa7, 0x7f, 0x87, 0x24, 0x5c, 0xc0, 0xe4, 0xfd, 0xbe, 0x4d, 0x49, 0x97, 0xb8, 0x3c, 0x7a, 0x10, 0x04, 0xb3, 0xe7, 0xfa, 0x74, 0xd0, 0x7c, 0x49, 0x2e, 0xac, 0x14, 0xe3, 0xe0, 0xb8, 0x35, 0xf1,
0xec, 0x8d, 0xe0, 0xe3, 0x31, 0x8b, 0xab, 0x37, 0x60, 0x69, 0xd4, 0x79, 0xb4, 0x04, 0xd9, 0x63, 0x78, 0x11, 0xdf, 0x7b, 0x0f, 0x7b, 0xbc, 0xe0, 0xcf, 0xfe, 0x66, 0x4a, 0xb8, 0x80, 0xc9, 0xfb,
0x72, 0xe6, 0xe7, 0x02, 0x16, 0x3f, 0xd1, 0x0a, 0xe4, 0x4e, 0x4c, 0xa7, 0xaf, 0xea, 0x0f, 0xf6, 0x7d, 0x9b, 0x92, 0x2e, 0x71, 0xfd, 0xe8, 0xf1, 0x72, 0x30, 0x86, 0x8f, 0x27, 0x2c, 0xae, 0xbf,
0x3f, 0xae, 0x67, 0xae, 0x69, 0xfa, 0xef, 0x35, 0xa8, 0x4c, 0x72, 0x04, 0x7d, 0x31, 0x06, 0x64, 0x03, 0x2b, 0xe3, 0xce, 0xa3, 0x15, 0xc8, 0x9e, 0x92, 0x41, 0x10, 0x0b, 0x98, 0xff, 0x8b, 0xd6,
0x94, 0x94, 0x57, 0xd9, 0x77, 0xc9, 0x99, 0x8f, 0xba, 0x03, 0x05, 0xaf, 0x27, 0x9e, 0x70, 0x1e, 0x20, 0x77, 0x66, 0x38, 0x7d, 0x99, 0x7f, 0x70, 0xf0, 0x71, 0x2d, 0x73, 0x55, 0xd3, 0x7f, 0xa7,
0x55, 0x79, 0xfe, 0x66, 0x90, 0xbb, 0x77, 0x15, 0xfd, 0x7c, 0x50, 0xbb, 0x92, 0x80, 0x0f, 0x18, 0x41, 0x65, 0x9a, 0x23, 0xe8, 0xf3, 0x31, 0xa0, 0x66, 0x49, 0x7a, 0x95, 0x7d, 0x97, 0x0c, 0x02,
0x38, 0x54, 0x45, 0x3a, 0xe4, 0xa5, 0x3f, 0xe2, 0x52, 0x16, 0xed, 0x93, 0xdc, 0xfc, 0xfb, 0x92, 0xd4, 0x3d, 0x28, 0x78, 0x3d, 0xfe, 0xdc, 0xf4, 0xa8, 0x8c, 0xf3, 0x37, 0xc2, 0xd8, 0xbd, 0x2d,
0x82, 0x15, 0x47, 0xff, 0x93, 0x06, 0xb3, 0xb2, 0x3d, 0x7c, 0x08, 0x05, 0x11, 0xbf, 0xb6, 0xc9, 0xe9, 0xe7, 0xc3, 0xda, 0xcb, 0x09, 0xf8, 0x90, 0x81, 0x95, 0x2a, 0x2f, 0x92, 0xc2, 0x1f, 0x5e,
0x4d, 0xe9, 0x57, 0xea, 0xc7, 0x84, 0xd0, 0xde, 0x23, 0xdc, 0x8c, 0xce, 0x57, 0x40, 0xc1, 0x21, 0xb8, 0x55, 0x91, 0xbc, 0x2b, 0x28, 0x58, 0x72, 0xf4, 0x3f, 0x6a, 0x30, 0x2f, 0x5a, 0xd9, 0xfb,
0x22, 0xc2, 0x90, 0xb3, 0x39, 0xe9, 0x06, 0x1b, 0xf9, 0xd6, 0x44, 0x68, 0xf5, 0xfe, 0xad, 0x63, 0x50, 0xe0, 0xfb, 0x67, 0x19, 0xbe, 0x21, 0xfc, 0x4a, 0xfd, 0xf0, 0xe1, 0xda, 0x07, 0xc4, 0x37,
0xf3, 0xd1, 0xce, 0x29, 0x27, 0xae, 0xd8, 0x8c, 0xa8, 0x18, 0xec, 0x0a, 0x0c, 0xec, 0x43, 0xe9, 0xa2, 0xfb, 0x15, 0x52, 0xb0, 0x42, 0x44, 0x18, 0x72, 0xb6, 0x4f, 0xba, 0xe1, 0x41, 0xbe, 0x39,
0x7f, 0xd0, 0x20, 0x34, 0x25, 0x8e, 0x3b, 0x23, 0xce, 0xe1, 0x6d, 0xdb, 0x3d, 0x56, 0x61, 0x0d, 0x15, 0x5a, 0x3e, 0xbb, 0xeb, 0xd8, 0x78, 0xb0, 0xf7, 0xd0, 0x27, 0x2e, 0x3f, 0x8c, 0x28, 0x19,
0xdd, 0xd9, 0x57, 0x74, 0x1c, 0x4a, 0x5c, 0x74, 0xc5, 0x66, 0xa6, 0xbc, 0x62, 0xaf, 0x42, 0xc1, 0xec, 0x73, 0x0c, 0x1c, 0x40, 0xe9, 0xbf, 0xd7, 0x40, 0x99, 0xe2, 0xd7, 0x9d, 0x11, 0xe7, 0xf8,
0xf2, 0x5c, 0x6e, 0xbb, 0xfd, 0xb1, 0xfa, 0xb2, 0xad, 0xe8, 0x38, 0x94, 0xd0, 0x9f, 0x65, 0xa1, 0xa6, 0xed, 0x9e, 0xca, 0x6d, 0x55, 0xee, 0x1c, 0x4a, 0x3a, 0x56, 0x12, 0x17, 0x95, 0xd8, 0xcc,
0x24, 0x7c, 0x0d, 0xee, 0xf8, 0x6f, 0x42, 0xd9, 0x89, 0xef, 0x9e, 0xf2, 0xf9, 0x8a, 0x82, 0x48, 0x8c, 0x25, 0xf6, 0x0a, 0x14, 0x4c, 0xcf, 0xf5, 0x6d, 0xb7, 0x3f, 0x91, 0x5f, 0x76, 0x25, 0x1d,
0x9e, 0x47, 0x9c, 0x94, 0x15, 0xca, 0x87, 0x36, 0x71, 0xda, 0xa1, 0x72, 0x26, 0xa9, 0x7c, 0x33, 0x2b, 0x09, 0xfd, 0x69, 0x16, 0x4a, 0xdc, 0xd7, 0xb0, 0xc6, 0x7f, 0x1d, 0xca, 0x4e, 0xfc, 0xf4,
0xce, 0xc4, 0x49, 0x59, 0x51, 0x67, 0x1f, 0x89, 0xbc, 0x56, 0x8d, 0x5a, 0x18, 0xda, 0xef, 0x09, 0xa4, 0xcf, 0x2f, 0x4b, 0x88, 0xe4, 0x7d, 0xc4, 0x49, 0x59, 0xae, 0x7c, 0x6c, 0x13, 0xc7, 0x52,
0x22, 0xf6, 0x79, 0x17, 0xc5, 0x67, 0x76, 0xca, 0xf8, 0x5c, 0x87, 0x05, 0xb1, 0x91, 0x5e, 0x9f, 0xca, 0x99, 0xa4, 0xf2, 0xf5, 0x38, 0x13, 0x27, 0x65, 0x79, 0x9e, 0x7d, 0xc0, 0xe3, 0x5a, 0x36,
0x07, 0xdd, 0x6c, 0x4e, 0xf6, 0x5d, 0x68, 0x38, 0xa8, 0x2d, 0xbc, 0x97, 0xe0, 0xe0, 0x11, 0xc9, 0x73, 0x6a, 0x6b, 0xbf, 0xc3, 0x89, 0x38, 0xe0, 0x5d, 0xb4, 0x3f, 0xf3, 0x33, 0xee, 0xcf, 0x35,
0x89, 0xed, 0x4b, 0xfe, 0xd3, 0xb6, 0x2f, 0x62, 0xd5, 0x8e, 0xdd, 0xb5, 0x79, 0x65, 0x4e, 0x3a, 0x58, 0xe2, 0x07, 0xe9, 0xf5, 0xfd, 0xb0, 0xe3, 0xcd, 0x89, 0xbe, 0x0b, 0x8d, 0x86, 0xb5, 0xa5,
0x11, 0xae, 0xfa, 0xb6, 0x20, 0x62, 0x9f, 0x97, 0xd8, 0xd2, 0xc2, 0xa5, 0x5b, 0xfa, 0x3e, 0x14, 0xf7, 0x12, 0x1c, 0x3c, 0x26, 0x39, 0xb5, 0x7d, 0xc9, 0x7f, 0xd2, 0xf6, 0x85, 0xaf, 0xda, 0xb1,
0xf7, 0x6c, 0x8b, 0x7a, 0x62, 0x2d, 0xe2, 0x62, 0x62, 0x89, 0xa6, 0x3d, 0x2c, 0xe0, 0xc1, 0x1a, 0xbb, 0xb6, 0x5f, 0x59, 0x10, 0x4e, 0xa8, 0x55, 0xdf, 0xe4, 0x44, 0x1c, 0xf0, 0x12, 0x47, 0x5a,
0x03, 0xbe, 0x70, 0xc5, 0x35, 0x5d, 0xcf, 0x6f, 0xcd, 0x73, 0x91, 0x2b, 0x77, 0x04, 0x11, 0xfb, 0xb8, 0xf4, 0x48, 0xdf, 0x87, 0xe2, 0x81, 0x6d, 0x52, 0x8f, 0xaf, 0x85, 0x17, 0x26, 0x96, 0x68,
0xbc, 0xeb, 0x2b, 0xe2, 0x3e, 0xfa, 0xe5, 0x93, 0xda, 0xcc, 0xe3, 0x27, 0xb5, 0x99, 0x0f, 0x9f, 0xec, 0x55, 0x02, 0x0f, 0xd7, 0x18, 0xf2, 0xb9, 0x2b, 0xae, 0xe1, 0x7a, 0x41, 0xfb, 0x9e, 0x8b,
0xa8, 0xbb, 0xe9, 0x5f, 0x00, 0x70, 0xf7, 0xe0, 0xc7, 0xc4, 0xf2, 0x73, 0xfe, 0xf2, 0x57, 0xb9, 0x5c, 0xb9, 0xc5, 0x89, 0x38, 0xe0, 0x5d, 0x5b, 0xe3, 0xf5, 0xe8, 0x17, 0x8f, 0x6b, 0x73, 0x8f,
0xe8, 0x31, 0xd4, 0x30, 0x48, 0xbe, 0x60, 0x33, 0x23, 0x3d, 0x46, 0x8c, 0x87, 0x13, 0x92, 0xa8, 0x1e, 0xd7, 0xe6, 0x3e, 0x7c, 0x2c, 0x6b, 0xd3, 0xbf, 0x00, 0xe0, 0xf6, 0xd1, 0x0f, 0x89, 0x19,
0x01, 0xc5, 0xf0, 0xa5, 0xae, 0xf2, 0x7b, 0x59, 0xa9, 0x15, 0xc3, 0xe7, 0x3c, 0x8e, 0x64, 0x12, 0xc4, 0xfc, 0xe5, 0x13, 0x04, 0xde, 0x63, 0xc8, 0xc1, 0x95, 0x78, 0x6d, 0x67, 0xc6, 0x7a, 0x8c,
0x07, 0x70, 0xf6, 0xd2, 0x03, 0x68, 0x40, 0xb6, 0x6f, 0xb7, 0x65, 0x4a, 0x14, 0x8d, 0xaf, 0x06, 0x18, 0x0f, 0x27, 0x24, 0x51, 0x03, 0x8a, 0x6a, 0xaa, 0x20, 0xe3, 0x7b, 0x55, 0xaa, 0x15, 0xd5,
0x05, 0xf0, 0xde, 0x6e, 0xf3, 0x7c, 0x50, 0x7b, 0x6d, 0xd2, 0x8c, 0x8b, 0x9f, 0xf5, 0x08, 0xab, 0xe8, 0x01, 0x47, 0x32, 0x89, 0x0b, 0x38, 0x7f, 0xe9, 0x05, 0x6c, 0x42, 0xb6, 0x6f, 0x5b, 0x22,
0xdf, 0xdb, 0x6d, 0x62, 0xa1, 0x7c, 0x51, 0x92, 0xe6, 0xa7, 0x4c, 0xd2, 0x4d, 0x00, 0xb5, 0x6a, 0x24, 0x8a, 0xcd, 0x2f, 0x87, 0x09, 0xf0, 0xce, 0x7e, 0xeb, 0x7c, 0x58, 0x7b, 0x75, 0xda, 0x48,
0xa1, 0xed, 0xe7, 0x46, 0x38, 0xb5, 0xb8, 0x15, 0x72, 0x70, 0x4c, 0x0a, 0x31, 0x58, 0xb6, 0x28, 0xce, 0x1f, 0xf4, 0x08, 0xab, 0xdf, 0xd9, 0x6f, 0x61, 0xae, 0x7c, 0x51, 0x90, 0xe6, 0x67, 0x0c,
0x91, 0xbf, 0xc5, 0xd6, 0x33, 0x6e, 0x76, 0xfd, 0x77, 0x7b, 0x69, 0xf3, 0xcb, 0xe9, 0x2a, 0xa6, 0xd2, 0x6d, 0x00, 0xb9, 0x6a, 0xae, 0x1d, 0xc4, 0x86, 0x9a, 0xb0, 0xdc, 0x50, 0x1c, 0x1c, 0x93,
0x50, 0x33, 0x5e, 0x55, 0x66, 0x96, 0xb7, 0x47, 0xc1, 0xf0, 0x38, 0x3e, 0xf2, 0x60, 0xb9, 0xad, 0x42, 0x0c, 0x56, 0x4d, 0xfe, 0xce, 0xb4, 0x3d, 0x97, 0x1f, 0x3d, 0xf3, 0x8d, 0x6e, 0x30, 0x63,
0x5e, 0x3d, 0x91, 0xd1, 0xe2, 0xd4, 0x46, 0xaf, 0x08, 0x83, 0xcd, 0x51, 0x20, 0x3c, 0x8e, 0x8d, 0x28, 0x6d, 0x7f, 0x31, 0x5d, 0xc6, 0xe4, 0x6a, 0xcd, 0x57, 0xa4, 0x99, 0xd5, 0xdd, 0x71, 0x30,
0x7e, 0x08, 0xab, 0x01, 0x71, 0xfc, 0xe9, 0x59, 0x01, 0x19, 0xa9, 0xaa, 0x78, 0x0c, 0x37, 0x27, 0x3c, 0x89, 0x8f, 0x3c, 0x58, 0xb5, 0xe4, 0xcb, 0x28, 0x32, 0x5a, 0x9c, 0xd9, 0xe8, 0xcb, 0xdc,
0x4a, 0xe1, 0x17, 0x20, 0xa0, 0x36, 0xe4, 0x1d, 0xbf, 0xbb, 0x28, 0xc9, 0x1b, 0xe1, 0x5b, 0xe9, 0x60, 0x6b, 0x1c, 0x08, 0x4f, 0x62, 0xa3, 0xef, 0xc3, 0x7a, 0x48, 0x9c, 0x7c, 0x9e, 0x56, 0x40,
0x56, 0x11, 0x65, 0x7f, 0x3d, 0xde, 0x55, 0x84, 0xcf, 0x2f, 0xd5, 0x50, 0x28, 0x6c, 0x74, 0x0a, 0xec, 0x54, 0x95, 0x3f, 0xdc, 0x5b, 0x53, 0xa5, 0xf0, 0x73, 0x10, 0x90, 0x05, 0x79, 0x27, 0xe8,
0x25, 0xd3, 0x75, 0x3d, 0x6e, 0xfa, 0x8f, 0xe1, 0x79, 0x69, 0x6a, 0x6b, 0x6a, 0x53, 0x5b, 0x11, 0x2e, 0x4a, 0xa2, 0x22, 0x7c, 0x23, 0xdd, 0x2a, 0xa2, 0xe8, 0xaf, 0xc7, 0xbb, 0x0a, 0xf5, 0xfc,
0xc6, 0x48, 0x17, 0x13, 0xe3, 0xe0, 0xb8, 0x29, 0xf4, 0x08, 0x16, 0xbd, 0x47, 0x2e, 0xa1, 0x98, 0x92, 0x0d, 0x85, 0xc4, 0x46, 0x0f, 0xa1, 0x64, 0xb8, 0xae, 0xe7, 0x1b, 0xc1, 0x83, 0x79, 0x51,
0x1c, 0x12, 0x4a, 0x5c, 0x8b, 0xb0, 0x4a, 0x59, 0x5a, 0xff, 0x5a, 0x4a, 0xeb, 0x09, 0xe5, 0x28, 0x98, 0xda, 0x99, 0xd9, 0xd4, 0x4e, 0x84, 0x31, 0xd6, 0xc5, 0xc4, 0x38, 0x38, 0x6e, 0x0a, 0x3d,
0xa5, 0x93, 0x74, 0x86, 0x47, 0xad, 0xa0, 0x3a, 0xc0, 0xa1, 0xed, 0xaa, 0x5e, 0xb4, 0xb2, 0x10, 0x80, 0x65, 0xef, 0x81, 0x4b, 0x28, 0x26, 0xc7, 0x84, 0x12, 0xd7, 0x24, 0xac, 0x52, 0x16, 0xd6,
0x8d, 0x9e, 0x6e, 0x86, 0x54, 0x1c, 0x93, 0x40, 0x5f, 0x87, 0x92, 0xe5, 0xf4, 0x19, 0x27, 0xfe, 0xbf, 0x92, 0xd2, 0x7a, 0x42, 0x39, 0x0a, 0xe9, 0x24, 0x9d, 0xe1, 0x71, 0x2b, 0xa8, 0x0e, 0x70,
0x8c, 0x6b, 0x51, 0x9e, 0xa0, 0x70, 0x7d, 0xdb, 0x11, 0x0b, 0xc7, 0xe5, 0xd0, 0x11, 0xcc, 0xdb, 0x6c, 0xbb, 0xb2, 0x17, 0xad, 0x2c, 0x45, 0x63, 0xb2, 0xeb, 0x8a, 0x8a, 0x63, 0x12, 0xe8, 0xab,
0xb1, 0xa6, 0xb7, 0xb2, 0x24, 0x73, 0x71, 0x73, 0xea, 0x4e, 0x97, 0x19, 0x4b, 0xa2, 0x12, 0xc5, 0x50, 0x32, 0x9d, 0x3e, 0xf3, 0x49, 0x30, 0x8f, 0x5b, 0x16, 0x37, 0x48, 0xad, 0x6f, 0x37, 0x62,
0x29, 0x38, 0x81, 0xbc, 0xfa, 0x0d, 0x28, 0x7d, 0xca, 0x1e, 0x4c, 0xf4, 0x70, 0xa3, 0x5b, 0x37, 0xe1, 0xb8, 0x1c, 0x3a, 0x81, 0x45, 0x3b, 0xd6, 0xf4, 0x56, 0x56, 0x44, 0x2c, 0x6e, 0xcf, 0xdc,
0x55, 0x0f, 0xf7, 0xd7, 0x0c, 0x2c, 0x24, 0x03, 0x1e, 0xbe, 0x75, 0xb4, 0x89, 0x33, 0xcb, 0xa0, 0xe9, 0xb2, 0xe6, 0x0a, 0xcf, 0x44, 0x71, 0x0a, 0x4e, 0x20, 0xaf, 0x7f, 0x0d, 0x4a, 0x9f, 0xb0,
0x2a, 0x67, 0x27, 0x56, 0x65, 0x55, 0xfc, 0x66, 0x5f, 0xa6, 0xf8, 0x6d, 0x02, 0x98, 0x3d, 0x3b, 0x07, 0xe3, 0x3d, 0xdc, 0xf8, 0xd1, 0xcd, 0xd4, 0xc3, 0xfd, 0x25, 0x03, 0x4b, 0xc9, 0x0d, 0x57,
0xa8, 0x7b, 0x7e, 0x1d, 0x0d, 0x2b, 0x57, 0x34, 0x45, 0xc3, 0x31, 0x29, 0x39, 0x95, 0xf4, 0x5c, 0x6f, 0x1d, 0x6d, 0xea, 0x7c, 0x35, 0xcc, 0xca, 0xd9, 0xa9, 0x59, 0x59, 0x26, 0xbf, 0xf9, 0x17,
0x4e, 0x3d, 0xc7, 0x21, 0x54, 0x5d, 0xa6, 0xfe, 0x54, 0x32, 0xa4, 0xe2, 0x98, 0x04, 0xba, 0x09, 0x49, 0x7e, 0xdb, 0x00, 0x46, 0xcf, 0x0e, 0xf3, 0x5e, 0x90, 0x47, 0x55, 0xe6, 0x8a, 0x26, 0x7e,
0xe8, 0xc0, 0xf1, 0xac, 0x63, 0x19, 0x82, 0xe0, 0x9c, 0xcb, 0x2a, 0x59, 0xf0, 0x87, 0x52, 0xc6, 0x38, 0x26, 0x25, 0x26, 0xa8, 0x9e, 0xeb, 0x53, 0xcf, 0x71, 0x08, 0x95, 0xc5, 0x34, 0x98, 0xa0,
0x18, 0x17, 0x5f, 0xa0, 0xa1, 0xcf, 0x41, 0xae, 0x25, 0xda, 0x0a, 0xfd, 0x2e, 0x24, 0xe7, 0x49, 0x2a, 0x2a, 0x8e, 0x49, 0xa0, 0xeb, 0x80, 0x8e, 0x1c, 0xcf, 0x3c, 0x15, 0x5b, 0x10, 0xde, 0x73,
0xe8, 0x86, 0x1f, 0x09, 0x2d, 0x1c, 0xf8, 0x4c, 0x17, 0x05, 0xfd, 0x2a, 0x14, 0xb1, 0xe7, 0xf1, 0x91, 0x25, 0x0b, 0xc1, 0xe0, 0xaa, 0x39, 0xc1, 0xc5, 0x17, 0x68, 0xe8, 0x0b, 0x90, 0x6b, 0xf3,
0x96, 0xc9, 0x8f, 0x18, 0xaa, 0x41, 0xae, 0x27, 0x7e, 0xa8, 0x61, 0xa1, 0x9c, 0xff, 0x4a, 0x0e, 0xb6, 0x42, 0xbf, 0x0d, 0xc9, 0x99, 0x13, 0x7a, 0x27, 0xd8, 0x09, 0x4d, 0x0d, 0x85, 0x66, 0xdb,
0xf6, 0xe9, 0xfa, 0xaf, 0x34, 0x78, 0x75, 0xe2, 0xec, 0x4e, 0x44, 0xd4, 0x0a, 0xbf, 0x94, 0x4b, 0x05, 0xfd, 0x0a, 0x14, 0xb1, 0xe7, 0xf9, 0x6d, 0xc3, 0x3f, 0x61, 0xa8, 0x06, 0xb9, 0x1e, 0xff,
0x61, 0x44, 0x23, 0x39, 0x1c, 0x93, 0x12, 0x9d, 0x58, 0x62, 0xe0, 0x37, 0xda, 0x89, 0x25, 0xac, 0x47, 0x8e, 0xfb, 0xc4, 0xac, 0x5a, 0x70, 0x70, 0x40, 0xd7, 0x7f, 0xa9, 0xc1, 0x2b, 0x53, 0xe7,
0xe1, 0xa4, 0xac, 0xfe, 0xef, 0x0c, 0xe4, 0xfd, 0x67, 0xd9, 0x7f, 0xb9, 0xf9, 0x7e, 0x03, 0xf2, 0x8c, 0x7c, 0x47, 0x4d, 0xf5, 0x25, 0x5d, 0x52, 0x3b, 0x1a, 0xc9, 0xe1, 0x98, 0x14, 0xef, 0xc4,
0x4c, 0xda, 0x51, 0xee, 0x85, 0xd5, 0xd2, 0xb7, 0x8e, 0x15, 0x57, 0x34, 0x31, 0x5d, 0xc2, 0x98, 0x12, 0xc3, 0xc9, 0xf1, 0x4e, 0x2c, 0x61, 0x0d, 0x27, 0x65, 0xf5, 0x7f, 0x67, 0x20, 0x1f, 0x3c,
0xd9, 0x09, 0x92, 0x37, 0x6c, 0x62, 0xf6, 0x7c, 0x32, 0x0e, 0xf8, 0xe8, 0x1d, 0xf1, 0x0a, 0x35, 0xcb, 0x3e, 0xe3, 0xe6, 0xfb, 0x75, 0xc8, 0x33, 0x61, 0x47, 0xba, 0xa7, 0xb2, 0x65, 0x60, 0x1d,
0x59, 0xd8, 0x17, 0x56, 0x03, 0x48, 0x2c, 0xa9, 0xe7, 0x83, 0xda, 0xbc, 0x02, 0x97, 0xdf, 0x58, 0x4b, 0x2e, 0x6f, 0x62, 0xba, 0x84, 0x31, 0xa3, 0x13, 0x06, 0xaf, 0x6a, 0x62, 0x0e, 0x02, 0x32,
0x49, 0xa3, 0x07, 0x30, 0xd7, 0x26, 0xdc, 0xb4, 0x1d, 0xbf, 0x1d, 0x4c, 0x3d, 0x99, 0xf4, 0xc1, 0x0e, 0xf9, 0xe8, 0x6d, 0xfe, 0x0a, 0x35, 0x98, 0xea, 0x0b, 0xab, 0x21, 0x24, 0x16, 0xd4, 0xf3,
0x9a, 0xbe, 0xaa, 0x51, 0x12, 0x3e, 0xa9, 0x0f, 0x1c, 0x00, 0x8a, 0x83, 0x67, 0x79, 0x6d, 0x7f, 0x61, 0x6d, 0x51, 0x82, 0x8b, 0x6f, 0x2c, 0xa5, 0xd1, 0x3d, 0x58, 0xb0, 0x88, 0x6f, 0xd8, 0x4e,
0x4c, 0x9f, 0x8b, 0x0e, 0xde, 0xb6, 0xd7, 0x26, 0x58, 0x72, 0xf4, 0xc7, 0x1a, 0x94, 0x7c, 0xa4, 0xd0, 0x0e, 0xa6, 0x9e, 0x5e, 0x06, 0x60, 0xad, 0x40, 0xb5, 0x59, 0xe2, 0x3e, 0xc9, 0x0f, 0x1c,
0x6d, 0xb3, 0xcf, 0x08, 0xda, 0x08, 0x57, 0xe1, 0x6f, 0x77, 0x70, 0x27, 0xcf, 0xbe, 0x77, 0xd6, 0x02, 0xf2, 0x8b, 0x67, 0x7a, 0x56, 0xf0, 0x93, 0x42, 0x2e, 0xba, 0x78, 0xbb, 0x9e, 0x45, 0xb0,
0x23, 0xe7, 0x83, 0x5a, 0x51, 0x8a, 0x89, 0x8f, 0x70, 0x01, 0xb1, 0x18, 0x65, 0x2e, 0x89, 0xd1, 0xe0, 0xe8, 0x8f, 0x34, 0x28, 0x05, 0x48, 0xbb, 0x46, 0x9f, 0x11, 0xb4, 0xa5, 0x56, 0x11, 0x1c,
0xeb, 0x90, 0x93, 0xad, 0xb7, 0x0a, 0x66, 0xd8, 0xe8, 0xc9, 0xf6, 0x1c, 0xfb, 0x3c, 0xfd, 0xe3, 0x77, 0x58, 0x93, 0xe7, 0xdf, 0x1b, 0xf4, 0xc8, 0xf9, 0xb0, 0x56, 0x14, 0x62, 0xfc, 0x43, 0x2d,
0x0c, 0x94, 0x13, 0x8b, 0x4b, 0xd1, 0xd5, 0x85, 0xa3, 0x92, 0x4c, 0x8a, 0xf1, 0xdb, 0xe4, 0x7f, 0x20, 0xb6, 0x47, 0x99, 0x4b, 0xf6, 0xe8, 0x35, 0xc8, 0x89, 0xd6, 0x5b, 0x6e, 0xa6, 0x6a, 0xf4,
0xae, 0x7c, 0x1f, 0xf2, 0x96, 0x58, 0x5f, 0xf0, 0xdf, 0xad, 0x8d, 0x69, 0xb6, 0x42, 0x46, 0x26, 0x44, 0x7b, 0x8e, 0x03, 0x9e, 0xfe, 0x71, 0x06, 0xca, 0x89, 0xc5, 0xa5, 0xe8, 0xea, 0xd4, 0xa8,
0xca, 0x24, 0xf9, 0xc9, 0xb0, 0x02, 0x44, 0xb7, 0x60, 0x99, 0x12, 0x4e, 0xcf, 0xb6, 0x0e, 0x39, 0x24, 0x93, 0x62, 0xfc, 0x36, 0xfd, 0x87, 0xa0, 0xef, 0x42, 0xde, 0xe4, 0xeb, 0x0b, 0x7f, 0x89,
0xa1, 0xf1, 0xfe, 0x3f, 0x17, 0xf5, 0x3d, 0x78, 0x54, 0x00, 0x8f, 0xeb, 0x04, 0xa5, 0x32, 0xff, 0xdb, 0x9a, 0xe5, 0x28, 0xc4, 0xce, 0x44, 0x91, 0x24, 0x3e, 0x19, 0x96, 0x80, 0xe8, 0x06, 0xac,
0x12, 0xa5, 0x52, 0x77, 0x60, 0xf6, 0x7f, 0xd8, 0xa3, 0xff, 0x00, 0x8a, 0x51, 0x17, 0xf5, 0x19, 0x52, 0xe2, 0xd3, 0xc1, 0xce, 0xb1, 0x4f, 0x68, 0xbc, 0xff, 0xcf, 0x45, 0x7d, 0x0f, 0x1e, 0x17,
0x9b, 0xd4, 0x7f, 0x04, 0x05, 0x91, 0x8d, 0x41, 0xf7, 0x7f, 0xc9, 0x4d, 0x94, 0xbc, 0x23, 0x32, 0xc0, 0x93, 0x3a, 0x61, 0xaa, 0xcc, 0xbf, 0x40, 0xaa, 0xd4, 0x1d, 0x98, 0xff, 0x2f, 0xf6, 0xe8,
0x69, 0xee, 0x08, 0x7d, 0x13, 0xfc, 0xff, 0x99, 0x89, 0x6a, 0xea, 0xbf, 0xd8, 0x63, 0xd5, 0x34, 0xdf, 0x83, 0x62, 0xd4, 0x45, 0x7d, 0xca, 0x26, 0xf5, 0x1f, 0x40, 0x81, 0x47, 0x63, 0xd8, 0xfd,
0xfe, 0xfc, 0x8e, 0x8d, 0xcc, 0x7e, 0xa1, 0x01, 0xc8, 0xe7, 0xe3, 0xce, 0x09, 0x71, 0xb9, 0x70, 0x5f, 0x52, 0x89, 0x92, 0x35, 0x22, 0x93, 0xa6, 0x46, 0xe8, 0x6f, 0x41, 0xf9, 0x4e, 0xcf, 0x9a,
0x4c, 0xec, 0xc0, 0xa8, 0x63, 0xf2, 0x18, 0x49, 0x0e, 0xba, 0x07, 0x79, 0x4f, 0x76, 0x57, 0x6a, 0xed, 0x57, 0x14, 0x7d, 0x1b, 0x82, 0x1f, 0x05, 0x79, 0x0a, 0x0e, 0x9e, 0xf9, 0xb1, 0x14, 0x1c,
0x86, 0x35, 0xe5, 0x38, 0x20, 0xcc, 0x3a, 0xbf, 0x45, 0xc3, 0x0a, 0xcc, 0x58, 0x7f, 0xfa, 0xbc, 0x7f, 0xb3, 0x27, 0x7f, 0xaf, 0x01, 0xf1, 0xe6, 0xdc, 0x3b, 0x23, 0xae, 0xcf, 0x57, 0xc3, 0x8f,
0x3a, 0xf3, 0xec, 0x79, 0x75, 0xe6, 0xa3, 0xe7, 0xd5, 0x99, 0x0f, 0x86, 0x55, 0xed, 0xe9, 0xb0, 0x6d, 0x7c, 0x35, 0xe2, 0xee, 0x09, 0x0e, 0xba, 0x03, 0x79, 0x4f, 0xb4, 0x64, 0x72, 0xf0, 0x35,
0xaa, 0x3d, 0x1b, 0x56, 0xb5, 0x8f, 0x86, 0x55, 0xed, 0xe3, 0x61, 0x55, 0x7b, 0xfc, 0x49, 0x75, 0xe3, 0x0c, 0x41, 0x85, 0x6a, 0xd0, 0xd7, 0x61, 0x09, 0xd6, 0xdc, 0x7c, 0xf2, 0xac, 0x3a, 0xf7,
0xe6, 0x41, 0xe6, 0x64, 0xe3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xc5, 0x28, 0xb2, 0x54, 0xf4, 0x59, 0x75, 0xee, 0xa3, 0x67, 0xd5, 0xb9, 0x0f, 0x46, 0x55, 0xed, 0xc9, 0xa8, 0xaa, 0x3d,
0x20, 0x00, 0x00, 0x1d, 0x55, 0xb5, 0x8f, 0x46, 0x55, 0xed, 0xe3, 0x51, 0x55, 0x7b, 0xf4, 0x8f, 0xea, 0xdc, 0xbd,
0xcc, 0xd9, 0xd6, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xab, 0xec, 0x02, 0x4a, 0x00, 0x21, 0x00,
0x00,
} }

View File

@ -23,7 +23,6 @@ package k8s.io.apimachinery.pkg.apis.meta.v1;
import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
// Package-wide variables from generator "generated". // Package-wide variables from generator "generated".
option go_package = "v1"; option go_package = "v1";
@ -125,6 +124,21 @@ message APIVersions {
repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 2; repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 2;
} }
// CreateOptions may be provided when creating an API object.
message CreateOptions {
// When present, indicates that modifications should not be
// persisted. An invalid or unrecognized dryRun directive will
// result in an error response and no further processing of the
// request. Valid values are:
// - All: all dry run stages will be processed
// +optional
repeated string dryRun = 1;
// If IncludeUninitialized is specified, the object may be
// returned without completing initialization.
optional bool includeUninitialized = 2;
}
// DeleteOptions may be provided when deleting an API object. // DeleteOptions may be provided when deleting an API object.
message DeleteOptions { message DeleteOptions {
// The duration in seconds before the object should be deleted. Value must be non-negative integer. // The duration in seconds before the object should be deleted. Value must be non-negative integer.
@ -156,6 +170,14 @@ message DeleteOptions {
// foreground. // foreground.
// +optional // +optional
optional string propagationPolicy = 4; optional string propagationPolicy = 4;
// When present, indicates that modifications should not be
// persisted. An invalid or unrecognized dryRun directive will
// result in an error response and no further processing of the
// request. Valid values are:
// - All: all dry run stages will be processed
// +optional
repeated string dryRun = 5;
} }
// Duration is a wrapper around time.Duration which supports correct // Duration is a wrapper around time.Duration which supports correct
@ -811,6 +833,17 @@ message TypeMeta {
optional string apiVersion = 2; optional string apiVersion = 2;
} }
// UpdateOptions may be provided when updating an API object.
message UpdateOptions {
// When present, indicates that modifications should not be
// persisted. An invalid or unrecognized dryRun directive will
// result in an error response and no further processing of the
// request. Valid values are:
// - All: all dry run stages will be processed
// +optional
repeated string dryRun = 1;
}
// Verbs masks the value so protobuf can generate // Verbs masks the value so protobuf can generate
// //
// +protobuf.nullable=true // +protobuf.nullable=true

View File

@ -19,6 +19,7 @@ package v1
import ( import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
) )
// GroupName is the group name for this API. // GroupName is the group name for this API.
@ -52,14 +53,15 @@ func AddToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion)
&ExportOptions{}, &ExportOptions{},
&GetOptions{}, &GetOptions{},
&DeleteOptions{}, &DeleteOptions{},
&CreateOptions{},
&UpdateOptions{},
) )
scheme.AddConversionFuncs( utilruntime.Must(scheme.AddConversionFuncs(
Convert_versioned_Event_to_watch_Event, Convert_v1_WatchEvent_To_watch_Event,
Convert_versioned_InternalEvent_to_versioned_Event, Convert_v1_InternalEvent_To_v1_WatchEvent,
Convert_watch_Event_to_versioned_Event, Convert_watch_Event_To_v1_WatchEvent,
Convert_versioned_Event_to_versioned_InternalEvent, Convert_v1_WatchEvent_To_v1_InternalEvent,
) ))
// Register Unversioned types under their own special group // Register Unversioned types under their own special group
scheme.AddUnversionedTypes(Unversioned, scheme.AddUnversionedTypes(Unversioned,
&Status{}, &Status{},
@ -70,8 +72,8 @@ func AddToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion)
) )
// register manually. This usually goes through the SchemeBuilder, which we cannot use here. // register manually. This usually goes through the SchemeBuilder, which we cannot use here.
AddConversionFuncs(scheme) utilruntime.Must(AddConversionFuncs(scheme))
RegisterDefaults(scheme) utilruntime.Must(RegisterDefaults(scheme))
} }
// scheme is the registry for the common types that adhere to the meta v1 API spec. // scheme is the registry for the common types that adhere to the meta v1 API spec.
@ -86,8 +88,10 @@ func init() {
&ExportOptions{}, &ExportOptions{},
&GetOptions{}, &GetOptions{},
&DeleteOptions{}, &DeleteOptions{},
&CreateOptions{},
&UpdateOptions{},
) )
// register manually. This usually goes through the SchemeBuilder, which we cannot use here. // register manually. This usually goes through the SchemeBuilder, which we cannot use here.
RegisterDefaults(scheme) utilruntime.Must(RegisterDefaults(scheme))
} }

View File

@ -418,6 +418,12 @@ const (
DeletePropagationForeground DeletionPropagation = "Foreground" DeletePropagationForeground DeletionPropagation = "Foreground"
) )
const (
// DryRunAll means to complete all processing stages, but don't
// persist changes to storage.
DryRunAll = "All"
)
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// DeleteOptions may be provided when deleting an API object. // DeleteOptions may be provided when deleting an API object.
@ -453,6 +459,48 @@ type DeleteOptions struct {
// foreground. // foreground.
// +optional // +optional
PropagationPolicy *DeletionPropagation `json:"propagationPolicy,omitempty" protobuf:"varint,4,opt,name=propagationPolicy"` PropagationPolicy *DeletionPropagation `json:"propagationPolicy,omitempty" protobuf:"varint,4,opt,name=propagationPolicy"`
// When present, indicates that modifications should not be
// persisted. An invalid or unrecognized dryRun directive will
// result in an error response and no further processing of the
// request. Valid values are:
// - All: all dry run stages will be processed
// +optional
DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,5,rep,name=dryRun"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// CreateOptions may be provided when creating an API object.
type CreateOptions struct {
TypeMeta `json:",inline"`
// When present, indicates that modifications should not be
// persisted. An invalid or unrecognized dryRun directive will
// result in an error response and no further processing of the
// request. Valid values are:
// - All: all dry run stages will be processed
// +optional
DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,1,rep,name=dryRun"`
// If IncludeUninitialized is specified, the object may be
// returned without completing initialization.
IncludeUninitialized bool `json:"includeUninitialized,omitempty" protobuf:"varint,2,opt,name=includeUninitialized"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// UpdateOptions may be provided when updating an API object.
type UpdateOptions struct {
TypeMeta `json:",inline"`
// When present, indicates that modifications should not be
// persisted. An invalid or unrecognized dryRun directive will
// result in an error response and no further processing of the
// request. Valid values are:
// - All: all dry run stages will be processed
// +optional
DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,1,rep,name=dryRun"`
} }
// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out. // Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.

View File

@ -85,12 +85,23 @@ func (APIVersions) SwaggerDoc() map[string]string {
return map_APIVersions return map_APIVersions
} }
var map_CreateOptions = map[string]string{
"": "CreateOptions may be provided when creating an API object.",
"dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed",
"includeUninitialized": "If IncludeUninitialized is specified, the object may be returned without completing initialization.",
}
func (CreateOptions) SwaggerDoc() map[string]string {
return map_CreateOptions
}
var map_DeleteOptions = map[string]string{ var map_DeleteOptions = map[string]string{
"": "DeleteOptions may be provided when deleting an API object.", "": "DeleteOptions may be provided when deleting an API object.",
"gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", "gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.",
"preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", "preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.",
"orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.",
"propagationPolicy": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", "propagationPolicy": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.",
"dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed",
} }
func (DeleteOptions) SwaggerDoc() map[string]string { func (DeleteOptions) SwaggerDoc() map[string]string {
@ -327,4 +338,13 @@ func (TypeMeta) SwaggerDoc() map[string]string {
return map_TypeMeta return map_TypeMeta
} }
var map_UpdateOptions = map[string]string{
"": "UpdateOptions may be provided when updating an API object.",
"dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed",
}
func (UpdateOptions) SwaggerDoc() map[string]string {
return map_UpdateOptions
}
// AUTO-GENERATED FUNCTIONS END HERE // AUTO-GENERATED FUNCTIONS END HERE

View File

@ -179,6 +179,11 @@ func (u *Unstructured) GetOwnerReferences() []metav1.OwnerReference {
} }
func (u *Unstructured) SetOwnerReferences(references []metav1.OwnerReference) { func (u *Unstructured) SetOwnerReferences(references []metav1.OwnerReference) {
if references == nil {
RemoveNestedField(u.Object, "metadata", "ownerReferences")
return
}
newReferences := make([]interface{}, 0, len(references)) newReferences := make([]interface{}, 0, len(references))
for _, reference := range references { for _, reference := range references {
out, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&reference) out, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&reference)
@ -212,6 +217,10 @@ func (u *Unstructured) GetNamespace() string {
} }
func (u *Unstructured) SetNamespace(namespace string) { func (u *Unstructured) SetNamespace(namespace string) {
if len(namespace) == 0 {
RemoveNestedField(u.Object, "metadata", "namespace")
return
}
u.setNestedField(namespace, "metadata", "namespace") u.setNestedField(namespace, "metadata", "namespace")
} }
@ -220,6 +229,10 @@ func (u *Unstructured) GetName() string {
} }
func (u *Unstructured) SetName(name string) { func (u *Unstructured) SetName(name string) {
if len(name) == 0 {
RemoveNestedField(u.Object, "metadata", "name")
return
}
u.setNestedField(name, "metadata", "name") u.setNestedField(name, "metadata", "name")
} }
@ -227,8 +240,12 @@ func (u *Unstructured) GetGenerateName() string {
return getNestedString(u.Object, "metadata", "generateName") return getNestedString(u.Object, "metadata", "generateName")
} }
func (u *Unstructured) SetGenerateName(name string) { func (u *Unstructured) SetGenerateName(generateName string) {
u.setNestedField(name, "metadata", "generateName") if len(generateName) == 0 {
RemoveNestedField(u.Object, "metadata", "generateName")
return
}
u.setNestedField(generateName, "metadata", "generateName")
} }
func (u *Unstructured) GetUID() types.UID { func (u *Unstructured) GetUID() types.UID {
@ -236,6 +253,10 @@ func (u *Unstructured) GetUID() types.UID {
} }
func (u *Unstructured) SetUID(uid types.UID) { func (u *Unstructured) SetUID(uid types.UID) {
if len(string(uid)) == 0 {
RemoveNestedField(u.Object, "metadata", "uid")
return
}
u.setNestedField(string(uid), "metadata", "uid") u.setNestedField(string(uid), "metadata", "uid")
} }
@ -243,8 +264,12 @@ func (u *Unstructured) GetResourceVersion() string {
return getNestedString(u.Object, "metadata", "resourceVersion") return getNestedString(u.Object, "metadata", "resourceVersion")
} }
func (u *Unstructured) SetResourceVersion(version string) { func (u *Unstructured) SetResourceVersion(resourceVersion string) {
u.setNestedField(version, "metadata", "resourceVersion") if len(resourceVersion) == 0 {
RemoveNestedField(u.Object, "metadata", "resourceVersion")
return
}
u.setNestedField(resourceVersion, "metadata", "resourceVersion")
} }
func (u *Unstructured) GetGeneration() int64 { func (u *Unstructured) GetGeneration() int64 {
@ -256,6 +281,10 @@ func (u *Unstructured) GetGeneration() int64 {
} }
func (u *Unstructured) SetGeneration(generation int64) { func (u *Unstructured) SetGeneration(generation int64) {
if generation == 0 {
RemoveNestedField(u.Object, "metadata", "generation")
return
}
u.setNestedField(generation, "metadata", "generation") u.setNestedField(generation, "metadata", "generation")
} }
@ -264,6 +293,10 @@ func (u *Unstructured) GetSelfLink() string {
} }
func (u *Unstructured) SetSelfLink(selfLink string) { func (u *Unstructured) SetSelfLink(selfLink string) {
if len(selfLink) == 0 {
RemoveNestedField(u.Object, "metadata", "selfLink")
return
}
u.setNestedField(selfLink, "metadata", "selfLink") u.setNestedField(selfLink, "metadata", "selfLink")
} }
@ -272,6 +305,10 @@ func (u *Unstructured) GetContinue() string {
} }
func (u *Unstructured) SetContinue(c string) { func (u *Unstructured) SetContinue(c string) {
if len(c) == 0 {
RemoveNestedField(u.Object, "metadata", "continue")
return
}
u.setNestedField(c, "metadata", "continue") u.setNestedField(c, "metadata", "continue")
} }
@ -330,6 +367,10 @@ func (u *Unstructured) GetLabels() map[string]string {
} }
func (u *Unstructured) SetLabels(labels map[string]string) { func (u *Unstructured) SetLabels(labels map[string]string) {
if labels == nil {
RemoveNestedField(u.Object, "metadata", "labels")
return
}
u.setNestedMap(labels, "metadata", "labels") u.setNestedMap(labels, "metadata", "labels")
} }
@ -339,6 +380,10 @@ func (u *Unstructured) GetAnnotations() map[string]string {
} }
func (u *Unstructured) SetAnnotations(annotations map[string]string) { func (u *Unstructured) SetAnnotations(annotations map[string]string) {
if annotations == nil {
RemoveNestedField(u.Object, "metadata", "annotations")
return
}
u.setNestedMap(annotations, "metadata", "annotations") u.setNestedMap(annotations, "metadata", "annotations")
} }
@ -387,6 +432,10 @@ func (u *Unstructured) GetFinalizers() []string {
} }
func (u *Unstructured) SetFinalizers(finalizers []string) { func (u *Unstructured) SetFinalizers(finalizers []string) {
if finalizers == nil {
RemoveNestedField(u.Object, "metadata", "finalizers")
return
}
u.setNestedSlice(finalizers, "metadata", "finalizers") u.setNestedSlice(finalizers, "metadata", "finalizers")
} }
@ -395,5 +444,9 @@ func (u *Unstructured) GetClusterName() string {
} }
func (u *Unstructured) SetClusterName(clusterName string) { func (u *Unstructured) SetClusterName(clusterName string) {
if len(clusterName) == 0 {
RemoveNestedField(u.Object, "metadata", "clusterName")
return
}
u.setNestedField(clusterName, "metadata", "clusterName") u.setNestedField(clusterName, "metadata", "clusterName")
} }

View File

@ -39,7 +39,7 @@ type WatchEvent struct {
Object runtime.RawExtension `json:"object" protobuf:"bytes,2,opt,name=object"` Object runtime.RawExtension `json:"object" protobuf:"bytes,2,opt,name=object"`
} }
func Convert_watch_Event_to_versioned_Event(in *watch.Event, out *WatchEvent, s conversion.Scope) error { func Convert_watch_Event_To_v1_WatchEvent(in *watch.Event, out *WatchEvent, s conversion.Scope) error {
out.Type = string(in.Type) out.Type = string(in.Type)
switch t := in.Object.(type) { switch t := in.Object.(type) {
case *runtime.Unknown: case *runtime.Unknown:
@ -52,11 +52,11 @@ func Convert_watch_Event_to_versioned_Event(in *watch.Event, out *WatchEvent, s
return nil return nil
} }
func Convert_versioned_InternalEvent_to_versioned_Event(in *InternalEvent, out *WatchEvent, s conversion.Scope) error { func Convert_v1_InternalEvent_To_v1_WatchEvent(in *InternalEvent, out *WatchEvent, s conversion.Scope) error {
return Convert_watch_Event_to_versioned_Event((*watch.Event)(in), out, s) return Convert_watch_Event_To_v1_WatchEvent((*watch.Event)(in), out, s)
} }
func Convert_versioned_Event_to_watch_Event(in *WatchEvent, out *watch.Event, s conversion.Scope) error { func Convert_v1_WatchEvent_To_watch_Event(in *WatchEvent, out *watch.Event, s conversion.Scope) error {
out.Type = watch.EventType(in.Type) out.Type = watch.EventType(in.Type)
if in.Object.Object != nil { if in.Object.Object != nil {
out.Object = in.Object.Object out.Object = in.Object.Object
@ -70,8 +70,8 @@ func Convert_versioned_Event_to_watch_Event(in *WatchEvent, out *watch.Event, s
return nil return nil
} }
func Convert_versioned_Event_to_versioned_InternalEvent(in *WatchEvent, out *InternalEvent, s conversion.Scope) error { func Convert_v1_WatchEvent_To_v1_InternalEvent(in *WatchEvent, out *InternalEvent, s conversion.Scope) error {
return Convert_versioned_Event_to_watch_Event(in, (*watch.Event)(out), s) return Convert_v1_WatchEvent_To_watch_Event(in, (*watch.Event)(out), s)
} }
// InternalEvent makes watch.Event versioned // InternalEvent makes watch.Event versioned

View File

@ -191,6 +191,36 @@ func (in *APIVersions) DeepCopyObject() runtime.Object {
return nil return nil
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CreateOptions) DeepCopyInto(out *CreateOptions) {
*out = *in
out.TypeMeta = in.TypeMeta
if in.DryRun != nil {
in, out := &in.DryRun, &out.DryRun
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CreateOptions.
func (in *CreateOptions) DeepCopy() *CreateOptions {
if in == nil {
return nil
}
out := new(CreateOptions)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *CreateOptions) 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. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DeleteOptions) DeepCopyInto(out *DeleteOptions) { func (in *DeleteOptions) DeepCopyInto(out *DeleteOptions) {
*out = *in *out = *in
@ -215,6 +245,11 @@ func (in *DeleteOptions) DeepCopyInto(out *DeleteOptions) {
*out = new(DeletionPropagation) *out = new(DeletionPropagation)
**out = **in **out = **in
} }
if in.DryRun != nil {
in, out := &in.DryRun, &out.DryRun
*out = make([]string, len(*in))
copy(*out, *in)
}
return return
} }
@ -443,9 +478,7 @@ func (in *Initializers) DeepCopy() *Initializers {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *InternalEvent) DeepCopyInto(out *InternalEvent) { func (in *InternalEvent) DeepCopyInto(out *InternalEvent) {
*out = *in *out = *in
if in.Object == nil { if in.Object != nil {
out.Object = nil
} else {
out.Object = in.Object.DeepCopyObject() out.Object = in.Object.DeepCopyObject()
} }
return return
@ -852,6 +885,36 @@ func (in *Timestamp) DeepCopy() *Timestamp {
return out return out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *UpdateOptions) DeepCopyInto(out *UpdateOptions) {
*out = *in
out.TypeMeta = in.TypeMeta
if in.DryRun != nil {
in, out := &in.DryRun, &out.DryRun
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateOptions.
func (in *UpdateOptions) DeepCopy() *UpdateOptions {
if in == nil {
return nil
}
out := new(UpdateOptions)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *UpdateOptions) 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. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in Verbs) DeepCopyInto(out *Verbs) { func (in Verbs) DeepCopyInto(out *Verbs) {
{ {

View File

@ -604,30 +604,29 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 391 bytes of a gzipped FileDescriptorProto // 375 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xbd, 0x6e, 0xd4, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xcd, 0x0a, 0xd3, 0x40,
0x10, 0xc7, 0xbd, 0x42, 0x11, 0x64, 0x43, 0x1a, 0x23, 0xa4, 0x70, 0xc5, 0x3a, 0xba, 0x2a, 0x48, 0x10, 0xc7, 0xb3, 0x48, 0xd1, 0x6e, 0xed, 0x25, 0x22, 0xd4, 0x1e, 0x36, 0xa5, 0xa7, 0x0a, 0x76,
0x64, 0x97, 0x04, 0x84, 0x28, 0x91, 0xbb, 0x48, 0xa0, 0x44, 0x16, 0x15, 0x15, 0x6b, 0x7b, 0xf0, 0xd7, 0x16, 0x11, 0x8f, 0x92, 0x5b, 0x41, 0x69, 0x09, 0x9e, 0x3c, 0xb9, 0x49, 0xc6, 0x74, 0xcd,
0x2d, 0xb6, 0x77, 0xad, 0xdd, 0x71, 0xa4, 0x6b, 0x10, 0x8f, 0xc0, 0x63, 0x5d, 0x99, 0x32, 0x95, 0xc7, 0x86, 0xec, 0xa6, 0xd0, 0x8b, 0xf8, 0x08, 0x3e, 0x56, 0x8f, 0x3d, 0xf6, 0x14, 0x6c, 0x7c,
0xc5, 0x99, 0xb7, 0xa0, 0x42, 0xfe, 0x10, 0xf9, 0xb8, 0x3b, 0xe5, 0xba, 0x99, 0xff, 0xe8, 0xf7, 0x0b, 0x4f, 0x92, 0x0f, 0xec, 0x87, 0x15, 0x7b, 0x9b, 0xf9, 0x0f, 0xbf, 0x5f, 0x66, 0xb2, 0xd8,
0xf3, 0x8c, 0x97, 0x46, 0xf9, 0x7b, 0xc7, 0x95, 0x11, 0x79, 0x1d, 0x83, 0xd5, 0x80, 0xe0, 0xc4, 0x09, 0xdf, 0x28, 0x2a, 0x24, 0x0b, 0x73, 0x17, 0xb2, 0x04, 0x34, 0x28, 0xb6, 0x81, 0xc4, 0x97,
0x25, 0xe8, 0xd4, 0x58, 0x31, 0x0e, 0x64, 0xa5, 0x4a, 0x99, 0xcc, 0x94, 0x06, 0x3b, 0x17, 0x55, 0x19, 0x6b, 0x07, 0x3c, 0x15, 0x31, 0xf7, 0xd6, 0x22, 0x81, 0x6c, 0xcb, 0xd2, 0x30, 0xa8, 0x02,
0x9e, 0x75, 0x81, 0x13, 0x25, 0xa0, 0x14, 0x97, 0x27, 0x31, 0xa0, 0x3c, 0x11, 0x19, 0x68, 0xb0, 0xc5, 0x62, 0xd0, 0x9c, 0x6d, 0x66, 0x2e, 0x68, 0x3e, 0x63, 0x01, 0x24, 0x90, 0x71, 0x0d, 0x3e,
0x12, 0x21, 0xe5, 0x95, 0x35, 0x68, 0xfc, 0x97, 0x03, 0xca, 0x6f, 0xa3, 0xbc, 0xca, 0xb3, 0x2e, 0x4d, 0x33, 0xa9, 0xa5, 0xf9, 0xbc, 0x41, 0xe9, 0x39, 0x4a, 0xd3, 0x30, 0xa8, 0x02, 0x45, 0x2b,
0x70, 0xbc, 0x43, 0xf9, 0x88, 0x4e, 0x8e, 0x33, 0x85, 0xb3, 0x3a, 0xe6, 0x89, 0x29, 0x45, 0x66, 0x94, 0xb6, 0xe8, 0x70, 0x1a, 0x08, 0xbd, 0xce, 0x5d, 0xea, 0xc9, 0x98, 0x05, 0x32, 0x90, 0xac,
0x32, 0x23, 0x7a, 0x43, 0x5c, 0x7f, 0xeb, 0xbb, 0xbe, 0xe9, 0xab, 0xc1, 0x3c, 0x79, 0xbb, 0xcd, 0x36, 0xb8, 0xf9, 0xe7, 0xba, 0xab, 0x9b, 0xba, 0x6a, 0xcc, 0xc3, 0x57, 0xf7, 0x2c, 0x75, 0xbd,
0x52, 0xf7, 0xf7, 0x99, 0x6c, 0x3c, 0xc5, 0xd6, 0x1a, 0x55, 0x09, 0x2b, 0xc0, 0xbb, 0x87, 0x00, 0xcf, 0xf0, 0x9f, 0xa7, 0x64, 0x79, 0xa2, 0x45, 0x0c, 0x7f, 0x01, 0xaf, 0xff, 0x07, 0x28, 0x6f,
0x97, 0xcc, 0xa0, 0x94, 0x2b, 0xdc, 0x9b, 0x4d, 0x5c, 0x8d, 0xaa, 0x10, 0x4a, 0xa3, 0x43, 0x7b, 0x0d, 0x31, 0xbf, 0xe6, 0xc6, 0x5b, 0xfc, 0x74, 0xc5, 0x33, 0x2d, 0x78, 0xb4, 0x74, 0xbf, 0x80,
0x1f, 0x9a, 0xce, 0xe9, 0xf3, 0x0b, 0x69, 0x51, 0xc9, 0xe2, 0x3c, 0xfe, 0x0e, 0x09, 0x7e, 0x02, 0xa7, 0xdf, 0x83, 0xe6, 0x3e, 0xd7, 0xdc, 0xfc, 0x84, 0x1f, 0xc5, 0x6d, 0x3d, 0x40, 0x23, 0x34,
0x94, 0xa9, 0x44, 0xe9, 0x7f, 0xa5, 0x4f, 0xca, 0xb1, 0x3e, 0x20, 0x87, 0xe4, 0x68, 0xef, 0xf4, 0xe9, 0xcd, 0x5f, 0xd2, 0x7b, 0x7e, 0x12, 0x3d, 0x79, 0x6c, 0x73, 0x57, 0x58, 0x46, 0x59, 0x58,
0x35, 0xdf, 0xe6, 0xcf, 0xf2, 0x1b, 0x4f, 0xe8, 0x2f, 0x9a, 0xc0, 0x6b, 0x9b, 0x80, 0xde, 0x64, 0xf8, 0x94, 0x39, 0x7f, 0xac, 0xe3, 0xaf, 0xf8, 0xd9, 0xcd, 0x4f, 0xbf, 0x13, 0x4a, 0x9b, 0x1c,
0xd1, 0x7f, 0xeb, 0xf4, 0x07, 0x7d, 0xb1, 0xf6, 0xd3, 0x1f, 0x95, 0x43, 0x5f, 0xd2, 0x1d, 0x85, 0x77, 0x84, 0x86, 0x58, 0x0d, 0xd0, 0xe8, 0xc1, 0xa4, 0x37, 0x7f, 0x4b, 0xef, 0x7e, 0x20, 0x7a,
0x50, 0xba, 0x03, 0x72, 0xf8, 0xe8, 0x68, 0xef, 0xf4, 0x03, 0xdf, 0xfa, 0x55, 0xf9, 0x5a, 0x69, 0x53, 0x6a, 0x77, 0xcb, 0xc2, 0xea, 0x2c, 0x2a, 0xa5, 0xd3, 0x98, 0xc7, 0x2e, 0x7e, 0xfc, 0x81,
0xb8, 0xdb, 0x36, 0xc1, 0xce, 0x59, 0xa7, 0x8c, 0x06, 0xf3, 0x34, 0xa6, 0x4f, 0x3f, 0xcb, 0xb8, 0xbb, 0x11, 0x2c, 0x53, 0x2d, 0x64, 0xa2, 0x4c, 0x07, 0xf7, 0x45, 0xe2, 0x45, 0xb9, 0x0f, 0x0d,
0x80, 0xf3, 0x0a, 0x95, 0xd1, 0xce, 0x8f, 0xe8, 0xbe, 0xd2, 0x49, 0x51, 0xa7, 0x30, 0xa0, 0xfd, 0x5a, 0x9f, 0xdd, 0xb5, 0x5f, 0xb4, 0x47, 0xf4, 0x17, 0xe7, 0xc3, 0x5f, 0x85, 0xf5, 0xe4, 0x22,
0xd9, 0xbb, 0xe1, 0xab, 0xf1, 0x88, 0xfd, 0xb3, 0xdb, 0xc3, 0xbf, 0x4d, 0xf0, 0xec, 0x4e, 0x70, 0x58, 0xc9, 0x48, 0x78, 0x5b, 0xe7, 0x52, 0x61, 0x4f, 0x77, 0x47, 0x62, 0xec, 0x8f, 0xc4, 0x38,
0x61, 0x0a, 0x95, 0xcc, 0xa3, 0xbb, 0x8a, 0xf0, 0x78, 0xb1, 0x64, 0xde, 0xd5, 0x92, 0x79, 0xd7, 0x1c, 0x89, 0xf1, 0xad, 0x24, 0x68, 0x57, 0x12, 0xb4, 0x2f, 0x09, 0x3a, 0x94, 0x04, 0xfd, 0x28,
0x4b, 0xe6, 0xfd, 0x6c, 0x19, 0x59, 0xb4, 0x8c, 0x5c, 0xb5, 0x8c, 0x5c, 0xb7, 0x8c, 0xfc, 0x6e, 0x09, 0xfa, 0xfe, 0x93, 0x18, 0x1f, 0x1f, 0xb6, 0xab, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xf3,
0x19, 0xf9, 0xf5, 0x87, 0x79, 0x5f, 0x1e, 0x8f, 0xab, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x73, 0xe1, 0xde, 0x86, 0xdb, 0x02, 0x00, 0x00,
0xdf, 0x3a, 0x0c, 0x10, 0x03, 0x00, 0x00,
} }

View File

@ -24,7 +24,6 @@ package k8s.io.apimachinery.pkg.apis.meta.v1beta1;
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
// Package-wide variables from generator "generated". // Package-wide variables from generator "generated".
option go_package = "v1beta1"; option go_package = "v1beta1";

View File

@ -58,9 +58,7 @@ func (in *PartialObjectMetadataList) DeepCopyInto(out *PartialObjectMetadataList
in, out := &in.Items, &out.Items in, out := &in.Items, &out.Items
*out = make([]*PartialObjectMetadata, len(*in)) *out = make([]*PartialObjectMetadata, len(*in))
for i := range *in { for i := range *in {
if (*in)[i] == nil { if (*in)[i] != nil {
(*out)[i] = nil
} else {
in, out := &(*in)[i], &(*out)[i] in, out := &(*in)[i], &(*out)[i]
*out = new(PartialObjectMetadata) *out = new(PartialObjectMetadata)
(*in).DeepCopyInto(*out) (*in).DeepCopyInto(*out)

View File

@ -40,7 +40,11 @@ type NameFunc func(t reflect.Type) string
var DefaultNameFunc = func(t reflect.Type) string { return t.Name() } var DefaultNameFunc = func(t reflect.Type) string { return t.Name() }
type GenericConversionFunc func(a, b interface{}, scope Scope) (bool, error) // ConversionFunc converts the object a into the object b, reusing arrays or objects
// or pointers if necessary. It should return an error if the object cannot be converted
// or if some data is invalid. If you do not wish a and b to share fields or nested
// objects, you must copy a before calling this function.
type ConversionFunc func(a, b interface{}, scope Scope) error
// Converter knows how to convert one type to another. // Converter knows how to convert one type to another.
type Converter struct { type Converter struct {
@ -49,11 +53,6 @@ type Converter struct {
conversionFuncs ConversionFuncs conversionFuncs ConversionFuncs
generatedConversionFuncs ConversionFuncs generatedConversionFuncs ConversionFuncs
// genericConversions are called during normal conversion to offer a "fast-path"
// that avoids all reflection. These methods are not called outside of the .Convert()
// method.
genericConversions []GenericConversionFunc
// Set of conversions that should be treated as a no-op // Set of conversions that should be treated as a no-op
ignoredConversions map[typePair]struct{} ignoredConversions map[typePair]struct{}
@ -98,14 +97,6 @@ func NewConverter(nameFn NameFunc) *Converter {
return c return c
} }
// AddGenericConversionFunc adds a function that accepts the ConversionFunc call pattern
// (for two conversion types) to the converter. These functions are checked first during
// a normal conversion, but are otherwise not called. Use AddConversionFuncs when registering
// typed conversions.
func (c *Converter) AddGenericConversionFunc(fn GenericConversionFunc) {
c.genericConversions = append(c.genericConversions, fn)
}
// WithConversions returns a Converter that is a copy of c but with the additional // WithConversions returns a Converter that is a copy of c but with the additional
// fns merged on top. // fns merged on top.
func (c *Converter) WithConversions(fns ConversionFuncs) *Converter { func (c *Converter) WithConversions(fns ConversionFuncs) *Converter {
@ -161,11 +152,15 @@ type Scope interface {
type FieldMappingFunc func(key string, sourceTag, destTag reflect.StructTag) (source string, dest string) type FieldMappingFunc func(key string, sourceTag, destTag reflect.StructTag) (source string, dest string)
func NewConversionFuncs() ConversionFuncs { func NewConversionFuncs() ConversionFuncs {
return ConversionFuncs{fns: make(map[typePair]reflect.Value)} return ConversionFuncs{
fns: make(map[typePair]reflect.Value),
untyped: make(map[typePair]ConversionFunc),
}
} }
type ConversionFuncs struct { type ConversionFuncs struct {
fns map[typePair]reflect.Value fns map[typePair]reflect.Value
untyped map[typePair]ConversionFunc
} }
// Add adds the provided conversion functions to the lookup table - they must have the signature // Add adds the provided conversion functions to the lookup table - they must have the signature
@ -183,6 +178,21 @@ func (c ConversionFuncs) Add(fns ...interface{}) error {
return nil return nil
} }
// AddUntyped adds the provided conversion function to the lookup table for the types that are
// supplied as a and b. a and b must be pointers or an error is returned. This method overwrites
// previously defined functions.
func (c ConversionFuncs) AddUntyped(a, b interface{}, fn ConversionFunc) error {
tA, tB := reflect.TypeOf(a), reflect.TypeOf(b)
if tA.Kind() != reflect.Ptr {
return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", a)
}
if tB.Kind() != reflect.Ptr {
return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", b)
}
c.untyped[typePair{tA, tB}] = fn
return nil
}
// Merge returns a new ConversionFuncs that contains all conversions from // Merge returns a new ConversionFuncs that contains all conversions from
// both other and c, with other conversions taking precedence. // both other and c, with other conversions taking precedence.
func (c ConversionFuncs) Merge(other ConversionFuncs) ConversionFuncs { func (c ConversionFuncs) Merge(other ConversionFuncs) ConversionFuncs {
@ -193,6 +203,12 @@ func (c ConversionFuncs) Merge(other ConversionFuncs) ConversionFuncs {
for k, v := range other.fns { for k, v := range other.fns {
merged.fns[k] = v merged.fns[k] = v
} }
for k, v := range c.untyped {
merged.untyped[k] = v
}
for k, v := range other.untyped {
merged.untyped[k] = v
}
return merged return merged
} }
@ -355,16 +371,32 @@ func verifyConversionFunctionSignature(ft reflect.Type) error {
// // conversion logic... // // conversion logic...
// return nil // return nil
// }) // })
// DEPRECATED: Will be removed in favor of RegisterUntypedConversionFunc
func (c *Converter) RegisterConversionFunc(conversionFunc interface{}) error { func (c *Converter) RegisterConversionFunc(conversionFunc interface{}) error {
return c.conversionFuncs.Add(conversionFunc) return c.conversionFuncs.Add(conversionFunc)
} }
// Similar to RegisterConversionFunc, but registers conversion function that were // Similar to RegisterConversionFunc, but registers conversion function that were
// automatically generated. // automatically generated.
// DEPRECATED: Will be removed in favor of RegisterGeneratedUntypedConversionFunc
func (c *Converter) RegisterGeneratedConversionFunc(conversionFunc interface{}) error { func (c *Converter) RegisterGeneratedConversionFunc(conversionFunc interface{}) error {
return c.generatedConversionFuncs.Add(conversionFunc) return c.generatedConversionFuncs.Add(conversionFunc)
} }
// RegisterUntypedConversionFunc registers a function that converts between a and b by passing objects of those
// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce
// any other guarantee.
func (c *Converter) RegisterUntypedConversionFunc(a, b interface{}, fn ConversionFunc) error {
return c.conversionFuncs.AddUntyped(a, b, fn)
}
// RegisterGeneratedUntypedConversionFunc registers a function that converts between a and b by passing objects of those
// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce
// any other guarantee.
func (c *Converter) RegisterGeneratedUntypedConversionFunc(a, b interface{}, fn ConversionFunc) error {
return c.generatedConversionFuncs.AddUntyped(a, b, fn)
}
// RegisterIgnoredConversion registers a "no-op" for conversion, where any requested // RegisterIgnoredConversion registers a "no-op" for conversion, where any requested
// conversion between from and to is ignored. // conversion between from and to is ignored.
func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error { func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error {
@ -380,39 +412,6 @@ func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error {
return nil return nil
} }
// IsConversionIgnored returns true if the specified objects should be dropped during
// conversion.
func (c *Converter) IsConversionIgnored(inType, outType reflect.Type) bool {
_, found := c.ignoredConversions[typePair{inType, outType}]
return found
}
func (c *Converter) HasConversionFunc(inType, outType reflect.Type) bool {
_, found := c.conversionFuncs.fns[typePair{inType, outType}]
return found
}
func (c *Converter) ConversionFuncValue(inType, outType reflect.Type) (reflect.Value, bool) {
value, found := c.conversionFuncs.fns[typePair{inType, outType}]
return value, found
}
// SetStructFieldCopy registers a correspondence. Whenever a struct field is encountered
// which has a type and name matching srcFieldType and srcFieldName, it wil be copied
// into the field in the destination struct matching destFieldType & Name, if such a
// field exists.
// May be called multiple times, even for the same source field & type--all applicable
// copies will be performed.
func (c *Converter) SetStructFieldCopy(srcFieldType interface{}, srcFieldName string, destFieldType interface{}, destFieldName string) error {
st := reflect.TypeOf(srcFieldType)
dt := reflect.TypeOf(destFieldType)
srcKey := typeNamePair{st, srcFieldName}
destKey := typeNamePair{dt, destFieldName}
c.structFieldDests[srcKey] = append(c.structFieldDests[srcKey], destKey)
c.structFieldSources[destKey] = append(c.structFieldSources[destKey], srcKey)
return nil
}
// RegisterInputDefaults registers a field name mapping function, used when converting // RegisterInputDefaults registers a field name mapping function, used when converting
// from maps to structs. Inputs to the conversion methods are checked for this type and a mapping // from maps to structs. Inputs to the conversion methods are checked for this type and a mapping
// applied automatically if the input matches in. A set of default flags for the input conversion // applied automatically if the input matches in. A set of default flags for the input conversion
@ -468,15 +467,6 @@ func (f FieldMatchingFlags) IsSet(flag FieldMatchingFlags) bool {
// it is not used by Convert() other than storing it in the scope. // it is not used by Convert() other than storing it in the scope.
// Not safe for objects with cyclic references! // Not safe for objects with cyclic references!
func (c *Converter) Convert(src, dest interface{}, flags FieldMatchingFlags, meta *Meta) error { func (c *Converter) Convert(src, dest interface{}, flags FieldMatchingFlags, meta *Meta) error {
if len(c.genericConversions) > 0 {
// TODO: avoid scope allocation
s := &scope{converter: c, flags: flags, meta: meta}
for _, fn := range c.genericConversions {
if ok, err := fn(src, dest, s); ok {
return err
}
}
}
return c.doConversion(src, dest, flags, meta, c.convert) return c.doConversion(src, dest, flags, meta, c.convert)
} }
@ -495,6 +485,21 @@ func (c *Converter) DefaultConvert(src, dest interface{}, flags FieldMatchingFla
type conversionFunc func(sv, dv reflect.Value, scope *scope) error type conversionFunc func(sv, dv reflect.Value, scope *scope) error
func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags, meta *Meta, f conversionFunc) error { func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags, meta *Meta, f conversionFunc) error {
pair := typePair{reflect.TypeOf(src), reflect.TypeOf(dest)}
scope := &scope{
converter: c,
flags: flags,
meta: meta,
}
if fn, ok := c.conversionFuncs.untyped[pair]; ok {
return fn(src, dest, scope)
}
if fn, ok := c.generatedConversionFuncs.untyped[pair]; ok {
return fn(src, dest, scope)
}
// TODO: consider everything past this point deprecated - we want to support only point to point top level
// conversions
dv, err := EnforcePtr(dest) dv, err := EnforcePtr(dest)
if err != nil { if err != nil {
return err return err
@ -506,15 +511,10 @@ func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags
if err != nil { if err != nil {
return err return err
} }
s := &scope{
converter: c,
flags: flags,
meta: meta,
}
// Leave something on the stack, so that calls to struct tag getters never fail. // Leave something on the stack, so that calls to struct tag getters never fail.
s.srcStack.push(scopeStackElem{}) scope.srcStack.push(scopeStackElem{})
s.destStack.push(scopeStackElem{}) scope.destStack.push(scopeStackElem{})
return f(sv, dv, s) return f(sv, dv, scope)
} }
// callCustom calls 'custom' with sv & dv. custom must be a conversion function. // callCustom calls 'custom' with sv & dv. custom must be a conversion function.

View File

@ -166,7 +166,6 @@ func NewRequirement(key string, op selection.Operator, vals []string) (*Requirem
return nil, err return nil, err
} }
} }
sort.Strings(vals)
return &Requirement{key: key, operator: op, strValues: vals}, nil return &Requirement{key: key, operator: op, strValues: vals}, nil
} }
@ -299,7 +298,9 @@ func (r *Requirement) String() string {
if len(r.strValues) == 1 { if len(r.strValues) == 1 {
buffer.WriteString(r.strValues[0]) buffer.WriteString(r.strValues[0])
} else { // only > 1 since == 0 prohibited by NewRequirement } else { // only > 1 since == 0 prohibited by NewRequirement
buffer.WriteString(strings.Join(r.strValues, ",")) // normalizes value order on output, without mutating the in-memory selector representation
// also avoids normalization when it is not required, and ensures we do not mutate shared data
buffer.WriteString(strings.Join(safeSort(r.strValues), ","))
} }
switch r.operator { switch r.operator {
@ -309,6 +310,17 @@ func (r *Requirement) String() string {
return buffer.String() return buffer.String()
} }
// safeSort sort input strings without modification
func safeSort(in []string) []string {
if sort.StringsAreSorted(in) {
return in
}
out := make([]string, len(in))
copy(out, in)
sort.Strings(out)
return out
}
// Add adds requirements to the selector. It copies the current selector returning a new one // Add adds requirements to the selector. It copies the current selector returning a new one
func (lsel internalSelector) Add(reqs ...Requirement) Selector { func (lsel internalSelector) Add(reqs ...Requirement) Selector {
var sel internalSelector var sel internalSelector

View File

@ -76,24 +76,6 @@ func EncodeOrDie(e Encoder, obj Object) string {
return string(bytes) return string(bytes)
} }
// DefaultingSerializer invokes defaulting after decoding.
type DefaultingSerializer struct {
Defaulter ObjectDefaulter
Decoder Decoder
// Encoder is optional to allow this type to be used as both a Decoder and an Encoder
Encoder
}
// Decode performs a decode and then allows the defaulter to act on the provided object.
func (d DefaultingSerializer) Decode(data []byte, defaultGVK *schema.GroupVersionKind, into Object) (Object, *schema.GroupVersionKind, error) {
obj, gvk, err := d.Decoder.Decode(data, defaultGVK, into)
if err != nil {
return obj, gvk, err
}
d.Defaulter.Default(obj)
return obj, gvk, nil
}
// UseOrCreateObject returns obj if the canonical ObjectKind returned by the provided typer matches gvk, or // UseOrCreateObject returns obj if the canonical ObjectKind returned by the provided typer matches gvk, or
// invokes the ObjectCreator to instantiate a new gvk. Returns an error if the typer cannot find the object. // invokes the ObjectCreator to instantiate a new gvk. Returns an error if the typer cannot find the object.
func UseOrCreateObject(t ObjectTyper, c ObjectCreater, gvk schema.GroupVersionKind, obj Object) (Object, error) { func UseOrCreateObject(t ObjectTyper, c ObjectCreater, gvk schema.GroupVersionKind, obj Object) (Object, error) {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
// Defines conversions between generic types and structs to map query strings // Package runtime defines conversions between generic types and structs to map query strings
// to struct objects. // to struct objects.
package runtime package runtime
@ -27,7 +27,7 @@ import (
"k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/conversion"
) )
// DefaultFieldSelectorConversion auto-accepts metav1 values for name and namespace. // DefaultMetaV1FieldSelectorConversion auto-accepts metav1 values for name and namespace.
// A cluster scoped resource specifying namespace empty works fine and specifying a particular // A cluster scoped resource specifying namespace empty works fine and specifying a particular
// namespace will return no results, as expected. // namespace will return no results, as expected.
func DefaultMetaV1FieldSelectorConversion(label, value string) (string, string, error) { func DefaultMetaV1FieldSelectorConversion(label, value string) (string, string, error) {
@ -82,7 +82,7 @@ func Convert_Slice_string_To_int(input *[]string, out *int, s conversion.Scope)
return nil return nil
} }
// Conver_Slice_string_To_bool will convert a string parameter to boolean. // Convert_Slice_string_To_bool will convert a string parameter to boolean.
// Only the absence of a value, a value of "false", or a value of "0" resolve to false. // Only the absence of a value, a value of "false", or a value of "0" resolve to false.
// Any other value (including empty string) resolves to true. // Any other value (including empty string) resolves to true.
func Convert_Slice_string_To_bool(input *[]string, out *bool, s conversion.Scope) error { func Convert_Slice_string_To_bool(input *[]string, out *bool, s conversion.Scope) error {

View File

@ -18,20 +18,27 @@ limitations under the License.
// that follow the kubernetes API object conventions, which are: // that follow the kubernetes API object conventions, which are:
// //
// 0. Your API objects have a common metadata struct member, TypeMeta. // 0. Your API objects have a common metadata struct member, TypeMeta.
//
// 1. Your code refers to an internal set of API objects. // 1. Your code refers to an internal set of API objects.
//
// 2. In a separate package, you have an external set of API objects. // 2. In a separate package, you have an external set of API objects.
//
// 3. The external set is considered to be versioned, and no breaking // 3. The external set is considered to be versioned, and no breaking
// changes are ever made to it (fields may be added but not changed // changes are ever made to it (fields may be added but not changed
// or removed). // or removed).
//
// 4. As your api evolves, you'll make an additional versioned package // 4. As your api evolves, you'll make an additional versioned package
// with every major change. // with every major change.
//
// 5. Versioned packages have conversion functions which convert to // 5. Versioned packages have conversion functions which convert to
// and from the internal version. // and from the internal version.
//
// 6. You'll continue to support older versions according to your // 6. You'll continue to support older versions according to your
// deprecation policy, and you can easily provide a program/library // deprecation policy, and you can easily provide a program/library
// to update old versions into new versions because of 5. // to update old versions into new versions because of 5.
//
// 7. All of your serializations and deserializations are handled in a // 7. All of your serializations and deserializations are handled in a
// centralized place. // centralized place.
// //
// Package runtime provides a conversion helper to make 5 easy, and the // Package runtime provides a conversion helper to make 5 easy, and the
// Encode/Decode/DecodeInto trio to accomplish 7. You can also register // Encode/Decode/DecodeInto trio to accomplish 7. You can also register
@ -41,5 +48,4 @@ limitations under the License.
// //
// As a bonus, a few common types useful from all api objects and versions // As a bonus, a few common types useful from all api objects and versions
// are provided in types.go. // are provided in types.go.
package runtime // import "k8s.io/apimachinery/pkg/runtime" package runtime // import "k8s.io/apimachinery/pkg/runtime"

View File

@ -31,7 +31,7 @@ type encodable struct {
func (e encodable) GetObjectKind() schema.ObjectKind { return e.obj.GetObjectKind() } func (e encodable) GetObjectKind() schema.ObjectKind { return e.obj.GetObjectKind() }
func (e encodable) DeepCopyObject() Object { func (e encodable) DeepCopyObject() Object {
var out encodable = e out := e
out.obj = e.obj.DeepCopyObject() out.obj = e.obj.DeepCopyObject()
copy(out.versions, e.versions) copy(out.versions, e.versions)
return out return out
@ -46,14 +46,14 @@ func NewEncodable(e Encoder, obj Object, versions ...schema.GroupVersion) Object
return encodable{e, obj, versions} return encodable{e, obj, versions}
} }
func (re encodable) UnmarshalJSON(in []byte) error { func (e encodable) UnmarshalJSON(in []byte) error {
return errors.New("runtime.encodable cannot be unmarshalled from JSON") return errors.New("runtime.encodable cannot be unmarshalled from JSON")
} }
// Marshal may get called on pointers or values, so implement MarshalJSON on value. // Marshal may get called on pointers or values, so implement MarshalJSON on value.
// http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go
func (re encodable) MarshalJSON() ([]byte, error) { func (e encodable) MarshalJSON() ([]byte, error) {
return Encode(re.E, re.obj) return Encode(e.E, e.obj)
} }
// NewEncodableList creates an object that will be encoded with the provided codec on demand. // NewEncodableList creates an object that will be encoded with the provided codec on demand.
@ -70,28 +70,28 @@ func NewEncodableList(e Encoder, objects []Object, versions ...schema.GroupVersi
return out return out
} }
func (re *Unknown) UnmarshalJSON(in []byte) error { func (e *Unknown) UnmarshalJSON(in []byte) error {
if re == nil { if e == nil {
return errors.New("runtime.Unknown: UnmarshalJSON on nil pointer") return errors.New("runtime.Unknown: UnmarshalJSON on nil pointer")
} }
re.TypeMeta = TypeMeta{} e.TypeMeta = TypeMeta{}
re.Raw = append(re.Raw[0:0], in...) e.Raw = append(e.Raw[0:0], in...)
re.ContentEncoding = "" e.ContentEncoding = ""
re.ContentType = ContentTypeJSON e.ContentType = ContentTypeJSON
return nil return nil
} }
// Marshal may get called on pointers or values, so implement MarshalJSON on value. // Marshal may get called on pointers or values, so implement MarshalJSON on value.
// http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go
func (re Unknown) MarshalJSON() ([]byte, error) { func (e Unknown) MarshalJSON() ([]byte, error) {
// If ContentType is unset, we assume this is JSON. // If ContentType is unset, we assume this is JSON.
if re.ContentType != "" && re.ContentType != ContentTypeJSON { if e.ContentType != "" && e.ContentType != ContentTypeJSON {
return nil, errors.New("runtime.Unknown: MarshalJSON on non-json data") return nil, errors.New("runtime.Unknown: MarshalJSON on non-json data")
} }
if re.Raw == nil { if e.Raw == nil {
return []byte("null"), nil return []byte("null"), nil
} }
return re.Raw, nil return e.Raw, nil
} }
func Convert_runtime_Object_To_runtime_RawExtension(in *Object, out *RawExtension, s conversion.Scope) error { func Convert_runtime_Object_To_runtime_RawExtension(in *Object, out *RawExtension, s conversion.Scope) error {

View File

@ -24,46 +24,47 @@ import (
) )
type notRegisteredErr struct { type notRegisteredErr struct {
gvk schema.GroupVersionKind schemeName string
target GroupVersioner gvk schema.GroupVersionKind
t reflect.Type target GroupVersioner
t reflect.Type
} }
func NewNotRegisteredErrForKind(gvk schema.GroupVersionKind) error { func NewNotRegisteredErrForKind(schemeName string, gvk schema.GroupVersionKind) error {
return &notRegisteredErr{gvk: gvk} return &notRegisteredErr{schemeName: schemeName, gvk: gvk}
} }
func NewNotRegisteredErrForType(t reflect.Type) error { func NewNotRegisteredErrForType(schemeName string, t reflect.Type) error {
return &notRegisteredErr{t: t} return &notRegisteredErr{schemeName: schemeName, t: t}
} }
func NewNotRegisteredErrForTarget(t reflect.Type, target GroupVersioner) error { func NewNotRegisteredErrForTarget(schemeName string, t reflect.Type, target GroupVersioner) error {
return &notRegisteredErr{t: t, target: target} return &notRegisteredErr{schemeName: schemeName, t: t, target: target}
} }
func NewNotRegisteredGVKErrForTarget(gvk schema.GroupVersionKind, target GroupVersioner) error { func NewNotRegisteredGVKErrForTarget(schemeName string, gvk schema.GroupVersionKind, target GroupVersioner) error {
return &notRegisteredErr{gvk: gvk, target: target} return &notRegisteredErr{schemeName: schemeName, gvk: gvk, target: target}
} }
func (k *notRegisteredErr) Error() string { func (k *notRegisteredErr) Error() string {
if k.t != nil && k.target != nil { if k.t != nil && k.target != nil {
return fmt.Sprintf("%v is not suitable for converting to %q", k.t, k.target) return fmt.Sprintf("%v is not suitable for converting to %q in scheme %q", k.t, k.target, k.schemeName)
} }
nullGVK := schema.GroupVersionKind{} nullGVK := schema.GroupVersionKind{}
if k.gvk != nullGVK && k.target != nil { if k.gvk != nullGVK && k.target != nil {
return fmt.Sprintf("%q is not suitable for converting to %q", k.gvk.GroupVersion(), k.target) return fmt.Sprintf("%q is not suitable for converting to %q in scheme %q", k.gvk.GroupVersion(), k.target, k.schemeName)
} }
if k.t != nil { if k.t != nil {
return fmt.Sprintf("no kind is registered for the type %v", k.t) return fmt.Sprintf("no kind is registered for the type %v in scheme %q", k.t, k.schemeName)
} }
if len(k.gvk.Kind) == 0 { if len(k.gvk.Kind) == 0 {
return fmt.Sprintf("no version %q has been registered", k.gvk.GroupVersion()) return fmt.Sprintf("no version %q has been registered in scheme %q", k.gvk.GroupVersion(), k.schemeName)
} }
if k.gvk.Version == APIVersionInternal { if k.gvk.Version == APIVersionInternal {
return fmt.Sprintf("no kind %q is registered for the internal version of group %q", k.gvk.Kind, k.gvk.Group) return fmt.Sprintf("no kind %q is registered for the internal version of group %q in scheme %q", k.gvk.Kind, k.gvk.Group, k.schemeName)
} }
return fmt.Sprintf("no kind %q is registered for version %q", k.gvk.Kind, k.gvk.GroupVersion()) return fmt.Sprintf("no kind %q is registered for version %q in scheme %q", k.gvk.Kind, k.gvk.GroupVersion(), k.schemeName)
} }
// IsNotRegisteredError returns true if the error indicates the provided // IsNotRegisteredError returns true if the error indicates the provided

View File

@ -32,7 +32,7 @@ func (re *RawExtension) UnmarshalJSON(in []byte) error {
return nil return nil
} }
// Marshal may get called on pointers or values, so implement MarshalJSON on value. // MarshalJSON may get called on pointers or values, so implement MarshalJSON on value.
// http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go
func (re RawExtension) MarshalJSON() ([]byte, error) { func (re RawExtension) MarshalJSON() ([]byte, error) {
if re.Raw == nil { if re.Raw == nil {

View File

@ -744,30 +744,29 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 395 bytes of a gzipped FileDescriptorProto // 378 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x4f, 0x6f, 0xd3, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0x4f, 0xab, 0x13, 0x31,
0x18, 0xc6, 0xe3, 0xb5, 0x52, 0x87, 0x5b, 0x69, 0xc8, 0x1c, 0x08, 0x3b, 0x38, 0x53, 0x4f, 0xec, 0x14, 0xc5, 0x27, 0xaf, 0x85, 0x3e, 0xd3, 0xc2, 0x93, 0xb8, 0x70, 0x74, 0x91, 0x79, 0x74, 0xe5,
0x30, 0x5b, 0x1a, 0x42, 0xe2, 0xba, 0x4c, 0x93, 0x40, 0x08, 0x09, 0x59, 0xfc, 0x91, 0x38, 0xe1, 0x5b, 0xbc, 0x04, 0x1e, 0x08, 0x6e, 0x3b, 0xa5, 0xa0, 0x88, 0x20, 0xc1, 0x3f, 0xe0, 0xca, 0x74,
0x26, 0x26, 0xb3, 0x42, 0x5f, 0x47, 0x8e, 0x43, 0xd8, 0x8d, 0x8f, 0xc0, 0xc7, 0xea, 0x71, 0xc7, 0x26, 0x4e, 0xc3, 0xd0, 0x9b, 0x21, 0xcd, 0x38, 0x76, 0xe7, 0x47, 0xf0, 0x63, 0x75, 0xd9, 0x65,
0x9e, 0x2a, 0x1a, 0x3e, 0x04, 0x57, 0x54, 0xd7, 0x2d, 0xa5, 0x08, 0xed, 0x16, 0xbf, 0xcf, 0xf3, 0x57, 0xc5, 0x8e, 0x1f, 0xc2, 0xad, 0x34, 0x4d, 0x6b, 0xd5, 0x85, 0xbb, 0xe4, 0x9e, 0xf3, 0x3b,
0x7b, 0xde, 0xe7, 0x0d, 0x7e, 0x5e, 0x3e, 0xab, 0x99, 0x36, 0xbc, 0x6c, 0x26, 0xca, 0x82, 0x72, 0xf7, 0x1e, 0xfc, 0xbc, 0x7c, 0xb6, 0x60, 0xda, 0xf0, 0xb2, 0x9e, 0x2a, 0x0b, 0xca, 0xa9, 0x05,
0xaa, 0xe6, 0x5f, 0x14, 0xe4, 0xc6, 0xf2, 0x20, 0xc8, 0x4a, 0x4f, 0x65, 0x76, 0xad, 0x41, 0xd9, 0xff, 0xac, 0x20, 0x37, 0x96, 0x07, 0x41, 0x56, 0x7a, 0x2e, 0xb3, 0x99, 0x06, 0x65, 0x97, 0xbc,
0x1b, 0x5e, 0x95, 0x05, 0xb7, 0x0d, 0x38, 0x3d, 0x55, 0xbc, 0x50, 0xa0, 0xac, 0x74, 0x2a, 0x67, 0x2a, 0x0b, 0x6e, 0x6b, 0x70, 0x7a, 0xae, 0x78, 0xa1, 0x40, 0x59, 0xe9, 0x54, 0xce, 0x2a, 0x6b,
0x95, 0x35, 0xce, 0x90, 0x64, 0x0d, 0xb0, 0x5d, 0x80, 0x55, 0x65, 0xc1, 0x02, 0x70, 0x7c, 0x56, 0x9c, 0x21, 0xc9, 0x01, 0x60, 0xe7, 0x00, 0xab, 0xca, 0x82, 0x05, 0xe0, 0xf1, 0x6d, 0xa1, 0xdd,
0x68, 0x77, 0xdd, 0x4c, 0x58, 0x66, 0xa6, 0xbc, 0x30, 0x85, 0xe1, 0x9e, 0x9b, 0x34, 0x9f, 0xfc, 0xac, 0x9e, 0xb2, 0xcc, 0xcc, 0x79, 0x61, 0x0a, 0xc3, 0x3d, 0x37, 0xad, 0x3f, 0xf9, 0x9f, 0xff,
0xcb, 0x3f, 0xfc, 0xd7, 0x3a, 0xef, 0xf8, 0xc9, 0xff, 0x0a, 0x34, 0x4e, 0x7f, 0xe6, 0x1a, 0x5c, 0xf8, 0xd7, 0x21, 0x6f, 0x78, 0x83, 0x07, 0x42, 0x36, 0x93, 0x2f, 0x4e, 0xc1, 0x42, 0x1b, 0x20,
0xed, 0xec, 0x7e, 0x89, 0xf1, 0x29, 0x1e, 0x09, 0xd9, 0x5e, 0x7d, 0x75, 0x0a, 0x6a, 0x6d, 0x80, 0x8f, 0x70, 0xc7, 0xca, 0x26, 0x46, 0xd7, 0xe8, 0xc9, 0x20, 0xed, 0xb5, 0xdb, 0xa4, 0x23, 0x64,
0x3c, 0xc2, 0x3d, 0x2b, 0xdb, 0x18, 0x9d, 0xa0, 0xc7, 0xa3, 0x74, 0xd0, 0x2d, 0x92, 0x9e, 0x90, 0x23, 0xf6, 0xb3, 0xe1, 0x47, 0x7c, 0xf9, 0x66, 0x59, 0xa9, 0x57, 0xca, 0x49, 0x72, 0x87, 0xb1,
0xad, 0x58, 0xcd, 0xc6, 0x1f, 0xf1, 0xe1, 0x9b, 0x9b, 0x4a, 0xbd, 0x52, 0x4e, 0x92, 0x73, 0x8c, 0xac, 0xf4, 0x3b, 0x65, 0xf7, 0x90, 0x77, 0xdf, 0x4b, 0xc9, 0x6a, 0x9b, 0x44, 0xed, 0x36, 0xc1,
0x65, 0xa5, 0xdf, 0x29, 0xbb, 0x82, 0xbc, 0xfb, 0x5e, 0x4a, 0x66, 0x8b, 0x24, 0xea, 0x16, 0x09, 0xa3, 0xd7, 0x2f, 0x82, 0x22, 0xce, 0x5c, 0xe4, 0x1a, 0x77, 0x4b, 0x0d, 0x79, 0x7c, 0xe1, 0xdd,
0xbe, 0x78, 0xfd, 0x22, 0x28, 0x62, 0xc7, 0x45, 0x4e, 0x70, 0xbf, 0xd4, 0x90, 0xc7, 0x07, 0xde, 0x83, 0xe0, 0xee, 0xbe, 0xd4, 0x90, 0x0b, 0xaf, 0x0c, 0x7f, 0x22, 0xdc, 0x7b, 0x0b, 0x25, 0x98,
0x3d, 0x0a, 0xee, 0xfe, 0x4b, 0x0d, 0xb9, 0xf0, 0xca, 0xf8, 0x17, 0xc2, 0x83, 0xb7, 0x50, 0x82, 0x06, 0xc8, 0x7b, 0x7c, 0xe9, 0xc2, 0x36, 0x9f, 0xdf, 0xbf, 0xbb, 0x61, 0xff, 0xe9, 0xce, 0x8e,
0x69, 0x81, 0xbc, 0xc7, 0x87, 0x2e, 0x6c, 0xf3, 0xf9, 0xc3, 0xf3, 0x53, 0x76, 0xc7, 0x0f, 0x63, 0xe7, 0xa5, 0xf7, 0x43, 0xf8, 0xe9, 0x60, 0x71, 0x0a, 0x3b, 0x36, 0xbc, 0xf8, 0xb7, 0x21, 0x19,
0x9b, 0x7a, 0xe9, 0xfd, 0x10, 0xbe, 0x2d, 0x2c, 0xb6, 0x61, 0x9b, 0x0b, 0x0f, 0xfe, 0xbd, 0x90, 0xe1, 0xab, 0xcc, 0x80, 0x53, 0xe0, 0x26, 0x90, 0x99, 0x5c, 0x43, 0x11, 0x77, 0xfc, 0xb1, 0x0f,
0x5c, 0xe0, 0xa3, 0xcc, 0x80, 0x53, 0xe0, 0xae, 0x20, 0x33, 0xb9, 0x86, 0x22, 0xee, 0xf9, 0xb2, 0x43, 0xde, 0xd5, 0xf8, 0x4f, 0x59, 0xfc, 0xed, 0x27, 0x4f, 0x71, 0x3f, 0x8c, 0xf6, 0xab, 0xe3,
0x0f, 0x43, 0xde, 0xd1, 0xe5, 0xdf, 0xb2, 0xd8, 0xf7, 0x93, 0xa7, 0x78, 0x18, 0x46, 0xab, 0xd5, 0xae, 0xc7, 0x1f, 0x04, 0xbc, 0x3f, 0xfe, 0x2d, 0x89, 0x73, 0x5f, 0x7a, 0xbb, 0xda, 0xd1, 0x68,
0x71, 0xdf, 0xe3, 0x0f, 0x02, 0x3e, 0xbc, 0xfc, 0x23, 0x89, 0x5d, 0x5f, 0x7a, 0x36, 0x5b, 0xd2, 0xbd, 0xa3, 0xd1, 0x66, 0x47, 0xa3, 0xaf, 0x2d, 0x45, 0xab, 0x96, 0xa2, 0x75, 0x4b, 0xd1, 0xa6,
0xe8, 0x76, 0x49, 0xa3, 0xf9, 0x92, 0x46, 0xdf, 0x3a, 0x8a, 0x66, 0x1d, 0x45, 0xb7, 0x1d, 0x45, 0xa5, 0xe8, 0x7b, 0x4b, 0xd1, 0xb7, 0x1f, 0x34, 0xfa, 0xd0, 0x0b, 0x45, 0x7f, 0x05, 0x00, 0x00,
0xf3, 0x8e, 0xa2, 0x1f, 0x1d, 0x45, 0xdf, 0x7f, 0xd2, 0xe8, 0xc3, 0x20, 0x1c, 0xfa, 0x3b, 0x00, 0xff, 0xff, 0xe3, 0x33, 0x18, 0x0b, 0x50, 0x02, 0x00, 0x00,
0x00, 0xff, 0xff, 0x3f, 0x1e, 0x24, 0x09, 0x85, 0x02, 0x00, 0x00,
} }

View File

@ -21,8 +21,6 @@ syntax = 'proto2';
package k8s.io.apimachinery.pkg.runtime; package k8s.io.apimachinery.pkg.runtime;
import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
// Package-wide variables from generator "generated". // Package-wide variables from generator "generated".
option go_package = "runtime"; option go_package = "runtime";

View File

@ -87,7 +87,7 @@ func Field(v reflect.Value, fieldName string, dest interface{}) error {
return fmt.Errorf("couldn't assign/convert %v to %v", field.Type(), destValue.Type()) return fmt.Errorf("couldn't assign/convert %v to %v", field.Type(), destValue.Type())
} }
// fieldPtr puts the address of fieldName, which must be a member of v, // FieldPtr puts the address of fieldName, which must be a member of v,
// into dest, which must be an address of a variable to which this field's // into dest, which must be an address of a variable to which this field's
// address can be assigned. // address can be assigned.
func FieldPtr(v reflect.Value, fieldName string, dest interface{}) error { func FieldPtr(v reflect.Value, fieldName string, dest interface{}) error {

View File

@ -39,14 +39,14 @@ type GroupVersioner interface {
KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (target schema.GroupVersionKind, ok bool) KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (target schema.GroupVersionKind, ok bool)
} }
// Encoders write objects to a serialized form // Encoder writes objects to a serialized form
type Encoder interface { type Encoder interface {
// Encode writes an object to a stream. Implementations may return errors if the versions are // Encode writes an object to a stream. Implementations may return errors if the versions are
// incompatible, or if no conversion is defined. // incompatible, or if no conversion is defined.
Encode(obj Object, w io.Writer) error Encode(obj Object, w io.Writer) error
} }
// Decoders attempt to load an object from data. // Decoder attempts to load an object from data.
type Decoder interface { type Decoder interface {
// Decode attempts to deserialize the provided data using either the innate typing of the scheme or the // Decode attempts to deserialize the provided data using either the innate typing of the scheme or the
// default kind, group, and version provided. It returns a decoded object as well as the kind, group, and // default kind, group, and version provided. It returns a decoded object as well as the kind, group, and
@ -185,7 +185,7 @@ type ObjectConvertor interface {
// This method is similar to Convert() but handles specific details of choosing the correct // This method is similar to Convert() but handles specific details of choosing the correct
// output version. // output version.
ConvertToVersion(in Object, gv GroupVersioner) (out Object, err error) ConvertToVersion(in Object, gv GroupVersioner) (out Object, err error)
ConvertFieldLabel(version, kind, label, value string) (string, string, error) ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error)
} }
// ObjectTyper contains methods for extracting the APIVersion and Kind // ObjectTyper contains methods for extracting the APIVersion and Kind
@ -224,7 +224,7 @@ type SelfLinker interface {
Namespace(obj Object) (string, error) Namespace(obj Object) (string, error)
} }
// All API types registered with Scheme must support the Object interface. Since objects in a scheme are // Object interface must be supported by all API types registered with Scheme. Since objects in a scheme are
// expected to be serialized to the wire, the interface an Object must provide to the Scheme allows // expected to be serialized to the wire, the interface an Object must provide to the Scheme allows
// serializers to set the kind, version, and group the object is represented as. An Object may choose // serializers to set the kind, version, and group the object is represented as. An Object may choose
// to return a no-op ObjectKindAccessor in cases where it is not expected to be serialized. // to return a no-op ObjectKindAccessor in cases where it is not expected to be serialized.

View File

@ -19,12 +19,12 @@ limitations under the License.
// DO NOT EDIT! // DO NOT EDIT!
/* /*
Package schema is a generated protocol buffer package. Package schema is a generated protocol buffer package.
It is generated from these files: It is generated from these files:
k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto
It has these top-level messages: It has these top-level messages:
*/ */
package schema package schema
@ -48,18 +48,17 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 202 bytes of a gzipped FileDescriptorProto // 185 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0xce, 0xaf, 0x4e, 0x04, 0x31, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0xcc, 0xaf, 0x6e, 0xc3, 0x30,
0x10, 0xc7, 0xf1, 0xd6, 0x20, 0x90, 0xc8, 0x13, 0x23, 0x51, 0xd0, 0x11, 0x18, 0x34, 0x2f, 0x80, 0x10, 0xc7, 0x71, 0x9b, 0x0c, 0x0c, 0x0e, 0x0e, 0x1c, 0x1c, 0xda, 0x7c, 0x74, 0xb8, 0x2f, 0x50,
0xc7, 0x75, 0xf7, 0x86, 0x6e, 0x53, 0xfa, 0x27, 0xed, 0x94, 0x04, 0xc7, 0x23, 0xf0, 0x58, 0x27, 0x5e, 0xe6, 0x24, 0x57, 0xc7, 0xb2, 0xfc, 0x47, 0x8e, 0x5d, 0xa9, 0xac, 0x8f, 0xd0, 0xc7, 0x0a,
0x4f, 0xae, 0x64, 0xcb, 0x8b, 0x90, 0xb4, 0x2b, 0x08, 0xc9, 0xb9, 0xfe, 0xd2, 0x7c, 0x26, 0xdf, 0x0c, 0x0c, 0x6c, 0xdc, 0x17, 0xa9, 0x64, 0x07, 0x94, 0xdd, 0x4f, 0xa7, 0xcf, 0xf7, 0xf3, 0x68,
0xeb, 0x67, 0xf7, 0x58, 0x94, 0x8d, 0xe8, 0xea, 0x44, 0x39, 0x10, 0x53, 0xc1, 0x77, 0x0a, 0xc7, 0xfe, 0x27, 0xa1, 0x3d, 0x9a, 0xdc, 0x51, 0x74, 0x94, 0x68, 0xc2, 0x0b, 0xb9, 0xc1, 0x47, 0xdc,
0x98, 0x71, 0xff, 0xd0, 0xc9, 0x7a, 0x3d, 0x2f, 0x36, 0x50, 0xfe, 0xc0, 0xe4, 0x0c, 0xe6, 0x1a, 0x1f, 0x32, 0x68, 0x2b, 0xfb, 0x51, 0x3b, 0x8a, 0x57, 0x0c, 0x46, 0x61, 0xcc, 0x2e, 0x69, 0x4b,
0xd8, 0x7a, 0xc2, 0x32, 0x2f, 0xe4, 0x35, 0x1a, 0x0a, 0x94, 0x35, 0xd3, 0x51, 0xa5, 0x1c, 0x39, 0x38, 0xf5, 0x23, 0x59, 0x89, 0x8a, 0x1c, 0x45, 0x99, 0x68, 0x10, 0x21, 0xfa, 0xe4, 0xbf, 0x7e,
0xde, 0xdc, 0x0e, 0xa7, 0xfe, 0x3a, 0x95, 0x9c, 0x51, 0xbb, 0x53, 0xc3, 0x1d, 0xee, 0x8d, 0xe5, 0x9a, 0x13, 0xef, 0x4e, 0x04, 0xa3, 0xc4, 0xee, 0x44, 0x73, 0xdf, 0x7f, 0x4a, 0xa7, 0x31, 0x77,
0xa5, 0x4e, 0x6a, 0x8e, 0x1e, 0x4d, 0x34, 0x11, 0x3b, 0x9f, 0xea, 0x6b, 0x5f, 0x7d, 0xf4, 0xd7, 0xa2, 0xf7, 0x16, 0x95, 0x57, 0x1e, 0x2b, 0xef, 0xf2, 0xb9, 0xae, 0x3a, 0xea, 0xd5, 0xb2, 0x87,
0x38, 0x7b, 0x78, 0xb8, 0x94, 0x53, 0xd9, 0xbe, 0xa1, 0x0d, 0x5c, 0x38, 0xff, 0x6f, 0x79, 0xba, 0xdf, 0x79, 0x03, 0xb6, 0x6c, 0xc0, 0xd6, 0x0d, 0xd8, 0xad, 0x00, 0x9f, 0x0b, 0xf0, 0xa5, 0x00,
0x3b, 0x6d, 0x20, 0xce, 0x1b, 0x88, 0x75, 0x03, 0xf1, 0xd9, 0x40, 0x9e, 0x1a, 0xc8, 0x73, 0x03, 0x5f, 0x0b, 0xf0, 0x47, 0x01, 0x7e, 0x7f, 0x02, 0x3b, 0x7d, 0xb4, 0xf8, 0x2b, 0x00, 0x00, 0xff,
0xb9, 0x36, 0x90, 0xdf, 0x0d, 0xe4, 0xd7, 0x0f, 0x88, 0x97, 0xab, 0x51, 0xf4, 0x1b, 0x00, 0x00, 0xff, 0xba, 0x7e, 0x65, 0xf4, 0xd6, 0x00, 0x00, 0x00,
0xff, 0xff, 0xfd, 0x59, 0x57, 0x93, 0x0b, 0x01, 0x00, 0x00,
} }

View File

@ -21,8 +21,6 @@ syntax = 'proto2';
package k8s.io.apimachinery.pkg.runtime.schema; package k8s.io.apimachinery.pkg.runtime.schema;
import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
// Package-wide variables from generator "generated". // Package-wide variables from generator "generated".
option go_package = "schema"; option go_package = "schema";

View File

@ -85,11 +85,10 @@ func ParseGroupKind(gk string) GroupKind {
// ParseGroupResource turns "resource.group" string into a GroupResource struct. Empty strings are allowed // ParseGroupResource turns "resource.group" string into a GroupResource struct. Empty strings are allowed
// for each field. // for each field.
func ParseGroupResource(gr string) GroupResource { func ParseGroupResource(gr string) GroupResource {
if i := strings.Index(gr, "."); i == -1 { if i := strings.Index(gr, "."); i >= 0 {
return GroupResource{Resource: gr}
} else {
return GroupResource{Group: gr[i+1:], Resource: gr[:i]} return GroupResource{Group: gr[i+1:], Resource: gr[:i]}
} }
return GroupResource{Resource: gr}
} }
// GroupVersionResource unambiguously identifies a resource. It doesn't anonymously include GroupVersion // GroupVersionResource unambiguously identifies a resource. It doesn't anonymously include GroupVersion

View File

@ -20,11 +20,12 @@ import (
"fmt" "fmt"
"net/url" "net/url"
"reflect" "reflect"
"strings" "strings"
"k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/conversion"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/naming"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
) )
@ -62,14 +63,14 @@ type Scheme struct {
// Map from version and resource to the corresponding func to convert // Map from version and resource to the corresponding func to convert
// resource field labels in that version to internal version. // resource field labels in that version to internal version.
fieldLabelConversionFuncs map[string]map[string]FieldLabelConversionFunc fieldLabelConversionFuncs map[schema.GroupVersionKind]FieldLabelConversionFunc
// defaulterFuncs is an array of interfaces to be called with an object to provide defaulting // defaulterFuncs is an array of interfaces to be called with an object to provide defaulting
// the provided object must be a pointer. // the provided object must be a pointer.
defaulterFuncs map[reflect.Type]func(interface{}) defaulterFuncs map[reflect.Type]func(interface{})
// converter stores all registered conversion functions. It also has // converter stores all registered conversion functions. It also has
// default coverting behavior. // default converting behavior.
converter *conversion.Converter converter *conversion.Converter
// versionPriority is a map of groups to ordered lists of versions for those groups indicating the // versionPriority is a map of groups to ordered lists of versions for those groups indicating the
@ -78,9 +79,13 @@ type Scheme struct {
// observedVersions keeps track of the order we've seen versions during type registration // observedVersions keeps track of the order we've seen versions during type registration
observedVersions []schema.GroupVersion observedVersions []schema.GroupVersion
// schemeName is the name of this scheme. If you don't specify a name, the stack of the NewScheme caller will be used.
// This is useful for error reporting to indicate the origin of the scheme.
schemeName string
} }
// Function to convert a field selector to internal representation. // FieldLabelConversionFunc converts a field selector to internal representation.
type FieldLabelConversionFunc func(label, value string) (internalLabel, internalValue string, err error) type FieldLabelConversionFunc func(label, value string) (internalLabel, internalValue string, err error)
// NewScheme creates a new Scheme. This scheme is pluggable by default. // NewScheme creates a new Scheme. This scheme is pluggable by default.
@ -90,24 +95,19 @@ func NewScheme() *Scheme {
typeToGVK: map[reflect.Type][]schema.GroupVersionKind{}, typeToGVK: map[reflect.Type][]schema.GroupVersionKind{},
unversionedTypes: map[reflect.Type]schema.GroupVersionKind{}, unversionedTypes: map[reflect.Type]schema.GroupVersionKind{},
unversionedKinds: map[string]reflect.Type{}, unversionedKinds: map[string]reflect.Type{},
fieldLabelConversionFuncs: map[string]map[string]FieldLabelConversionFunc{}, fieldLabelConversionFuncs: map[schema.GroupVersionKind]FieldLabelConversionFunc{},
defaulterFuncs: map[reflect.Type]func(interface{}){}, defaulterFuncs: map[reflect.Type]func(interface{}){},
versionPriority: map[string][]string{}, versionPriority: map[string][]string{},
schemeName: naming.GetNameFromCallsite(internalPackages...),
} }
s.converter = conversion.NewConverter(s.nameFunc) s.converter = conversion.NewConverter(s.nameFunc)
s.AddConversionFuncs(DefaultEmbeddedConversions()...) utilruntime.Must(s.AddConversionFuncs(DefaultEmbeddedConversions()...))
// Enable map[string][]string conversions by default // Enable map[string][]string conversions by default
if err := s.AddConversionFuncs(DefaultStringConversions...); err != nil { utilruntime.Must(s.AddConversionFuncs(DefaultStringConversions...))
panic(err) utilruntime.Must(s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
} utilruntime.Must(s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
if err := s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields); err != nil {
panic(err)
}
if err := s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields); err != nil {
panic(err)
}
return s return s
} }
@ -159,7 +159,7 @@ func (s *Scheme) AddUnversionedTypes(version schema.GroupVersion, types ...Objec
gvk := version.WithKind(t.Name()) gvk := version.WithKind(t.Name())
s.unversionedTypes[t] = gvk s.unversionedTypes[t] = gvk
if old, ok := s.unversionedKinds[gvk.Kind]; ok && t != old { if old, ok := s.unversionedKinds[gvk.Kind]; ok && t != old {
panic(fmt.Sprintf("%v.%v has already been registered as unversioned kind %q - kind name must be unique", old.PkgPath(), old.Name(), gvk)) panic(fmt.Sprintf("%v.%v has already been registered as unversioned kind %q - kind name must be unique in scheme %q", old.PkgPath(), old.Name(), gvk, s.schemeName))
} }
s.unversionedKinds[gvk.Kind] = t s.unversionedKinds[gvk.Kind] = t
} }
@ -200,7 +200,7 @@ func (s *Scheme) AddKnownTypeWithName(gvk schema.GroupVersionKind, obj Object) {
} }
if oldT, found := s.gvkToType[gvk]; found && oldT != t { if oldT, found := s.gvkToType[gvk]; found && oldT != t {
panic(fmt.Sprintf("Double registration of different types for %v: old=%v.%v, new=%v.%v", gvk, oldT.PkgPath(), oldT.Name(), t.PkgPath(), t.Name())) panic(fmt.Sprintf("Double registration of different types for %v: old=%v.%v, new=%v.%v in scheme %q", gvk, oldT.PkgPath(), oldT.Name(), t.PkgPath(), t.Name(), s.schemeName))
} }
s.gvkToType[gvk] = t s.gvkToType[gvk] = t
@ -255,7 +255,7 @@ func (s *Scheme) ObjectKinds(obj Object) ([]schema.GroupVersionKind, bool, error
gvks, ok := s.typeToGVK[t] gvks, ok := s.typeToGVK[t]
if !ok { if !ok {
return nil, false, NewNotRegisteredErrForType(t) return nil, false, NewNotRegisteredErrForType(s.schemeName, t)
} }
_, unversionedType := s.unversionedTypes[t] _, unversionedType := s.unversionedTypes[t]
@ -293,15 +293,7 @@ func (s *Scheme) New(kind schema.GroupVersionKind) (Object, error) {
if t, exists := s.unversionedKinds[kind.Kind]; exists { if t, exists := s.unversionedKinds[kind.Kind]; exists {
return reflect.New(t).Interface().(Object), nil return reflect.New(t).Interface().(Object), nil
} }
return nil, NewNotRegisteredErrForKind(kind) return nil, NewNotRegisteredErrForKind(s.schemeName, kind)
}
// AddGenericConversionFunc adds a function that accepts the ConversionFunc call pattern
// (for two conversion types) to the converter. These functions are checked first during
// a normal conversion, but are otherwise not called. Use AddConversionFuncs when registering
// typed conversions.
func (s *Scheme) AddGenericConversionFunc(fn conversion.GenericConversionFunc) {
s.converter.AddGenericConversionFunc(fn)
} }
// Log sets a logger on the scheme. For test purposes only // Log sets a logger on the scheme. For test purposes only
@ -355,36 +347,27 @@ func (s *Scheme) AddConversionFuncs(conversionFuncs ...interface{}) error {
return nil return nil
} }
// AddGeneratedConversionFuncs registers conversion functions that were // AddConversionFunc registers a function that converts between a and b by passing objects of those
// automatically generated. // types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce
func (s *Scheme) AddGeneratedConversionFuncs(conversionFuncs ...interface{}) error { // any other guarantee.
for _, f := range conversionFuncs { func (s *Scheme) AddConversionFunc(a, b interface{}, fn conversion.ConversionFunc) error {
if err := s.converter.RegisterGeneratedConversionFunc(f); err != nil { return s.converter.RegisterUntypedConversionFunc(a, b, fn)
return err }
}
} // AddGeneratedConversionFunc registers a function that converts between a and b by passing objects of those
return nil // types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce
// any other guarantee.
func (s *Scheme) AddGeneratedConversionFunc(a, b interface{}, fn conversion.ConversionFunc) error {
return s.converter.RegisterGeneratedUntypedConversionFunc(a, b, fn)
} }
// AddFieldLabelConversionFunc adds a conversion function to convert field selectors // AddFieldLabelConversionFunc adds a conversion function to convert field selectors
// of the given kind from the given version to internal version representation. // of the given kind from the given version to internal version representation.
func (s *Scheme) AddFieldLabelConversionFunc(version, kind string, conversionFunc FieldLabelConversionFunc) error { func (s *Scheme) AddFieldLabelConversionFunc(gvk schema.GroupVersionKind, conversionFunc FieldLabelConversionFunc) error {
if s.fieldLabelConversionFuncs[version] == nil { s.fieldLabelConversionFuncs[gvk] = conversionFunc
s.fieldLabelConversionFuncs[version] = map[string]FieldLabelConversionFunc{}
}
s.fieldLabelConversionFuncs[version][kind] = conversionFunc
return nil return nil
} }
// AddStructFieldConversion allows you to specify a mechanical copy for a moved
// or renamed struct field without writing an entire conversion function. See
// the comment in conversion.Converter.SetStructFieldCopy for parameter details.
// Call as many times as needed, even on the same fields.
func (s *Scheme) AddStructFieldConversion(srcFieldType interface{}, srcFieldName string, destFieldType interface{}, destFieldName string) error {
return s.converter.SetStructFieldCopy(srcFieldType, srcFieldName, destFieldType, destFieldName)
}
// RegisterInputDefaults sets the provided field mapping function and field matching // RegisterInputDefaults sets the provided field mapping function and field matching
// as the defaults for the provided input type. The fn may be nil, in which case no // as the defaults for the provided input type. The fn may be nil, in which case no
// mapping will happen by default. Use this method to register a mechanism for handling // mapping will happen by default. Use this method to register a mechanism for handling
@ -393,7 +376,7 @@ func (s *Scheme) RegisterInputDefaults(in interface{}, fn conversion.FieldMappin
return s.converter.RegisterInputDefaults(in, fn, defaultFlags) return s.converter.RegisterInputDefaults(in, fn, defaultFlags)
} }
// AddTypeDefaultingFuncs registers a function that is passed a pointer to an // AddTypeDefaultingFunc registers a function that is passed a pointer to an
// object and can default fields on the object. These functions will be invoked // object and can default fields on the object. These functions will be invoked
// when Default() is called. The function will never be called unless the // when Default() is called. The function will never be called unless the
// defaulted object matches srcType. If this function is invoked twice with the // defaulted object matches srcType. If this function is invoked twice with the
@ -486,11 +469,8 @@ func (s *Scheme) Convert(in, out interface{}, context interface{}) error {
// ConvertFieldLabel alters the given field label and value for an kind field selector from // ConvertFieldLabel alters the given field label and value for an kind field selector from
// versioned representation to an unversioned one or returns an error. // versioned representation to an unversioned one or returns an error.
func (s *Scheme) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { func (s *Scheme) ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error) {
if s.fieldLabelConversionFuncs[version] == nil { conversionFunc, ok := s.fieldLabelConversionFuncs[gvk]
return DefaultMetaV1FieldSelectorConversion(label, value)
}
conversionFunc, ok := s.fieldLabelConversionFuncs[version][kind]
if !ok { if !ok {
return DefaultMetaV1FieldSelectorConversion(label, value) return DefaultMetaV1FieldSelectorConversion(label, value)
} }
@ -541,7 +521,7 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) (
kinds, ok := s.typeToGVK[t] kinds, ok := s.typeToGVK[t]
if !ok || len(kinds) == 0 { if !ok || len(kinds) == 0 {
return nil, NewNotRegisteredErrForType(t) return nil, NewNotRegisteredErrForType(s.schemeName, t)
} }
gvk, ok := target.KindForGroupVersionKinds(kinds) gvk, ok := target.KindForGroupVersionKinds(kinds)
@ -554,7 +534,7 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) (
} }
return copyAndSetTargetKind(copy, in, unversionedKind) return copyAndSetTargetKind(copy, in, unversionedKind)
} }
return nil, NewNotRegisteredErrForTarget(t, target) return nil, NewNotRegisteredErrForTarget(s.schemeName, t, target)
} }
// target wants to use the existing type, set kind and return (no conversion necessary) // target wants to use the existing type, set kind and return (no conversion necessary)
@ -764,3 +744,11 @@ func (s *Scheme) addObservedVersion(version schema.GroupVersion) {
s.observedVersions = append(s.observedVersions, version) s.observedVersions = append(s.observedVersions, version)
} }
func (s *Scheme) Name() string {
return s.schemeName
}
// internalPackages are packages that ignored when creating a default reflector name. These packages are in the common
// call chains to NewReflector, so they'd be low entropy names for reflectors
var internalPackages = []string{"k8s.io/apimachinery/pkg/runtime/scheme.go"}

View File

@ -273,7 +273,7 @@ func (jsonFramer) NewFrameReader(r io.ReadCloser) io.ReadCloser {
return framer.NewJSONFramedReader(r) return framer.NewJSONFramedReader(r)
} }
// Framer is the default JSON framing behavior, with newlines delimiting individual objects. // YAMLFramer is the default JSON framing behavior, with newlines delimiting individual objects.
var YAMLFramer = yamlFramer{} var YAMLFramer = yamlFramer{}
type yamlFramer struct{} type yamlFramer struct{}

View File

@ -20,10 +20,12 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"io" "io"
"net/http"
"reflect" "reflect"
"github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/proto"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer/recognizer" "k8s.io/apimachinery/pkg/runtime/serializer/recognizer"
@ -50,6 +52,15 @@ func (e errNotMarshalable) Error() string {
return fmt.Sprintf("object %v does not implement the protobuf marshalling interface and cannot be encoded to a protobuf message", e.t) return fmt.Sprintf("object %v does not implement the protobuf marshalling interface and cannot be encoded to a protobuf message", e.t)
} }
func (e errNotMarshalable) Status() metav1.Status {
return metav1.Status{
Status: metav1.StatusFailure,
Code: http.StatusNotAcceptable,
Reason: metav1.StatusReason("NotAcceptable"),
Message: e.Error(),
}
}
func IsNotMarshalable(err error) bool { func IsNotMarshalable(err error) bool {
_, ok := err.(errNotMarshalable) _, ok := err.(errNotMarshalable)
return err != nil && ok return err != nil && ok

View File

@ -24,18 +24,6 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
) )
// NewCodecForScheme is a convenience method for callers that are using a scheme.
func NewCodecForScheme(
// TODO: I should be a scheme interface?
scheme *runtime.Scheme,
encoder runtime.Encoder,
decoder runtime.Decoder,
encodeVersion runtime.GroupVersioner,
decodeVersion runtime.GroupVersioner,
) runtime.Codec {
return NewCodec(encoder, decoder, runtime.UnsafeObjectConvertor(scheme), scheme, scheme, nil, encodeVersion, decodeVersion)
}
// NewDefaultingCodecForScheme is a convenience method for callers that are using a scheme. // NewDefaultingCodecForScheme is a convenience method for callers that are using a scheme.
func NewDefaultingCodecForScheme( func NewDefaultingCodecForScheme(
// TODO: I should be a scheme interface? // TODO: I should be a scheme interface?
@ -45,7 +33,7 @@ func NewDefaultingCodecForScheme(
encodeVersion runtime.GroupVersioner, encodeVersion runtime.GroupVersioner,
decodeVersion runtime.GroupVersioner, decodeVersion runtime.GroupVersioner,
) runtime.Codec { ) runtime.Codec {
return NewCodec(encoder, decoder, runtime.UnsafeObjectConvertor(scheme), scheme, scheme, scheme, encodeVersion, decodeVersion) return NewCodec(encoder, decoder, runtime.UnsafeObjectConvertor(scheme), scheme, scheme, scheme, encodeVersion, decodeVersion, scheme.Name())
} }
// NewCodec takes objects in their internal versions and converts them to external versions before // NewCodec takes objects in their internal versions and converts them to external versions before
@ -60,6 +48,7 @@ func NewCodec(
defaulter runtime.ObjectDefaulter, defaulter runtime.ObjectDefaulter,
encodeVersion runtime.GroupVersioner, encodeVersion runtime.GroupVersioner,
decodeVersion runtime.GroupVersioner, decodeVersion runtime.GroupVersioner,
originalSchemeName string,
) runtime.Codec { ) runtime.Codec {
internal := &codec{ internal := &codec{
encoder: encoder, encoder: encoder,
@ -71,6 +60,8 @@ func NewCodec(
encodeVersion: encodeVersion, encodeVersion: encodeVersion,
decodeVersion: decodeVersion, decodeVersion: decodeVersion,
originalSchemeName: originalSchemeName,
} }
return internal return internal
} }
@ -85,6 +76,9 @@ type codec struct {
encodeVersion runtime.GroupVersioner encodeVersion runtime.GroupVersioner
decodeVersion runtime.GroupVersioner decodeVersion runtime.GroupVersioner
// originalSchemeName is optional, but when filled in it holds the name of the scheme from which this codec originates
originalSchemeName string
} }
// Decode attempts a decode of the object, then tries to convert it to the internal version. If into is provided and the decoding is // Decode attempts a decode of the object, then tries to convert it to the internal version. If into is provided and the decoding is
@ -182,7 +176,7 @@ func (c *codec) Encode(obj runtime.Object, w io.Writer) error {
} }
targetGVK, ok := c.encodeVersion.KindForGroupVersionKinds([]schema.GroupVersionKind{objGVK}) targetGVK, ok := c.encodeVersion.KindForGroupVersionKinds([]schema.GroupVersionKind{objGVK})
if !ok { if !ok {
return runtime.NewNotRegisteredGVKErrForTarget(objGVK, c.encodeVersion) return runtime.NewNotRegisteredGVKErrForTarget(c.originalSchemeName, objGVK, c.encodeVersion)
} }
if targetGVK == objGVK { if targetGVK == objGVK {
return c.encoder.Encode(obj, w) return c.encoder.Encode(obj, w)

View File

@ -28,9 +28,7 @@ func (in *RawExtension) DeepCopyInto(out *RawExtension) {
*out = make([]byte, len(*in)) *out = make([]byte, len(*in))
copy(*out, *in) copy(*out, *in)
} }
if in.Object == nil { if in.Object != nil {
out.Object = nil
} else {
out.Object = in.Object.DeepCopyObject() out.Object = in.Object.DeepCopyObject()
} }
return return
@ -83,9 +81,7 @@ func (in *VersionedObjects) DeepCopyInto(out *VersionedObjects) {
in, out := &in.Objects, &out.Objects in, out := &in.Objects, &out.Objects
*out = make([]Object, len(*in)) *out = make([]Object, len(*in))
for i := range *in { for i := range *in {
if (*in)[i] == nil { if (*in)[i] != nil {
(*out)[i] = nil
} else {
(*out)[i] = (*in)[i].DeepCopyObject() (*out)[i] = (*in)[i].DeepCopyObject()
} }
} }

View File

@ -18,6 +18,7 @@ package intstr
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"math" "math"
"runtime/debug" "runtime/debug"
@ -142,7 +143,17 @@ func (intstr *IntOrString) Fuzz(c fuzz.Continue) {
} }
} }
func ValueOrDefault(intOrPercent *IntOrString, defaultValue IntOrString) *IntOrString {
if intOrPercent == nil {
return &defaultValue
}
return intOrPercent
}
func GetValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool) (int, error) { func GetValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool) (int, error) {
if intOrPercent == nil {
return 0, errors.New("nil value for IntOrString")
}
value, isPercent, err := getIntOrPercentValue(intOrPercent) value, isPercent, err := getIntOrPercentValue(intOrPercent)
if err != nil { if err != nil {
return 0, fmt.Errorf("invalid value for IntOrString: %v", err) return 0, fmt.Errorf("invalid value for IntOrString: %v", err)

View File

@ -0,0 +1,93 @@
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package naming
import (
"fmt"
"regexp"
goruntime "runtime"
"runtime/debug"
"strconv"
"strings"
)
// GetNameFromCallsite walks back through the call stack until we find a caller from outside of the ignoredPackages
// it returns back a shortpath/filename:line to aid in identification of this reflector when it starts logging
func GetNameFromCallsite(ignoredPackages ...string) string {
name := "????"
const maxStack = 10
for i := 1; i < maxStack; i++ {
_, file, line, ok := goruntime.Caller(i)
if !ok {
file, line, ok = extractStackCreator()
if !ok {
break
}
i += maxStack
}
if hasPackage(file, append(ignoredPackages, "/runtime/asm_")) {
continue
}
file = trimPackagePrefix(file)
name = fmt.Sprintf("%s:%d", file, line)
break
}
return name
}
// hasPackage returns true if the file is in one of the ignored packages.
func hasPackage(file string, ignoredPackages []string) bool {
for _, ignoredPackage := range ignoredPackages {
if strings.Contains(file, ignoredPackage) {
return true
}
}
return false
}
// trimPackagePrefix reduces duplicate values off the front of a package name.
func trimPackagePrefix(file string) string {
if l := strings.LastIndex(file, "/vendor/"); l >= 0 {
return file[l+len("/vendor/"):]
}
if l := strings.LastIndex(file, "/src/"); l >= 0 {
return file[l+5:]
}
if l := strings.LastIndex(file, "/pkg/"); l >= 0 {
return file[l+1:]
}
return file
}
var stackCreator = regexp.MustCompile(`(?m)^created by (.*)\n\s+(.*):(\d+) \+0x[[:xdigit:]]+$`)
// extractStackCreator retrieves the goroutine file and line that launched this stack. Returns false
// if the creator cannot be located.
// TODO: Go does not expose this via runtime https://github.com/golang/go/issues/11440
func extractStackCreator() (string, int, bool) {
stack := debug.Stack()
matches := stackCreator.FindStringSubmatch(string(stack))
if matches == nil || len(matches) != 4 {
return "", 0, false
}
line, err := strconv.Atoi(matches[3])
if err != nil {
return "", 0, false
}
return matches[2], line, true
}

View File

@ -91,7 +91,8 @@ func SetOldTransportDefaults(t *http.Transport) *http.Transport {
// ProxierWithNoProxyCIDR allows CIDR rules in NO_PROXY // ProxierWithNoProxyCIDR allows CIDR rules in NO_PROXY
t.Proxy = NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment) t.Proxy = NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment)
} }
if t.DialContext == nil { // If no custom dialer is set, use the default context dialer
if t.DialContext == nil && t.Dial == nil {
t.DialContext = defaultTransport.DialContext t.DialContext = defaultTransport.DialContext
} }
if t.TLSHandshakeTimeout == 0 { if t.TLSHandshakeTimeout == 0 {
@ -129,7 +130,18 @@ func DialerFor(transport http.RoundTripper) (DialFunc, error) {
switch transport := transport.(type) { switch transport := transport.(type) {
case *http.Transport: case *http.Transport:
return transport.DialContext, nil // transport.DialContext takes precedence over transport.Dial
if transport.DialContext != nil {
return transport.DialContext, nil
}
// adapt transport.Dial to the DialWithContext signature
if transport.Dial != nil {
return func(ctx context.Context, net, addr string) (net.Conn, error) {
return transport.Dial(net, addr)
}, nil
}
// otherwise return nil
return nil, nil
case RoundTripperWrapper: case RoundTripperWrapper:
return DialerFor(transport.WrappedRoundTripper()) return DialerFor(transport.WrappedRoundTripper())
default: default:
@ -167,10 +179,8 @@ func FormatURL(scheme string, host string, port int, path string) *url.URL {
} }
func GetHTTPClient(req *http.Request) string { func GetHTTPClient(req *http.Request) string {
if userAgent, ok := req.Header["User-Agent"]; ok { if ua := req.UserAgent(); len(ua) != 0 {
if len(userAgent) > 0 { return ua
return userAgent[0]
}
} }
return "unknown" return "unknown"
} }

View File

@ -1,19 +0,0 @@
/*
Copyright 2014 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package wait provides tools for polling or listening for changes
// to a condition.
package wait // import "k8s.io/apimachinery/pkg/util/wait"

View File

@ -1,405 +0,0 @@
/*
Copyright 2014 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package wait
import (
"context"
"errors"
"math/rand"
"sync"
"time"
"k8s.io/apimachinery/pkg/util/runtime"
)
// For any test of the style:
// ...
// <- time.After(timeout):
// t.Errorf("Timed out")
// The value for timeout should effectively be "forever." Obviously we don't want our tests to truly lock up forever, but 30s
// is long enough that it is effectively forever for the things that can slow down a run on a heavily contended machine
// (GC, seeks, etc), but not so long as to make a developer ctrl-c a test run if they do happen to break that test.
var ForeverTestTimeout = time.Second * 30
// NeverStop may be passed to Until to make it never stop.
var NeverStop <-chan struct{} = make(chan struct{})
// Group allows to start a group of goroutines and wait for their completion.
type Group struct {
wg sync.WaitGroup
}
func (g *Group) Wait() {
g.wg.Wait()
}
// StartWithChannel starts f in a new goroutine in the group.
// stopCh is passed to f as an argument. f should stop when stopCh is available.
func (g *Group) StartWithChannel(stopCh <-chan struct{}, f func(stopCh <-chan struct{})) {
g.Start(func() {
f(stopCh)
})
}
// StartWithContext starts f in a new goroutine in the group.
// ctx is passed to f as an argument. f should stop when ctx.Done() is available.
func (g *Group) StartWithContext(ctx context.Context, f func(context.Context)) {
g.Start(func() {
f(ctx)
})
}
// Start starts f in a new goroutine in the group.
func (g *Group) Start(f func()) {
g.wg.Add(1)
go func() {
defer g.wg.Done()
f()
}()
}
// Forever calls f every period for ever.
//
// Forever is syntactic sugar on top of Until.
func Forever(f func(), period time.Duration) {
Until(f, period, NeverStop)
}
// Until loops until stop channel is closed, running f every period.
//
// Until is syntactic sugar on top of JitterUntil with zero jitter factor and
// with sliding = true (which means the timer for period starts after the f
// completes).
func Until(f func(), period time.Duration, stopCh <-chan struct{}) {
JitterUntil(f, period, 0.0, true, stopCh)
}
// NonSlidingUntil loops until stop channel is closed, running f every
// period.
//
// NonSlidingUntil is syntactic sugar on top of JitterUntil with zero jitter
// factor, with sliding = false (meaning the timer for period starts at the same
// time as the function starts).
func NonSlidingUntil(f func(), period time.Duration, stopCh <-chan struct{}) {
JitterUntil(f, period, 0.0, false, stopCh)
}
// JitterUntil loops until stop channel is closed, running f every period.
//
// If jitterFactor is positive, the period is jittered before every run of f.
// If jitterFactor is not positive, the period is unchanged and not jittered.
//
// If sliding is true, the period is computed after f runs. If it is false then
// period includes the runtime for f.
//
// Close stopCh to stop. f may not be invoked if stop channel is already
// closed. Pass NeverStop to if you don't want it stop.
func JitterUntil(f func(), period time.Duration, jitterFactor float64, sliding bool, stopCh <-chan struct{}) {
var t *time.Timer
var sawTimeout bool
for {
select {
case <-stopCh:
return
default:
}
jitteredPeriod := period
if jitterFactor > 0.0 {
jitteredPeriod = Jitter(period, jitterFactor)
}
if !sliding {
t = resetOrReuseTimer(t, jitteredPeriod, sawTimeout)
}
func() {
defer runtime.HandleCrash()
f()
}()
if sliding {
t = resetOrReuseTimer(t, jitteredPeriod, sawTimeout)
}
// NOTE: b/c there is no priority selection in golang
// it is possible for this to race, meaning we could
// trigger t.C and stopCh, and t.C select falls through.
// In order to mitigate we re-check stopCh at the beginning
// of every loop to prevent extra executions of f().
select {
case <-stopCh:
return
case <-t.C:
sawTimeout = true
}
}
}
// Jitter returns a time.Duration between duration and duration + maxFactor *
// duration.
//
// This allows clients to avoid converging on periodic behavior. If maxFactor
// is 0.0, a suggested default value will be chosen.
func Jitter(duration time.Duration, maxFactor float64) time.Duration {
if maxFactor <= 0.0 {
maxFactor = 1.0
}
wait := duration + time.Duration(rand.Float64()*maxFactor*float64(duration))
return wait
}
// ErrWaitTimeout is returned when the condition exited without success.
var ErrWaitTimeout = errors.New("timed out waiting for the condition")
// ConditionFunc returns true if the condition is satisfied, or an error
// if the loop should be aborted.
type ConditionFunc func() (done bool, err error)
// Backoff holds parameters applied to a Backoff function.
type Backoff struct {
Duration time.Duration // the base duration
Factor float64 // Duration is multiplied by factor each iteration
Jitter float64 // The amount of jitter applied each iteration
Steps int // Exit with error after this many steps
}
// ExponentialBackoff repeats a condition check with exponential backoff.
//
// It checks the condition up to Steps times, increasing the wait by multiplying
// the previous duration by Factor.
//
// If Jitter is greater than zero, a random amount of each duration is added
// (between duration and duration*(1+jitter)).
//
// If the condition never returns true, ErrWaitTimeout is returned. All other
// errors terminate immediately.
func ExponentialBackoff(backoff Backoff, condition ConditionFunc) error {
duration := backoff.Duration
for i := 0; i < backoff.Steps; i++ {
if i != 0 {
adjusted := duration
if backoff.Jitter > 0.0 {
adjusted = Jitter(duration, backoff.Jitter)
}
time.Sleep(adjusted)
duration = time.Duration(float64(duration) * backoff.Factor)
}
if ok, err := condition(); err != nil || ok {
return err
}
}
return ErrWaitTimeout
}
// Poll tries a condition func until it returns true, an error, or the timeout
// is reached.
//
// Poll always waits the interval before the run of 'condition'.
// 'condition' will always be invoked at least once.
//
// Some intervals may be missed if the condition takes too long or the time
// window is too short.
//
// If you want to Poll something forever, see PollInfinite.
func Poll(interval, timeout time.Duration, condition ConditionFunc) error {
return pollInternal(poller(interval, timeout), condition)
}
func pollInternal(wait WaitFunc, condition ConditionFunc) error {
done := make(chan struct{})
defer close(done)
return WaitFor(wait, condition, done)
}
// PollImmediate tries a condition func until it returns true, an error, or the timeout
// is reached.
//
// PollImmediate always checks 'condition' before waiting for the interval. 'condition'
// will always be invoked at least once.
//
// Some intervals may be missed if the condition takes too long or the time
// window is too short.
//
// If you want to immediately Poll something forever, see PollImmediateInfinite.
func PollImmediate(interval, timeout time.Duration, condition ConditionFunc) error {
return pollImmediateInternal(poller(interval, timeout), condition)
}
func pollImmediateInternal(wait WaitFunc, condition ConditionFunc) error {
done, err := condition()
if err != nil {
return err
}
if done {
return nil
}
return pollInternal(wait, condition)
}
// PollInfinite tries a condition func until it returns true or an error
//
// PollInfinite always waits the interval before the run of 'condition'.
//
// Some intervals may be missed if the condition takes too long or the time
// window is too short.
func PollInfinite(interval time.Duration, condition ConditionFunc) error {
done := make(chan struct{})
defer close(done)
return PollUntil(interval, condition, done)
}
// PollImmediateInfinite tries a condition func until it returns true or an error
//
// PollImmediateInfinite runs the 'condition' before waiting for the interval.
//
// Some intervals may be missed if the condition takes too long or the time
// window is too short.
func PollImmediateInfinite(interval time.Duration, condition ConditionFunc) error {
done, err := condition()
if err != nil {
return err
}
if done {
return nil
}
return PollInfinite(interval, condition)
}
// PollUntil tries a condition func until it returns true, an error or stopCh is
// closed.
//
// PollUntil always waits interval before the first run of 'condition'.
// 'condition' will always be invoked at least once.
func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error {
return WaitFor(poller(interval, 0), condition, stopCh)
}
// PollImmediateUntil tries a condition func until it returns true, an error or stopCh is closed.
//
// PollImmediateUntil runs the 'condition' before waiting for the interval.
// 'condition' will always be invoked at least once.
func PollImmediateUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error {
done, err := condition()
if err != nil {
return err
}
if done {
return nil
}
select {
case <-stopCh:
return ErrWaitTimeout
default:
return PollUntil(interval, condition, stopCh)
}
}
// WaitFunc creates a channel that receives an item every time a test
// should be executed and is closed when the last test should be invoked.
type WaitFunc func(done <-chan struct{}) <-chan struct{}
// WaitFor continually checks 'fn' as driven by 'wait'.
//
// WaitFor gets a channel from 'wait()'', and then invokes 'fn' once for every value
// placed on the channel and once more when the channel is closed.
//
// If 'fn' returns an error the loop ends and that error is returned, and if
// 'fn' returns true the loop ends and nil is returned.
//
// ErrWaitTimeout will be returned if the channel is closed without fn ever
// returning true.
func WaitFor(wait WaitFunc, fn ConditionFunc, done <-chan struct{}) error {
c := wait(done)
for {
_, open := <-c
ok, err := fn()
if err != nil {
return err
}
if ok {
return nil
}
if !open {
break
}
}
return ErrWaitTimeout
}
// poller returns a WaitFunc that will send to the channel every interval until
// timeout has elapsed and then closes the channel.
//
// Over very short intervals you may receive no ticks before the channel is
// closed. A timeout of 0 is interpreted as an infinity.
//
// Output ticks are not buffered. If the channel is not ready to receive an
// item, the tick is skipped.
func poller(interval, timeout time.Duration) WaitFunc {
return WaitFunc(func(done <-chan struct{}) <-chan struct{} {
ch := make(chan struct{})
go func() {
defer close(ch)
tick := time.NewTicker(interval)
defer tick.Stop()
var after <-chan time.Time
if timeout != 0 {
// time.After is more convenient, but it
// potentially leaves timers around much longer
// than necessary if we exit early.
timer := time.NewTimer(timeout)
after = timer.C
defer timer.Stop()
}
for {
select {
case <-tick.C:
// If the consumer isn't ready for this signal drop it and
// check the other channels.
select {
case ch <- struct{}{}:
default:
}
case <-after:
return
case <-done:
return
}
}
}()
return ch
})
}
// resetOrReuseTimer avoids allocating a new timer if one is already in use.
// Not safe for multiple threads.
func resetOrReuseTimer(t *time.Timer, d time.Duration, sawTimeout bool) *time.Timer {
if t == nil {
return time.NewTimer(d)
}
if !t.Stop() && !sawTimeout {
<-t.C
}
t.Reset(d)
return t
}

View File

@ -1,87 +0,0 @@
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package watch
import (
"errors"
"time"
"k8s.io/apimachinery/pkg/util/wait"
)
// ConditionFunc returns true if the condition has been reached, false if it has not been reached yet,
// or an error if the condition cannot be checked and should terminate. In general, it is better to define
// level driven conditions over edge driven conditions (pod has ready=true, vs pod modified and ready changed
// from false to true).
type ConditionFunc func(event Event) (bool, error)
// ErrWatchClosed is returned when the watch channel is closed before timeout in Until.
var ErrWatchClosed = errors.New("watch closed before Until timeout")
// Until reads items from the watch until each provided condition succeeds, and then returns the last watch
// encountered. The first condition that returns an error terminates the watch (and the event is also returned).
// If no event has been received, the returned event will be nil.
// Conditions are satisfied sequentially so as to provide a useful primitive for higher level composition.
// A zero timeout means to wait forever.
func Until(timeout time.Duration, watcher Interface, conditions ...ConditionFunc) (*Event, error) {
ch := watcher.ResultChan()
defer watcher.Stop()
var after <-chan time.Time
if timeout > 0 {
after = time.After(timeout)
} else {
ch := make(chan time.Time)
defer close(ch)
after = ch
}
var lastEvent *Event
for _, condition := range conditions {
// check the next condition against the previous event and short circuit waiting for the next watch
if lastEvent != nil {
done, err := condition(*lastEvent)
if err != nil {
return lastEvent, err
}
if done {
continue
}
}
ConditionSucceeded:
for {
select {
case event, ok := <-ch:
if !ok {
return lastEvent, ErrWatchClosed
}
lastEvent = &event
// TODO: check for watch expired error and retry watch from latest point?
done, err := condition(event)
if err != nil {
return lastEvent, err
}
if done {
break ConditionSucceeded
}
case <-after:
return lastEvent, wait.ErrWaitTimeout
}
}
}
return lastEvent, nil
}

View File

@ -268,3 +268,50 @@ func (f *RaceFreeFakeWatcher) Action(action EventType, obj runtime.Object) {
} }
} }
} }
// ProxyWatcher lets you wrap your channel in watch Interface. Threadsafe.
type ProxyWatcher struct {
result chan Event
stopCh chan struct{}
mutex sync.Mutex
stopped bool
}
var _ Interface = &ProxyWatcher{}
// NewProxyWatcher creates new ProxyWatcher by wrapping a channel
func NewProxyWatcher(ch chan Event) *ProxyWatcher {
return &ProxyWatcher{
result: ch,
stopCh: make(chan struct{}),
stopped: false,
}
}
// Stop implements Interface
func (pw *ProxyWatcher) Stop() {
pw.mutex.Lock()
defer pw.mutex.Unlock()
if !pw.stopped {
pw.stopped = true
close(pw.stopCh)
}
}
// Stopping returns true if Stop() has been called
func (pw *ProxyWatcher) Stopping() bool {
pw.mutex.Lock()
defer pw.mutex.Unlock()
return pw.stopped
}
// ResultChan implements Interface
func (pw *ProxyWatcher) ResultChan() <-chan Event {
return pw.result
}
// StopChan returns stop channel
func (pw *ProxyWatcher) StopChan() <-chan struct{} {
return pw.stopCh
}

View File

@ -23,9 +23,7 @@ package watch
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Event) DeepCopyInto(out *Event) { func (in *Event) DeepCopyInto(out *Event) {
*out = *in *out = *in
if in.Object == nil { if in.Object != nil {
out.Object = nil
} else {
out.Object = in.Object.DeepCopyObject() out.Object = in.Object.DeepCopyObject()
} }
return return

2
vendor/k8s.io/apiserver/README.md generated vendored
View File

@ -14,7 +14,7 @@ This library contains code to create Kubernetes aggregation server complete with
There are *NO compatibility guarantees* for this repository, yet. It is in direct support of Kubernetes, so branches There are *NO compatibility guarantees* for this repository, yet. It is in direct support of Kubernetes, so branches
will track Kubernetes and be compatible with that repo. As we more cleanly separate the layers, we will review the will track Kubernetes and be compatible with that repo. As we more cleanly separate the layers, we will review the
compatibility guarantee. We have a goal to make this easier to use in 2017. compatibility guarantee. We have a goal to make this easier to use in the future.
## Where does it come from? ## Where does it come from?

View File

@ -100,14 +100,11 @@ func NewLogged(req *http.Request, w *http.ResponseWriter) *respLogger {
// then a passthroughLogger will be created which will log to stdout immediately // then a passthroughLogger will be created which will log to stdout immediately
// when Addf is called. // when Addf is called.
func LogOf(req *http.Request, w http.ResponseWriter) logger { func LogOf(req *http.Request, w http.ResponseWriter) logger {
if _, exists := w.(*respLogger); !exists {
pl := &passthroughLogger{}
return pl
}
if rl, ok := w.(*respLogger); ok { if rl, ok := w.(*respLogger); ok {
return rl return rl
} }
panic("Unable to find or create the logger!")
return &passthroughLogger{}
} }
// Unlogged returns the original ResponseWriter, or w if it is not our inserted logger. // Unlogged returns the original ResponseWriter, or w if it is not our inserted logger.
@ -148,9 +145,9 @@ func (rl *respLogger) Log() {
latency := time.Since(rl.startTime) latency := time.Since(rl.startTime)
if glog.V(3) { if glog.V(3) {
if !rl.hijacked { if !rl.hijacked {
glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) %v%v%v [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.status, rl.statusStack, rl.addedInfo, rl.req.Header["User-Agent"], rl.req.RemoteAddr)) glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) %v%v%v [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.status, rl.statusStack, rl.addedInfo, rl.req.UserAgent(), rl.req.RemoteAddr))
} else { } else {
glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) hijacked [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.req.Header["User-Agent"], rl.req.RemoteAddr)) glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) hijacked [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.req.UserAgent(), rl.req.RemoteAddr))
} }
} }
} }

29
vendor/k8s.io/client-go/README.md generated vendored
View File

@ -2,7 +2,7 @@
Go clients for talking to a [kubernetes](http://kubernetes.io/) cluster. Go clients for talking to a [kubernetes](http://kubernetes.io/) cluster.
We currently recommend using the v7.0.0 tag. See [INSTALL.md](/INSTALL.md) for We currently recommend using the v8.0.0 tag. See [INSTALL.md](/INSTALL.md) for
detailed installation instructions. `go get k8s.io/client-go/...` works, but detailed installation instructions. `go get k8s.io/client-go/...` works, but
will build `master`, which doesn't handle the dependencies well. will build `master`, which doesn't handle the dependencies well.
@ -91,17 +91,17 @@ We will backport bugfixes--but not new features--into older versions of
#### Compatibility matrix #### Compatibility matrix
| | Kubernetes 1.4 | Kubernetes 1.5 | Kubernetes 1.6 | Kubernetes 1.7 | Kubernetes 1.8 | Kubernetes 1.9 | Kubernetes 1.10 | | | Kubernetes 1.5 | Kubernetes 1.6 | Kubernetes 1.7 | Kubernetes 1.8 | Kubernetes 1.9 | Kubernetes 1.10 | Kubernetes 1.11 |
|---------------------|----------------|----------------|----------------|----------------|----------------|----------------|-----------------| |---------------------|----------------|----------------|----------------|----------------|----------------|-----------------|-----------------|
| client-go 1.4 | ✓ | - | - | - | - | - | - | | client-go 1.5 | - | - | - | - | - | - | - |
| client-go 1.5 | + | - | - | - | - | - | - | | client-go 2.0 | ✓ | +- | +- | +- | +- | +- | +- |
| client-go 2.0 | +- | ✓ | +- | +- | +- | +- | +- | | client-go 3.0 | +- | ✓ | - | +- | +- | +- | +- |
| client-go 3.0 | +- | +- | ✓ | - | +- | +- | +- | | client-go 4.0 | +- | +- | ✓ | +- | +- | +- | +- |
| client-go 4.0 | +- | +- | +- | ✓ | +- | +- | +- | | client-go 5.0 | +- | +- | +- | ✓ | +- | +- | +- |
| client-go 5.0 | +- | +- | +- | +- | ✓ | +- | +- | | client-go 6.0 | +- | +- | +- | +- | ✓ | +- | +- |
| client-go 6.0 | +- | +- | +- | +- | +- | ✓ | +- | | client-go 7.0 | +- | +- | +- | +- | +- | ✓ | +- |
| client-go 7.0 | +- | +- | +- | +- | +- | +- | ✓ | | client-go 8.0 | +- | +- | +- | +- | +- | +- | ✓ |
| client-go HEAD | +- | +- | +- | +- | +- | + | + | | client-go HEAD | +- | +- | +- | +- | +- | +- | +- |
Key: Key:
@ -127,9 +127,10 @@ between client-go versions.
| client-go 2.0 | Kubernetes main repo, 1.5 branch | = - | | client-go 2.0 | Kubernetes main repo, 1.5 branch | = - |
| client-go 3.0 | Kubernetes main repo, 1.6 branch | = - | | client-go 3.0 | Kubernetes main repo, 1.6 branch | = - |
| client-go 4.0 | Kubernetes main repo, 1.7 branch | = - | | client-go 4.0 | Kubernetes main repo, 1.7 branch | = - |
| client-go 5.0 | Kubernetes main repo, 1.8 branch | | | client-go 5.0 | Kubernetes main repo, 1.8 branch | = - |
| client-go 6.0 | Kubernetes main repo, 1.9 branch | ✓ | | client-go 6.0 | Kubernetes main repo, 1.9 branch | ✓ |
| client-go 7.0 | Kubernetes main repo, 1.10 branch | ✓ | | client-go 7.0 | Kubernetes main repo, 1.10 branch | ✓ |
| client-go 8.0 | Kubernetes main repo, 1.11 branch | ✓ |
| client-go HEAD | Kubernetes main repo, master branch | ✓ | | client-go HEAD | Kubernetes main repo, master branch | ✓ |
Key: Key:
@ -154,7 +155,7 @@ existing users won't be broken.
### Kubernetes tags ### Kubernetes tags
As of April 2018, client-go is still a mirror of This repository is still a mirror of
[k8s.io/kubernetes/staging/src/client-go](https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/client-go), [k8s.io/kubernetes/staging/src/client-go](https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/client-go),
the code development is still done in the staging area. Since Kubernetes 1.8 the code development is still done in the staging area. Since Kubernetes 1.8
release, when syncing the code from the staging area, we also sync the Kubernetes release, when syncing the code from the staging area, we also sync the Kubernetes

View File

@ -35,17 +35,48 @@ func init() {
// RegisterConversions adds conversion functions to the given scheme. // RegisterConversions adds conversion functions to the given scheme.
// Public to allow building arbitrary schemes. // Public to allow building arbitrary schemes.
func RegisterConversions(scheme *runtime.Scheme) error { func RegisterConversions(s *runtime.Scheme) error {
return scheme.AddGeneratedConversionFuncs( if err := s.AddGeneratedConversionFunc((*ExecCredential)(nil), (*clientauthentication.ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error {
Convert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential, return Convert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential(a.(*ExecCredential), b.(*clientauthentication.ExecCredential), scope)
Convert_clientauthentication_ExecCredential_To_v1alpha1_ExecCredential, }); err != nil {
Convert_v1alpha1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec, return err
Convert_clientauthentication_ExecCredentialSpec_To_v1alpha1_ExecCredentialSpec, }
Convert_v1alpha1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus, if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredential)(nil), (*ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error {
Convert_clientauthentication_ExecCredentialStatus_To_v1alpha1_ExecCredentialStatus, return Convert_clientauthentication_ExecCredential_To_v1alpha1_ExecCredential(a.(*clientauthentication.ExecCredential), b.(*ExecCredential), scope)
Convert_v1alpha1_Response_To_clientauthentication_Response, }); err != nil {
Convert_clientauthentication_Response_To_v1alpha1_Response, return err
) }
if err := s.AddGeneratedConversionFunc((*ExecCredentialSpec)(nil), (*clientauthentication.ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(a.(*ExecCredentialSpec), b.(*clientauthentication.ExecCredentialSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialSpec)(nil), (*ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_clientauthentication_ExecCredentialSpec_To_v1alpha1_ExecCredentialSpec(a.(*clientauthentication.ExecCredentialSpec), b.(*ExecCredentialSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*ExecCredentialStatus)(nil), (*clientauthentication.ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(a.(*ExecCredentialStatus), b.(*clientauthentication.ExecCredentialStatus), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialStatus)(nil), (*ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_clientauthentication_ExecCredentialStatus_To_v1alpha1_ExecCredentialStatus(a.(*clientauthentication.ExecCredentialStatus), b.(*ExecCredentialStatus), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*Response)(nil), (*clientauthentication.Response)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha1_Response_To_clientauthentication_Response(a.(*Response), b.(*clientauthentication.Response), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*clientauthentication.Response)(nil), (*Response)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_clientauthentication_Response_To_v1alpha1_Response(a.(*clientauthentication.Response), b.(*Response), scope)
}); err != nil {
return err
}
return nil
} }
func autoConvert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error { func autoConvert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error {

View File

@ -35,15 +35,43 @@ func init() {
// RegisterConversions adds conversion functions to the given scheme. // RegisterConversions adds conversion functions to the given scheme.
// Public to allow building arbitrary schemes. // Public to allow building arbitrary schemes.
func RegisterConversions(scheme *runtime.Scheme) error { func RegisterConversions(s *runtime.Scheme) error {
return scheme.AddGeneratedConversionFuncs( if err := s.AddGeneratedConversionFunc((*ExecCredential)(nil), (*clientauthentication.ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error {
Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential, return Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(a.(*ExecCredential), b.(*clientauthentication.ExecCredential), scope)
Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential, }); err != nil {
Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec, return err
Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec, }
Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus, if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredential)(nil), (*ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error {
Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus, return Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential(a.(*clientauthentication.ExecCredential), b.(*ExecCredential), scope)
) }); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*ExecCredentialSpec)(nil), (*clientauthentication.ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(a.(*ExecCredentialSpec), b.(*clientauthentication.ExecCredentialSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialSpec)(nil), (*ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(a.(*clientauthentication.ExecCredentialSpec), b.(*ExecCredentialSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*ExecCredentialStatus)(nil), (*clientauthentication.ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(a.(*ExecCredentialStatus), b.(*clientauthentication.ExecCredentialStatus), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialStatus)(nil), (*ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus(a.(*clientauthentication.ExecCredentialStatus), b.(*ExecCredentialStatus), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*clientauthentication.ExecCredentialSpec)(nil), (*ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(a.(*clientauthentication.ExecCredentialSpec), b.(*ExecCredentialSpec), scope)
}); err != nil {
return err
}
return nil
} }
func autoConvert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error { func autoConvert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error {

View File

@ -20,6 +20,7 @@ import (
"bytes" "bytes"
"context" "context"
"crypto/tls" "crypto/tls"
"errors"
"fmt" "fmt"
"io" "io"
"net" "net"
@ -36,6 +37,7 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/pkg/apis/clientauthentication" "k8s.io/client-go/pkg/apis/clientauthentication"
"k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1" "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1"
"k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1"
@ -51,9 +53,9 @@ var codecs = serializer.NewCodecFactory(scheme)
func init() { func init() {
v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
v1alpha1.AddToScheme(scheme) utilruntime.Must(v1alpha1.AddToScheme(scheme))
v1beta1.AddToScheme(scheme) utilruntime.Must(v1beta1.AddToScheme(scheme))
clientauthentication.AddToScheme(scheme) utilruntime.Must(clientauthentication.AddToScheme(scheme))
} }
var ( var (
@ -178,21 +180,10 @@ func (a *Authenticator) UpdateTransportConfig(c *transport.Config) error {
return &roundTripper{a, rt} return &roundTripper{a, rt}
} }
getCert := c.TLS.GetCert if c.TLS.GetCert != nil {
c.TLS.GetCert = func() (*tls.Certificate, error) { return errors.New("can't add TLS certificate callback: transport.Config.TLS.GetCert already set")
// If previous GetCert is present and returns a valid non-nil
// certificate, use that. Otherwise use cert from exec plugin.
if getCert != nil {
cert, err := getCert()
if err != nil {
return nil, err
}
if cert != nil {
return cert, nil
}
}
return a.cert()
} }
c.TLS.GetCert = a.cert
var dial func(ctx context.Context, network, addr string) (net.Conn, error) var dial func(ctx context.Context, network, addr string) (net.Conn, error)
if c.Dial != nil { if c.Dial != nil {

View File

@ -18,6 +18,7 @@ package rest
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net" "net"
@ -44,6 +45,8 @@ const (
DefaultBurst int = 10 DefaultBurst int = 10
) )
var ErrNotInCluster = errors.New("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined")
// Config holds the common attributes that can be passed to a Kubernetes client on // Config holds the common attributes that can be passed to a Kubernetes client on
// initialization. // initialization.
type Config struct { type Config struct {
@ -220,7 +223,7 @@ func RESTClientFor(config *Config) (*RESTClient, error) {
// the config.Version to be empty. // the config.Version to be empty.
func UnversionedRESTClientFor(config *Config) (*RESTClient, error) { func UnversionedRESTClientFor(config *Config) (*RESTClient, error) {
if config.NegotiatedSerializer == nil { if config.NegotiatedSerializer == nil {
return nil, fmt.Errorf("NeogitatedSerializer is required when initializing a RESTClient") return nil, fmt.Errorf("NegotiatedSerializer is required when initializing a RESTClient")
} }
baseURL, versionedAPIPath, err := defaultServerUrlFor(config) baseURL, versionedAPIPath, err := defaultServerUrlFor(config)
@ -308,12 +311,12 @@ func DefaultKubernetesUserAgent() string {
// InClusterConfig returns a config object which uses the service account // InClusterConfig returns a config object which uses the service account
// kubernetes gives to pods. It's intended for clients that expect to be // kubernetes gives to pods. It's intended for clients that expect to be
// running inside a pod running on kubernetes. It will return an error if // running inside a pod running on kubernetes. It will return ErrNotInCluster
// called from a process not running in a kubernetes environment. // if called from a process not running in a kubernetes environment.
func InClusterConfig() (*Config, error) { func InClusterConfig() (*Config, error) {
host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT") host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
if len(host) == 0 || len(port) == 0 { if len(host) == 0 || len(port) == 0 {
return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined") return nil, ErrNotInCluster
} }
token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token") token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token")

View File

@ -198,7 +198,7 @@ func (r *Request) Throttle(limiter flowcontrol.RateLimiter) *Request {
return r return r
} }
// SubResource sets a sub-resource path which can be multiple segments segment after the resource // SubResource sets a sub-resource path which can be multiple segments after the resource
// name but before the suffix. // name but before the suffix.
func (r *Request) SubResource(subresources ...string) *Request { func (r *Request) SubResource(subresources ...string) *Request {
if r.err != nil { if r.err != nil {
@ -731,7 +731,7 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error {
} }
} }
glog.V(4).Infof("Got a Retry-After %s response for attempt %d to %v", seconds, retries, url) glog.V(4).Infof("Got a Retry-After %ds response for attempt %d to %v", seconds, retries, url)
r.backoffMgr.Sleep(time.Duration(seconds) * time.Second) r.backoffMgr.Sleep(time.Duration(seconds) * time.Second)
return false return false
} }

View File

@ -29,6 +29,8 @@ import (
func init() { func init() {
sDec, _ := base64.StdEncoding.DecodeString("REDACTED+") sDec, _ := base64.StdEncoding.DecodeString("REDACTED+")
redactedBytes = []byte(string(sDec)) redactedBytes = []byte(string(sDec))
sDec, _ = base64.StdEncoding.DecodeString("DATA+OMITTED")
dataOmittedBytes = []byte(string(sDec))
} }
// IsConfigEmpty returns true if the config is empty. // IsConfigEmpty returns true if the config is empty.
@ -79,7 +81,10 @@ func MinifyConfig(config *Config) error {
return nil return nil
} }
var redactedBytes []byte var (
redactedBytes []byte
dataOmittedBytes []byte
)
// Flatten redacts raw data entries from the config object for a human-readable view. // Flatten redacts raw data entries from the config object for a human-readable view.
func ShortenConfig(config *Config) { func ShortenConfig(config *Config) {
@ -97,7 +102,7 @@ func ShortenConfig(config *Config) {
} }
for key, cluster := range config.Clusters { for key, cluster := range config.Clusters {
if len(cluster.CertificateAuthorityData) > 0 { if len(cluster.CertificateAuthorityData) > 0 {
cluster.CertificateAuthorityData = redactedBytes cluster.CertificateAuthorityData = dataOmittedBytes
} }
config.Clusters[key] = cluster config.Clusters[key] = cluster
} }

View File

@ -30,8 +30,8 @@ import (
spdy "k8s.io/client-go/transport/spdy" spdy "k8s.io/client-go/transport/spdy"
) )
// StreamOptions holds information pertaining to the current streaming session: supported stream // StreamOptions holds information pertaining to the current streaming session:
// protocols, input/output streams, if the client is requesting a TTY, and a terminal size queue to // input/output streams, if the client is requesting a TTY, and a terminal size queue to
// support terminal resizing. // support terminal resizing.
type StreamOptions struct { type StreamOptions struct {
Stdin io.Reader Stdin io.Reader

View File

@ -129,7 +129,7 @@ func SetAuthProxyHeaders(req *http.Request, username string, groups []string, ex
} }
for key, values := range extra { for key, values := range extra {
for _, value := range values { for _, value := range values {
req.Header.Add("X-Remote-Extra-"+key, value) req.Header.Add("X-Remote-Extra-"+headerKeyEscape(key), value)
} }
} }
} }
@ -138,7 +138,7 @@ func (rt *authProxyRoundTripper) CancelRequest(req *http.Request) {
if canceler, ok := rt.rt.(requestCanceler); ok { if canceler, ok := rt.rt.(requestCanceler); ok {
canceler.CancelRequest(req) canceler.CancelRequest(req)
} else { } else {
glog.Errorf("CancelRequest not implemented") glog.Errorf("CancelRequest not implemented by %T", rt.rt)
} }
} }
@ -166,7 +166,7 @@ func (rt *userAgentRoundTripper) CancelRequest(req *http.Request) {
if canceler, ok := rt.rt.(requestCanceler); ok { if canceler, ok := rt.rt.(requestCanceler); ok {
canceler.CancelRequest(req) canceler.CancelRequest(req)
} else { } else {
glog.Errorf("CancelRequest not implemented") glog.Errorf("CancelRequest not implemented by %T", rt.rt)
} }
} }
@ -197,7 +197,7 @@ func (rt *basicAuthRoundTripper) CancelRequest(req *http.Request) {
if canceler, ok := rt.rt.(requestCanceler); ok { if canceler, ok := rt.rt.(requestCanceler); ok {
canceler.CancelRequest(req) canceler.CancelRequest(req)
} else { } else {
glog.Errorf("CancelRequest not implemented") glog.Errorf("CancelRequest not implemented by %T", rt.rt)
} }
} }
@ -246,7 +246,7 @@ func (rt *impersonatingRoundTripper) RoundTrip(req *http.Request) (*http.Respons
} }
for k, vv := range rt.impersonate.Extra { for k, vv := range rt.impersonate.Extra {
for _, v := range vv { for _, v := range vv {
req.Header.Add(ImpersonateUserExtraHeaderPrefix+k, v) req.Header.Add(ImpersonateUserExtraHeaderPrefix+headerKeyEscape(k), v)
} }
} }
@ -257,7 +257,7 @@ func (rt *impersonatingRoundTripper) CancelRequest(req *http.Request) {
if canceler, ok := rt.delegate.(requestCanceler); ok { if canceler, ok := rt.delegate.(requestCanceler); ok {
canceler.CancelRequest(req) canceler.CancelRequest(req)
} else { } else {
glog.Errorf("CancelRequest not implemented") glog.Errorf("CancelRequest not implemented by %T", rt.delegate)
} }
} }
@ -288,7 +288,7 @@ func (rt *bearerAuthRoundTripper) CancelRequest(req *http.Request) {
if canceler, ok := rt.rt.(requestCanceler); ok { if canceler, ok := rt.rt.(requestCanceler); ok {
canceler.CancelRequest(req) canceler.CancelRequest(req)
} else { } else {
glog.Errorf("CancelRequest not implemented") glog.Errorf("CancelRequest not implemented by %T", rt.rt)
} }
} }
@ -372,7 +372,7 @@ func (rt *debuggingRoundTripper) CancelRequest(req *http.Request) {
if canceler, ok := rt.delegatedRoundTripper.(requestCanceler); ok { if canceler, ok := rt.delegatedRoundTripper.(requestCanceler); ok {
canceler.CancelRequest(req) canceler.CancelRequest(req)
} else { } else {
glog.Errorf("CancelRequest not implemented") glog.Errorf("CancelRequest not implemented by %T", rt.delegatedRoundTripper)
} }
} }
@ -422,3 +422,110 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e
func (rt *debuggingRoundTripper) WrappedRoundTripper() http.RoundTripper { func (rt *debuggingRoundTripper) WrappedRoundTripper() http.RoundTripper {
return rt.delegatedRoundTripper return rt.delegatedRoundTripper
} }
func legalHeaderByte(b byte) bool {
return int(b) < len(legalHeaderKeyBytes) && legalHeaderKeyBytes[b]
}
func shouldEscape(b byte) bool {
// url.PathUnescape() returns an error if any '%' is not followed by two
// hexadecimal digits, so we'll intentionally encode it.
return !legalHeaderByte(b) || b == '%'
}
func headerKeyEscape(key string) string {
buf := strings.Builder{}
for i := 0; i < len(key); i++ {
b := key[i]
if shouldEscape(b) {
// %-encode bytes that should be escaped:
// https://tools.ietf.org/html/rfc3986#section-2.1
fmt.Fprintf(&buf, "%%%02X", b)
continue
}
buf.WriteByte(b)
}
return buf.String()
}
// legalHeaderKeyBytes was copied from net/http/lex.go's isTokenTable.
// See https://httpwg.github.io/specs/rfc7230.html#rule.token.separators
var legalHeaderKeyBytes = [127]bool{
'%': true,
'!': true,
'#': true,
'$': true,
'&': true,
'\'': true,
'*': true,
'+': true,
'-': true,
'.': true,
'0': true,
'1': true,
'2': true,
'3': true,
'4': true,
'5': true,
'6': true,
'7': true,
'8': true,
'9': true,
'A': true,
'B': true,
'C': true,
'D': true,
'E': true,
'F': true,
'G': true,
'H': true,
'I': true,
'J': true,
'K': true,
'L': true,
'M': true,
'N': true,
'O': true,
'P': true,
'Q': true,
'R': true,
'S': true,
'T': true,
'U': true,
'W': true,
'V': true,
'X': true,
'Y': true,
'Z': true,
'^': true,
'_': true,
'`': true,
'a': true,
'b': true,
'c': true,
'd': true,
'e': true,
'f': true,
'g': true,
'h': true,
'i': true,
'j': true,
'k': true,
'l': true,
'm': true,
'n': true,
'o': true,
'p': true,
'q': true,
'r': true,
's': true,
't': true,
'u': true,
'v': true,
'w': true,
'x': true,
'y': true,
'z': true,
'|': true,
'~': true,
}

View File

@ -20,6 +20,7 @@ import (
"bytes" "bytes"
"crypto/ecdsa" "crypto/ecdsa"
"crypto/elliptic" "crypto/elliptic"
"crypto/rand"
cryptorand "crypto/rand" cryptorand "crypto/rand"
"crypto/rsa" "crypto/rsa"
"crypto/x509" "crypto/x509"
@ -27,9 +28,12 @@ import (
"encoding/pem" "encoding/pem"
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"math" "math"
"math/big" "math/big"
"net" "net"
"path"
"strings"
"time" "time"
) )
@ -84,7 +88,7 @@ func NewSelfSignedCACert(cfg Config, key *rsa.PrivateKey) (*x509.Certificate, er
// NewSignedCert creates a signed certificate using the given CA certificate and key // NewSignedCert creates a signed certificate using the given CA certificate and key
func NewSignedCert(cfg Config, key *rsa.PrivateKey, caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, error) { func NewSignedCert(cfg Config, key *rsa.PrivateKey, caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, error) {
serial, err := cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64)) serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -136,8 +140,38 @@ func MakeEllipticPrivateKeyPEM() ([]byte, error) {
// GenerateSelfSignedCertKey creates a self-signed certificate and key for the given host. // GenerateSelfSignedCertKey creates a self-signed certificate and key for the given host.
// Host may be an IP or a DNS name // Host may be an IP or a DNS name
// You may also specify additional subject alt names (either ip or dns names) for the certificate // You may also specify additional subject alt names (either ip or dns names) for the certificate.
func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS []string) ([]byte, []byte, error) { func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS []string) ([]byte, []byte, error) {
return GenerateSelfSignedCertKeyWithFixtures(host, alternateIPs, alternateDNS, "")
}
// GenerateSelfSignedCertKeyWithFixtures creates a self-signed certificate and key for the given host.
// Host may be an IP or a DNS name. You may also specify additional subject alt names (either ip or dns names)
// for the certificate.
//
// If fixtureDirectory is non-empty, it is a directory path which can contain pre-generated certs. The format is:
// <host>_<ip>-<ip>_<alternateDNS>-<alternateDNS>.crt
// <host>_<ip>-<ip>_<alternateDNS>-<alternateDNS>.key
// Certs/keys not existing in that directory are created.
func GenerateSelfSignedCertKeyWithFixtures(host string, alternateIPs []net.IP, alternateDNS []string, fixtureDirectory string) ([]byte, []byte, error) {
validFrom := time.Now().Add(-time.Hour) // valid an hour earlier to avoid flakes due to clock skew
maxAge := time.Hour * 24 * 365 // one year self-signed certs
baseName := fmt.Sprintf("%s_%s_%s", host, strings.Join(ipsToStrings(alternateIPs), "-"), strings.Join(alternateDNS, "-"))
certFixturePath := path.Join(fixtureDirectory, baseName+".crt")
keyFixturePath := path.Join(fixtureDirectory, baseName+".key")
if len(fixtureDirectory) > 0 {
cert, err := ioutil.ReadFile(certFixturePath)
if err == nil {
key, err := ioutil.ReadFile(keyFixturePath)
if err == nil {
return cert, key, nil
}
return nil, nil, fmt.Errorf("cert %s can be read, but key %s cannot: %v", certFixturePath, keyFixturePath, err)
}
maxAge = 100 * time.Hour * 24 * 365 // 100 years fixtures
}
caKey, err := rsa.GenerateKey(cryptorand.Reader, 2048) caKey, err := rsa.GenerateKey(cryptorand.Reader, 2048)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -148,8 +182,8 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS
Subject: pkix.Name{ Subject: pkix.Name{
CommonName: fmt.Sprintf("%s-ca@%d", host, time.Now().Unix()), CommonName: fmt.Sprintf("%s-ca@%d", host, time.Now().Unix()),
}, },
NotBefore: time.Now(), NotBefore: validFrom,
NotAfter: time.Now().Add(time.Hour * 24 * 365), NotAfter: validFrom.Add(maxAge),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
BasicConstraintsValid: true, BasicConstraintsValid: true,
@ -176,8 +210,8 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS
Subject: pkix.Name{ Subject: pkix.Name{
CommonName: fmt.Sprintf("%s@%d", host, time.Now().Unix()), CommonName: fmt.Sprintf("%s@%d", host, time.Now().Unix()),
}, },
NotBefore: time.Now(), NotBefore: validFrom,
NotAfter: time.Now().Add(time.Hour * 24 * 365), NotAfter: validFrom.Add(maxAge),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
@ -213,6 +247,15 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS
return nil, nil, err return nil, nil, err
} }
if len(fixtureDirectory) > 0 {
if err := ioutil.WriteFile(certFixturePath, certBuffer.Bytes(), 0644); err != nil {
return nil, nil, fmt.Errorf("failed to write cert fixture to %s: %v", certFixturePath, err)
}
if err := ioutil.WriteFile(keyFixturePath, keyBuffer.Bytes(), 0644); err != nil {
return nil, nil, fmt.Errorf("failed to write key fixture to %s: %v", certFixturePath, err)
}
}
return certBuffer.Bytes(), keyBuffer.Bytes(), nil return certBuffer.Bytes(), keyBuffer.Bytes(), nil
} }
@ -243,3 +286,11 @@ func FormatCert(c *x509.Certificate) string {
} }
return res return res
} }
func ipsToStrings(ips []net.IP) []string {
ss := make([]string, 0, len(ips))
for _, ip := range ips {
ss = append(ss, ip.String())
}
return ss
}

8
vendor/k8s.io/kubernetes/README.md generated vendored
View File

@ -76,11 +76,11 @@ That said, if you have questions, reach out to us
[Go environment]: https://golang.org/doc/install [Go environment]: https://golang.org/doc/install
[GoDoc]: https://godoc.org/k8s.io/kubernetes [GoDoc]: https://godoc.org/k8s.io/kubernetes
[GoDoc Widget]: https://godoc.org/k8s.io/kubernetes?status.svg [GoDoc Widget]: https://godoc.org/k8s.io/kubernetes?status.svg
[interactive tutorial]: http://kubernetes.io/docs/tutorials/kubernetes-basics [interactive tutorial]: https://kubernetes.io/docs/tutorials/kubernetes-basics
[kubernetes.io]: http://kubernetes.io [kubernetes.io]: https://kubernetes.io
[Scalable Microservices with Kubernetes]: https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615 [Scalable Microservices with Kubernetes]: https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615
[Submit Queue]: http://submit-queue.k8s.io/#/ci [Submit Queue]: https://submit-queue.k8s.io/#/ci
[Submit Queue Widget]: http://submit-queue.k8s.io/health.svg?v=1 [Submit Queue Widget]: https://submit-queue.k8s.io/health.svg?v=1
[troubleshooting guide]: https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/ [troubleshooting guide]: https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/README.md?pixel)]() [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/README.md?pixel)]()

View File

@ -24,12 +24,13 @@ The following scripts are found in the `build/` directory. Note that all scripts
* `build/run.sh`: Run a command in a build docker container. Common invocations: * `build/run.sh`: Run a command in a build docker container. Common invocations:
* `build/run.sh make`: Build just linux binaries in the container. Pass options and packages as necessary. * `build/run.sh make`: Build just linux binaries in the container. Pass options and packages as necessary.
* `build/run.sh make cross`: Build all binaries for all platforms * `build/run.sh make cross`: Build all binaries for all platforms
* `build/run.sh make kubectl KUBE_BUILD_PLATFORMS=darwin/amd64`: Build the specific binary for the specific platform (`kubectl` and `darwin/amd64` respectively in this example)
* `build/run.sh make test`: Run all unit tests * `build/run.sh make test`: Run all unit tests
* `build/run.sh make test-integration`: Run integration test * `build/run.sh make test-integration`: Run integration test
* `build/run.sh make test-cmd`: Run CLI tests * `build/run.sh make test-cmd`: Run CLI tests
* `build/copy-output.sh`: This will copy the contents of `_output/dockerized/bin` from the Docker container to the local `_output/dockerized/bin`. It will also copy out specific file patterns that are generated as part of the build process. This is run automatically as part of `build/run.sh`. * `build/copy-output.sh`: This will copy the contents of `_output/dockerized/bin` from the Docker container to the local `_output/dockerized/bin`. It will also copy out specific file patterns that are generated as part of the build process. This is run automatically as part of `build/run.sh`.
* `build/make-clean.sh`: Clean out the contents of `_output`, remove any locally built container images and remove the data container. * `build/make-clean.sh`: Clean out the contents of `_output`, remove any locally built container images and remove the data container.
* `/build/shell.sh`: Drop into a `bash` shell in a build container with a snapshot of the current repo code. * `build/shell.sh`: Drop into a `bash` shell in a build container with a snapshot of the current repo code.
## Basic Flow ## Basic Flow

View File

@ -35,6 +35,8 @@ const (
NamespaceSystem string = "kube-system" NamespaceSystem string = "kube-system"
// NamespacePublic is the namespace where we place public info (ConfigMaps) // NamespacePublic is the namespace where we place public info (ConfigMaps)
NamespacePublic string = "kube-public" NamespacePublic string = "kube-public"
// NamespaceNodeLease is the namespace where we place node lease objects (used for node heartbeats)
NamespaceNodeLease string = "kube-node-lease"
// TerminationMessagePathDefault means the default path to capture the application termination message running in a container // TerminationMessagePathDefault means the default path to capture the application termination message running in a container
TerminationMessagePathDefault string = "/dev/termination-log" TerminationMessagePathDefault string = "/dev/termination-log"
) )
@ -411,6 +413,16 @@ type PersistentVolumeClaimSpec struct {
// This is an alpha feature and may change in the future. // This is an alpha feature and may change in the future.
// +optional // +optional
VolumeMode *PersistentVolumeMode VolumeMode *PersistentVolumeMode
// This field requires the VolumeSnapshotDataSource alpha feature gate to be
// enabled and currently VolumeSnapshot is the only supported data source.
// If the provisioner can support VolumeSnapshot data source, it will create
// a new volume and data will be restored to the volume at the same time.
// If the provisioner does not support VolumeSnapshot data source, volume will
// not be created and the failure will be reported as an event.
// In the future, we plan to support more data source types and the behavior
// of the provisioner may change.
// +optional
DataSource *TypedLocalObjectReference
} }
type PersistentVolumeClaimConditionType string type PersistentVolumeClaimConditionType string
@ -562,6 +574,8 @@ const (
ProtocolTCP Protocol = "TCP" ProtocolTCP Protocol = "TCP"
// ProtocolUDP is the UDP protocol. // ProtocolUDP is the UDP protocol.
ProtocolUDP Protocol = "UDP" ProtocolUDP Protocol = "UDP"
// ProtocolSCTP is the SCTP protocol.
ProtocolSCTP Protocol = "SCTP"
) )
// Represents a Persistent Disk resource in Google Compute Engine. // Represents a Persistent Disk resource in Google Compute Engine.
@ -1264,6 +1278,7 @@ type ScaleIOVolumeSource struct {
// +optional // +optional
StoragePool string StoragePool string
// Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.
// Default is ThinProvisioned.
// +optional // +optional
StorageMode string StorageMode string
// The name of a volume already created in the ScaleIO system // The name of a volume already created in the ScaleIO system
@ -1271,7 +1286,8 @@ type ScaleIOVolumeSource struct {
VolumeName string VolumeName string
// Filesystem type to mount. // Filesystem type to mount.
// Must be a filesystem type supported by the host operating system. // Must be a filesystem type supported by the host operating system.
// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // Ex. "ext4", "xfs", "ntfs".
// Default is "xfs".
// +optional // +optional
FSType string FSType string
// Defaults to false (read/write). ReadOnly here will force // Defaults to false (read/write). ReadOnly here will force
@ -1300,6 +1316,7 @@ type ScaleIOPersistentVolumeSource struct {
// +optional // +optional
StoragePool string StoragePool string
// Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.
// Default is ThinProvisioned.
// +optional // +optional
StorageMode string StorageMode string
// The name of a volume created in the ScaleIO system // The name of a volume created in the ScaleIO system
@ -1307,7 +1324,8 @@ type ScaleIOPersistentVolumeSource struct {
VolumeName string VolumeName string
// Filesystem type to mount. // Filesystem type to mount.
// Must be a filesystem type supported by the host operating system. // Must be a filesystem type supported by the host operating system.
// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // Ex. "ext4", "xfs", "ntfs".
// Default is "xfs".
// +optional // +optional
FSType string FSType string
// Defaults to false (read/write). ReadOnly here will force // Defaults to false (read/write). ReadOnly here will force
@ -1519,7 +1537,7 @@ type CSIPersistentVolumeSource struct {
// Filesystem type to mount. // Filesystem type to mount.
// Must be a filesystem type supported by the host operating system. // Must be a filesystem type supported by the host operating system.
// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // Ex. "ext4", "xfs", "ntfs".
// +optional // +optional
FSType string FSType string
@ -1564,7 +1582,7 @@ type ContainerPort struct {
HostPort int32 HostPort int32
// Required: This must be a valid port number, 0 < x < 65536. // Required: This must be a valid port number, 0 < x < 65536.
ContainerPort int32 ContainerPort int32
// Required: Supports "TCP" and "UDP". // Required: Supports "TCP", "UDP" and "SCTP"
// +optional // +optional
Protocol Protocol Protocol Protocol
// Optional: What host IP to bind the external port to. // Optional: What host IP to bind the external port to.
@ -1589,7 +1607,7 @@ type VolumeMount struct {
SubPath string SubPath string
// mountPropagation determines how mounts are propagated from the host // mountPropagation determines how mounts are propagated from the host
// to container and the other way around. // to container and the other way around.
// When not set, MountPropagationHostToContainer is used. // When not set, MountPropagationNone is used.
// This field is beta in 1.10. // This field is beta in 1.10.
// +optional // +optional
MountPropagation *MountPropagationMode MountPropagation *MountPropagationMode
@ -2567,6 +2585,14 @@ type PodSpec struct {
// More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md
// +optional // +optional
ReadinessGates []PodReadinessGate ReadinessGates []PodReadinessGate
// RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used
// to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run.
// If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an
// empty definition that uses the default runtime handler.
// More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md
// This is an alpha feature and may change in the future.
// +optional
RuntimeClassName *string
} }
// HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the // HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the
@ -2609,7 +2635,7 @@ type PodSecurityContext struct {
// in the same pod, and the first process in each container will not be assigned PID 1. // in the same pod, and the first process in each container will not be assigned PID 1.
// HostPID and ShareProcessNamespace cannot both be set. // HostPID and ShareProcessNamespace cannot both be set.
// Optional: Default to false. // Optional: Default to false.
// This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature. // This field is beta-level and may be disabled with the PodShareProcessNamespace feature.
// +k8s:conversion-gen=false // +k8s:conversion-gen=false
// +optional // +optional
ShareProcessNamespace *bool ShareProcessNamespace *bool
@ -3161,7 +3187,7 @@ type ServicePort struct {
// the 'Name' field in EndpointPort objects. // the 'Name' field in EndpointPort objects.
Name string Name string
// The IP protocol for this port. Supports "TCP" and "UDP". // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP".
Protocol Protocol Protocol Protocol
// The port that will be exposed on the service. // The port that will be exposed on the service.
@ -3944,6 +3970,16 @@ type LocalObjectReference struct {
Name string Name string
} }
// TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace.
type TypedLocalObjectReference struct {
// APIGroup is the group for the resource being referenced
APIGroup string
// Kind is the type of resource being referenced
Kind string
// Name is the name of resource being referenced
Name string
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type SerializedReference struct { type SerializedReference struct {

File diff suppressed because it is too large Load Diff

View File

@ -160,17 +160,20 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
type Protocol int32 type Protocol int32
const ( const (
Protocol_TCP Protocol = 0 Protocol_TCP Protocol = 0
Protocol_UDP Protocol = 1 Protocol_UDP Protocol = 1
Protocol_SCTP Protocol = 2
) )
var Protocol_name = map[int32]string{ var Protocol_name = map[int32]string{
0: "TCP", 0: "TCP",
1: "UDP", 1: "UDP",
2: "SCTP",
} }
var Protocol_value = map[string]int32{ var Protocol_value = map[string]int32{
"TCP": 0, "TCP": 0,
"UDP": 1, "UDP": 1,
"SCTP": 2,
} }
func (x Protocol) String() string { func (x Protocol) String() string {
@ -842,6 +845,12 @@ func (m *PodSandboxConfig) GetLinux() *LinuxPodSandboxConfig {
type RunPodSandboxRequest struct { type RunPodSandboxRequest struct {
// Configuration for creating a PodSandbox. // Configuration for creating a PodSandbox.
Config *PodSandboxConfig `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"` Config *PodSandboxConfig `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"`
// Named runtime configuration to use for this PodSandbox.
// If the runtime handler is unknown, this request should be rejected. An
// empty string should select the default handler, equivalent to the
// behavior before this feature was added.
// See https://git.k8s.io/community/keps/sig-node/0014-runtime-class.md
RuntimeHandler string `protobuf:"bytes,2,opt,name=runtime_handler,json=runtimeHandler,proto3" json:"runtime_handler,omitempty"`
} }
func (m *RunPodSandboxRequest) Reset() { *m = RunPodSandboxRequest{} } func (m *RunPodSandboxRequest) Reset() { *m = RunPodSandboxRequest{} }
@ -855,6 +864,13 @@ func (m *RunPodSandboxRequest) GetConfig() *PodSandboxConfig {
return nil return nil
} }
func (m *RunPodSandboxRequest) GetRuntimeHandler() string {
if m != nil {
return m.RuntimeHandler
}
return ""
}
type RunPodSandboxResponse struct { type RunPodSandboxResponse struct {
// ID of the PodSandbox to run. // ID of the PodSandbox to run.
PodSandboxId string `protobuf:"bytes,1,opt,name=pod_sandbox_id,json=podSandboxId,proto3" json:"pod_sandbox_id,omitempty"` PodSandboxId string `protobuf:"bytes,1,opt,name=pod_sandbox_id,json=podSandboxId,proto3" json:"pod_sandbox_id,omitempty"`
@ -1497,6 +1513,12 @@ type LinuxContainerSecurityContext struct {
// no_new_privs defines if the flag for no_new_privs should be set on the // no_new_privs defines if the flag for no_new_privs should be set on the
// container. // container.
NoNewPrivs bool `protobuf:"varint,11,opt,name=no_new_privs,json=noNewPrivs,proto3" json:"no_new_privs,omitempty"` NoNewPrivs bool `protobuf:"varint,11,opt,name=no_new_privs,json=noNewPrivs,proto3" json:"no_new_privs,omitempty"`
// masked_paths is a slice of paths that should be masked by the container
// runtime, this can be passed directly to the OCI spec.
MaskedPaths []string `protobuf:"bytes,13,rep,name=masked_paths,json=maskedPaths" json:"masked_paths,omitempty"`
// readonly_paths is a slice of paths that should be set as readonly by the
// container runtime, this can be passed directly to the OCI spec.
ReadonlyPaths []string `protobuf:"bytes,14,rep,name=readonly_paths,json=readonlyPaths" json:"readonly_paths,omitempty"`
} }
func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} } func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} }
@ -1589,6 +1611,20 @@ func (m *LinuxContainerSecurityContext) GetNoNewPrivs() bool {
return false return false
} }
func (m *LinuxContainerSecurityContext) GetMaskedPaths() []string {
if m != nil {
return m.MaskedPaths
}
return nil
}
func (m *LinuxContainerSecurityContext) GetReadonlyPaths() []string {
if m != nil {
return m.ReadonlyPaths
}
return nil
}
// LinuxContainerConfig contains platform-specific configuration for // LinuxContainerConfig contains platform-specific configuration for
// Linux-based containers. // Linux-based containers.
type LinuxContainerConfig struct { type LinuxContainerConfig struct {
@ -5413,6 +5449,12 @@ func (m *RunPodSandboxRequest) MarshalTo(dAtA []byte) (int, error) {
} }
i += n11 i += n11
} }
if len(m.RuntimeHandler) > 0 {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(len(m.RuntimeHandler)))
i += copy(dAtA[i:], m.RuntimeHandler)
}
return i, nil return i, nil
} }
@ -6321,6 +6363,36 @@ func (m *LinuxContainerSecurityContext) MarshalTo(dAtA []byte) (int, error) {
} }
i += n27 i += n27
} }
if len(m.MaskedPaths) > 0 {
for _, s := range m.MaskedPaths {
dAtA[i] = 0x6a
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
if len(m.ReadonlyPaths) > 0 {
for _, s := range m.ReadonlyPaths {
dAtA[i] = 0x72
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
return i, nil return i, nil
} }
@ -9260,6 +9332,10 @@ func (m *RunPodSandboxRequest) Size() (n int) {
l = m.Config.Size() l = m.Config.Size()
n += 1 + l + sovApi(uint64(l)) n += 1 + l + sovApi(uint64(l))
} }
l = len(m.RuntimeHandler)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
return n return n
} }
@ -9643,6 +9719,18 @@ func (m *LinuxContainerSecurityContext) Size() (n int) {
l = m.RunAsGroup.Size() l = m.RunAsGroup.Size()
n += 1 + l + sovApi(uint64(l)) n += 1 + l + sovApi(uint64(l))
} }
if len(m.MaskedPaths) > 0 {
for _, s := range m.MaskedPaths {
l = len(s)
n += 1 + l + sovApi(uint64(l))
}
}
if len(m.ReadonlyPaths) > 0 {
for _, s := range m.ReadonlyPaths {
l = len(s)
n += 1 + l + sovApi(uint64(l))
}
}
return n return n
} }
@ -10931,6 +11019,7 @@ func (this *RunPodSandboxRequest) String() string {
} }
s := strings.Join([]string{`&RunPodSandboxRequest{`, s := strings.Join([]string{`&RunPodSandboxRequest{`,
`Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "PodSandboxConfig", "PodSandboxConfig", 1) + `,`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "PodSandboxConfig", "PodSandboxConfig", 1) + `,`,
`RuntimeHandler:` + fmt.Sprintf("%v", this.RuntimeHandler) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -11247,6 +11336,8 @@ func (this *LinuxContainerSecurityContext) String() string {
`SeccompProfilePath:` + fmt.Sprintf("%v", this.SeccompProfilePath) + `,`, `SeccompProfilePath:` + fmt.Sprintf("%v", this.SeccompProfilePath) + `,`,
`NoNewPrivs:` + fmt.Sprintf("%v", this.NoNewPrivs) + `,`, `NoNewPrivs:` + fmt.Sprintf("%v", this.NoNewPrivs) + `,`,
`RunAsGroup:` + strings.Replace(fmt.Sprintf("%v", this.RunAsGroup), "Int64Value", "Int64Value", 1) + `,`, `RunAsGroup:` + strings.Replace(fmt.Sprintf("%v", this.RunAsGroup), "Int64Value", "Int64Value", 1) + `,`,
`MaskedPaths:` + fmt.Sprintf("%v", this.MaskedPaths) + `,`,
`ReadonlyPaths:` + fmt.Sprintf("%v", this.ReadonlyPaths) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -14250,6 +14341,35 @@ func (m *RunPodSandboxRequest) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field RuntimeHandler", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.RuntimeHandler = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:]) skippy, err := skipApi(dAtA[iNdEx:])
@ -17509,6 +17629,64 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 13:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field MaskedPaths", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.MaskedPaths = append(m.MaskedPaths, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 14:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ReadonlyPaths", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ReadonlyPaths = append(m.ReadonlyPaths, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:]) skippy, err := skipApi(dAtA[iNdEx:])
@ -26658,38 +26836,38 @@ var (
func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } func init() { proto.RegisterFile("api.proto", fileDescriptorApi) }
var fileDescriptorApi = []byte{ var fileDescriptorApi = []byte{
// 4649 bytes of a gzipped FileDescriptorProto // 4698 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5c, 0xcd, 0x6f, 0x1b, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5c, 0xcd, 0x6f, 0x1b, 0x49,
0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0xdb, 0xb2, 0xd5, 0x1e, 0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0xdb, 0xb2, 0xd5, 0x1e,
0x7f, 0xce, 0x58, 0x1e, 0x6b, 0x76, 0x3d, 0xb1, 0x3d, 0x6b, 0x9b, 0x96, 0x64, 0x9b, 0x59, 0x9b, 0x7f, 0xce, 0x58, 0x1e, 0x6b, 0x76, 0x3d, 0xb1, 0x3d, 0x6b, 0x9b, 0x96, 0x64, 0x9b, 0x59, 0x9b,
0x52, 0x9a, 0xd2, 0x7c, 0xec, 0x0c, 0xd0, 0xdb, 0x62, 0x97, 0xa8, 0x5e, 0x93, 0x5d, 0x3d, 0xdd, 0x52, 0x9a, 0xd2, 0x7c, 0xec, 0x0c, 0xd0, 0xdb, 0x62, 0x97, 0xa8, 0x5e, 0x93, 0x5d, 0x3d, 0xdd,
0x4d, 0xdb, 0xca, 0x21, 0x58, 0x20, 0xc8, 0x1e, 0x02, 0x04, 0xc8, 0x79, 0x8f, 0x9b, 0x43, 0x0e, 0x4d, 0xdb, 0x4a, 0x80, 0x60, 0x81, 0x20, 0x7b, 0x08, 0x10, 0x20, 0xe7, 0x1c, 0x37, 0x87, 0x1c,
0xb9, 0x05, 0x08, 0x72, 0xc8, 0x69, 0x83, 0x3d, 0xec, 0x25, 0x40, 0x4e, 0x8b, 0x7c, 0x5c, 0x32, 0x72, 0x0b, 0x10, 0xe4, 0x90, 0xd3, 0x06, 0x7b, 0xd8, 0x4b, 0x80, 0x9c, 0x16, 0xf9, 0xb8, 0x64,
0x13, 0xe4, 0x92, 0x43, 0x90, 0x3f, 0x20, 0x87, 0xa0, 0xbe, 0x9a, 0xfd, 0xc9, 0x0f, 0x8f, 0x77, 0x26, 0xc9, 0x25, 0x87, 0x20, 0x7f, 0x40, 0x0e, 0x41, 0x7d, 0x35, 0xfb, 0x93, 0x1f, 0x1e, 0xef,
0x67, 0xf6, 0xa4, 0xae, 0xd7, 0xef, 0xbd, 0x7a, 0xf5, 0xea, 0xf5, 0xab, 0x57, 0xbf, 0x2a, 0x0a, 0xce, 0xe4, 0xa4, 0xae, 0xd7, 0xef, 0xbd, 0x7a, 0xf5, 0xea, 0xf5, 0xab, 0x57, 0xbf, 0x2a, 0x0a,
0x8a, 0x86, 0x63, 0xad, 0x3b, 0x2e, 0xf1, 0x09, 0xaa, 0xb8, 0x7d, 0xdb, 0xb7, 0x7a, 0x78, 0xfd, 0x8a, 0x86, 0x63, 0xad, 0x3b, 0x2e, 0xf1, 0x09, 0xaa, 0xb8, 0x7d, 0xdb, 0xb7, 0x7a, 0x78, 0xfd,
0xe5, 0x2d, 0xa3, 0xeb, 0x1c, 0x19, 0x1b, 0xb5, 0x1b, 0x1d, 0xcb, 0x3f, 0xea, 0x1f, 0xac, 0xb7, 0xe5, 0x2d, 0xa3, 0xeb, 0x1c, 0x19, 0x1b, 0xb5, 0x1b, 0x1d, 0xcb, 0x3f, 0xea, 0x1f, 0xac, 0xb7,
0x49, 0xef, 0x66, 0x87, 0x74, 0xc8, 0x4d, 0xc6, 0x78, 0xd0, 0x3f, 0x64, 0x2d, 0xd6, 0x60, 0x4f, 0x49, 0xef, 0x66, 0x87, 0x74, 0xc8, 0x4d, 0xc6, 0x78, 0xd0, 0x3f, 0x64, 0x2d, 0xd6, 0x60, 0x4f,
0x5c, 0x81, 0x7a, 0x1d, 0x16, 0x3e, 0xc6, 0xae, 0x67, 0x11, 0x5b, 0xc3, 0x5f, 0xf6, 0xb1, 0xe7, 0x5c, 0x81, 0x7a, 0x1d, 0x16, 0x3e, 0xc6, 0xae, 0x67, 0x11, 0x5b, 0xc3, 0x5f, 0xf6, 0xb1, 0xe7,
0xa3, 0x2a, 0xcc, 0xbd, 0xe4, 0x94, 0xaa, 0x72, 0x41, 0xb9, 0x5a, 0xd4, 0x64, 0x53, 0xfd, 0x6b, 0xa3, 0x2a, 0xcc, 0xbd, 0xe4, 0x94, 0xaa, 0x72, 0x41, 0xb9, 0x5a, 0xd4, 0x64, 0x53, 0xfd, 0x4b,
0x05, 0x16, 0x03, 0x66, 0xcf, 0x21, 0xb6, 0x87, 0xb3, 0xb9, 0xd1, 0x1a, 0xcc, 0x0b, 0xe3, 0x74, 0x05, 0x16, 0x03, 0x66, 0xcf, 0x21, 0xb6, 0x87, 0xb3, 0xb9, 0xd1, 0x1a, 0xcc, 0x0b, 0xe3, 0x74,
0xdb, 0xe8, 0xe1, 0x6a, 0x8e, 0xbd, 0x2e, 0x09, 0x5a, 0xd3, 0xe8, 0x61, 0x74, 0x05, 0x16, 0x25, 0xdb, 0xe8, 0xe1, 0x6a, 0x8e, 0xbd, 0x2e, 0x09, 0x5a, 0xd3, 0xe8, 0x61, 0x74, 0x05, 0x16, 0x25,
0x8b, 0x54, 0x92, 0x67, 0x5c, 0x0b, 0x82, 0x2c, 0x7a, 0x43, 0xeb, 0x70, 0x42, 0x32, 0x1a, 0x8e, 0x8b, 0x54, 0x92, 0x67, 0x5c, 0x0b, 0x82, 0x2c, 0x7a, 0x43, 0xeb, 0x70, 0x42, 0x32, 0x1a, 0x8e,
0x15, 0x30, 0x4f, 0x33, 0xe6, 0x25, 0xf1, 0xaa, 0xee, 0x58, 0x82, 0x5f, 0xfd, 0x1c, 0x8a, 0x5b, 0x15, 0x30, 0x4f, 0x33, 0xe6, 0x25, 0xf1, 0xaa, 0xee, 0x58, 0x82, 0x5f, 0xfd, 0x1c, 0x8a, 0x5b,
0xcd, 0xd6, 0x26, 0xb1, 0x0f, 0xad, 0x0e, 0x35, 0xd1, 0xc3, 0x2e, 0x95, 0xa9, 0x2a, 0x17, 0xf2, 0xcd, 0xd6, 0x26, 0xb1, 0x0f, 0xad, 0x0e, 0x35, 0xd1, 0xc3, 0x2e, 0x95, 0xa9, 0x2a, 0x17, 0xf2,
0xd4, 0x44, 0xd1, 0x44, 0x35, 0x28, 0x78, 0xd8, 0x70, 0xdb, 0x47, 0xd8, 0xab, 0xe6, 0xd8, 0xab, 0xd4, 0x44, 0xd1, 0x44, 0x35, 0x28, 0x78, 0xd8, 0x70, 0xdb, 0x47, 0xd8, 0xab, 0xe6, 0xd8, 0xab,
0xa0, 0x4d, 0xa5, 0x88, 0xe3, 0x5b, 0xc4, 0xf6, 0xaa, 0x79, 0x2e, 0x25, 0x9a, 0xea, 0x2f, 0x14, 0xa0, 0x4d, 0xa5, 0x88, 0xe3, 0x5b, 0xc4, 0xf6, 0xaa, 0x79, 0x2e, 0x25, 0x9a, 0xea, 0xcf, 0x15,
0x28, 0xed, 0x12, 0xd7, 0x7f, 0x6e, 0x38, 0x8e, 0x65, 0x77, 0xd0, 0x6d, 0x28, 0x30, 0x5f, 0xb6, 0x28, 0xed, 0x12, 0xd7, 0x7f, 0x6e, 0x38, 0x8e, 0x65, 0x77, 0xd0, 0x6d, 0x28, 0x30, 0x5f, 0xb6,
0x49, 0x97, 0xf9, 0x60, 0x61, 0xa3, 0xb6, 0x1e, 0x9f, 0x96, 0xf5, 0x5d, 0xc1, 0xa1, 0x05, 0xbc, 0x49, 0x97, 0xf9, 0x60, 0x61, 0xa3, 0xb6, 0x1e, 0x9f, 0x96, 0xf5, 0x5d, 0xc1, 0xa1, 0x05, 0xbc,
0xe8, 0x12, 0x2c, 0xb4, 0x89, 0xed, 0x1b, 0x96, 0x8d, 0x5d, 0xdd, 0x21, 0xae, 0xcf, 0x5c, 0x34, 0xe8, 0x12, 0x2c, 0xb4, 0x89, 0xed, 0x1b, 0x96, 0x8d, 0x5d, 0xdd, 0x21, 0xae, 0xcf, 0x5c, 0x34,
0xa3, 0x95, 0x03, 0x2a, 0xed, 0x05, 0x9d, 0x81, 0xe2, 0x11, 0xf1, 0x7c, 0xce, 0x91, 0x67, 0x1c, 0xa3, 0x95, 0x03, 0x2a, 0xed, 0x05, 0x9d, 0x81, 0xe2, 0x11, 0xf1, 0x7c, 0xce, 0x91, 0x67, 0x1c,
0x05, 0x4a, 0x60, 0x2f, 0x57, 0x60, 0x8e, 0xbd, 0xb4, 0x1c, 0xe1, 0x8c, 0x59, 0xda, 0x6c, 0x38, 0x05, 0x4a, 0x60, 0x2f, 0x57, 0x60, 0x8e, 0xbd, 0xb4, 0x1c, 0xe1, 0x8c, 0x59, 0xda, 0x6c, 0x38,
0xea, 0x6f, 0x14, 0x98, 0x79, 0x4e, 0xfa, 0xb6, 0x1f, 0xeb, 0xc6, 0xf0, 0x8f, 0xc4, 0x44, 0x85, 0xea, 0xaf, 0x15, 0x98, 0x79, 0x4e, 0xfa, 0xb6, 0x1f, 0xeb, 0xc6, 0xf0, 0x8f, 0xc4, 0x44, 0x85,
0xba, 0x31, 0xfc, 0xa3, 0x41, 0x37, 0x94, 0x83, 0xcf, 0x15, 0xef, 0x86, 0xbe, 0xac, 0x41, 0xc1, 0xba, 0x31, 0xfc, 0xa3, 0x41, 0x37, 0x94, 0x83, 0xcf, 0x15, 0xef, 0x86, 0xbe, 0xac, 0x41, 0xc1,
0xc5, 0x86, 0x49, 0xec, 0xee, 0x31, 0x33, 0xa1, 0xa0, 0x05, 0x6d, 0x3a, 0x89, 0x1e, 0xee, 0x5a, 0xc5, 0x86, 0x49, 0xec, 0xee, 0x31, 0x33, 0xa1, 0xa0, 0x05, 0x6d, 0x3a, 0x89, 0x1e, 0xee, 0x5a,
0x76, 0xff, 0xb5, 0xee, 0xe2, 0xae, 0x71, 0x80, 0xbb, 0xcc, 0x94, 0x82, 0xb6, 0x20, 0xc8, 0x1a, 0x76, 0xff, 0xb5, 0xee, 0xe2, 0xae, 0x71, 0x80, 0xbb, 0xcc, 0x94, 0x82, 0xb6, 0x20, 0xc8, 0x1a,
0xa7, 0xa2, 0x2d, 0x28, 0x39, 0x2e, 0x71, 0x8c, 0x8e, 0x41, 0xfd, 0x58, 0x9d, 0x61, 0xae, 0x52, 0xa7, 0xa2, 0x2d, 0x28, 0x39, 0x2e, 0x71, 0x8c, 0x8e, 0x41, 0xfd, 0x58, 0x9d, 0x61, 0xae, 0x52,
0x93, 0xae, 0x62, 0x66, 0xef, 0x0e, 0x38, 0xb5, 0xb0, 0x98, 0xfa, 0xb7, 0x0a, 0x2c, 0xd2, 0xe0, 0x93, 0xae, 0x62, 0x66, 0xef, 0x0e, 0x38, 0xb5, 0xb0, 0x98, 0xfa, 0xd7, 0x0a, 0x2c, 0xd2, 0xe0,
0xf1, 0x1c, 0xa3, 0x8d, 0x77, 0xd8, 0x94, 0xa0, 0x3b, 0x30, 0x67, 0x63, 0xff, 0x15, 0x71, 0x5f, 0xf1, 0x1c, 0xa3, 0x8d, 0x77, 0xd8, 0x94, 0xa0, 0x3b, 0x30, 0x67, 0x63, 0xff, 0x15, 0x71, 0x5f,
0x88, 0x09, 0x38, 0x9f, 0xd4, 0x1a, 0xc8, 0x3c, 0x27, 0x26, 0xd6, 0x24, 0x3f, 0xba, 0x05, 0x79, 0x88, 0x09, 0x38, 0x9f, 0xd4, 0x1a, 0xc8, 0x3c, 0x27, 0x26, 0xd6, 0x24, 0x3f, 0xba, 0x05, 0x79,
0xc7, 0x32, 0xd9, 0x80, 0xc7, 0x10, 0xa3, 0xbc, 0x54, 0xc4, 0x72, 0xda, 0xcc, 0x0f, 0xe3, 0x88, 0xc7, 0x32, 0xd9, 0x80, 0xc7, 0x10, 0xa3, 0xbc, 0x54, 0xc4, 0x72, 0xda, 0xcc, 0x0f, 0xe3, 0x88,
@ -26707,16 +26885,16 @@ var fileDescriptorApi = []byte{
0x60, 0xb3, 0x3a, 0xcb, 0x94, 0x86, 0x28, 0xe8, 0x7d, 0x58, 0xf6, 0x70, 0xbb, 0x4d, 0x7a, 0x8e, 0x60, 0xb3, 0x3a, 0xcb, 0x94, 0x86, 0x28, 0xe8, 0x7d, 0x58, 0xf6, 0x70, 0xbb, 0x4d, 0x7a, 0x8e,
0xee, 0xb8, 0xe4, 0xd0, 0xea, 0x62, 0x1e, 0xfd, 0x73, 0x2c, 0xfa, 0x91, 0x78, 0xb7, 0xcb, 0x5f, 0xee, 0xb8, 0xe4, 0xd0, 0xea, 0x62, 0x1e, 0xfd, 0x73, 0x2c, 0xfa, 0x91, 0x78, 0xb7, 0xcb, 0x5f,
0xb1, 0xef, 0xe0, 0x3e, 0xcb, 0x69, 0x74, 0xa4, 0xac, 0xf3, 0x6a, 0x61, 0x8c, 0xa1, 0x02, 0x1b, 0xb1, 0xef, 0xe0, 0x3e, 0xcb, 0x69, 0x74, 0xa4, 0xac, 0xf3, 0x6a, 0x61, 0x8c, 0xa1, 0x02, 0x1b,
0x2a, 0x33, 0x49, 0xfd, 0x45, 0x0e, 0x4e, 0x32, 0x4f, 0xee, 0x12, 0x53, 0x4c, 0xb3, 0x48, 0x52, 0x2a, 0x33, 0x49, 0xfd, 0x79, 0x0e, 0x4e, 0x32, 0x4f, 0xee, 0x12, 0x53, 0x4c, 0xb3, 0x48, 0x52,
0x17, 0xa1, 0xdc, 0x66, 0x3a, 0x75, 0xc7, 0x70, 0xb1, 0xed, 0x8b, 0x8f, 0x74, 0x9e, 0x13, 0x77, 0x17, 0xa1, 0xdc, 0x66, 0x3a, 0x75, 0xc7, 0x70, 0xb1, 0xed, 0x8b, 0x8f, 0x74, 0x9e, 0x13, 0x77,
0x19, 0x0d, 0x7d, 0x0a, 0x15, 0x4f, 0x44, 0x85, 0xde, 0xe6, 0x61, 0x21, 0xe6, 0xec, 0x46, 0xd2, 0x19, 0x0d, 0x7d, 0x0a, 0x15, 0x4f, 0x44, 0x85, 0xde, 0xe6, 0x61, 0x21, 0xe6, 0xec, 0x46, 0xd2,
0x84, 0x21, 0xb1, 0xa4, 0x2d, 0x7a, 0x89, 0xe0, 0x9a, 0xf3, 0x8e, 0xbd, 0xb6, 0xdf, 0xe5, 0xd9, 0x84, 0x21, 0xb1, 0xa4, 0x2d, 0x7a, 0x89, 0xe0, 0x9a, 0xf3, 0x8e, 0xbd, 0xb6, 0xdf, 0xe5, 0xd9,
0xae, 0xb4, 0xf1, 0xbd, 0x0c, 0x85, 0x71, 0xc3, 0xd7, 0x5b, 0x5c, 0x6c, 0xdb, 0xf6, 0xdd, 0x63, 0xae, 0xb4, 0xf1, 0xbd, 0x0c, 0x85, 0x71, 0xc3, 0xd7, 0x5b, 0x5c, 0x6c, 0xdb, 0xf6, 0xdd, 0x63,
0x4d, 0x2a, 0xa9, 0xdd, 0x85, 0xf9, 0xf0, 0x0b, 0x54, 0x81, 0xfc, 0x0b, 0x7c, 0x2c, 0x06, 0x45, 0x4d, 0x2a, 0xa9, 0xdd, 0x85, 0xf9, 0xf0, 0x0b, 0x54, 0x81, 0xfc, 0x0b, 0x7c, 0x2c, 0x06, 0x45,
0x1f, 0x07, 0x1f, 0x01, 0xcf, 0x35, 0xbc, 0x71, 0x37, 0xf7, 0x07, 0x8a, 0xea, 0x02, 0x1a, 0xf4, 0x1f, 0x07, 0x1f, 0x01, 0xcf, 0x35, 0xbc, 0x71, 0x37, 0xf7, 0x3b, 0x8a, 0xea, 0x02, 0x1a, 0xf4,
0xf2, 0x1c, 0xfb, 0x86, 0x69, 0xf8, 0x06, 0x42, 0x30, 0xcd, 0x96, 0x11, 0xae, 0x82, 0x3d, 0x53, 0xf2, 0x1c, 0xfb, 0x86, 0x69, 0xf8, 0x06, 0x42, 0x30, 0xcd, 0x96, 0x11, 0xae, 0x82, 0x3d, 0x53,
0xad, 0x7d, 0xf1, 0xf1, 0x16, 0x35, 0xfa, 0x88, 0xce, 0x42, 0x31, 0x08, 0x74, 0xb1, 0x96, 0x0c, 0xad, 0x7d, 0xf1, 0xf1, 0x16, 0x35, 0xfa, 0x88, 0xce, 0x42, 0x31, 0x08, 0x74, 0xb1, 0x96, 0x0c,
0x08, 0x34, 0xa7, 0x1b, 0xbe, 0x8f, 0x7b, 0x8e, 0xcf, 0x42, 0xac, 0xac, 0xc9, 0xa6, 0xfa, 0x3f, 0x08, 0x34, 0xa7, 0x1b, 0xbe, 0x8f, 0x7b, 0x8e, 0xcf, 0x42, 0xac, 0xac, 0xc9, 0xa6, 0xfa, 0xdf,
0xd3, 0x50, 0x49, 0xcc, 0xc9, 0x43, 0x28, 0xf4, 0x44, 0xf7, 0xe2, 0x43, 0x7b, 0x27, 0x25, 0xb1, 0xd3, 0x50, 0x49, 0xcc, 0xc9, 0x43, 0x28, 0xf4, 0x44, 0xf7, 0xe2, 0x43, 0x7b, 0x27, 0x25, 0xb1,
0x27, 0x4c, 0xd5, 0x02, 0x29, 0x9a, 0x37, 0x69, 0x0e, 0x0d, 0xad, 0x7f, 0x41, 0x9b, 0xce, 0x78, 0x27, 0x4c, 0xd5, 0x02, 0x29, 0x9a, 0x37, 0x69, 0x0e, 0x0d, 0xad, 0x7f, 0x41, 0x9b, 0xce, 0x78,
0x97, 0x74, 0x74, 0xd3, 0x72, 0x71, 0xdb, 0x27, 0xee, 0xb1, 0x30, 0x77, 0xbe, 0x4b, 0x3a, 0x5b, 0x97, 0x74, 0x74, 0xd3, 0x72, 0x71, 0xdb, 0x27, 0xee, 0xb1, 0x30, 0x77, 0xbe, 0x4b, 0x3a, 0x5b,
@ -26727,227 +26905,230 @@ var fileDescriptorApi = []byte{
0x11, 0x11, 0xcf, 0x98, 0x00, 0x0f, 0x08, 0x21, 0x8d, 0xf6, 0xa1, 0x64, 0xd8, 0x36, 0xf1, 0x0d, 0x11, 0x11, 0xcf, 0x98, 0x00, 0x0f, 0x08, 0x21, 0x8d, 0xf6, 0xa1, 0x64, 0xd8, 0x36, 0xf1, 0x0d,
0x9e, 0x68, 0xe6, 0x98, 0xb2, 0x0f, 0xc6, 0x50, 0x56, 0x1f, 0x48, 0x71, 0x8d, 0x61, 0x3d, 0xe8, 0x9e, 0x68, 0xe6, 0x98, 0xb2, 0x0f, 0xc6, 0x50, 0x56, 0x1f, 0x48, 0x71, 0x8d, 0x61, 0x3d, 0xe8,
0x07, 0x30, 0xc3, 0x32, 0x91, 0xf8, 0x10, 0xaf, 0x8c, 0x19, 0xb4, 0x1a, 0x97, 0xaa, 0xdd, 0x81, 0x07, 0x30, 0xc3, 0x32, 0x91, 0xf8, 0x10, 0xaf, 0x8c, 0x19, 0xb4, 0x1a, 0x97, 0xaa, 0xdd, 0x81,
0x52, 0xc8, 0xd8, 0x49, 0x82, 0xb4, 0x76, 0x1f, 0x2a, 0x71, 0xd3, 0x26, 0x0a, 0x72, 0x0d, 0x96, 0x52, 0xc8, 0xd8, 0x49, 0x82, 0xb4, 0x76, 0x1f, 0x2a, 0x71, 0xd3, 0x26, 0x0a, 0xf2, 0x3f, 0x80,
0xb5, 0xbe, 0x3d, 0x30, 0x4c, 0x56, 0x5f, 0x77, 0x61, 0x56, 0x4c, 0x36, 0x8f, 0x38, 0x75, 0xb4, 0x65, 0xad, 0x6f, 0x0f, 0x0c, 0x93, 0xd5, 0xd7, 0x5d, 0x98, 0x15, 0x93, 0xcd, 0x23, 0x4e, 0x1d,
0x8f, 0x34, 0x21, 0xa1, 0xfe, 0x00, 0x4e, 0xc6, 0x74, 0x8a, 0x22, 0xed, 0x1d, 0x58, 0x70, 0x88, 0xed, 0x23, 0x4d, 0x48, 0x84, 0xcb, 0xa9, 0x23, 0xc3, 0x36, 0xbb, 0xd8, 0x15, 0xfd, 0xca, 0x72,
0xa9, 0x7b, 0x9c, 0xac, 0x5b, 0xa6, 0xcc, 0x2e, 0x4e, 0xc0, 0xdb, 0x30, 0xa9, 0x78, 0xcb, 0x27, 0xea, 0x29, 0xa7, 0xaa, 0x3f, 0x80, 0x93, 0xb1, 0xce, 0x45, 0x35, 0xf7, 0x0e, 0x2c, 0x38, 0xc4,
0x4e, 0xd2, 0xa6, 0xf1, 0xc4, 0xab, 0x70, 0x2a, 0x2e, 0xce, 0xbb, 0x57, 0x1f, 0xc0, 0x8a, 0x86, 0xd4, 0x3d, 0x4e, 0xd6, 0x2d, 0x53, 0xa6, 0x21, 0x27, 0xe0, 0x6d, 0x98, 0x54, 0xbc, 0xe5, 0x13,
0x7b, 0xe4, 0x25, 0x7e, 0x53, 0xd5, 0x35, 0xa8, 0x26, 0x15, 0x08, 0xe5, 0x9f, 0xc1, 0xca, 0x80, 0x27, 0x69, 0xfc, 0x78, 0xe2, 0x55, 0x38, 0x15, 0x17, 0xe7, 0xdd, 0xab, 0x0f, 0x60, 0x45, 0xc3,
0xda, 0xf2, 0x0d, 0xbf, 0xef, 0x4d, 0xa4, 0x5c, 0x54, 0xb0, 0x07, 0xc4, 0xe3, 0xb3, 0x54, 0xd0, 0x3d, 0xf2, 0x12, 0xbf, 0xa9, 0xea, 0x1a, 0x54, 0x93, 0x0a, 0x84, 0xf2, 0xcf, 0x60, 0x65, 0x40,
0x64, 0x53, 0xbd, 0x16, 0x56, 0xdd, 0xe4, 0x05, 0x03, 0xef, 0x01, 0x2d, 0x40, 0xce, 0x72, 0x84, 0x6d, 0xf9, 0x86, 0xdf, 0xf7, 0x26, 0x52, 0x2e, 0x4a, 0xdd, 0x03, 0xe2, 0xf1, 0xe9, 0x2c, 0x68,
0xba, 0x9c, 0xe5, 0xa8, 0x4f, 0xa1, 0x18, 0xac, 0xb8, 0xe8, 0xde, 0xa0, 0x74, 0xcc, 0x8d, 0xbb, 0xb2, 0xa9, 0x5e, 0x0b, 0xab, 0x6e, 0xf2, 0xca, 0x82, 0xf7, 0x80, 0x16, 0x20, 0x67, 0x39, 0x42,
0x3e, 0x07, 0xd5, 0xe5, 0x5e, 0x62, 0x85, 0x10, 0x5d, 0xde, 0x03, 0x08, 0x32, 0x99, 0x5c, 0xf8, 0x5d, 0xce, 0x72, 0xd4, 0xa7, 0x50, 0x0c, 0x96, 0x66, 0x74, 0x6f, 0x50, 0x63, 0xe6, 0xc6, 0x5d,
0xcf, 0x0c, 0x51, 0xac, 0x85, 0xd8, 0xd5, 0x7f, 0x8b, 0xe4, 0xb7, 0xd0, 0x20, 0xcc, 0x60, 0x10, 0xc8, 0x83, 0x32, 0x74, 0x2f, 0xb1, 0x94, 0x88, 0x2e, 0xef, 0x01, 0x04, 0x29, 0x4f, 0x56, 0x08,
0x66, 0x24, 0xdf, 0xe5, 0xde, 0x28, 0xdf, 0x7d, 0x08, 0x33, 0x9e, 0x6f, 0xf8, 0x58, 0x14, 0x47, 0x67, 0x86, 0x28, 0xd6, 0x42, 0xec, 0xea, 0xbf, 0x44, 0x12, 0x61, 0x68, 0x10, 0x66, 0x30, 0x08,
0x6b, 0xc3, 0xc4, 0xa9, 0x11, 0x58, 0xe3, 0xfc, 0xe8, 0x1c, 0x40, 0xdb, 0xc5, 0x86, 0x8f, 0x4d, 0x33, 0x92, 0x18, 0x73, 0x6f, 0x94, 0x18, 0x3f, 0x84, 0x19, 0xcf, 0x37, 0x7c, 0x2c, 0xaa, 0xa8,
0xdd, 0xe0, 0xc9, 0x39, 0xaf, 0x15, 0x05, 0xa5, 0xee, 0xa3, 0xcd, 0x41, 0x81, 0x37, 0xc3, 0x0c, 0xb5, 0x61, 0xe2, 0xd4, 0x08, 0xac, 0x71, 0x7e, 0x74, 0x0e, 0xa0, 0xed, 0x62, 0xc3, 0xc7, 0xa6,
0xbb, 0x36, 0x4c, 0x73, 0x64, 0xaa, 0x06, 0xa5, 0x5e, 0x90, 0x2c, 0x66, 0xc7, 0x4c, 0x16, 0x42, 0x6e, 0xf0, 0x2c, 0x9e, 0xd7, 0x8a, 0x82, 0x52, 0xf7, 0xd1, 0xe6, 0xa0, 0x12, 0x9c, 0x61, 0x86,
0x01, 0x97, 0x0a, 0xa5, 0xc2, 0xb9, 0xd1, 0xa9, 0x90, 0x8b, 0x8e, 0x93, 0x0a, 0x0b, 0xa3, 0x53, 0x5d, 0x1b, 0xa6, 0x39, 0x32, 0x55, 0x83, 0x9a, 0x30, 0xc8, 0x2a, 0xb3, 0x63, 0x66, 0x15, 0xa1,
0xa1, 0x50, 0x36, 0x34, 0x15, 0x7e, 0x9b, 0xb9, 0xec, 0x5f, 0x15, 0xa8, 0x26, 0xbf, 0x41, 0x91, 0x80, 0x4b, 0x85, 0x72, 0xe6, 0xdc, 0xe8, 0x9c, 0xc9, 0x45, 0xc7, 0xc9, 0x99, 0x85, 0xd1, 0x39,
0x7b, 0xee, 0xc2, 0xac, 0xc7, 0x28, 0xe3, 0x24, 0x34, 0x21, 0x2b, 0x24, 0xd0, 0x53, 0x98, 0xb6, 0x53, 0x28, 0x1b, 0x9a, 0x33, 0xbf, 0xcd, 0xa4, 0xf7, 0xcf, 0x0a, 0x54, 0x93, 0xdf, 0xa0, 0xc8,
0xec, 0x43, 0xc2, 0xf6, 0x66, 0xa9, 0x25, 0x49, 0x56, 0xaf, 0xeb, 0x0d, 0xfb, 0x90, 0x70, 0x27, 0x3d, 0x77, 0x61, 0xd6, 0x63, 0x94, 0x71, 0x32, 0x9f, 0x90, 0x15, 0x12, 0xe8, 0x29, 0x4c, 0x5b,
0x31, 0x0d, 0xb5, 0x0f, 0xa1, 0x18, 0x90, 0x26, 0x1a, 0xdb, 0x0e, 0x2c, 0xc7, 0x42, 0x96, 0xd7, 0xf6, 0x21, 0x61, 0x9b, 0xb8, 0xd4, 0xda, 0x25, 0xab, 0xd7, 0xf5, 0x86, 0x7d, 0x48, 0xb8, 0x93,
0xf0, 0x41, 0xa4, 0x2b, 0x93, 0x45, 0xba, 0xfa, 0xd3, 0x5c, 0xf8, 0x4b, 0x7c, 0x6c, 0x75, 0x7d, 0x98, 0x86, 0xda, 0x87, 0x50, 0x0c, 0x48, 0x13, 0x8d, 0x6d, 0x07, 0x96, 0x63, 0x21, 0xcb, 0x8b,
0xec, 0x26, 0xbe, 0xc4, 0x8f, 0xa4, 0x76, 0xfe, 0x19, 0x5e, 0x1e, 0xa9, 0x9d, 0x97, 0x9a, 0xe2, 0xfd, 0x20, 0xd2, 0x95, 0xc9, 0x22, 0x5d, 0xfd, 0x69, 0x2e, 0xfc, 0x25, 0x3e, 0xb6, 0xba, 0x3e,
0x63, 0xfa, 0x02, 0x16, 0x58, 0xac, 0xe9, 0x1e, 0xee, 0xb2, 0x3a, 0x42, 0xd4, 0x74, 0xdf, 0x1f, 0x76, 0x13, 0x5f, 0xe2, 0x47, 0x52, 0x3b, 0xff, 0x0c, 0x2f, 0x8f, 0xd4, 0xce, 0x6b, 0x52, 0xf1,
0xa6, 0x86, 0x5b, 0xc2, 0x23, 0xb6, 0x25, 0xe4, 0xb8, 0x07, 0xcb, 0xdd, 0x30, 0xad, 0xf6, 0x10, 0x31, 0x7d, 0x01, 0x0b, 0x2c, 0xd6, 0x74, 0x0f, 0x77, 0x59, 0xc1, 0x21, 0x8a, 0xbf, 0xef, 0x0f,
0x50, 0x92, 0x69, 0x22, 0x9f, 0xb6, 0x68, 0x8a, 0xa3, 0x1b, 0xd8, 0x94, 0xc5, 0xef, 0x90, 0x99, 0x53, 0xc3, 0x2d, 0xe1, 0x11, 0xdb, 0x12, 0x72, 0xdc, 0x83, 0xe5, 0x6e, 0x98, 0x56, 0x7b, 0x08,
0x31, 0x4e, 0xac, 0x70, 0x83, 0x35, 0x21, 0xa1, 0xfe, 0x2a, 0x0f, 0x30, 0x78, 0xf9, 0x7b, 0x94, 0x28, 0xc9, 0x34, 0x91, 0x4f, 0x5b, 0x34, 0xc5, 0xd1, 0x9d, 0x6e, 0xca, 0x2a, 0x79, 0xc8, 0xcc,
0xdb, 0x1e, 0x06, 0x79, 0x85, 0xd7, 0x67, 0x57, 0x87, 0x29, 0x4e, 0xcd, 0x28, 0x3b, 0xd1, 0x8c, 0x18, 0x27, 0x56, 0xb8, 0xc1, 0x9a, 0x90, 0x50, 0x7f, 0x99, 0x07, 0x18, 0xbc, 0xfc, 0x7f, 0x94,
0xc2, 0x2b, 0xb5, 0x1b, 0x43, 0xd5, 0x7c, 0x67, 0x73, 0xc9, 0x33, 0x38, 0x15, 0x8f, 0x0d, 0x91, 0xdb, 0x1e, 0x06, 0x79, 0x85, 0x17, 0x72, 0x57, 0x87, 0x29, 0x4e, 0xcd, 0x28, 0x3b, 0xd1, 0x8c,
0x48, 0x36, 0x60, 0xc6, 0xf2, 0x71, 0x8f, 0x83, 0x38, 0xa9, 0x9b, 0xae, 0x90, 0x10, 0x67, 0x55, 0xc2, 0x4b, 0xba, 0x1b, 0x43, 0xd5, 0x7c, 0x67, 0x73, 0xc9, 0x33, 0x38, 0x15, 0x8f, 0x0d, 0x91,
0x48, 0x36, 0x60, 0xc6, 0xf2, 0x71, 0x8f, 0xa3, 0x3d, 0xa9, 0xbb, 0xb3, 0x90, 0x10, 0x67, 0x55,
0xd7, 0xa0, 0xd8, 0xe8, 0x19, 0x1d, 0xdc, 0x72, 0x70, 0x9b, 0x76, 0x6a, 0xd1, 0x86, 0x30, 0x84, 0xd7, 0xa0, 0xd8, 0xe8, 0x19, 0x1d, 0xdc, 0x72, 0x70, 0x9b, 0x76, 0x6a, 0xd1, 0x86, 0x30, 0x84,
0x37, 0xd4, 0x0d, 0x28, 0xfc, 0x10, 0x1f, 0xf3, 0x8f, 0x7a, 0x4c, 0x43, 0xd5, 0xbf, 0xc8, 0xc1, 0x37, 0xd4, 0x0d, 0x28, 0xfc, 0x10, 0x1f, 0xf3, 0x8f, 0x7a, 0x4c, 0x43, 0xd5, 0x3f, 0xcd, 0xc1,
0x0a, 0x5b, 0x2b, 0x36, 0x25, 0x84, 0xa2, 0x61, 0x8f, 0xf4, 0xdd, 0x36, 0xf6, 0xd8, 0x6c, 0x3b, 0x0a, 0x5b, 0x2b, 0x36, 0x25, 0xd6, 0xa2, 0x61, 0x8f, 0xf4, 0xdd, 0x36, 0xf6, 0xd8, 0x6c, 0x3b,
0x7d, 0xdd, 0xc1, 0xae, 0x45, 0x4c, 0xb1, 0xc3, 0x2f, 0xb6, 0x9d, 0xfe, 0x2e, 0x23, 0xa0, 0x33, 0x7d, 0xdd, 0xc1, 0xae, 0x45, 0x4c, 0x01, 0x05, 0x14, 0xdb, 0x4e, 0x7f, 0x97, 0x11, 0xd0, 0x19,
0x40, 0x1b, 0xfa, 0x97, 0x7d, 0x22, 0x02, 0x31, 0xaf, 0x15, 0xda, 0x4e, 0xff, 0x8f, 0x68, 0x5b, 0xa0, 0x0d, 0xfd, 0xcb, 0x3e, 0x11, 0x81, 0x98, 0xd7, 0x0a, 0x6d, 0xa7, 0xff, 0x7b, 0xb4, 0x2d,
0xca, 0x7a, 0x47, 0x86, 0x8b, 0x3d, 0x16, 0x67, 0x5c, 0xb6, 0xc5, 0x08, 0xe8, 0x16, 0x9c, 0xec, 0x65, 0xbd, 0x23, 0xc3, 0xc5, 0x1e, 0x8b, 0x33, 0x2e, 0xdb, 0x62, 0x04, 0x74, 0x0b, 0x4e, 0xf6,
0xe1, 0x1e, 0x71, 0x8f, 0xf5, 0xae, 0xd5, 0xb3, 0x7c, 0xdd, 0xb2, 0xf5, 0x83, 0x63, 0x1f, 0x7b, 0x70, 0x8f, 0xb8, 0xc7, 0x7a, 0xd7, 0xea, 0x59, 0xbe, 0x6e, 0xd9, 0xfa, 0xc1, 0xb1, 0x8f, 0x3d,
0x22, 0xa6, 0x10, 0x7f, 0xf9, 0x8c, 0xbe, 0x6b, 0xd8, 0x8f, 0xe8, 0x1b, 0xa4, 0x42, 0x99, 0x90, 0x11, 0x53, 0x88, 0xbf, 0x7c, 0x46, 0xdf, 0x35, 0xec, 0x47, 0xf4, 0x0d, 0x52, 0xa1, 0x4c, 0x48,
0x9e, 0xee, 0xb5, 0x89, 0x8b, 0x75, 0xc3, 0xfc, 0x09, 0x5b, 0x3e, 0xf3, 0x5a, 0x89, 0x90, 0x5e, 0x4f, 0xf7, 0xda, 0xc4, 0xc5, 0xba, 0x61, 0xfe, 0x84, 0x2d, 0x9f, 0x79, 0xad, 0x44, 0x48, 0xaf,
0x8b, 0xd2, 0xea, 0xe6, 0x4f, 0xd0, 0x79, 0x28, 0xb5, 0x9d, 0xbe, 0x87, 0x7d, 0x9d, 0xfe, 0x61, 0x45, 0x69, 0x75, 0xf3, 0x27, 0xe8, 0x3c, 0x94, 0xda, 0x4e, 0xdf, 0xc3, 0xbe, 0x4e, 0xff, 0xb0,
0xab, 0x63, 0x51, 0x03, 0x4e, 0xda, 0x74, 0xfa, 0x5e, 0x88, 0xa1, 0x47, 0xfd, 0x3f, 0x17, 0x66, 0xd5, 0xb1, 0xa8, 0x01, 0x27, 0x6d, 0x3a, 0x7d, 0x2f, 0xc4, 0xd0, 0xa3, 0xfe, 0x9f, 0x0b, 0x33,
0x78, 0x4e, 0xdd, 0x6c, 0x40, 0x39, 0x82, 0x10, 0xd0, 0xcd, 0x1a, 0x83, 0x02, 0xc4, 0x66, 0x8d, 0x3c, 0xa7, 0x6e, 0x36, 0xa0, 0x1c, 0x81, 0x12, 0xe8, 0xae, 0x8e, 0x61, 0x06, 0x62, 0x57, 0x47,
0x3e, 0x53, 0x9a, 0x4b, 0xba, 0xd2, 0x93, 0xec, 0x99, 0xd2, 0xfc, 0x63, 0x47, 0xee, 0xd4, 0xd8, 0x9f, 0x29, 0xcd, 0x25, 0x5d, 0xe9, 0x49, 0xf6, 0x4c, 0x69, 0xfe, 0xb1, 0x23, 0xb7, 0x74, 0xec,
0x33, 0x75, 0x79, 0x17, 0xbf, 0x14, 0x28, 0x52, 0x51, 0xe3, 0x0d, 0xd5, 0x04, 0xd8, 0x34, 0x1c, 0x99, 0xba, 0xbc, 0x8b, 0x5f, 0x0a, 0xb8, 0xa9, 0xa8, 0xf1, 0x86, 0x6a, 0x02, 0x6c, 0x1a, 0x8e,
0xe3, 0xc0, 0xea, 0x5a, 0xfe, 0x31, 0xba, 0x06, 0x15, 0xc3, 0x34, 0xf5, 0xb6, 0xa4, 0x58, 0x58, 0x71, 0x60, 0x75, 0x2d, 0xff, 0x18, 0x5d, 0x83, 0x8a, 0x61, 0x9a, 0x7a, 0x5b, 0x52, 0x2c, 0x2c,
0x62, 0x7b, 0x8b, 0x86, 0x69, 0x6e, 0x86, 0xc8, 0xe8, 0x5d, 0x58, 0x32, 0x5d, 0xe2, 0x44, 0x79, 0x41, 0xc0, 0x45, 0xc3, 0x34, 0x37, 0x43, 0x64, 0xf4, 0x2e, 0x2c, 0x99, 0x2e, 0x71, 0xa2, 0xbc,
0x39, 0xd8, 0x57, 0xa1, 0x2f, 0xc2, 0xcc, 0xea, 0xcf, 0x67, 0xe0, 0x5c, 0x74, 0x62, 0xe3, 0x28, 0x1c, 0x15, 0xac, 0xd0, 0x17, 0x61, 0x66, 0xf5, 0x3f, 0x66, 0xe0, 0x5c, 0x74, 0x62, 0xe3, 0x70,
0xcc, 0x43, 0x98, 0x8f, 0xf5, 0x9a, 0x81, 0x00, 0x0c, 0xac, 0xd5, 0x22, 0x12, 0x31, 0x54, 0x22, 0xcd, 0x43, 0x98, 0x8f, 0xf5, 0x9a, 0x01, 0x15, 0x0c, 0xac, 0xd5, 0x22, 0x12, 0x31, 0xf8, 0x22,
0x97, 0x40, 0x25, 0x52, 0x71, 0x9e, 0xfc, 0x5b, 0xc5, 0x79, 0xa6, 0xdf, 0x0a, 0xce, 0x33, 0x33, 0x97, 0x80, 0x2f, 0x52, 0x01, 0xa1, 0xfc, 0x5b, 0x05, 0x84, 0xa6, 0xdf, 0x0a, 0x20, 0x34, 0x33,
0x19, 0xce, 0x73, 0x99, 0x81, 0xbd, 0x52, 0x9a, 0x6d, 0x89, 0x79, 0xa8, 0x95, 0x03, 0x1e, 0x5b, 0x19, 0x20, 0x74, 0x99, 0x6d, 0x63, 0xa4, 0x34, 0xdb, 0x3b, 0xf3, 0x50, 0x2b, 0x07, 0x3c, 0xb6,
0x82, 0xc2, 0x31, 0x3c, 0x68, 0x6e, 0x12, 0x3c, 0xa8, 0x90, 0x89, 0x07, 0xd1, 0xa8, 0x71, 0x1c, 0x44, 0x8f, 0x63, 0xc0, 0xd1, 0xdc, 0x24, 0xc0, 0x51, 0x21, 0x13, 0x38, 0xa2, 0x51, 0xe3, 0x38,
0xc3, 0xed, 0x11, 0x57, 0x02, 0x3e, 0xd5, 0x22, 0x33, 0x61, 0x51, 0xd2, 0x05, 0xd8, 0x93, 0x09, 0x86, 0xdb, 0x23, 0xae, 0x44, 0x86, 0xaa, 0x45, 0x66, 0xc2, 0xa2, 0xa4, 0x0b, 0x54, 0x28, 0x13,
0x0d, 0x41, 0x26, 0x34, 0x74, 0x01, 0xe6, 0x6d, 0xa2, 0xdb, 0xf8, 0x95, 0x4e, 0xe7, 0xd2, 0xab, 0x43, 0x82, 0x4c, 0x0c, 0xe9, 0x02, 0xcc, 0xdb, 0x44, 0xb7, 0xf1, 0x2b, 0x9d, 0xce, 0xa5, 0x57,
0x96, 0xf8, 0xc4, 0xda, 0xa4, 0x89, 0x5f, 0xed, 0x52, 0x4a, 0x02, 0x3c, 0x9a, 0x9f, 0x10, 0x3c, 0x2d, 0xf1, 0x89, 0xb5, 0x49, 0x13, 0xbf, 0xda, 0xa5, 0x94, 0x04, 0xca, 0x34, 0x3f, 0x19, 0xca,
0xfa, 0x07, 0x05, 0x96, 0xa3, 0xc1, 0x29, 0x36, 0xfa, 0x4f, 0xa0, 0xe8, 0xca, 0xfc, 0x23, 0x02, 0x84, 0xd6, 0x60, 0xbe, 0x67, 0x78, 0x2f, 0xb0, 0xc9, 0x4c, 0xf1, 0xaa, 0x65, 0x16, 0xc4, 0x25,
0xf2, 0x5a, 0x46, 0x71, 0x9b, 0x4c, 0x58, 0xda, 0x40, 0x16, 0xfd, 0x28, 0x13, 0x5f, 0xba, 0x39, 0x4e, 0xa3, 0x36, 0x78, 0xe8, 0x12, 0x04, 0x4e, 0x12, 0x4c, 0x0b, 0x8c, 0xa9, 0x2c, 0xa9, 0x8c,
0x4a, 0xdf, 0x28, 0x84, 0x49, 0x6d, 0xc0, 0xf9, 0x4f, 0x2c, 0xdb, 0x24, 0xaf, 0xbc, 0xcc, 0x6f, 0x4d, 0xfd, 0x3b, 0x05, 0x96, 0xa3, 0x61, 0x2e, 0xb0, 0x85, 0x27, 0x50, 0x74, 0x65, 0x26, 0x13,
0x2b, 0x25, 0x42, 0x94, 0x94, 0x08, 0x51, 0x7f, 0xa9, 0xc0, 0xa9, 0xb8, 0x2e, 0xe1, 0x8a, 0x46, 0xa1, 0x7d, 0x2d, 0xa3, 0x4c, 0x4e, 0xa6, 0x3e, 0x6d, 0x20, 0x8b, 0x7e, 0x94, 0x09, 0x69, 0xdd,
0xd2, 0x15, 0xef, 0x26, 0x4d, 0x8f, 0x0b, 0xa7, 0x3a, 0xe3, 0x8b, 0x4c, 0x67, 0xdc, 0x1a, 0xad, 0x1c, 0xa5, 0x6f, 0x14, 0xa8, 0xa5, 0x36, 0xe0, 0xfc, 0x27, 0x96, 0x6d, 0x92, 0x57, 0x5e, 0xe6,
0x71, 0xa4, 0x3b, 0xfe, 0x46, 0x81, 0xd3, 0x99, 0x66, 0xc4, 0x16, 0x02, 0x25, 0xbe, 0x10, 0x88, 0x57, 0x9a, 0x12, 0x6b, 0x4a, 0x4a, 0xac, 0xa9, 0xbf, 0x50, 0xe0, 0x54, 0x5c, 0x97, 0x70, 0x45,
0x45, 0xa4, 0x4d, 0xfa, 0xb6, 0x1f, 0x5a, 0x44, 0x36, 0x19, 0xde, 0xcf, 0xb3, 0xb5, 0xde, 0x33, 0x23, 0xe9, 0x8a, 0x77, 0x93, 0xa6, 0xc7, 0x85, 0x53, 0x9d, 0xf1, 0x45, 0xa6, 0x33, 0x6e, 0x8d,
0x5e, 0x5b, 0xbd, 0x7e, 0x4f, 0xac, 0x22, 0x54, 0xdd, 0x73, 0x4e, 0x79, 0x83, 0x65, 0x44, 0xad, 0xd6, 0x38, 0xd2, 0x1d, 0x7f, 0xa5, 0xc0, 0xe9, 0x4c, 0x33, 0x62, 0x4b, 0x8a, 0x12, 0x5f, 0x52,
0xc3, 0x52, 0x60, 0xe5, 0x50, 0x44, 0x2e, 0x84, 0xb0, 0xe5, 0xa2, 0x08, 0x9b, 0x0d, 0xb3, 0x5b, 0xc4, 0x72, 0xd4, 0x26, 0x7d, 0xdb, 0x0f, 0x2d, 0x47, 0x9b, 0xec, 0x88, 0x81, 0xe7, 0x7d, 0xbd,
0xf8, 0xa5, 0xd5, 0xc6, 0x6f, 0xe5, 0x40, 0xe2, 0x02, 0x94, 0x1c, 0xec, 0xf6, 0x2c, 0xcf, 0x0b, 0x67, 0xbc, 0xb6, 0x7a, 0xfd, 0x9e, 0x58, 0x8f, 0xa8, 0xba, 0xe7, 0x9c, 0xf2, 0x06, 0x0b, 0x92,
0xd2, 0x63, 0x51, 0x0b, 0x93, 0xd4, 0xff, 0x9a, 0x85, 0xc5, 0x78, 0x74, 0x3c, 0x48, 0x00, 0x7a, 0x5a, 0x87, 0xa5, 0xc0, 0xca, 0xa1, 0x20, 0x60, 0x08, 0xd4, 0xcb, 0x45, 0x41, 0x3d, 0x1b, 0x66,
0x17, 0x53, 0x12, 0x77, 0x7c, 0xa0, 0xa1, 0x1a, 0xf0, 0x96, 0x2c, 0x21, 0x72, 0x59, 0xdb, 0xef, 0xb7, 0xf0, 0x4b, 0xab, 0x8d, 0xdf, 0xca, 0x19, 0xc8, 0x05, 0x28, 0x39, 0xd8, 0xed, 0x59, 0x9e,
0xa0, 0xdc, 0x10, 0xf5, 0x05, 0xf5, 0x48, 0x9b, 0xf4, 0x7a, 0x86, 0x6d, 0xca, 0x73, 0x24, 0xd1, 0x17, 0x24, 0xda, 0xa2, 0x16, 0x26, 0xa9, 0xff, 0x39, 0x0b, 0x8b, 0xf1, 0xe8, 0x78, 0x90, 0xc0,
0xa4, 0xfe, 0x33, 0xdc, 0x0e, 0x75, 0x3b, 0x25, 0xb3, 0x67, 0x3a, 0x79, 0x74, 0xaf, 0x6a, 0xd9, 0x10, 0x2f, 0xa6, 0x2c, 0x01, 0xf1, 0x81, 0x86, 0xaa, 0xc9, 0x5b, 0xb2, 0x18, 0xc9, 0x65, 0x6d,
0x0c, 0x18, 0x64, 0x29, 0xb6, 0xa8, 0x81, 0x20, 0x6d, 0x59, 0x2e, 0x5a, 0x87, 0x69, 0x6c, 0xbf, 0xe4, 0x83, 0xc2, 0x45, 0x54, 0x2a, 0xd4, 0x23, 0x6d, 0xd2, 0xeb, 0x19, 0xb6, 0x29, 0x8f, 0xae,
0x94, 0x45, 0x5e, 0xca, 0x41, 0x93, 0x2c, 0x66, 0x34, 0xc6, 0x87, 0x6e, 0xc2, 0x6c, 0x8f, 0x86, 0x44, 0x93, 0xfa, 0xcf, 0x70, 0x3b, 0xd4, 0xed, 0x94, 0xcc, 0x9e, 0xe9, 0xe4, 0xd1, 0x5d, 0xaf,
0x85, 0xdc, 0xb5, 0xae, 0x64, 0x9c, 0xb7, 0x68, 0x82, 0x0d, 0x6d, 0xc0, 0x9c, 0xc9, 0xe6, 0x49, 0x65, 0x33, 0x2c, 0x92, 0x25, 0xeb, 0xa2, 0x06, 0x82, 0xb4, 0x65, 0xb9, 0x68, 0x1d, 0xa6, 0xb1,
0x6e, 0x4d, 0xab, 0x29, 0x70, 0x23, 0x63, 0xd0, 0x24, 0x23, 0xda, 0x0e, 0x4a, 0xd8, 0x62, 0x56, 0xfd, 0x52, 0x96, 0x8b, 0x29, 0x67, 0x5b, 0xb2, 0x2c, 0xd2, 0x18, 0x1f, 0xba, 0x09, 0xb3, 0x3d,
0xed, 0x19, 0x9b, 0x8a, 0xd4, 0x3a, 0x76, 0x2f, 0x5a, 0xc7, 0x02, 0xd3, 0xb5, 0x31, 0x5a, 0xd7, 0x1a, 0x16, 0x72, 0xff, 0xbb, 0x92, 0x71, 0xc4, 0xa3, 0x09, 0x36, 0xb4, 0x01, 0x73, 0x26, 0x9b,
0x70, 0x8c, 0xf0, 0x34, 0x14, 0xba, 0xa4, 0xc3, 0xc3, 0xa8, 0xc4, 0x8f, 0x28, 0xbb, 0xa4, 0xc3, 0x27, 0xb9, 0xc9, 0xad, 0xa6, 0x20, 0x9c, 0x8c, 0x41, 0x93, 0x8c, 0x68, 0x3b, 0x28, 0x86, 0x8b,
0xa2, 0x68, 0x99, 0x96, 0xf4, 0xa6, 0x65, 0xb3, 0x54, 0x5c, 0xd0, 0x78, 0x83, 0x7e, 0x7c, 0xec, 0x59, 0x55, 0x6c, 0x6c, 0x2a, 0x52, 0x2b, 0xe2, 0xbd, 0x68, 0x45, 0x0c, 0x4c, 0xd7, 0xc6, 0x68,
0x41, 0x27, 0x76, 0x1b, 0x57, 0xcb, 0xec, 0x55, 0x91, 0x51, 0x76, 0xec, 0x36, 0x2b, 0x12, 0x7d, 0x5d, 0xc3, 0x61, 0xc9, 0xd3, 0x50, 0xe8, 0x92, 0x0e, 0x0f, 0xa3, 0x12, 0x3f, 0x15, 0xed, 0x92,
0xff, 0xb8, 0xba, 0xc0, 0xe8, 0xf4, 0x91, 0xee, 0xd6, 0x38, 0xb0, 0xb0, 0x98, 0xb5, 0x5b, 0x4b, 0x0e, 0x8b, 0xa2, 0x65, 0xba, 0x39, 0x30, 0x2d, 0x9b, 0x25, 0xf5, 0x82, 0xc6, 0x1b, 0xf4, 0xe3,
0x4b, 0xdb, 0x12, 0x57, 0x78, 0x04, 0x73, 0xaf, 0x78, 0x22, 0xa8, 0x56, 0x98, 0xfc, 0xd5, 0xd1, 0x63, 0x0f, 0x3a, 0xb1, 0xdb, 0xb8, 0x5a, 0x66, 0xaf, 0x8a, 0x8c, 0xb2, 0x63, 0xb7, 0x59, 0xb9,
0xe9, 0x45, 0x68, 0x90, 0x82, 0xdf, 0x66, 0xc1, 0xfe, 0x2b, 0x05, 0x4e, 0x6d, 0xb2, 0xcd, 0x4c, 0xe9, 0xfb, 0xc7, 0xd5, 0x05, 0x46, 0xa7, 0x8f, 0x74, 0xdf, 0xc7, 0x21, 0x8a, 0xc5, 0xac, 0x7d,
0x28, 0x8f, 0x4d, 0x82, 0xbf, 0xdd, 0x09, 0x10, 0xcf, 0x4c, 0xb0, 0x2c, 0x3e, 0x6e, 0x21, 0x80, 0x5f, 0x5a, 0xda, 0x96, 0x08, 0xc5, 0x23, 0x98, 0x7b, 0xc5, 0x13, 0x41, 0xb5, 0xc2, 0xe4, 0xaf,
0x1a, 0xb0, 0x20, 0x95, 0x0b, 0x15, 0xf9, 0xb1, 0x41, 0xd3, 0xb2, 0x17, 0x6e, 0xaa, 0x1f, 0xc1, 0x8e, 0x4e, 0x2f, 0x42, 0x83, 0x14, 0xfc, 0x36, 0x4b, 0xff, 0x5f, 0x2a, 0x70, 0x6a, 0x93, 0x6d,
0x4a, 0x62, 0x14, 0x62, 0xe3, 0xb1, 0x06, 0xf3, 0x83, 0x7c, 0x15, 0x0c, 0xa2, 0x14, 0xd0, 0x1a, 0x8b, 0x42, 0x79, 0x6c, 0x12, 0x24, 0xef, 0x4e, 0x00, 0xb2, 0x66, 0xc2, 0x6e, 0xf1, 0x71, 0x4b,
0xa6, 0x7a, 0x17, 0x4e, 0xb6, 0x7c, 0xc3, 0xf5, 0x13, 0x2e, 0x18, 0x43, 0x96, 0xe1, 0xa6, 0x51, 0x8c, 0xb5, 0x01, 0x0b, 0x52, 0xb9, 0x50, 0x91, 0x1f, 0x1b, 0xa7, 0x2d, 0x7b, 0xe1, 0xa6, 0xfa,
0x59, 0x01, 0x6d, 0xb6, 0x60, 0xb9, 0xe5, 0x13, 0xe7, 0x0d, 0x94, 0xd2, 0xac, 0x43, 0xc7, 0x4f, 0x11, 0xac, 0x24, 0x46, 0x21, 0xb6, 0x30, 0x6b, 0x30, 0x3f, 0xc8, 0x57, 0xc1, 0x20, 0x4a, 0x01,
0xfa, 0x72, 0x7d, 0x90, 0x4d, 0x75, 0x85, 0xa3, 0xbc, 0xc9, 0xde, 0xee, 0xc1, 0x29, 0x0e, 0xb2, 0xad, 0x61, 0xaa, 0x77, 0xe1, 0x64, 0xcb, 0x37, 0x5c, 0x3f, 0xe1, 0x82, 0x31, 0x64, 0x19, 0x02,
0xbe, 0xc9, 0x20, 0x4e, 0x4b, 0x88, 0x37, 0xa9, 0xf7, 0x39, 0x9c, 0x18, 0x2c, 0x8b, 0x03, 0x00, 0x1b, 0x95, 0x15, 0x20, 0x69, 0x0b, 0x96, 0x5b, 0x3e, 0x71, 0xde, 0x40, 0x29, 0xcd, 0x3a, 0x74,
0xe5, 0x76, 0x14, 0x40, 0xb9, 0x30, 0x64, 0xd6, 0x23, 0xf8, 0xc9, 0x5f, 0xe5, 0x42, 0x79, 0x3d, 0xfc, 0xa4, 0x2f, 0xd7, 0x07, 0xd9, 0x54, 0x57, 0x38, 0x5e, 0x9c, 0xec, 0xed, 0x1e, 0x9c, 0xe2,
0x03, 0x3e, 0xb9, 0x17, 0x85, 0x4f, 0x2e, 0x8d, 0xd2, 0x1d, 0x41, 0x4f, 0x92, 0x51, 0x9b, 0x4f, 0x70, 0xed, 0x9b, 0x0c, 0xe2, 0xb4, 0x04, 0x8b, 0x93, 0x7a, 0x9f, 0xc3, 0x89, 0xc1, 0xb2, 0x38,
0x89, 0xda, 0xcf, 0x13, 0x18, 0xcb, 0x74, 0x16, 0x48, 0x15, 0xb3, 0xf6, 0x77, 0x02, 0xb1, 0x68, 0x80, 0x62, 0x6e, 0x47, 0xa1, 0x98, 0x0b, 0x43, 0x66, 0x3d, 0x82, 0xc4, 0xfc, 0x45, 0x2e, 0x94,
0x1c, 0x62, 0x09, 0xba, 0x0e, 0x30, 0xf1, 0x3b, 0x31, 0x88, 0x65, 0x6d, 0xa4, 0xbd, 0x01, 0xc2, 0xd7, 0x33, 0x80, 0x98, 0x7b, 0x51, 0x20, 0xe6, 0xd2, 0x28, 0xdd, 0x11, 0x1c, 0x26, 0x19, 0xb5,
0xf2, 0x77, 0xd3, 0x50, 0x0c, 0xde, 0x25, 0x7c, 0x9e, 0x74, 0x5b, 0x2e, 0xc5, 0x6d, 0xe1, 0x15, 0xf9, 0x94, 0xa8, 0xfd, 0x3c, 0x81, 0xd6, 0x4c, 0x67, 0xc1, 0x5d, 0x31, 0x6b, 0x7f, 0x2b, 0x60,
0x38, 0xff, 0x8d, 0x56, 0xe0, 0xe9, 0xb1, 0x57, 0xe0, 0x33, 0x50, 0x64, 0x0f, 0xba, 0x8b, 0x0f, 0x8d, 0xc6, 0xc1, 0x9a, 0xa0, 0xeb, 0x00, 0x5d, 0xbf, 0x13, 0x03, 0x6b, 0xd6, 0x46, 0xda, 0x1b,
0xc5, 0x8a, 0x5a, 0x60, 0x04, 0x0d, 0x1f, 0x0e, 0xc2, 0x70, 0x76, 0xa2, 0x30, 0x8c, 0x81, 0x3a, 0x60, 0x35, 0x7f, 0x33, 0x0d, 0xc5, 0xe0, 0x5d, 0xc2, 0xe7, 0x49, 0xb7, 0xe5, 0x52, 0xdc, 0x16,
0x73, 0x71, 0x50, 0xe7, 0x41, 0xb0, 0x22, 0xf2, 0x45, 0xf4, 0xca, 0x10, 0xbd, 0xa9, 0x6b, 0x61, 0x5e, 0x81, 0xf3, 0xdf, 0x68, 0x05, 0x9e, 0x1e, 0x7b, 0x05, 0x3e, 0x03, 0x45, 0xf6, 0xa0, 0xbb,
0x33, 0xba, 0x16, 0xf2, 0x75, 0xf5, 0xbd, 0x61, 0x5a, 0xbe, 0xb3, 0x90, 0xce, 0x3e, 0x87, 0x74, 0xf8, 0x50, 0xac, 0xa8, 0x05, 0x46, 0xd0, 0xf0, 0xe1, 0x20, 0x0c, 0x67, 0x27, 0x0a, 0xc3, 0x18,
0xc2, 0xb1, 0x28, 0x32, 0xeb, 0x3d, 0x80, 0x20, 0x89, 0x48, 0x5c, 0xe7, 0xcc, 0x90, 0x31, 0x6a, 0x3c, 0x34, 0x17, 0x87, 0x87, 0x1e, 0x04, 0x2b, 0x22, 0x5f, 0x44, 0xaf, 0x0c, 0xd1, 0x9b, 0xba,
0x21, 0x76, 0xaa, 0x36, 0x32, 0x35, 0x83, 0x73, 0x9f, 0xf1, 0xf2, 0x63, 0xc6, 0xa1, 0xcf, 0xff, 0x16, 0x36, 0xa3, 0x6b, 0x21, 0x5f, 0x57, 0xdf, 0x1b, 0xa6, 0xe5, 0x3b, 0x0b, 0x0e, 0xed, 0x73,
0xcd, 0x84, 0xf2, 0x4b, 0xc6, 0x41, 0xc9, 0x83, 0x04, 0x98, 0x38, 0x61, 0x14, 0xdf, 0x8e, 0x62, 0x70, 0x28, 0x1c, 0x8b, 0x22, 0xb3, 0xde, 0x03, 0x08, 0x92, 0x88, 0x44, 0x88, 0xce, 0x0c, 0x19,
0x89, 0x6f, 0x18, 0x75, 0x09, 0x28, 0x91, 0x55, 0x2e, 0x86, 0x2b, 0x5e, 0x73, 0xa8, 0xa7, 0x28, 0xa3, 0x16, 0x62, 0xa7, 0x6a, 0x23, 0x53, 0x33, 0x38, 0x41, 0x1a, 0x2f, 0x3f, 0x66, 0x1c, 0x1f,
0x28, 0x75, 0xb6, 0x33, 0x38, 0xb4, 0x6c, 0xcb, 0x3b, 0xe2, 0xef, 0x67, 0xf9, 0xce, 0x40, 0x92, 0xfd, 0xef, 0x4c, 0x28, 0xbf, 0x64, 0x1c, 0xb9, 0x3c, 0x48, 0xc0, 0x92, 0x13, 0x46, 0xf1, 0xed,
0xea, 0xec, 0xaa, 0x11, 0x7e, 0x6d, 0xf9, 0x7a, 0x9b, 0x98, 0x98, 0xc5, 0xf4, 0x8c, 0x56, 0xa0, 0x28, 0x2a, 0xf9, 0x86, 0x51, 0x97, 0x00, 0x25, 0x59, 0xe5, 0x62, 0xb8, 0xe2, 0x35, 0x07, 0x8d,
0x84, 0x4d, 0x62, 0xe2, 0xc1, 0x97, 0x57, 0x78, 0xb3, 0x2f, 0xaf, 0x18, 0xfb, 0xf2, 0x4e, 0xc1, 0x8a, 0x82, 0x52, 0x67, 0x3b, 0x83, 0x43, 0xcb, 0xb6, 0xbc, 0x23, 0xfe, 0x7e, 0x96, 0xef, 0x0c,
0xac, 0x8b, 0x0d, 0x8f, 0xd8, 0x62, 0x53, 0x2d, 0x5a, 0x74, 0x6a, 0x7a, 0xd8, 0xf3, 0x68, 0x4f, 0x24, 0xa9, 0xce, 0x6e, 0x37, 0xe1, 0xd7, 0x96, 0xaf, 0xb7, 0x89, 0x89, 0x59, 0x4c, 0xcf, 0x68,
0xa2, 0x5c, 0x13, 0xcd, 0x50, 0x99, 0x39, 0x3f, 0xb2, 0xcc, 0x1c, 0x72, 0x00, 0x13, 0x2b, 0x33, 0x05, 0x4a, 0xd8, 0x24, 0x26, 0x1e, 0x7c, 0x79, 0x85, 0x37, 0xfb, 0xf2, 0x8a, 0xb1, 0x2f, 0xef,
0xcb, 0x23, 0xcb, 0xcc, 0x71, 0xce, 0x5f, 0x42, 0x85, 0xf6, 0xc2, 0x78, 0x85, 0x76, 0xb8, 0x2e, 0x14, 0xcc, 0xba, 0xd8, 0xf0, 0x88, 0x2d, 0xb6, 0xe7, 0xa2, 0x45, 0xa7, 0xa6, 0x87, 0x3d, 0x8f,
0x5d, 0x8c, 0xd4, 0xa5, 0xdf, 0xe6, 0xc7, 0xfa, 0x1b, 0x05, 0x56, 0x12, 0x9f, 0x95, 0xf8, 0x5c, 0xf6, 0x24, 0xca, 0x35, 0xd1, 0x0c, 0x95, 0x99, 0xf3, 0x23, 0xcb, 0xcc, 0x21, 0x47, 0x39, 0xb1,
0xef, 0xc4, 0x8e, 0x72, 0xd6, 0x46, 0xfa, 0x2c, 0x38, 0xc9, 0x79, 0x12, 0x39, 0xc9, 0xf9, 0x60, 0x32, 0xb3, 0x3c, 0xb2, 0xcc, 0x1c, 0xe7, 0x24, 0x27, 0x54, 0x68, 0x2f, 0x8c, 0x57, 0x68, 0x87,
0xb4, 0xe0, 0x5b, 0x3f, 0xc8, 0xf9, 0x33, 0x05, 0xce, 0xef, 0x3b, 0x66, 0xac, 0xc2, 0x13, 0xdb, 0xeb, 0xd2, 0xc5, 0x48, 0x5d, 0xfa, 0x6d, 0x7e, 0xac, 0xbf, 0x56, 0x60, 0x25, 0xf1, 0x59, 0x89,
0xfe, 0xf1, 0x13, 0xc7, 0x03, 0x59, 0xeb, 0xe7, 0x26, 0xc5, 0x59, 0xb8, 0x9c, 0xaa, 0xc2, 0x85, 0xcf, 0xf5, 0x4e, 0xec, 0x50, 0x68, 0x6d, 0xa4, 0xcf, 0x82, 0x33, 0xa1, 0x27, 0x91, 0x33, 0xa1,
0x6c, 0x33, 0x44, 0xc9, 0xf4, 0x63, 0x58, 0xdc, 0x7e, 0x8d, 0xdb, 0xad, 0x63, 0xbb, 0x3d, 0x81, 0x0f, 0x46, 0x0b, 0xbe, 0xf5, 0x23, 0xa1, 0x3f, 0x56, 0xe0, 0xfc, 0xbe, 0x63, 0xc6, 0x2a, 0x3c,
0x69, 0x15, 0xc8, 0xb7, 0x7b, 0xa6, 0xc0, 0x36, 0xe9, 0x63, 0xb8, 0x0a, 0xcc, 0x47, 0xab, 0x40, 0xb1, 0xed, 0x1f, 0x3f, 0x71, 0x3c, 0x90, 0xb5, 0x7e, 0x6e, 0x52, 0x9c, 0x85, 0xcb, 0xa9, 0x2a,
0x1d, 0x2a, 0x83, 0x1e, 0xc4, 0xf4, 0x9e, 0xa2, 0xd3, 0x6b, 0x52, 0x66, 0xaa, 0x7c, 0x5e, 0x13, 0x5c, 0xc8, 0x36, 0x43, 0x94, 0x4c, 0x3f, 0x86, 0xc5, 0xed, 0xd7, 0xb8, 0xdd, 0x3a, 0xb6, 0xdb,
0x2d, 0x41, 0xc7, 0xae, 0xcb, 0xc6, 0xcc, 0xe9, 0xd8, 0x75, 0xa3, 0xd9, 0x22, 0x1f, 0xcd, 0x16, 0x13, 0x98, 0x56, 0x81, 0x7c, 0xbb, 0x67, 0x0a, 0x94, 0x94, 0x3e, 0x86, 0xab, 0xc0, 0x7c, 0xb4,
0xea, 0xcf, 0x15, 0x28, 0xd1, 0x1e, 0xbe, 0x91, 0xfd, 0x62, 0xab, 0x95, 0x1f, 0x6c, 0xb5, 0x82, 0x0a, 0xd4, 0xa1, 0x32, 0xe8, 0x41, 0x4c, 0xef, 0x29, 0x3a, 0xbd, 0x26, 0x65, 0xa6, 0xca, 0xe7,
0x1d, 0xdb, 0x74, 0x78, 0xc7, 0x36, 0xb0, 0x7c, 0x86, 0x91, 0x93, 0x96, 0xcf, 0x06, 0x74, 0xec, 0x35, 0xd1, 0x12, 0x74, 0xec, 0xf2, 0x0b, 0x0c, 0x9c, 0x8e, 0x5d, 0x37, 0x9a, 0x2d, 0xf2, 0xd1,
0xba, 0xea, 0x05, 0x98, 0xe7, 0xb6, 0x89, 0x91, 0x57, 0x20, 0xdf, 0x77, 0xbb, 0x32, 0x8e, 0xfa, 0x6c, 0xa1, 0xfe, 0xb9, 0x02, 0x25, 0xda, 0xc3, 0x37, 0xb2, 0x5f, 0x6c, 0xb5, 0xf2, 0x83, 0xad,
0x6e, 0x57, 0xfd, 0x73, 0x05, 0xca, 0x75, 0xdf, 0x37, 0xda, 0x47, 0x13, 0x0c, 0x20, 0x30, 0x2e, 0x56, 0xb0, 0x63, 0x9b, 0x0e, 0xef, 0xd8, 0x06, 0x96, 0xcf, 0x30, 0x72, 0xd2, 0xf2, 0xd9, 0x80,
0x17, 0x36, 0x2e, 0x39, 0x88, 0x81, 0xb9, 0xd3, 0x19, 0xe6, 0xce, 0x44, 0xcc, 0x55, 0x61, 0x41, 0x8e, 0x5d, 0x57, 0xbd, 0x00, 0xf3, 0xdc, 0x36, 0x31, 0xf2, 0x0a, 0xe4, 0xfb, 0x6e, 0x57, 0xc6,
0xda, 0x92, 0x69, 0x70, 0x13, 0xd0, 0x2e, 0x71, 0xfd, 0xc7, 0xc4, 0x7d, 0x65, 0xb8, 0xe6, 0x64, 0x51, 0xdf, 0xed, 0xaa, 0x7f, 0xa2, 0x40, 0xb9, 0xee, 0xfb, 0x46, 0xfb, 0x68, 0x82, 0x01, 0x04,
0x3b, 0x30, 0x04, 0xd3, 0xe2, 0xfa, 0x69, 0xfe, 0xea, 0x8c, 0xc6, 0x9e, 0xd5, 0x2b, 0x70, 0x22, 0xc6, 0xe5, 0xc2, 0xc6, 0x25, 0x07, 0x31, 0x30, 0x77, 0x3a, 0xc3, 0xdc, 0x99, 0x88, 0xb9, 0x2a,
0xa2, 0x2f, 0xb3, 0xe3, 0x87, 0x50, 0x62, 0x79, 0x5f, 0x94, 0xe2, 0xb7, 0xc2, 0x87, 0x2c, 0x63, 0x2c, 0x48, 0x5b, 0x32, 0x0d, 0x6e, 0x02, 0xda, 0x25, 0xae, 0xff, 0x98, 0xb8, 0xaf, 0x0c, 0xd7,
0xad, 0x12, 0xea, 0x1f, 0xc2, 0x12, 0xad, 0x0f, 0x18, 0x3d, 0xf8, 0x14, 0xbf, 0x1f, 0xab, 0x53, 0x9c, 0x6c, 0x07, 0x86, 0x60, 0x5a, 0xdc, 0x78, 0xcd, 0x5f, 0x9d, 0xd1, 0xd8, 0xb3, 0x7a, 0x05,
0xcf, 0x65, 0x28, 0x8a, 0xd5, 0xa8, 0x7f, 0xaf, 0xc0, 0x0c, 0xa3, 0x27, 0xd6, 0xec, 0x33, 0x50, 0x4e, 0x44, 0xf4, 0x65, 0x76, 0xfc, 0x10, 0x4a, 0x2c, 0xef, 0x8b, 0x52, 0xfc, 0x56, 0xf8, 0xb8,
0x74, 0xb1, 0x43, 0x74, 0xdf, 0xe8, 0x04, 0x97, 0x7d, 0x29, 0x61, 0xcf, 0xe8, 0x78, 0xec, 0xae, 0x66, 0xac, 0x55, 0x42, 0xfd, 0x5d, 0x58, 0xa2, 0xf5, 0x01, 0xa3, 0x07, 0x9f, 0xe2, 0xf7, 0x63,
0x32, 0x7d, 0x69, 0x5a, 0x1d, 0xec, 0xf9, 0xf2, 0xc6, 0x6f, 0x89, 0xd2, 0xb6, 0x38, 0x89, 0x3a, 0x75, 0xea, 0xb9, 0x0c, 0x45, 0xb1, 0x1a, 0xf5, 0x6f, 0x15, 0x98, 0x61, 0xf4, 0xc4, 0x9a, 0x7d,
0xc9, 0xb3, 0xfe, 0x98, 0xd7, 0x9d, 0xd3, 0x1a, 0x7b, 0x46, 0xeb, 0xfc, 0xfe, 0xd9, 0x38, 0x40, 0x06, 0x8a, 0x2e, 0x76, 0x88, 0xee, 0x1b, 0x9d, 0xe0, 0x7e, 0x31, 0x25, 0xec, 0x19, 0x1d, 0x8f,
0x38, 0xbb, 0x9d, 0x56, 0x83, 0x42, 0x0c, 0xfb, 0x0e, 0xda, 0xea, 0x36, 0xa0, 0xb0, 0x17, 0x84, 0x5d, 0x8f, 0xa6, 0x2f, 0x4d, 0xab, 0x83, 0x3d, 0x5f, 0x5e, 0x32, 0x2e, 0x51, 0xda, 0x16, 0x27,
0xbf, 0x6f, 0xc2, 0x2c, 0x73, 0x92, 0xac, 0x8e, 0x56, 0x32, 0xdc, 0xa0, 0x09, 0x36, 0xd5, 0x00, 0x51, 0x27, 0x79, 0xd6, 0xef, 0xf3, 0xba, 0x73, 0x5a, 0x63, 0xcf, 0x68, 0x9d, 0x5f, 0x79, 0x1b,
0xc4, 0x1d, 0x1c, 0xa9, 0x88, 0x26, 0x9f, 0x95, 0x21, 0x15, 0xd2, 0x3f, 0x2a, 0x70, 0x22, 0xd2, 0x07, 0x52, 0x67, 0x17, 0xe2, 0x6a, 0x50, 0x88, 0xa1, 0xe8, 0x41, 0x5b, 0xdd, 0x06, 0x14, 0xf6,
0x87, 0xb0, 0xf5, 0x46, 0xb4, 0x93, 0x4c, 0x53, 0x45, 0x07, 0x9b, 0x91, 0x25, 0xe1, 0x66, 0x96, 0x82, 0xf0, 0xf7, 0x4d, 0x98, 0x65, 0x4e, 0x92, 0xd5, 0xd1, 0x4a, 0x86, 0x1b, 0x34, 0xc1, 0xa6,
0x49, 0xbf, 0xa5, 0xe5, 0xe0, 0x9f, 0x14, 0x80, 0x7a, 0xdf, 0x3f, 0x12, 0xc8, 0x60, 0x78, 0x66, 0x1a, 0x80, 0xb8, 0x83, 0x23, 0x15, 0xd1, 0xe4, 0xb3, 0x32, 0xa4, 0x42, 0xfa, 0x7b, 0x05, 0x4e,
0x94, 0xe8, 0xcc, 0xd0, 0x77, 0x8e, 0xe1, 0x79, 0xaf, 0x88, 0x2b, 0xf7, 0x34, 0x41, 0x9b, 0x61, 0x44, 0xfa, 0x10, 0xb6, 0xde, 0x88, 0x76, 0x92, 0x69, 0xaa, 0xe8, 0x60, 0x33, 0xb2, 0x24, 0xdc,
0x78, 0x7d, 0xff, 0x48, 0x1e, 0x60, 0xd1, 0x67, 0x74, 0x09, 0x16, 0xf8, 0x05, 0x73, 0xdd, 0x30, 0xcc, 0x32, 0xe9, 0x37, 0xb4, 0x1c, 0xfc, 0x83, 0x02, 0x50, 0xef, 0xfb, 0x47, 0x02, 0x19, 0x0c,
0x4d, 0x17, 0x7b, 0x9e, 0x38, 0xc9, 0x2a, 0x73, 0x6a, 0x9d, 0x13, 0x29, 0x9b, 0x65, 0x62, 0xdb, 0xcf, 0x8c, 0x12, 0x9d, 0x19, 0xfa, 0xce, 0x31, 0x3c, 0xef, 0x15, 0x71, 0xe5, 0x9e, 0x26, 0x68,
0xb7, 0xfc, 0x63, 0xdd, 0x27, 0x2f, 0xb0, 0x2d, 0xf6, 0x26, 0x65, 0x49, 0xdd, 0xa3, 0x44, 0xca, 0x33, 0x0c, 0xaf, 0xef, 0x1f, 0xc9, 0xa3, 0x30, 0xfa, 0x8c, 0x2e, 0xc1, 0x02, 0xbf, 0xd3, 0xae,
0xe6, 0xe2, 0x8e, 0xe5, 0xf9, 0xae, 0x64, 0x93, 0xa7, 0x26, 0x82, 0xca, 0xd8, 0xe8, 0xa4, 0x54, 0x1b, 0xa6, 0xe9, 0x62, 0xcf, 0x13, 0x67, 0x62, 0x65, 0x4e, 0xad, 0x73, 0x22, 0x65, 0xb3, 0x4c,
0x76, 0xfb, 0xdd, 0x2e, 0x77, 0xf1, 0x9b, 0x4f, 0xfb, 0xfb, 0x62, 0x40, 0xb9, 0xac, 0x98, 0x1e, 0x6c, 0xfb, 0x96, 0x7f, 0xac, 0xfb, 0xe4, 0x05, 0xb6, 0xc5, 0xde, 0xa4, 0x2c, 0xa9, 0x7b, 0x94,
0x38, 0x4d, 0x0c, 0xf7, 0x2d, 0x82, 0x30, 0xef, 0xc3, 0x52, 0x68, 0x0c, 0x22, 0xac, 0x22, 0x45, 0xc8, 0x0f, 0x07, 0x3a, 0x96, 0xe7, 0xbb, 0x92, 0x4d, 0x9e, 0xbf, 0x08, 0x2a, 0x63, 0xa3, 0x93,
0xa4, 0x12, 0x2d, 0x22, 0xd5, 0x27, 0x80, 0x38, 0xee, 0xf0, 0x0d, 0xc7, 0xad, 0x9e, 0x84, 0x13, 0x52, 0xd9, 0xed, 0x77, 0xbb, 0xdc, 0xc5, 0x6f, 0x3e, 0xed, 0xef, 0x8b, 0x01, 0xe5, 0xb2, 0x62,
0x11, 0x45, 0x62, 0x25, 0xbe, 0x0e, 0x65, 0x71, 0x9b, 0x48, 0x04, 0xca, 0x69, 0x28, 0xd0, 0x8c, 0x7a, 0xe0, 0x34, 0x31, 0xdc, 0xb7, 0x08, 0xc2, 0xbc, 0x0f, 0x4b, 0xa1, 0x31, 0x88, 0xb0, 0x8a,
0xda, 0xb6, 0x4c, 0x79, 0xba, 0x39, 0xe7, 0x10, 0x73, 0xd3, 0x32, 0x5d, 0xf5, 0x13, 0x28, 0x6b, 0x14, 0x91, 0x4a, 0xb4, 0x88, 0x54, 0x9f, 0x00, 0xe2, 0xb8, 0xc3, 0x37, 0x1c, 0xb7, 0x7a, 0x12,
0xbc, 0x1f, 0xc1, 0xfb, 0x18, 0x16, 0xc4, 0xdd, 0x23, 0x3d, 0x72, 0xa7, 0x2f, 0xed, 0xce, 0x78, 0x4e, 0x44, 0x14, 0x89, 0x95, 0xf8, 0x3a, 0x94, 0xc5, 0xbd, 0x24, 0x11, 0x28, 0xa7, 0xa1, 0x40,
0xb8, 0x13, 0xad, 0x6c, 0x87, 0x9b, 0xaa, 0x09, 0x35, 0x5e, 0x32, 0x44, 0xd4, 0xcb, 0xc1, 0x3e, 0x33, 0x6a, 0xdb, 0x32, 0xe5, 0x39, 0xe9, 0x9c, 0x43, 0xcc, 0x4d, 0xcb, 0x74, 0xd5, 0x4f, 0xa0,
0x06, 0xf9, 0x6b, 0x89, 0x91, 0xbd, 0x44, 0xe5, 0xcb, 0x6e, 0xb8, 0xa9, 0x9e, 0x83, 0x33, 0xa9, 0xac, 0xf1, 0x7e, 0x04, 0xef, 0x63, 0x58, 0x10, 0xb7, 0x98, 0xf4, 0xc8, 0x35, 0xc2, 0xb4, 0x6b,
0xbd, 0x08, 0x4f, 0x38, 0x50, 0x19, 0xbc, 0x30, 0x2d, 0x79, 0xcc, 0xcb, 0x8e, 0x6f, 0x95, 0xd0, 0xea, 0xe1, 0x4e, 0xb4, 0xb2, 0x1d, 0x6e, 0xaa, 0x26, 0xd4, 0x78, 0xc9, 0x10, 0x51, 0x2f, 0x07,
0xf1, 0xed, 0xa9, 0xa0, 0x48, 0xcc, 0xc9, 0x45, 0x8c, 0x55, 0x80, 0x83, 0x72, 0x3f, 0x9f, 0x55, 0xfb, 0x18, 0xe4, 0x8d, 0xc2, 0x91, 0xbd, 0x44, 0xe5, 0xcb, 0x6e, 0xb8, 0xa9, 0x9e, 0x83, 0x33,
0xee, 0x4f, 0x47, 0xca, 0x7d, 0xb5, 0x15, 0xf8, 0x53, 0x6c, 0xc3, 0x1e, 0xb1, 0xed, 0x22, 0xef, 0xa9, 0xbd, 0x08, 0x4f, 0x38, 0x50, 0x19, 0xbc, 0x30, 0x2d, 0x79, 0x60, 0xcc, 0x0e, 0x82, 0x95,
0x5b, 0x26, 0x44, 0x75, 0xd8, 0x28, 0x39, 0xab, 0x16, 0x92, 0x52, 0xaf, 0x41, 0x39, 0x9a, 0x1a, 0xd0, 0x41, 0xf0, 0xa9, 0xa0, 0x48, 0xcc, 0xc9, 0x45, 0x8c, 0x55, 0x80, 0x83, 0x72, 0x3f, 0x9f,
0x43, 0x79, 0x4e, 0x49, 0xe4, 0xb9, 0x85, 0x58, 0x8a, 0xfb, 0x30, 0x56, 0x01, 0x67, 0xfb, 0x38, 0x55, 0xee, 0x4f, 0x47, 0xca, 0x7d, 0xb5, 0x15, 0xf8, 0x53, 0x6c, 0xc3, 0x1e, 0xb1, 0xed, 0x22,
0x56, 0xff, 0xde, 0x8f, 0x24, 0xbb, 0xeb, 0x29, 0x27, 0xaf, 0xbf, 0xa5, 0x3c, 0xb7, 0x2c, 0xd6, 0xef, 0x5b, 0x26, 0x44, 0x75, 0xd8, 0x28, 0x39, 0xab, 0x16, 0x92, 0x52, 0xaf, 0x41, 0x39, 0x9a,
0x83, 0xc7, 0x1e, 0x95, 0x17, 0x83, 0x56, 0x2f, 0x42, 0x69, 0x3f, 0xeb, 0x07, 0x09, 0xd3, 0xf2, 0x1a, 0x43, 0x79, 0x4e, 0x49, 0xe4, 0xb9, 0x85, 0x58, 0x8a, 0xfb, 0x30, 0x56, 0x01, 0x67, 0xfb,
0x96, 0xc3, 0x6d, 0x58, 0x7e, 0x6c, 0x75, 0xb1, 0x77, 0xec, 0xf9, 0xb8, 0xd7, 0x60, 0x49, 0xe9, 0x38, 0x56, 0xff, 0xde, 0x8f, 0x24, 0xbb, 0xeb, 0x29, 0x67, 0xb8, 0xbf, 0xa1, 0x3c, 0xb7, 0x2c,
0xd0, 0xc2, 0x2e, 0x5a, 0x05, 0x60, 0x5b, 0x18, 0x87, 0x58, 0xc1, 0x3d, 0xf5, 0x10, 0x45, 0xfd, 0xd6, 0x83, 0xc7, 0x1e, 0x95, 0x17, 0x83, 0x56, 0x2f, 0x42, 0x69, 0x3f, 0xeb, 0x37, 0x10, 0xd3,
0x6f, 0x05, 0x16, 0x07, 0x82, 0xfb, 0x6c, 0xeb, 0x76, 0x16, 0x8a, 0x74, 0xbc, 0x9e, 0x6f, 0xf4, 0xf2, 0xbe, 0xc4, 0x6d, 0x58, 0x7e, 0x6c, 0x75, 0xb1, 0x77, 0xec, 0xf9, 0xb8, 0xd7, 0x60, 0x49,
0x1c, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x3d, 0x98, 0x39, 0xf4, 0x24, 0x64, 0x94, 0x0a, 0xa0, 0xa7, 0xe9, 0xd0, 0xc2, 0x2e, 0x5a, 0x05, 0x60, 0x5b, 0x18, 0x87, 0x58, 0xc1, 0xd5, 0xf8, 0x10, 0x45,
0x19, 0xa2, 0x4d, 0x1f, 0x7a, 0x0d, 0x13, 0x7d, 0x04, 0xd0, 0xf7, 0xb0, 0x29, 0xce, 0xb0, 0xf2, 0xfd, 0x2f, 0x05, 0x16, 0x07, 0x82, 0xfb, 0x6c, 0xeb, 0x76, 0x16, 0x8a, 0x74, 0xbc, 0x9e, 0x6f,
0x59, 0xd5, 0xc2, 0x7e, 0xf8, 0x54, 0x9a, 0x0a, 0xf0, 0x0b, 0x12, 0xf7, 0xa1, 0x64, 0xd9, 0xc4, 0xf4, 0x1c, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x3d, 0x98, 0x39, 0xf4, 0x24, 0x64, 0x94, 0x0a, 0xa0,
0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x08, 0x71, 0xe0, 0x12, 0xfb, 0x1e, 0x36, 0x55, 0x2c, 0xa7, 0x19, 0xa2, 0x4d, 0x1f, 0x7a, 0x0d, 0x13, 0x7d, 0x04, 0xd0, 0xf7, 0xb0, 0x29, 0xce, 0xb0,
0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe2, 0x49, 0xeb, 0x30, 0x30, 0x5c, 0x46, 0xec, 0xf2, 0x59, 0xd5, 0xc2, 0x7e, 0xf8, 0x7c, 0x9b, 0x0a, 0xf0, 0xab, 0x16, 0xf7, 0xa1, 0x64, 0xd9,
0xda, 0xb0, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0b, 0x27, 0x23, 0xc4, 0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x08, 0x71, 0xe0, 0x12, 0xfb, 0x1e, 0x36, 0x55,
0x3b, 0xa4, 0x09, 0xb6, 0x2c, 0xea, 0x6e, 0x0c, 0x28, 0x19, 0x84, 0xb3, 0x80, 0x21, 0x64, 0x34, 0x2c, 0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe2, 0x49, 0xeb, 0x30, 0x30, 0x5c, 0x46,
0x8f, 0x82, 0x21, 0x3c, 0x0e, 0x43, 0x78, 0xea, 0xe7, 0x70, 0x3a, 0x82, 0xe8, 0x44, 0x2c, 0xba, 0xec, 0xda, 0xb0, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0b, 0x27,
0x1f, 0xab, 0xdc, 0x2e, 0x8f, 0xd2, 0x1a, 0x2b, 0xe1, 0xfe, 0x57, 0x81, 0xe5, 0x34, 0x86, 0x37, 0x23, 0x3b, 0xa4, 0x09, 0xb6, 0x2c, 0xea, 0x6e, 0x0c, 0x28, 0x19, 0x84, 0xb3, 0x80, 0x21, 0x64,
0x44, 0x1c, 0x7f, 0x9c, 0x71, 0x19, 0xee, 0xce, 0x78, 0x66, 0xfd, 0x4e, 0xd0, 0xda, 0x3d, 0xa8, 0x34, 0x8f, 0x82, 0x21, 0x3c, 0x0e, 0x43, 0x78, 0xea, 0xe7, 0x70, 0x3a, 0x82, 0xe8, 0x44, 0x2c,
0xa5, 0xf9, 0x33, 0x39, 0x4b, 0xf9, 0x49, 0x66, 0xe9, 0x67, 0xf9, 0x10, 0xf2, 0x5e, 0xf7, 0x7d, 0xba, 0x1f, 0xab, 0xdc, 0x2e, 0x8f, 0xd2, 0x1a, 0x2b, 0xe1, 0xfe, 0x47, 0x81, 0xe5, 0x34, 0x86,
0xd7, 0x3a, 0xe8, 0xd3, 0x90, 0x7f, 0xeb, 0x68, 0x56, 0x23, 0xc0, 0x65, 0xb8, 0x6b, 0x6f, 0x0d, 0x37, 0x44, 0x1c, 0x7f, 0x9c, 0x71, 0xad, 0xee, 0xce, 0x78, 0x66, 0xfd, 0x56, 0xd0, 0xda, 0x3d,
0x11, 0x1f, 0xd8, 0x91, 0x8a, 0xcd, 0x7c, 0x1a, 0xc5, 0x66, 0x38, 0xa6, 0x7e, 0x7b, 0x3c, 0x7d, 0xa8, 0xa5, 0xf9, 0x33, 0x39, 0x4b, 0xf9, 0x49, 0x66, 0xe9, 0x67, 0xf9, 0x10, 0xf2, 0x5e, 0xf7,
0xdf, 0x59, 0x00, 0xf4, 0x67, 0x39, 0x58, 0x88, 0x4e, 0x11, 0xda, 0x06, 0x30, 0x02, 0xcb, 0xc5, 0x7d, 0xd7, 0x3a, 0xe8, 0xd3, 0x90, 0x7f, 0xeb, 0x68, 0x56, 0x23, 0xc0, 0x65, 0xb8, 0x6b, 0x6f,
0x87, 0x72, 0x69, 0xac, 0x61, 0x6a, 0x21, 0x41, 0xf4, 0x1e, 0xe4, 0xdb, 0x4e, 0x5f, 0xcc, 0x5a, 0x0d, 0x11, 0x1f, 0xd8, 0x91, 0x8a, 0xcd, 0x7c, 0x1a, 0xc5, 0x66, 0x38, 0xa6, 0x7e, 0x7b, 0x3c,
0xca, 0x61, 0xf0, 0xa6, 0xd3, 0xe7, 0x19, 0x85, 0xb2, 0xd1, 0x3d, 0x15, 0x3f, 0xdb, 0xcf, 0xce, 0x7d, 0xdf, 0x59, 0x00, 0xf4, 0x67, 0x39, 0x58, 0x88, 0x4e, 0x11, 0xda, 0x06, 0x30, 0x02, 0xcb,
0x92, 0xcf, 0xd9, 0x7b, 0x2e, 0x23, 0x98, 0xd1, 0x53, 0x58, 0x78, 0xe5, 0x5a, 0xbe, 0x71, 0xd0, 0xc5, 0x87, 0x72, 0x69, 0xac, 0x61, 0x6a, 0x21, 0x41, 0xf4, 0x1e, 0xe4, 0xdb, 0x4e, 0x5f, 0xcc,
0xc5, 0x7a, 0xd7, 0x38, 0xc6, 0xae, 0xc8, 0x92, 0x63, 0x24, 0xb2, 0xb2, 0x14, 0x7c, 0x46, 0xe5, 0x5a, 0xca, 0x61, 0xf0, 0xa6, 0xd3, 0xe7, 0x19, 0x85, 0xb2, 0xd1, 0x3d, 0x15, 0x3f, 0xdb, 0xcf,
0xd4, 0x3f, 0x81, 0x82, 0xb4, 0x68, 0xc4, 0x8a, 0xb0, 0x07, 0x2b, 0x7d, 0xca, 0xa6, 0xb3, 0x8b, 0xce, 0x92, 0xcf, 0xd9, 0x7b, 0x2e, 0x23, 0x98, 0xd1, 0x53, 0x58, 0x78, 0xe5, 0x5a, 0xbe, 0x71,
0x6b, 0xb6, 0x61, 0x13, 0xdd, 0xc3, 0x74, 0x19, 0x97, 0x57, 0xea, 0x47, 0xa4, 0xe8, 0x65, 0x26, 0xd0, 0xc5, 0x7a, 0xd7, 0x38, 0xc6, 0xae, 0xc8, 0x92, 0x63, 0x24, 0xb2, 0xb2, 0x14, 0x7c, 0x46,
0xbd, 0x49, 0x5c, 0xdc, 0x34, 0x6c, 0xd2, 0xe2, 0xa2, 0xea, 0x4b, 0x28, 0x85, 0x06, 0x38, 0xc2, 0xe5, 0xd4, 0x3f, 0x84, 0x82, 0xb4, 0x68, 0xc4, 0x8a, 0xb0, 0x07, 0x2b, 0x7d, 0xca, 0xa6, 0xb3,
0x84, 0x06, 0x2c, 0xc9, 0xa3, 0x78, 0x0f, 0xfb, 0x62, 0x79, 0x19, 0xab, 0xf3, 0x45, 0x21, 0xd7, 0x2b, 0x70, 0xb6, 0x61, 0x13, 0xdd, 0xc3, 0x74, 0x19, 0x97, 0x97, 0xf3, 0x47, 0xa4, 0xe8, 0x65,
0xc2, 0x3e, 0xbf, 0x3e, 0x71, 0x1f, 0x4e, 0x6b, 0x98, 0x38, 0xd8, 0x0e, 0xe6, 0xf3, 0x19, 0xe9, 0x26, 0xbd, 0x49, 0x5c, 0xdc, 0x34, 0x6c, 0xd2, 0xe2, 0xa2, 0xea, 0x4b, 0x28, 0x85, 0x06, 0x38,
0x4c, 0x90, 0xc1, 0xcf, 0x42, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0xeb, 0x67, 0xa1, 0x20, 0x7f, 0x5d, 0xc2, 0x84, 0x06, 0x2c, 0xc9, 0xa3, 0x78, 0x0f, 0xfb, 0x62, 0x79, 0x19, 0xab, 0xf3, 0x45, 0x21,
0x8a, 0xe6, 0x20, 0xbf, 0xb7, 0xb9, 0x5b, 0x99, 0xa2, 0x0f, 0xfb, 0x5b, 0xbb, 0x15, 0xe5, 0x7a, 0xd7, 0xc2, 0x3e, 0xbf, 0x3e, 0x71, 0x1f, 0x4e, 0x6b, 0x98, 0x38, 0xd8, 0x0e, 0xe6, 0xf3, 0x19,
0x0f, 0x2a, 0xf1, 0x1f, 0x54, 0xa2, 0x15, 0x38, 0xb1, 0xab, 0xed, 0xec, 0xd6, 0x9f, 0xd4, 0xf7, 0xe9, 0x4c, 0x90, 0xc1, 0xcf, 0x42, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0xeb, 0x67, 0xa1, 0x20, 0x7f,
0x1a, 0x3b, 0x4d, 0x7d, 0x57, 0x6b, 0x7c, 0x5c, 0xdf, 0xdb, 0xae, 0x4c, 0xa1, 0x35, 0x38, 0x17, 0xd0, 0x8a, 0xe6, 0x20, 0xbf, 0xb7, 0xb9, 0x5b, 0x99, 0xa2, 0x0f, 0xfb, 0x5b, 0xbb, 0x15, 0xe5,
0x7e, 0xf1, 0x74, 0xa7, 0xb5, 0xa7, 0xef, 0xed, 0xe8, 0x9b, 0x3b, 0xcd, 0xbd, 0x7a, 0xa3, 0xb9, 0x7a, 0x0f, 0x2a, 0xf1, 0xdf, 0x70, 0xa2, 0x15, 0x38, 0xb1, 0xab, 0xed, 0xec, 0xd6, 0x9f, 0xd4,
0xad, 0x55, 0x14, 0x74, 0x0e, 0x4e, 0x87, 0x59, 0x1e, 0x35, 0xb6, 0x1a, 0xda, 0xf6, 0x26, 0x7d, 0xf7, 0x1a, 0x3b, 0x4d, 0x7d, 0x57, 0x6b, 0x7c, 0x5c, 0xdf, 0xdb, 0xae, 0x4c, 0xa1, 0x35, 0x38,
0xae, 0x3f, 0xab, 0xe4, 0xae, 0xdf, 0x82, 0x72, 0xe4, 0xf7, 0x8f, 0xd4, 0x90, 0xdd, 0x9d, 0xad, 0x17, 0x7e, 0xf1, 0x74, 0xa7, 0xb5, 0xa7, 0xef, 0xed, 0xe8, 0x9b, 0x3b, 0xcd, 0xbd, 0x7a, 0xa3,
0xca, 0x14, 0x2a, 0x43, 0x31, 0xac, 0xa7, 0x00, 0xd3, 0xcd, 0x9d, 0xad, 0xed, 0x4a, 0xee, 0xfa, 0xb9, 0xad, 0x55, 0x14, 0x74, 0x0e, 0x4e, 0x87, 0x59, 0x1e, 0x35, 0xb6, 0x1a, 0xda, 0xf6, 0x26,
0x5d, 0x58, 0x8c, 0xdd, 0x9c, 0x45, 0x4b, 0x50, 0x6e, 0xd5, 0x9b, 0x5b, 0x8f, 0x76, 0x3e, 0xd5, 0x7d, 0xae, 0x3f, 0xab, 0xe4, 0xae, 0xdf, 0x82, 0x72, 0xe4, 0x27, 0x97, 0xd4, 0x90, 0xdd, 0x9d,
0xb5, 0xed, 0xfa, 0xd6, 0x67, 0x95, 0x29, 0xb4, 0x0c, 0x15, 0x49, 0x6a, 0xee, 0xec, 0x71, 0xaa, 0xad, 0xca, 0x14, 0x2a, 0x43, 0x31, 0xac, 0xa7, 0x00, 0xd3, 0xcd, 0x9d, 0xad, 0xed, 0x4a, 0xee,
0x72, 0xfd, 0x45, 0xec, 0xcb, 0xc2, 0xe8, 0x24, 0x2c, 0x05, 0xdd, 0xe8, 0x9b, 0xda, 0x76, 0x7d, 0xfa, 0x5d, 0x58, 0x8c, 0xdd, 0xc1, 0x45, 0x4b, 0x50, 0x6e, 0xd5, 0x9b, 0x5b, 0x8f, 0x76, 0x3e,
0x6f, 0x9b, 0xf6, 0x1e, 0x21, 0x6b, 0xfb, 0xcd, 0x66, 0xa3, 0xf9, 0xa4, 0xa2, 0x50, 0xad, 0x03, 0xd5, 0xb5, 0xed, 0xfa, 0xd6, 0x67, 0x95, 0x29, 0xb4, 0x0c, 0x15, 0x49, 0x6a, 0xee, 0xec, 0x71,
0xf2, 0xf6, 0xa7, 0x0d, 0xca, 0x9c, 0x8b, 0x32, 0xef, 0x37, 0x7f, 0xd8, 0xdc, 0xf9, 0xa4, 0x59, 0xaa, 0x72, 0xfd, 0x45, 0xec, 0xcb, 0xc2, 0xe8, 0x24, 0x2c, 0x05, 0xdd, 0xe8, 0x9b, 0xda, 0x76,
0xc9, 0x6f, 0xfc, 0x72, 0x09, 0x16, 0x64, 0x79, 0x87, 0x5d, 0x76, 0x97, 0x65, 0x17, 0xe6, 0xe4, 0x7d, 0x6f, 0x9b, 0xf6, 0x1e, 0x21, 0x6b, 0xfb, 0xcd, 0x66, 0xa3, 0xf9, 0xa4, 0xa2, 0x50, 0xad,
0x6f, 0x94, 0x53, 0xf2, 0x72, 0xf4, 0x97, 0xd5, 0xb5, 0xb5, 0x21, 0x1c, 0xa2, 0xca, 0x9e, 0x42, 0x03, 0xf2, 0xf6, 0xa7, 0x0d, 0xca, 0x9c, 0x8b, 0x32, 0xef, 0x37, 0x7f, 0xd8, 0xdc, 0xf9, 0xa4,
0x07, 0xac, 0xea, 0x0d, 0xdd, 0x64, 0xbe, 0x9c, 0x5a, 0x63, 0x26, 0x2e, 0x4f, 0xd7, 0xae, 0x8c, 0x59, 0xc9, 0x6f, 0xfc, 0x62, 0x09, 0x16, 0x64, 0x79, 0x87, 0x5d, 0x76, 0x97, 0x65, 0x17, 0xe6,
0xe4, 0x0b, 0xfa, 0xc0, 0xb4, 0xb0, 0x0d, 0xff, 0x54, 0x07, 0x5d, 0x49, 0xab, 0x48, 0x53, 0x7e, 0xe4, 0xcf, 0xa2, 0x53, 0xf2, 0x72, 0xf4, 0xc7, 0xdc, 0xb5, 0xb5, 0x21, 0x1c, 0xa2, 0xca, 0x9e,
0x0b, 0x54, 0xbb, 0x3a, 0x9a, 0x31, 0xe8, 0xe6, 0x05, 0x54, 0xe2, 0x3f, 0xdb, 0x41, 0x29, 0x80, 0x42, 0x07, 0xac, 0xea, 0x0d, 0xdd, 0x89, 0xbe, 0x9c, 0x5a, 0x63, 0x26, 0xae, 0x61, 0xd7, 0xae,
0x69, 0xc6, 0x6f, 0x83, 0x6a, 0xd7, 0xc7, 0x61, 0x0d, 0x77, 0x96, 0xf8, 0x81, 0xcb, 0xb5, 0x71, 0x8c, 0xe4, 0x0b, 0xfa, 0xc0, 0xb4, 0xb0, 0x0d, 0xff, 0xe8, 0x07, 0x5d, 0x49, 0xab, 0x48, 0x53,
0x7e, 0x31, 0x90, 0xd9, 0x59, 0xd6, 0x8f, 0x0b, 0xb8, 0x03, 0xa3, 0xb7, 0x94, 0x51, 0xea, 0xaf, 0x7e, 0x55, 0x54, 0xbb, 0x3a, 0x9a, 0x31, 0xe8, 0xe6, 0x05, 0x54, 0xe2, 0x3f, 0x00, 0x42, 0x29,
0x49, 0x52, 0xee, 0xb8, 0xa7, 0x39, 0x30, 0xfd, 0xc2, 0xb3, 0x3a, 0x85, 0x8e, 0x60, 0x31, 0x76, 0x80, 0x69, 0xc6, 0xaf, 0x8c, 0x6a, 0xd7, 0xc7, 0x61, 0x0d, 0x77, 0x96, 0xf8, 0xa9, 0xcc, 0xb5,
0x29, 0x01, 0xa5, 0x88, 0xa7, 0xdf, 0xbe, 0xa8, 0x5d, 0x1b, 0x83, 0x33, 0x1a, 0x11, 0xe1, 0x4b, 0x71, 0x7e, 0x7b, 0x90, 0xd9, 0x59, 0xd6, 0xcf, 0x14, 0xb8, 0x03, 0xa3, 0xf7, 0x9d, 0x51, 0xea,
0x08, 0xe9, 0x11, 0x91, 0x72, 0xc5, 0x21, 0x3d, 0x22, 0x52, 0xef, 0x33, 0xb0, 0xe0, 0x8e, 0x5c, 0xef, 0x52, 0x52, 0x6e, 0xcb, 0xa7, 0x39, 0x30, 0xfd, 0xea, 0xb4, 0x3a, 0x85, 0x8e, 0x60, 0x31,
0x3e, 0x48, 0x0b, 0xee, 0xb4, 0x2b, 0x0f, 0xb5, 0x2b, 0x23, 0xf9, 0xc2, 0x4e, 0x8b, 0x5d, 0x45, 0x76, 0x29, 0x01, 0xa5, 0x88, 0xa7, 0xdf, 0xbe, 0xa8, 0x5d, 0x1b, 0x83, 0x33, 0x1a, 0x11, 0xe1,
0x48, 0x73, 0x5a, 0xfa, 0x55, 0x87, 0xda, 0xb5, 0x31, 0x38, 0xe3, 0x51, 0x30, 0x38, 0xd8, 0xcc, 0x4b, 0x08, 0xe9, 0x11, 0x91, 0x72, 0xc5, 0x21, 0x3d, 0x22, 0x52, 0xef, 0x33, 0xb0, 0xe0, 0x8e,
0x8a, 0x82, 0xc4, 0x31, 0x7c, 0x56, 0x14, 0x24, 0xcf, 0x48, 0x45, 0x14, 0xc4, 0x0e, 0x24, 0xaf, 0x5c, 0x3e, 0x48, 0x0b, 0xee, 0xb4, 0x2b, 0x0f, 0xb5, 0x2b, 0x23, 0xf9, 0xc2, 0x4e, 0x8b, 0x5d,
0x8e, 0x71, 0x80, 0x92, 0x1d, 0x05, 0xe9, 0x47, 0x2d, 0xea, 0x14, 0xfa, 0x53, 0x05, 0xaa, 0x59, 0x45, 0x48, 0x73, 0x5a, 0xfa, 0x55, 0x87, 0xda, 0xb5, 0x31, 0x38, 0xe3, 0x51, 0x30, 0x38, 0xd8,
0x87, 0x13, 0x28, 0xa5, 0xaa, 0x1b, 0x71, 0x9e, 0x52, 0xdb, 0x98, 0x44, 0x24, 0xb0, 0xe2, 0x4b, 0xcc, 0x8a, 0x82, 0xc4, 0x31, 0x7c, 0x56, 0x14, 0x24, 0xcf, 0x48, 0x45, 0x14, 0xc4, 0x0e, 0x24,
0x40, 0xc9, 0xd5, 0x0e, 0xbd, 0x9b, 0x36, 0x33, 0x19, 0x6b, 0x6a, 0xed, 0xbd, 0xf1, 0x98, 0x83, 0xaf, 0x8e, 0x71, 0x80, 0x92, 0x1d, 0x05, 0xe9, 0x47, 0x2d, 0xea, 0x14, 0xfa, 0x23, 0x05, 0xaa,
0x2e, 0x5b, 0x50, 0x90, 0xc7, 0x21, 0x28, 0x25, 0x4b, 0xc7, 0x0e, 0x63, 0x6a, 0xea, 0x30, 0x96, 0x59, 0x87, 0x13, 0x28, 0xa5, 0xaa, 0x1b, 0x71, 0x9e, 0x52, 0xdb, 0x98, 0x44, 0x24, 0xb0, 0xe2,
0x40, 0xe9, 0x13, 0x98, 0xa6, 0x54, 0x74, 0x2e, 0x9d, 0x5b, 0x2a, 0x5b, 0xcd, 0x7a, 0x1d, 0x28, 0x4b, 0x40, 0xc9, 0xd5, 0x0e, 0xbd, 0x9b, 0x36, 0x33, 0x19, 0x6b, 0x6a, 0xed, 0xbd, 0xf1, 0x98,
0x7a, 0x0e, 0xb3, 0x1c, 0xff, 0x47, 0x29, 0x78, 0x43, 0xe4, 0x94, 0xa2, 0x76, 0x21, 0x9b, 0x21, 0x83, 0x2e, 0x5b, 0x50, 0x90, 0xc7, 0x21, 0x28, 0x25, 0x4b, 0xc7, 0x0e, 0x63, 0x6a, 0xea, 0x30,
0x50, 0xf7, 0x05, 0xff, 0xf7, 0x15, 0x02, 0xda, 0x47, 0xef, 0xa4, 0xff, 0x1e, 0x38, 0x7a, 0x92, 0x96, 0x40, 0xe9, 0x13, 0x98, 0xa6, 0x54, 0x74, 0x2e, 0x9d, 0x5b, 0x2a, 0x5b, 0xcd, 0x7a, 0x1d,
0x50, 0xbb, 0x34, 0x82, 0x2b, 0xfc, 0x51, 0xc4, 0x6a, 0xdd, 0x2b, 0x23, 0x37, 0x2c, 0xd9, 0x1f, 0x28, 0x7a, 0x0e, 0xb3, 0x1c, 0xff, 0x47, 0x29, 0x78, 0x43, 0xe4, 0x94, 0xa2, 0x76, 0x21, 0x9b,
0x45, 0xfa, 0x96, 0x88, 0x07, 0x49, 0x72, 0xcb, 0x94, 0x16, 0x24, 0x99, 0x1b, 0xd5, 0xb4, 0x20, 0x21, 0x50, 0xf7, 0x05, 0xff, 0x8f, 0x19, 0x02, 0xda, 0x47, 0xef, 0xa4, 0xff, 0x04, 0x39, 0x7a,
0xc9, 0xde, 0x85, 0xa9, 0x53, 0xc8, 0x87, 0x13, 0x29, 0x00, 0x19, 0x7a, 0x2f, 0x2b, 0xc8, 0xd3, 0x92, 0x50, 0xbb, 0x34, 0x82, 0x2b, 0xfc, 0x51, 0xc4, 0x6a, 0xdd, 0x2b, 0x23, 0x37, 0x2c, 0xd9,
0xd0, 0xba, 0xda, 0x8d, 0x31, 0xb9, 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0xf3, 0xd9, 0xa8, 0x51, 0xe6, 0x1f, 0x45, 0xfa, 0x96, 0x88, 0x07, 0x49, 0x72, 0xcb, 0x94, 0x16, 0x24, 0x99, 0x1b, 0xd5, 0xb4,
0xe4, 0xc7, 0x3f, 0xf1, 0x8d, 0x7f, 0xcf, 0xc3, 0x3c, 0x07, 0x3f, 0x45, 0x05, 0xf3, 0x19, 0xc0, 0x20, 0xc9, 0xde, 0x85, 0xa9, 0x53, 0xc8, 0x87, 0x13, 0x29, 0x00, 0x19, 0x7a, 0x2f, 0x2b, 0xc8,
0xe0, 0xdc, 0x01, 0x5d, 0x4c, 0xf7, 0x49, 0xe4, 0x6c, 0xa6, 0xf6, 0xce, 0x70, 0xa6, 0x70, 0xa0, 0xd3, 0xd0, 0xba, 0xda, 0x8d, 0x31, 0xb9, 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0xf3, 0xd9, 0xa8, 0x51,
0x85, 0x30, 0xfc, 0xb4, 0x40, 0x4b, 0x1e, 0x55, 0xa4, 0x05, 0x5a, 0xca, 0x41, 0x80, 0x3a, 0x85, 0xe6, 0xe4, 0xc7, 0x3f, 0xf1, 0x8d, 0x7f, 0xcd, 0xc3, 0x3c, 0x07, 0x3f, 0x45, 0x05, 0xf3, 0x19,
0x3e, 0x86, 0x62, 0x00, 0x16, 0xa3, 0x34, 0xb0, 0x39, 0x86, 0x86, 0xd7, 0x2e, 0x0e, 0xe5, 0x09, 0xc0, 0xe0, 0xdc, 0x01, 0x5d, 0x4c, 0xf7, 0x49, 0xe4, 0x6c, 0xa6, 0xf6, 0xce, 0x70, 0xa6, 0x70,
0x5b, 0x1d, 0x42, 0x82, 0xd3, 0xac, 0x4e, 0x22, 0xce, 0x69, 0x56, 0xa7, 0xc1, 0xc9, 0x03, 0x9f, 0xa0, 0x85, 0x30, 0xfc, 0xb4, 0x40, 0x4b, 0x1e, 0x55, 0xa4, 0x05, 0x5a, 0xca, 0x41, 0x80, 0x3a,
0x70, 0xbc, 0x28, 0xd3, 0x27, 0x11, 0xb8, 0x2e, 0xd3, 0x27, 0x51, 0xd0, 0x49, 0x9d, 0x7a, 0x74, 0x85, 0x3e, 0x86, 0x62, 0x00, 0x16, 0xa3, 0x34, 0xb0, 0x39, 0x86, 0x86, 0xd7, 0x2e, 0x0e, 0xe5,
0xf9, 0xd7, 0x5f, 0xad, 0x2a, 0xff, 0xf2, 0xd5, 0xea, 0xd4, 0x4f, 0xbf, 0x5e, 0x55, 0x7e, 0xfd, 0x09, 0x5b, 0x1d, 0x42, 0x82, 0xd3, 0xac, 0x4e, 0x22, 0xce, 0x69, 0x56, 0xa7, 0xc1, 0xc9, 0x03,
0xf5, 0xaa, 0xf2, 0xcf, 0x5f, 0xaf, 0x2a, 0xff, 0xf1, 0xf5, 0xaa, 0xf2, 0x97, 0xff, 0xb9, 0x3a, 0x9f, 0x70, 0xbc, 0x28, 0xd3, 0x27, 0x11, 0xb8, 0x2e, 0xd3, 0x27, 0x51, 0xd0, 0x49, 0x9d, 0x7a,
0xf5, 0xa3, 0x82, 0x94, 0x3e, 0x98, 0x65, 0xff, 0x84, 0xe6, 0x83, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x74, 0xf9, 0x57, 0x5f, 0xad, 0x2a, 0xff, 0xf4, 0xd5, 0xea, 0xd4, 0x4f, 0xbf, 0x5e, 0x55, 0x7e,
0xff, 0xb5, 0x80, 0xdd, 0xf4, 0x4a, 0x48, 0x00, 0x00, 0xf5, 0xf5, 0xaa, 0xf2, 0x8f, 0x5f, 0xaf, 0x2a, 0xff, 0xf6, 0xf5, 0xaa, 0xf2, 0x67, 0xff, 0xbe,
0x3a, 0xf5, 0xa3, 0x82, 0x94, 0x3e, 0x98, 0x65, 0xff, 0xf7, 0xe6, 0x83, 0xff, 0x0b, 0x00, 0x00,
0xff, 0xff, 0xc2, 0xad, 0x03, 0x06, 0xbd, 0x48, 0x00, 0x00,
} }

View File

@ -143,6 +143,7 @@ message DNSConfig {
enum Protocol { enum Protocol {
TCP = 0; TCP = 0;
UDP = 1; UDP = 1;
SCTP = 2;
} }
// PortMapping specifies the port mapping configurations of a sandbox. // PortMapping specifies the port mapping configurations of a sandbox.
@ -344,6 +345,12 @@ message PodSandboxConfig {
message RunPodSandboxRequest { message RunPodSandboxRequest {
// Configuration for creating a PodSandbox. // Configuration for creating a PodSandbox.
PodSandboxConfig config = 1; PodSandboxConfig config = 1;
// Named runtime configuration to use for this PodSandbox.
// If the runtime handler is unknown, this request should be rejected. An
// empty string should select the default handler, equivalent to the
// behavior before this feature was added.
// See https://git.k8s.io/community/keps/sig-node/0014-runtime-class.md
string runtime_handler = 2;
} }
message RunPodSandboxResponse { message RunPodSandboxResponse {
@ -586,6 +593,12 @@ message LinuxContainerSecurityContext {
// no_new_privs defines if the flag for no_new_privs should be set on the // no_new_privs defines if the flag for no_new_privs should be set on the
// container. // container.
bool no_new_privs = 11; bool no_new_privs = 11;
// masked_paths is a slice of paths that should be masked by the container
// runtime, this can be passed directly to the OCI spec.
repeated string masked_paths = 13;
// readonly_paths is a slice of paths that should be set as readonly by the
// container runtime, this can be passed directly to the OCI spec.
repeated string readonly_paths = 14;
} }
// LinuxContainerConfig contains platform-specific configuration for // LinuxContainerConfig contains platform-specific configuration for

View File

@ -24,9 +24,9 @@ import (
runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
) )
// maxMsgSize use 8MB as the default message size limit. // maxMsgSize use 16MB as the default message size limit.
// grpc library default is 4MB // grpc library default is 4MB
const maxMsgSize = 1024 * 1024 * 8 const maxMsgSize = 1024 * 1024 * 16
// getContextWithTimeout returns a context with timeout. // getContextWithTimeout returns a context with timeout.
func getContextWithTimeout(timeout time.Duration) (context.Context, context.CancelFunc) { func getContextWithTimeout(timeout time.Duration) (context.Context, context.CancelFunc) {

View File

@ -46,7 +46,7 @@ func handleHttpStreams(req *http.Request, w http.ResponseWriter, portForwarder P
upgrader := spdy.NewResponseUpgrader() upgrader := spdy.NewResponseUpgrader()
conn := upgrader.UpgradeResponse(w, req, httpStreamReceived(streamChan)) conn := upgrader.UpgradeResponse(w, req, httpStreamReceived(streamChan))
if conn == nil { if conn == nil {
return errors.New("Unable to upgrade websocket connection") return errors.New("Unable to upgrade httpstream connection")
} }
defer conn.Close() defer conn.Close()

6
vendor/k8s.io/utils/README.md generated vendored
View File

@ -45,6 +45,8 @@ an existing package to this repository.
- [Clock](/clock) provides an interface for time-based operations. It allows - [Clock](/clock) provides an interface for time-based operations. It allows
mocking time for testing. mocking time for testing.
- [Pointers](/pointers) provides some functions for pointer-based operations.
[Build Status]: https://travis-ci.org/kubernetes/utils.svg?branch=master [Build Status]: https://travis-ci.org/kubernetes/utils.svg?branch=master
[Go standard libs]: https://golang.org/pkg/#stdlib [Go standard libs]: https://golang.org/pkg/#stdlib
@ -55,3 +57,7 @@ an existing package to this repository.
[kubeadm]: https://github.com/kubernetes/kubeadm [kubeadm]: https://github.com/kubernetes/kubeadm
[kubectl]: https://github.com/kubernetes/kubectl [kubectl]: https://github.com/kubernetes/kubectl
[instructions for moving]: ./HOWTOMOVE.md [instructions for moving]: ./HOWTOMOVE.md
## Contributing
Please see [CONTRIBUTING.md](CONTRIBUTING.md) for instructions on how to contribute.