From f548db0a10637dceb0145f6cdf4e9b2589ae7b52 Mon Sep 17 00:00:00 2001 From: Ben Parees Date: Thu, 29 Sep 2016 14:12:23 -0400 Subject: [PATCH] build nodeselector support with defaults and overrides --- ...om_openshift_origin_pkg_build_api_v1.proto | 3 + api/swagger-spec/oapi-v1.json | 12 +- api/swagger-spec/openshift-openapi-spec.json | 12 +- pkg/build/admission/defaults/admission.go | 24 + pkg/build/admission/defaults/api/types.go | 3 + .../admission/defaults/api/v1/swagger_doc.go | 13 +- pkg/build/admission/defaults/api/v1/types.go | 15 +- pkg/build/admission/overrides/admission.go | 15 +- .../admission/overrides/admission_test.go | 42 ++ pkg/build/admission/overrides/api/types.go | 3 + .../admission/overrides/api/v1/swagger_doc.go | 5 +- pkg/build/admission/overrides/api/v1/types.go | 3 + pkg/build/admission/testutil/build.go | 5 + pkg/build/api/types.go | 3 + pkg/build/api/v1/generated.pb.go | 542 +++++++++++------- pkg/build/api/v1/generated.proto | 3 + pkg/build/api/v1/swagger_doc.go | 1 + pkg/build/api/v1/types.go | 3 + pkg/build/api/v1/zz_generated.conversion.go | 2 + pkg/build/api/v1/zz_generated.deepcopy.go | 9 + pkg/build/api/zz_generated.deepcopy.go | 9 + pkg/build/controller/strategy/custom.go | 1 + pkg/build/controller/strategy/custom_test.go | 19 +- pkg/build/controller/strategy/docker.go | 1 + pkg/build/controller/strategy/docker_test.go | 19 +- pkg/build/controller/strategy/sti.go | 1 + pkg/build/controller/strategy/sti_test.go | 22 +- pkg/build/generator/generator.go | 1 + pkg/build/generator/generator_test.go | 10 +- pkg/cmd/server/origin/master_config.go | 10 +- pkg/cmd/server/origin/master_config_test.go | 25 + .../k8s.io/client-go/1.4/pkg/version/base.go | 4 +- vendor/k8s.io/kubernetes/pkg/version/base.go | 4 +- 33 files changed, 598 insertions(+), 246 deletions(-) diff --git a/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto b/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto index 3dc70cfcbb75..8a613cea15bb 100644 --- a/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto +++ b/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto @@ -489,6 +489,9 @@ message CommonSpec { // be active on a node before the system actively tries to terminate the // build; value must be positive integer optional int64 completionDeadlineSeconds = 8; + + // nodeSelector is a selector which must be true for the build pod to fit on a node + map nodeSelector = 9; } // CustomBuildStrategy defines input parameters specific to Custom build. diff --git a/api/swagger-spec/oapi-v1.json b/api/swagger-spec/oapi-v1.json index 9a601134377c..d7c95df52ec1 100644 --- a/api/swagger-spec/oapi-v1.json +++ b/api/swagger-spec/oapi-v1.json @@ -21383,7 +21383,7 @@ }, "v1.BuildConfig": { "id": "v1.BuildConfig", - "description": "Build configurations define a build process for new Docker images. There are three types of builds possible - a Docker build using a Dockerfile, a Source-to-Image build that uses a specially prepared base image that accepts source code that it can make runnable, and a custom build that can run // arbitrary Docker images as a base and accept the build parameters. Builds run on the cluster and on completion are pushed to the Docker registry specified in the \"output\" section. A build can be triggered via a webhook, when the base image changes, or when a user manually requests a new build be // created.\n\nEach build created by a build configuration is numbered and refers back to its parent configuration. Multiple builds can be triggered at once. Builds that do not have \"output\" set can be used to test code or run a verification build.", + "description": "BuildConfig is a template which can be used to create new builds.", "required": [ "spec", "status" @@ -21462,6 +21462,10 @@ "type": "integer", "format": "int64", "description": "completionDeadlineSeconds is an optional duration in seconds, counted from the time when a build pod gets scheduled in the system, that the build may be active on a node before the system actively tries to terminate the build; value must be positive integer" + }, + "nodeSelector": { + "type": "object", + "description": "nodeSelector is a selector which must be true for the build pod to fit on a node" } } }, @@ -21640,7 +21644,7 @@ }, "v1.ImageSource": { "id": "v1.ImageSource", - "description": "ImageSource is used to describe build source that will be extracted from an image. A reference of type ImageStreamTag, ImageStreamImage or DockerImage may be used. A pull secret can be specified to pull the image from an external registry or override the default service account secret if pulling from the internal registry. A list of paths to copy from the image and their respective destination within the build directory must be specified in the paths array.", + "description": "ImageSource describes an image that is used as source for the build", "required": [ "from", "paths" @@ -22489,6 +22493,10 @@ "format": "int64", "description": "completionDeadlineSeconds is an optional duration in seconds, counted from the time when a build pod gets scheduled in the system, that the build may be active on a node before the system actively tries to terminate the build; value must be positive integer" }, + "nodeSelector": { + "type": "object", + "description": "nodeSelector is a selector which must be true for the build pod to fit on a node" + }, "triggeredBy": { "type": "array", "items": { diff --git a/api/swagger-spec/openshift-openapi-spec.json b/api/swagger-spec/openshift-openapi-spec.json index 2e072607324f..cc82639ed190 100644 --- a/api/swagger-spec/openshift-openapi-spec.json +++ b/api/swagger-spec/openshift-openapi-spec.json @@ -44617,7 +44617,7 @@ } }, "v1.BuildConfig": { - "description": "Build configurations define a build process for new Docker images. There are three types of builds possible - a Docker build using a Dockerfile, a Source-to-Image build that uses a specially prepared base image that accepts source code that it can make runnable, and a custom build that can run // arbitrary Docker images as a base and accept the build parameters. Builds run on the cluster and on completion are pushed to the Docker registry specified in the \"output\" section. A build can be triggered via a webhook, when the base image changes, or when a user manually requests a new build be // created.\n\nEach build created by a build configuration is numbered and refers back to its parent configuration. Multiple builds can be triggered at once. Builds that do not have \"output\" set can be used to test code or run a verification build.", + "description": "BuildConfig is a template which can be used to create new builds.", "required": [ "spec", "status" @@ -44680,6 +44680,10 @@ "type": "integer", "format": "int64" }, + "nodeSelector": { + "description": "nodeSelector is a selector which must be true for the build pod to fit on a node", + "type": "object" + }, "output": { "$ref": "#/definitions/v1.BuildOutput" }, @@ -44906,6 +44910,10 @@ "type": "integer", "format": "int64" }, + "nodeSelector": { + "description": "nodeSelector is a selector which must be true for the build pod to fit on a node", + "type": "object" + }, "output": { "$ref": "#/definitions/v1.BuildOutput" }, @@ -47845,7 +47853,7 @@ } }, "v1.ImageSource": { - "description": "ImageSource is used to describe build source that will be extracted from an image. A reference of type ImageStreamTag, ImageStreamImage or DockerImage may be used. A pull secret can be specified to pull the image from an external registry or override the default service account secret if pulling from the internal registry. A list of paths to copy from the image and their respective destination within the build directory must be specified in the paths array.", + "description": "ImageSource describes an image that is used as source for the build", "required": [ "from", "paths" diff --git a/pkg/build/admission/defaults/admission.go b/pkg/build/admission/defaults/admission.go index 4151594e8130..962c5bcdeb9f 100644 --- a/pkg/build/admission/defaults/admission.go +++ b/pkg/build/admission/defaults/admission.go @@ -72,6 +72,22 @@ func (a *buildDefaults) Admit(attributes admission.Attributes) error { a.applyBuildDefaults(build) + pod, err := buildadmission.GetPod(attributes) + if err != nil { + return err + } + + if len(a.defaultsConfig.NodeSelector) != 0 && pod.Spec.NodeSelector == nil { + pod.Spec.NodeSelector = map[string]string{} + } + for k, v := range a.defaultsConfig.NodeSelector { + if addDefaultNodeSelector(k, v, pod.Spec.NodeSelector) { + glog.V(5).Infof("Added default nodeselector %s=%s to build pod %s/%s", k, v, pod.Namespace, pod.Name) + } else { + glog.V(5).Infof("Not defaulting pre-existing nodeselector %s on build pod %s/%s", k, pod.Namespace, pod.Name) + } + } + err = buildadmission.SetBuildLogLevel(attributes, build) if err != nil { return err @@ -153,3 +169,11 @@ func addDefaultEnvVar(v kapi.EnvVar, envVars *[]kapi.EnvVar) { *envVars = append(*envVars, v) } } + +func addDefaultNodeSelector(k, v string, selectors map[string]string) bool { + if _, ok := selectors[k]; !ok { + selectors[k] = v + return true + } + return false +} diff --git a/pkg/build/admission/defaults/api/types.go b/pkg/build/admission/defaults/api/types.go index a6487dea06b9..be7b9a2790db 100644 --- a/pkg/build/admission/defaults/api/types.go +++ b/pkg/build/admission/defaults/api/types.go @@ -25,6 +25,9 @@ type BuildDefaultsConfig struct { // SourceStrategyDefaults are default values that apply to builds using the // source strategy. SourceStrategyDefaults *SourceStrategyDefaultsConfig + + // NodeSelector is a selector which must be true for the build pod to fit on a node + NodeSelector map[string]string } // SourceStrategyDefaultsConfig contains values that apply to builds using the diff --git a/pkg/build/admission/defaults/api/v1/swagger_doc.go b/pkg/build/admission/defaults/api/v1/swagger_doc.go index ee3869700c6e..f8b917fa3452 100644 --- a/pkg/build/admission/defaults/api/v1/swagger_doc.go +++ b/pkg/build/admission/defaults/api/v1/swagger_doc.go @@ -7,11 +7,12 @@ package v1 var map_BuildDefaultsConfig = map[string]string{ "": "BuildDefaultsConfig controls the default information for Builds", - "gitHTTPProxy": "GitHTTPProxy is the location of the HTTPProxy for Git source", - "gitHTTPSProxy": "GitHTTPSProxy is the location of the HTTPSProxy for Git source", - "gitNoProxy": "GitNoProxy is the list of domains for which the proxy should not be used", - "env": "Env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", - "sourceStrategyDefaults": "SourceStrategyDefaults are default values that apply to builds using the source strategy.", + "gitHTTPProxy": "gitHTTPProxy is the location of the HTTPProxy for Git source", + "gitHTTPSProxy": "gitHTTPSProxy is the location of the HTTPSProxy for Git source", + "gitNoProxy": "gitNoProxy is the list of domains for which the proxy should not be used", + "env": "env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", + "sourceStrategyDefaults": "sourceStrategyDefaults are default values that apply to builds using the source strategy.", + "nodeSelector": "nodeSelector is a selector which must be true for the build pod to fit on a node", } func (BuildDefaultsConfig) SwaggerDoc() map[string]string { @@ -20,7 +21,7 @@ func (BuildDefaultsConfig) SwaggerDoc() map[string]string { var map_SourceStrategyDefaultsConfig = map[string]string{ "": "SourceStrategyDefaultsConfig contains values that apply to builds using the source strategy.", - "incremental": "Incremental indicates if s2i build strategies should perform an incremental build or not", + "incremental": "incremental indicates if s2i build strategies should perform an incremental build or not", } func (SourceStrategyDefaultsConfig) SwaggerDoc() map[string]string { diff --git a/pkg/build/admission/defaults/api/v1/types.go b/pkg/build/admission/defaults/api/v1/types.go index 308d9f8707ea..ba0253976f1a 100644 --- a/pkg/build/admission/defaults/api/v1/types.go +++ b/pkg/build/admission/defaults/api/v1/types.go @@ -9,29 +9,32 @@ import ( type BuildDefaultsConfig struct { unversioned.TypeMeta `json:",inline"` - // GitHTTPProxy is the location of the HTTPProxy for Git source + // gitHTTPProxy is the location of the HTTPProxy for Git source GitHTTPProxy string `json:"gitHTTPProxy,omitempty"` - // GitHTTPSProxy is the location of the HTTPSProxy for Git source + // gitHTTPSProxy is the location of the HTTPSProxy for Git source GitHTTPSProxy string `json:"gitHTTPSProxy,omitempty"` - // GitNoProxy is the list of domains for which the proxy should not be used + // gitNoProxy is the list of domains for which the proxy should not be used GitNoProxy string `json:"gitNoProxy,omitempty"` - // Env is a set of default environment variables that will be applied to the + // env is a set of default environment variables that will be applied to the // build if the specified variables do not exist on the build Env []kapi.EnvVar `json:"env,omitempty"` - // SourceStrategyDefaults are default values that apply to builds using the + // sourceStrategyDefaults are default values that apply to builds using the // source strategy. SourceStrategyDefaults *SourceStrategyDefaultsConfig `json:"sourceStrategyDefaults,omitempty"` + + // nodeSelector is a selector which must be true for the build pod to fit on a node + NodeSelector map[string]string `json:"nodeSelector,omitempty"` } // SourceStrategyDefaultsConfig contains values that apply to builds using the // source strategy. type SourceStrategyDefaultsConfig struct { - // Incremental indicates if s2i build strategies should perform an incremental + // incremental indicates if s2i build strategies should perform an incremental // build or not Incremental *bool `json:"incremental,omitempty"` } diff --git a/pkg/build/admission/overrides/admission.go b/pkg/build/admission/overrides/admission.go index d4ac5862065c..d569ae7f8348 100644 --- a/pkg/build/admission/overrides/admission.go +++ b/pkg/build/admission/overrides/admission.go @@ -59,7 +59,7 @@ func (a *buildOverrides) Admit(attributes admission.Attributes) error { } func (a *buildOverrides) applyOverrides(attributes admission.Attributes) error { - if !a.overridesConfig.ForcePull { + if !a.overridesConfig.ForcePull && len(a.overridesConfig.NodeSelector) == 0 { return nil } build, version, err := buildadmission.GetBuild(attributes) @@ -83,6 +83,19 @@ func (a *buildOverrides) applyOverrides(attributes admission.Attributes) error { glog.V(5).Infof("Setting custom strategy ForcePull to true in build %s/%s", build.Namespace, build.Name) build.Spec.Strategy.CustomStrategy.ForcePull = true } + + pod, err := buildadmission.GetPod(attributes) + if err != nil { + return err + } + if len(a.overridesConfig.NodeSelector) != 0 && pod.Spec.NodeSelector == nil { + pod.Spec.NodeSelector = map[string]string{} + } + for k, v := range a.overridesConfig.NodeSelector { + glog.V(5).Infof("Adding override nodeselector %s=%s to build pod %s/%s", k, v, pod.Namespace, pod.Name) + pod.Spec.NodeSelector[k] = v + } + return buildadmission.SetBuild(attributes, build, version) } diff --git a/pkg/build/admission/overrides/admission_test.go b/pkg/build/admission/overrides/admission_test.go index ebac5a378558..78c055d74384 100644 --- a/pkg/build/admission/overrides/admission_test.go +++ b/pkg/build/admission/overrides/admission_test.go @@ -66,3 +66,45 @@ func TestBuildOverrideForcePull(t *testing.T) { } } } + +func TestBuildOverrideNodeSelector(t *testing.T) { + tests := []struct { + name string + build *buildapi.Build + overrides map[string]string + expected map[string]string + }{ + { + name: "build - full override", + build: u.Build().WithNodeSelector(map[string]string{"key1": "value1"}).AsBuild(), + overrides: map[string]string{"key1": "override1", "key2": "override2"}, + expected: map[string]string{"key1": "override1", "key2": "override2"}, + }, + { + name: "build - partial override", + build: u.Build().WithNodeSelector(map[string]string{"key1": "value1"}).AsBuild(), + overrides: map[string]string{"key2": "override2"}, + expected: map[string]string{"key1": "value1", "key2": "override2"}, + }, + } + + for _, test := range tests { + overrides := NewBuildOverrides(&overridesapi.BuildOverridesConfig{NodeSelector: test.overrides}) + pod := u.Pod().WithBuild(t, test.build, "v1") + // normally the pod will have the nodeselectors from the build, due to the pod creation logic + // in the build controller flow. fake it out here. + pod.Spec.NodeSelector = test.build.Spec.NodeSelector + err := overrides.Admit(pod.ToAttributes()) + if err != nil { + t.Errorf("%s: unexpected error: %v", test.name, err) + } + if len(pod.Spec.NodeSelector) != len(test.expected) { + t.Errorf("%s: incorrect number of selectors, expected %v, got %v", test.name, test.expected, pod.Spec.NodeSelector) + } + for k, v := range pod.Spec.NodeSelector { + if ev, ok := test.expected[k]; !ok || ev != v { + t.Errorf("%s: incorrect selector value for key %s, expected %s, got %s", test.name, k, ev, v) + } + } + } +} diff --git a/pkg/build/admission/overrides/api/types.go b/pkg/build/admission/overrides/api/types.go index e0d6db377da8..7015b0cfc286 100644 --- a/pkg/build/admission/overrides/api/types.go +++ b/pkg/build/admission/overrides/api/types.go @@ -10,4 +10,7 @@ type BuildOverridesConfig struct { // ForcePull indicates whether the build strategy should always be set to ForcePull=true ForcePull bool + + // nodeSelector is a selector which must be true for the build pod to fit on a node + NodeSelector map[string]string } diff --git a/pkg/build/admission/overrides/api/v1/swagger_doc.go b/pkg/build/admission/overrides/api/v1/swagger_doc.go index 36190c511af9..38c8b3c7b370 100644 --- a/pkg/build/admission/overrides/api/v1/swagger_doc.go +++ b/pkg/build/admission/overrides/api/v1/swagger_doc.go @@ -6,8 +6,9 @@ package v1 // ==== DO NOT EDIT THIS FILE MANUALLY ==== var map_BuildOverridesConfig = map[string]string{ - "": "BuildOverridesConfig controls override settings for builds", - "forcePull": "ForcePull indicates whether the build strategy should always be set to ForcePull=true", + "": "BuildOverridesConfig controls override settings for builds", + "forcePull": "ForcePull indicates whether the build strategy should always be set to ForcePull=true", + "nodeSelector": "nodeSelector is a selector which must be true for the build pod to fit on a node", } func (BuildOverridesConfig) SwaggerDoc() map[string]string { diff --git a/pkg/build/admission/overrides/api/v1/types.go b/pkg/build/admission/overrides/api/v1/types.go index ed78def96c86..69d3280b93c8 100644 --- a/pkg/build/admission/overrides/api/v1/types.go +++ b/pkg/build/admission/overrides/api/v1/types.go @@ -10,4 +10,7 @@ type BuildOverridesConfig struct { // ForcePull indicates whether the build strategy should always be set to ForcePull=true ForcePull bool `json:"forcePull"` + + // nodeSelector is a selector which must be true for the build pod to fit on a node + NodeSelector map[string]string `json:"nodeSelector,omitempty"` } diff --git a/pkg/build/admission/testutil/build.go b/pkg/build/admission/testutil/build.go index dfbaeaaa0773..cd66a783303a 100644 --- a/pkg/build/admission/testutil/build.go +++ b/pkg/build/admission/testutil/build.go @@ -49,6 +49,11 @@ func (b *TestBuild) WithCustomStrategy() *TestBuild { return b } +func (b *TestBuild) WithNodeSelector(ns map[string]string) *TestBuild { + b.Spec.NodeSelector = ns + return b +} + func (b *TestBuild) AsBuild() *buildapi.Build { return (*buildapi.Build)(b) } diff --git a/pkg/build/api/types.go b/pkg/build/api/types.go index 7b9c143e7597..cdb059ac278d 100644 --- a/pkg/build/api/types.go +++ b/pkg/build/api/types.go @@ -112,6 +112,9 @@ type CommonSpec struct { // be active on a node before the system actively tries to terminate the // build; value must be positive integer. CompletionDeadlineSeconds *int64 + + // NodeSelector is a selector which must be true for the build pod to fit on a node + NodeSelector map[string]string } // BuildTriggerCause holds information about a triggered build. It is used for diff --git a/pkg/build/api/v1/generated.pb.go b/pkg/build/api/v1/generated.pb.go index c283f7017587..b6f329cc5489 100644 --- a/pkg/build/api/v1/generated.pb.go +++ b/pkg/build/api/v1/generated.pb.go @@ -63,6 +63,7 @@ import time "time" import strings "strings" import reflect "reflect" +import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" import io "io" @@ -1306,6 +1307,23 @@ func (m *CommonSpec) MarshalTo(data []byte) (int, error) { i++ i = encodeVarintGenerated(data, i, uint64(*m.CompletionDeadlineSeconds)) } + if len(m.NodeSelector) > 0 { + for k := range m.NodeSelector { + data[i] = 0x4a + i++ + v := m.NodeSelector[k] + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + i = encodeVarintGenerated(data, i, uint64(mapSize)) + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(len(k))) + i += copy(data[i:], k) + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(len(v))) + i += copy(data[i:], v) + } + } return i, nil } @@ -2522,6 +2540,14 @@ func (m *CommonSpec) Size() (n int) { if m.CompletionDeadlineSeconds != nil { n += 1 + sovGenerated(uint64(*m.CompletionDeadlineSeconds)) } + if len(m.NodeSelector) > 0 { + for k, v := range m.NodeSelector { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } return n } @@ -3086,6 +3112,16 @@ func (this *CommonSpec) String() string { if this == nil { return "nil" } + keysForNodeSelector := make([]string, 0, len(this.NodeSelector)) + for k := range this.NodeSelector { + keysForNodeSelector = append(keysForNodeSelector, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForNodeSelector) + mapStringForNodeSelector := "map[string]string{" + for _, k := range keysForNodeSelector { + mapStringForNodeSelector += fmt.Sprintf("%v: %v,", k, this.NodeSelector[k]) + } + mapStringForNodeSelector += "}" s := strings.Join([]string{`&CommonSpec{`, `ServiceAccount:` + fmt.Sprintf("%v", this.ServiceAccount) + `,`, `Source:` + strings.Replace(strings.Replace(this.Source.String(), "BuildSource", "BuildSource", 1), `&`, ``, 1) + `,`, @@ -3095,6 +3131,7 @@ func (this *CommonSpec) String() string { `Resources:` + strings.Replace(strings.Replace(this.Resources.String(), "ResourceRequirements", "k8s_io_kubernetes_pkg_api_v1.ResourceRequirements", 1), `&`, ``, 1) + `,`, `PostCommit:` + strings.Replace(strings.Replace(this.PostCommit.String(), "BuildPostCommitSpec", "BuildPostCommitSpec", 1), `&`, ``, 1) + `,`, `CompletionDeadlineSeconds:` + valueToStringGenerated(this.CompletionDeadlineSeconds) + `,`, + `NodeSelector:` + mapStringForNodeSelector + `,`, `}`, }, "") return s @@ -6832,6 +6869,117 @@ func (m *CommonSpec) Unmarshal(data []byte) error { } } m.CompletionDeadlineSeconds = &v + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := string(data[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue := string(data[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + if m.NodeSelector == nil { + m.NodeSelector = make(map[string]string) + } + m.NodeSelector[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -9741,199 +9889,203 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 3094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe4, 0x1a, 0x4b, 0x6c, 0x24, 0xc5, - 0x95, 0x9e, 0x19, 0x8f, 0x67, 0x6a, 0xbc, 0xb6, 0xb7, 0xbc, 0xb0, 0x5e, 0x03, 0x0b, 0x34, 0x24, - 0x22, 0x02, 0x66, 0x64, 0xf3, 0x09, 0x88, 0x4f, 0xf0, 0x8c, 0x77, 0xc1, 0x8e, 0xd9, 0x75, 0x9e, - 0xcd, 0x27, 0x1b, 0x25, 0x51, 0x7b, 0x5c, 0x33, 0x6e, 0x3c, 0xd3, 0x3d, 0xe9, 0xee, 0x31, 0x58, - 0x4a, 0x24, 0x94, 0x28, 0x12, 0xb9, 0xe5, 0x77, 0xc8, 0x25, 0x89, 0x90, 0xf2, 0x39, 0x70, 0x88, - 0xf2, 0x39, 0x20, 0xe5, 0x92, 0x48, 0x39, 0x70, 0xe4, 0x98, 0x13, 0x0a, 0x70, 0xc8, 0x39, 0x57, - 0x4e, 0xa9, 0xcf, 0xab, 0xee, 0xea, 0x9e, 0xb1, 0x61, 0xda, 0xeb, 0x55, 0xa4, 0x1c, 0xc6, 0x72, - 0xbf, 0xf7, 0xea, 0xbd, 0xaa, 0x57, 0xaf, 0xde, 0xaf, 0x8a, 0x3c, 0xd3, 0x75, 0xa3, 0xfd, 0xe1, - 0x6e, 0xbd, 0xed, 0xf7, 0x1b, 0xfe, 0x80, 0x79, 0xe1, 0xbe, 0xdb, 0x89, 0x1a, 0x7e, 0xe0, 0x76, - 0x5d, 0xaf, 0x31, 0x38, 0xe8, 0x36, 0x76, 0x87, 0x6e, 0x6f, 0xaf, 0xe1, 0x0c, 0xdc, 0xc6, 0xe1, - 0x72, 0xa3, 0xcb, 0x3c, 0x16, 0x38, 0x11, 0xdb, 0xab, 0x0f, 0x02, 0x3f, 0xf2, 0xe9, 0xc3, 0xc9, - 0xe8, 0x7a, 0x3c, 0xba, 0xae, 0x46, 0xd7, 0xf9, 0xe8, 0xba, 0x1c, 0x5d, 0xe7, 0xa3, 0xeb, 0x87, - 0xcb, 0x4b, 0x8f, 0x18, 0xb2, 0xba, 0x7e, 0xd7, 0x6f, 0x48, 0x26, 0xbb, 0xc3, 0x8e, 0xfc, 0x92, - 0x1f, 0xf2, 0x3f, 0xc5, 0x7c, 0xe9, 0xf1, 0x83, 0x27, 0xc3, 0xba, 0xeb, 0x37, 0x0e, 0x86, 0xbb, - 0x2c, 0xf0, 0x58, 0xc4, 0x42, 0x39, 0x21, 0x31, 0x95, 0xa1, 0x77, 0xc8, 0x82, 0xd0, 0xf5, 0x3d, - 0xb6, 0x97, 0x9d, 0xd3, 0xd2, 0xc3, 0xc7, 0x0f, 0x1b, 0x5d, 0xc1, 0xd2, 0x23, 0xe3, 0xa9, 0x83, - 0xa1, 0x17, 0xb9, 0x7d, 0x36, 0x42, 0xbe, 0x3c, 0x9e, 0x7c, 0x18, 0xb9, 0xbd, 0x86, 0xeb, 0x45, - 0x61, 0x14, 0x64, 0x87, 0xd8, 0xef, 0x95, 0xc8, 0xa5, 0xa6, 0xeb, 0x39, 0xc1, 0x51, 0x53, 0x28, - 0x03, 0xd8, 0x77, 0x86, 0x2c, 0x8c, 0xae, 0x0f, 0x22, 0x3e, 0xfd, 0x90, 0xbe, 0x46, 0x2a, 0x7d, - 0x16, 0x39, 0x7b, 0x4e, 0xe4, 0x2c, 0x5a, 0xf7, 0x5a, 0x0f, 0xd6, 0x56, 0x1e, 0xac, 0x2b, 0x19, - 0xf5, 0x44, 0x86, 0x54, 0xa5, 0x52, 0x62, 0xfd, 0xfa, 0xee, 0xeb, 0xac, 0x1d, 0xbd, 0xc4, 0xc7, - 0x34, 0xe9, 0xfb, 0x1f, 0xde, 0x73, 0xdb, 0xc7, 0x1f, 0xde, 0x43, 0x12, 0x18, 0xc4, 0xdc, 0xe8, - 0x17, 0x49, 0xd9, 0x09, 0xaf, 0xba, 0x3d, 0xb6, 0x58, 0xe0, 0x7c, 0xab, 0xcd, 0x59, 0xa4, 0x2e, - 0xaf, 0x4a, 0x28, 0x20, 0x96, 0x3e, 0x41, 0x66, 0x03, 0x76, 0xe8, 0x0a, 0x6d, 0xb6, 0xfc, 0x7e, - 0xdf, 0x8d, 0x16, 0x8b, 0x69, 0x7a, 0x05, 0x85, 0x0c, 0x15, 0x7d, 0x8a, 0xcc, 0x69, 0xc8, 0x4b, - 0x2c, 0x0c, 0x9d, 0x2e, 0x5b, 0x2c, 0xc9, 0x81, 0x73, 0x38, 0x70, 0x1a, 0xc1, 0x90, 0xa5, 0xa3, - 0x4d, 0x42, 0x35, 0x68, 0x75, 0x18, 0xed, 0xfb, 0xc1, 0x35, 0xa7, 0xcf, 0x16, 0xa7, 0xe4, 0xe8, - 0x78, 0x51, 0x09, 0x06, 0xc6, 0x50, 0xd3, 0x2b, 0x64, 0x21, 0x0d, 0xbd, 0xd2, 0x77, 0xdc, 0xde, - 0x62, 0x59, 0x32, 0x59, 0x40, 0x26, 0x35, 0x03, 0x05, 0xe3, 0xe8, 0xe9, 0x57, 0xc9, 0xed, 0xe9, - 0x75, 0x45, 0x4c, 0xcd, 0x66, 0x5a, 0x32, 0xba, 0x1d, 0x19, 0x9d, 0x4b, 0x21, 0x61, 0xfc, 0x18, - 0x7a, 0x8d, 0xdc, 0x31, 0x82, 0x50, 0xd3, 0xaa, 0x48, 0x6e, 0x77, 0x20, 0xb7, 0xd9, 0x34, 0x16, - 0x8e, 0x19, 0x65, 0x3f, 0x4d, 0xce, 0x1b, 0x96, 0xb3, 0xed, 0x0f, 0x83, 0x36, 0x33, 0xf6, 0xd5, - 0x3a, 0x69, 0x5f, 0xed, 0x5f, 0x17, 0xc8, 0x94, 0x1c, 0x77, 0x86, 0x36, 0xf6, 0x75, 0x52, 0x0a, - 0x07, 0xac, 0x2d, 0x2d, 0xac, 0xb6, 0xf2, 0xe5, 0xfa, 0x24, 0xee, 0xa0, 0xae, 0x16, 0xc5, 0x87, - 0x37, 0x67, 0x50, 0x48, 0x49, 0x7c, 0x81, 0x64, 0x49, 0x1d, 0x52, 0x0e, 0x23, 0x27, 0x1a, 0x86, - 0xd2, 0x1c, 0x6b, 0x2b, 0x4f, 0xe5, 0x61, 0x2e, 0x19, 0x24, 0x1a, 0x52, 0xdf, 0x80, 0x8c, 0xed, - 0x3f, 0x16, 0x48, 0x4d, 0xd2, 0xb5, 0x7c, 0xaf, 0xe3, 0x76, 0xcf, 0x50, 0x4f, 0xdf, 0x4e, 0xe9, - 0xe9, 0xd9, 0x1c, 0x4b, 0x51, 0x53, 0x3c, 0x56, 0x5b, 0xdd, 0x8c, 0xb6, 0xbe, 0x92, 0x5f, 0xc4, - 0xc9, 0x3a, 0xfb, 0xc0, 0x22, 0x73, 0x06, 0xf5, 0xa6, 0x1b, 0x46, 0xf4, 0x9b, 0x23, 0x7a, 0x6b, - 0x9c, 0xa0, 0x37, 0xc3, 0x77, 0xd7, 0xc5, 0x70, 0xa9, 0xbe, 0x79, 0x14, 0x57, 0xd1, 0x10, 0x43, - 0x79, 0xdf, 0x22, 0x53, 0x6e, 0xc4, 0xfa, 0x21, 0xd7, 0x5e, 0x31, 0xa7, 0x21, 0xa8, 0xc9, 0x36, - 0xcf, 0xa1, 0x94, 0xa9, 0x75, 0xc1, 0x0f, 0x14, 0x5b, 0xfb, 0x4f, 0x85, 0xd4, 0x92, 0x84, 0x56, - 0xa9, 0x47, 0x2a, 0x11, 0x67, 0xd8, 0xe5, 0x33, 0xe5, 0x4b, 0x12, 0x62, 0x9f, 0xcf, 0x21, 0x76, - 0x47, 0xb1, 0xd8, 0xf2, 0x7b, 0x6e, 0xfb, 0x28, 0x59, 0x23, 0x82, 0x43, 0x88, 0x65, 0xd0, 0x55, - 0x52, 0xe5, 0x21, 0x47, 0x11, 0xa2, 0xbf, 0xbe, 0x1f, 0xc9, 0xab, 0xa0, 0x11, 0x9f, 0x72, 0xcf, - 0xa1, 0x62, 0x88, 0x86, 0x40, 0x32, 0x8a, 0xf6, 0x08, 0xe1, 0x53, 0xeb, 0xfb, 0x9e, 0x58, 0x00, - 0x9a, 0xc1, 0x93, 0x93, 0x4d, 0xba, 0x15, 0x8f, 0x4f, 0xec, 0x39, 0x81, 0x81, 0xc1, 0xdf, 0xde, - 0xe0, 0xae, 0x29, 0x6b, 0x34, 0xf4, 0x71, 0x52, 0xeb, 0x39, 0x61, 0xf4, 0x8a, 0xda, 0x5f, 0x69, - 0x0b, 0xc5, 0xc4, 0x17, 0x6f, 0x26, 0x28, 0x30, 0xe9, 0xec, 0x7f, 0x58, 0xa4, 0x2a, 0x99, 0xdd, - 0x0a, 0x6b, 0x7a, 0x2d, 0x6d, 0x4d, 0x8f, 0xe6, 0xd8, 0xd6, 0x63, 0xec, 0x88, 0x90, 0x8a, 0x5a, - 0x85, 0xdf, 0xb5, 0xdf, 0x2e, 0xa1, 0x4d, 0xf1, 0x0f, 0x1d, 0xea, 0x1b, 0xa4, 0xda, 0xf6, 0xbd, - 0xc8, 0x71, 0x79, 0x7e, 0x80, 0xbe, 0xfb, 0xbc, 0xde, 0xe3, 0x96, 0x46, 0x40, 0x42, 0x23, 0x3c, - 0x7d, 0xc7, 0xef, 0xf5, 0xfc, 0x37, 0xa4, 0x45, 0x54, 0x92, 0x33, 0x79, 0x55, 0x42, 0x01, 0xb1, - 0xf4, 0x61, 0x52, 0x19, 0x88, 0x08, 0xe2, 0xe3, 0xf1, 0xaf, 0x24, 0x0a, 0xd8, 0x42, 0x38, 0xc4, - 0x14, 0xf4, 0x31, 0x32, 0x13, 0xba, 0x5e, 0x9b, 0x6d, 0x33, 0x2e, 0x69, 0x2f, 0x94, 0x41, 0xbb, - 0xd8, 0x9c, 0xe7, 0xd4, 0x33, 0xdb, 0x06, 0x1c, 0x52, 0x54, 0x5c, 0x6d, 0x55, 0xf9, 0xbd, 0xe3, - 0x62, 0xa4, 0xae, 0xad, 0x3c, 0xf4, 0x39, 0xb7, 0x45, 0x0c, 0x69, 0x9e, 0x13, 0xab, 0xdc, 0xd6, - 0x1c, 0x20, 0x61, 0x46, 0x57, 0x08, 0x11, 0xa9, 0x16, 0xf7, 0x2f, 0xfd, 0x41, 0x28, 0xe3, 0x77, - 0x25, 0xb1, 0xbe, 0x9d, 0x18, 0x03, 0x06, 0x15, 0x7d, 0x88, 0x54, 0xb9, 0x8e, 0x7a, 0x9b, 0x5c, - 0x4d, 0xa1, 0x8c, 0xd4, 0x45, 0x25, 0x60, 0x47, 0x03, 0x21, 0xc1, 0xd3, 0x3a, 0x21, 0x3d, 0x97, - 0x87, 0xd5, 0xe6, 0x11, 0x9f, 0xa1, 0x8c, 0xc4, 0xc5, 0xe6, 0xac, 0x60, 0xbe, 0x19, 0x43, 0xc1, - 0xa0, 0x10, 0x6a, 0xf7, 0xfc, 0x37, 0x1c, 0x9e, 0x08, 0x55, 0xd3, 0x6a, 0xbf, 0xe6, 0xbf, 0xca, - 0xa1, 0x80, 0x58, 0xfa, 0x05, 0x32, 0x8d, 0x8b, 0x5c, 0x24, 0x92, 0x69, 0x4d, 0x24, 0x3d, 0xda, - 0xc2, 0x35, 0xce, 0x7e, 0xcf, 0xc2, 0x28, 0x73, 0x7d, 0x18, 0x0d, 0x86, 0x11, 0x4f, 0x5c, 0x0a, - 0x91, 0x8f, 0x96, 0xfd, 0xc8, 0xe7, 0x89, 0x2f, 0xc0, 0x3a, 0x2c, 0x60, 0x5c, 0x5d, 0xcd, 0x32, - 0x17, 0x50, 0xd8, 0xf1, 0x81, 0x33, 0xa0, 0xbb, 0x84, 0x0c, 0x86, 0xe1, 0x3e, 0xdf, 0x9f, 0x80, - 0x45, 0x18, 0x58, 0x56, 0x4e, 0x66, 0xb7, 0xe9, 0xb7, 0x9d, 0x5e, 0x96, 0xa7, 0xd4, 0xc4, 0x56, - 0xcc, 0x09, 0x0c, 0xae, 0xf6, 0xf7, 0x2d, 0xb2, 0x20, 0xa7, 0xbe, 0xe5, 0x87, 0x91, 0xca, 0x4d, - 0xa4, 0x77, 0xe4, 0x2b, 0x17, 0xae, 0xc0, 0xf1, 0xf6, 0xa4, 0x73, 0xac, 0xaa, 0x95, 0xb7, 0x14, - 0x08, 0x34, 0x8e, 0xde, 0x45, 0x4a, 0x4e, 0xd0, 0x55, 0x27, 0xad, 0xda, 0xac, 0x88, 0x90, 0xb5, - 0xca, 0xbf, 0x41, 0x42, 0x85, 0x9a, 0xc3, 0x76, 0xe0, 0x0e, 0x46, 0xf2, 0xcd, 0x6d, 0x09, 0x05, - 0xc4, 0xda, 0x9f, 0x4c, 0x91, 0x19, 0x33, 0x73, 0x3e, 0xc3, 0x30, 0xdd, 0x21, 0x15, 0x9d, 0x89, - 0xa1, 0x46, 0x9f, 0x99, 0xcc, 0x3d, 0xa8, 0x14, 0x0d, 0x90, 0x47, 0x73, 0x46, 0x1c, 0x41, 0xfd, - 0x05, 0x31, 0x6f, 0xea, 0x93, 0x79, 0xf4, 0xfc, 0x6c, 0xaf, 0x79, 0xb4, 0xde, 0x17, 0xb9, 0x73, - 0x31, 0x8f, 0x41, 0x5c, 0xe0, 0x02, 0xe6, 0x77, 0x32, 0xac, 0x60, 0x84, 0x39, 0xcf, 0x72, 0x4b, - 0x9d, 0xc0, 0xef, 0xcb, 0xb3, 0x3e, 0xb1, 0x10, 0xb9, 0x71, 0x57, 0xf9, 0x70, 0x90, 0x4c, 0x68, - 0x9b, 0x94, 0x77, 0x65, 0x56, 0x8a, 0x7e, 0x60, 0xd2, 0x5c, 0x23, 0x9b, 0xd1, 0x36, 0x89, 0xd8, - 0x75, 0x05, 0x06, 0x64, 0x4d, 0x97, 0xd3, 0xa1, 0xa4, 0x2c, 0x0f, 0xd8, 0xdc, 0x49, 0x61, 0x84, - 0xb6, 0x48, 0x91, 0x79, 0x87, 0xdc, 0x1d, 0x08, 0xbf, 0xfe, 0xc0, 0xc9, 0x6b, 0xbc, 0xe2, 0x1d, - 0xbe, 0xe2, 0x04, 0xcd, 0x1a, 0x9a, 0x43, 0x91, 0x7f, 0x83, 0x18, 0x4d, 0x0f, 0x49, 0xcd, 0xd0, - 0x1e, 0xf7, 0x16, 0xc5, 0x9c, 0xd9, 0x14, 0xee, 0x4a, 0xcb, 0x19, 0x86, 0x2c, 0x89, 0x81, 0xc6, - 0x5e, 0x81, 0x29, 0xc8, 0xfe, 0xe5, 0x14, 0x7a, 0x09, 0xcc, 0xf2, 0x1f, 0x25, 0xa5, 0xe8, 0x68, - 0xa0, 0x73, 0xfc, 0x7b, 0x74, 0xca, 0xb7, 0xc3, 0x61, 0x3c, 0x0d, 0x98, 0x33, 0x48, 0x05, 0x08, - 0x24, 0xb1, 0xb1, 0x33, 0x85, 0xb3, 0xdb, 0x19, 0xee, 0x4e, 0xf7, 0xfc, 0xf6, 0x01, 0x0b, 0x3a, - 0xa2, 0x06, 0xc1, 0xb3, 0x2b, 0x8e, 0xd4, 0x5a, 0x0c, 0x05, 0x83, 0x82, 0xbe, 0x4a, 0x8a, 0x7c, - 0x16, 0x68, 0x7a, 0x13, 0x9e, 0xa7, 0x17, 0xb8, 0x4f, 0x36, 0xa6, 0x33, 0x2d, 0xb6, 0x8a, 0xc3, - 0x40, 0x70, 0x14, 0x15, 0x82, 0x2b, 0xac, 0x3b, 0xe4, 0x76, 0x98, 0x23, 0x31, 0x94, 0x27, 0x03, - 0x19, 0xc7, 0xbe, 0x47, 0x02, 0x79, 0xb6, 0xab, 0x18, 0x8b, 0xd8, 0x24, 0xc2, 0x31, 0x7b, 0x33, - 0x5a, 0x73, 0x03, 0xac, 0x2d, 0x8d, 0xcc, 0x48, 0x63, 0xc0, 0xa0, 0xa2, 0xfb, 0x3c, 0xbe, 0x4a, - 0xae, 0xe8, 0x9a, 0xa7, 0x73, 0xbb, 0x66, 0x15, 0x93, 0x0d, 0x5e, 0x90, 0xe2, 0x4c, 0x5f, 0x27, - 0xd3, 0xa1, 0xfc, 0x2f, 0xcc, 0x67, 0xa7, 0x8a, 0x8d, 0xa9, 0xe0, 0xb8, 0x74, 0x57, 0xa8, 0x10, - 0xb4, 0x00, 0xfb, 0x3f, 0x3a, 0x47, 0x93, 0x01, 0x20, 0x9d, 0x6b, 0x5a, 0x67, 0x9b, 0x6b, 0x66, - 0xcf, 0x64, 0xe1, 0x56, 0x9d, 0xc9, 0x77, 0xe3, 0x33, 0xa9, 0xd2, 0xdb, 0x65, 0x32, 0x35, 0xd8, - 0x77, 0x42, 0x7d, 0x28, 0xef, 0xd4, 0x59, 0xe0, 0x96, 0x00, 0xf2, 0x53, 0x49, 0x54, 0xac, 0x14, - 0x5f, 0xa0, 0x28, 0x65, 0xce, 0xe7, 0xf0, 0xbd, 0xec, 0xf5, 0xd8, 0x1e, 0x66, 0x71, 0x49, 0xce, - 0xa7, 0x11, 0x90, 0xd0, 0xd0, 0x27, 0x48, 0x39, 0x60, 0x4e, 0xc8, 0x5d, 0x9e, 0x3a, 0x59, 0x97, - 0xb5, 0x65, 0x82, 0x84, 0x7e, 0x2a, 0x2c, 0x42, 0x55, 0x64, 0xf2, 0x1b, 0x90, 0x9a, 0x7e, 0x89, - 0x4c, 0xf7, 0x4f, 0xee, 0xc2, 0x68, 0x3c, 0xaf, 0x15, 0x67, 0x79, 0x1a, 0x15, 0x44, 0x71, 0x6e, - 0x95, 0x27, 0x9f, 0xa3, 0xa2, 0x8d, 0xb1, 0x9d, 0x62, 0x03, 0x19, 0xb6, 0x7c, 0xdf, 0x16, 0xf8, - 0xe6, 0x0c, 0x7a, 0x4c, 0xe4, 0xbf, 0x89, 0xb4, 0xf2, 0xe4, 0xd2, 0x2e, 0x72, 0x69, 0x0b, 0xad, - 0x51, 0x5e, 0x30, 0x4e, 0x00, 0x7d, 0x96, 0x54, 0xf6, 0x86, 0x81, 0x23, 0x80, 0x98, 0x1c, 0xde, - 0xa7, 0xf3, 0xe1, 0x35, 0x84, 0x73, 0x3d, 0x9e, 0x13, 0xf9, 0x64, 0x5d, 0x03, 0x20, 0x1e, 0xc2, - 0x33, 0xab, 0x25, 0x5f, 0xa6, 0x6a, 0xca, 0xa1, 0xa9, 0x98, 0xaa, 0x0f, 0x25, 0x76, 0x72, 0x6c, - 0x64, 0xb8, 0x74, 0xfd, 0x58, 0x4a, 0x38, 0x81, 0x0b, 0xfd, 0x1a, 0x29, 0xb7, 0x65, 0xe5, 0x24, - 0x73, 0xcc, 0x89, 0x43, 0x32, 0x51, 0x7d, 0x39, 0xc1, 0x00, 0x90, 0x91, 0xfd, 0xef, 0x12, 0x39, - 0x87, 0xd6, 0x2a, 0xda, 0x8f, 0xdd, 0x23, 0x5e, 0x8e, 0x99, 0x31, 0xe4, 0xbe, 0x4c, 0x0c, 0x39, - 0x9f, 0x22, 0x36, 0xa2, 0xc8, 0xf7, 0xc8, 0xac, 0x72, 0xdf, 0x1a, 0x87, 0xd1, 0x64, 0x75, 0xb2, - 0x13, 0xa7, 0xd6, 0x9d, 0x12, 0xa2, 0xac, 0x66, 0x2d, 0xc5, 0x1c, 0x32, 0xc2, 0x84, 0x78, 0xf4, - 0x72, 0x5a, 0x7c, 0x31, 0x8f, 0x78, 0xf4, 0x68, 0xa3, 0xe2, 0xb7, 0x53, 0xcc, 0x21, 0x23, 0x4c, - 0x88, 0x6f, 0x0f, 0xc3, 0xc8, 0xef, 0xc7, 0xe2, 0x4b, 0x79, 0xc4, 0xb7, 0x24, 0x8f, 0x31, 0xe2, - 0x5b, 0x29, 0xe6, 0x90, 0x11, 0x46, 0xdf, 0xb1, 0xc8, 0xc5, 0xd7, 0x99, 0x77, 0xe0, 0x7a, 0xe1, - 0x96, 0x3b, 0x60, 0x3d, 0x5e, 0xc1, 0xc4, 0x13, 0x51, 0xc7, 0x74, 0x63, 0xb2, 0x89, 0x6c, 0xa4, - 0x99, 0xa5, 0x67, 0x74, 0x27, 0x9f, 0xd1, 0xc5, 0x8d, 0xf1, 0xe2, 0xe0, 0xb8, 0x79, 0xd8, 0x7f, - 0x2d, 0x62, 0xf1, 0x6f, 0xfa, 0x53, 0xd3, 0x03, 0x59, 0x9f, 0xe1, 0x81, 0xb8, 0x8e, 0x65, 0x97, - 0xdc, 0x6d, 0xbf, 0xca, 0x76, 0x5f, 0xf4, 0xfd, 0x83, 0x7c, 0x16, 0xf6, 0x42, 0x8a, 0x87, 0xf2, - 0xea, 0x52, 0xc7, 0x69, 0x04, 0x64, 0x84, 0xd1, 0x23, 0x72, 0x4e, 0xc9, 0xd1, 0xd2, 0x95, 0x81, - 0x3d, 0x3f, 0x71, 0x6e, 0xf2, 0x62, 0xcc, 0x42, 0x09, 0x3f, 0x2f, 0x3a, 0xc5, 0x29, 0x38, 0xa4, - 0x25, 0xd1, 0xb7, 0x2c, 0x32, 0x2f, 0x73, 0x8b, 0xd6, 0xbe, 0xe3, 0x75, 0xd5, 0x6e, 0xa0, 0x81, - 0x3d, 0x97, 0x23, 0x7d, 0x51, 0x5c, 0x94, 0x70, 0x59, 0x0b, 0xac, 0x67, 0x78, 0xc3, 0x88, 0x34, - 0xfb, 0xe7, 0x45, 0x42, 0x47, 0xbb, 0x53, 0xf4, 0xb1, 0x94, 0xb3, 0xb8, 0x37, 0xe3, 0x2c, 0xe6, - 0xcd, 0x11, 0x86, 0xaf, 0xe8, 0x92, 0xb2, 0x9a, 0x75, 0xbe, 0x7a, 0x09, 0xd5, 0x82, 0x7c, 0xc7, - 0xe9, 0x0f, 0xd9, 0x8b, 0x5c, 0x07, 0x77, 0x11, 0x77, 0xeb, 0x74, 0x92, 0xc6, 0x99, 0x89, 0x16, - 0x40, 0x43, 0x52, 0x33, 0xb4, 0x86, 0xdb, 0xf3, 0x7c, 0xee, 0xed, 0xd1, 0x32, 0x65, 0xf5, 0x62, - 0xc0, 0xc1, 0x94, 0x62, 0xff, 0xaa, 0x4c, 0x8c, 0xfc, 0x87, 0x3e, 0xc7, 0xbd, 0x20, 0x0b, 0x0e, - 0xdd, 0x36, 0x5b, 0x6d, 0xb7, 0xfd, 0xa1, 0x17, 0xe1, 0xc6, 0xc4, 0x57, 0x08, 0xdb, 0x29, 0x2c, - 0x64, 0xa8, 0x65, 0xfb, 0x5c, 0x3a, 0x36, 0xdc, 0x98, 0x5c, 0xed, 0xf3, 0x4c, 0x72, 0x8c, 0xd5, - 0x2d, 0x32, 0x4e, 0x55, 0xcb, 0xc5, 0x33, 0xac, 0x96, 0x5d, 0x52, 0x09, 0xd3, 0xbe, 0xf8, 0xe9, - 0x5c, 0x77, 0x01, 0xe8, 0xf3, 0xe2, 0xde, 0x58, 0xec, 0xe8, 0x62, 0xf6, 0x42, 0x6b, 0x2a, 0x68, - 0xa3, 0xaf, 0xcd, 0xa3, 0x35, 0x95, 0x11, 0x24, 0x5a, 0x53, 0xdf, 0x80, 0x8c, 0x79, 0x8d, 0x56, - 0x0d, 0x98, 0xd2, 0x60, 0x88, 0xa9, 0xd0, 0x67, 0xd4, 0x06, 0x80, 0xe4, 0xa2, 0xff, 0xe1, 0x06, - 0xac, 0xcf, 0xbc, 0x28, 0x4c, 0xb2, 0x48, 0x8d, 0x0d, 0x21, 0xe1, 0x4b, 0x87, 0x84, 0x0c, 0xe2, - 0x96, 0x0d, 0x56, 0x20, 0xab, 0x39, 0xd6, 0x92, 0xee, 0xfb, 0x24, 0x89, 0x7a, 0x02, 0x07, 0x43, - 0x10, 0xfd, 0x06, 0xb9, 0x94, 0xe4, 0x63, 0x6b, 0xcc, 0xd9, 0x93, 0x61, 0x03, 0xfb, 0x8c, 0xaa, - 0xf1, 0x76, 0x37, 0x1f, 0x7e, 0xa9, 0x75, 0x1c, 0x11, 0x1c, 0x3f, 0xde, 0xfe, 0x4b, 0x89, 0x2c, - 0x8c, 0x89, 0xaa, 0xf4, 0x3a, 0xf6, 0x36, 0x72, 0x75, 0xd4, 0xe2, 0xbb, 0x14, 0xa3, 0xbf, 0x21, - 0x3b, 0x6b, 0xbd, 0xde, 0xcd, 0xea, 0xac, 0x69, 0x4e, 0x60, 0x70, 0xd5, 0xbd, 0x8a, 0xe2, 0xa9, - 0x7a, 0x15, 0x1b, 0x84, 0xb2, 0x37, 0xb9, 0xfa, 0x19, 0x66, 0x54, 0xe2, 0xaf, 0x2a, 0xb4, 0x2b, - 0xcd, 0x25, 0xa4, 0xa6, 0x57, 0x46, 0x28, 0x60, 0xcc, 0x28, 0x51, 0xa8, 0x74, 0x7c, 0x6e, 0x3b, - 0x62, 0xbe, 0xd2, 0xf8, 0x8d, 0x42, 0xe5, 0xaa, 0x46, 0x40, 0x42, 0xc3, 0xed, 0x38, 0x2e, 0x3e, - 0xcb, 0x72, 0x15, 0x4f, 0xe6, 0x29, 0x3e, 0xa5, 0x59, 0x1d, 0x5b, 0x75, 0xd2, 0x55, 0x32, 0x27, - 0x07, 0xad, 0x6e, 0xad, 0xeb, 0x4e, 0x90, 0xba, 0x97, 0xbd, 0x88, 0x43, 0x54, 0x23, 0x24, 0x41, - 0x43, 0x96, 0xde, 0xfe, 0x7d, 0x91, 0x2c, 0x8c, 0x49, 0x45, 0xe3, 0x96, 0x98, 0x75, 0x33, 0x5a, - 0x62, 0xb7, 0xc2, 0x64, 0x78, 0x7e, 0xe5, 0xf9, 0x2d, 0xa7, 0xbd, 0xcf, 0xb0, 0xc9, 0x1f, 0xab, - 0xed, 0x9a, 0x02, 0x83, 0xc6, 0x6b, 0xeb, 0x2a, 0x9d, 0xca, 0xba, 0x26, 0xb6, 0x88, 0xe7, 0x74, - 0xdd, 0x20, 0xda, 0x3e, 0x5b, 0x4e, 0xb4, 0x8f, 0x0d, 0x93, 0x38, 0x64, 0xad, 0xa5, 0xb0, 0x90, - 0xa1, 0xb6, 0x7f, 0x6b, 0x91, 0x85, 0x31, 0x29, 0x5d, 0x2a, 0xce, 0x58, 0x67, 0x18, 0x67, 0x44, - 0x43, 0x3a, 0xd9, 0x40, 0xb3, 0x21, 0xad, 0x36, 0x03, 0xb1, 0xf6, 0x47, 0x23, 0xf3, 0xbc, 0x72, - 0xc8, 0x7d, 0x72, 0xbe, 0x96, 0xdd, 0x96, 0xea, 0x8e, 0x29, 0x93, 0x79, 0x7c, 0xe2, 0x0c, 0x74, - 0xdd, 0xeb, 0xf8, 0x99, 0xb6, 0xd8, 0xcd, 0x70, 0x2d, 0xf6, 0xdf, 0x2c, 0x32, 0x9b, 0x6e, 0xbe, - 0xd1, 0xbb, 0x49, 0x71, 0x18, 0xb8, 0xb8, 0xba, 0x78, 0xc4, 0xcb, 0xb0, 0x0e, 0x02, 0x2e, 0xd0, - 0x01, 0xeb, 0xa0, 0xea, 0x62, 0x34, 0x37, 0x6d, 0x10, 0x70, 0x3a, 0x20, 0xb5, 0x41, 0xe0, 0xbf, - 0x79, 0xa4, 0x8a, 0xd6, 0x7c, 0x77, 0xfa, 0x5b, 0x09, 0x83, 0xa4, 0x7b, 0x63, 0x00, 0xc1, 0x14, - 0x61, 0xff, 0xc6, 0x22, 0x74, 0x34, 0x47, 0xff, 0x9f, 0xb3, 0xa6, 0x9f, 0x16, 0xc8, 0x34, 0x6e, - 0x24, 0xfd, 0x2e, 0xaf, 0x8b, 0x52, 0x4a, 0xcf, 0x37, 0xc3, 0x4c, 0xd7, 0x34, 0x3e, 0x7f, 0x69, - 0x38, 0x64, 0x64, 0xd1, 0xb7, 0x2d, 0x72, 0x9e, 0x83, 0xd2, 0xeb, 0xcb, 0xd7, 0x49, 0x7e, 0x21, - 0xcb, 0xa6, 0x79, 0x09, 0x27, 0x71, 0x7e, 0x04, 0x05, 0xa3, 0x42, 0xed, 0xbf, 0x17, 0xc8, 0x28, - 0xa1, 0x50, 0x69, 0x5b, 0x65, 0x34, 0xd6, 0xd8, 0x17, 0x4a, 0x88, 0x15, 0x45, 0x89, 0x23, 0x9f, - 0xf8, 0xe4, 0x9b, 0xbc, 0x92, 0x2a, 0xba, 0xbb, 0x81, 0xdf, 0x7b, 0x99, 0xe7, 0xd5, 0xc6, 0x13, - 0x1b, 0xc9, 0x16, 0x90, 0x3d, 0x37, 0xea, 0x6a, 0x5b, 0xbf, 0xd8, 0xc9, 0xf7, 0xf0, 0x62, 0x54, - 0x96, 0x71, 0x25, 0x8c, 0x9c, 0x21, 0x11, 0x32, 0x41, 0x9b, 0xcf, 0xfe, 0x19, 0x2f, 0x35, 0xb3, - 0x45, 0xa2, 0x18, 0x2f, 0x8b, 0x8e, 0xf5, 0xb5, 0x6c, 0x91, 0xbe, 0xae, 0xc0, 0xa0, 0xf1, 0x74, - 0x87, 0x4c, 0x8b, 0xd8, 0x06, 0x78, 0xa8, 0x27, 0x8e, 0x91, 0xf2, 0x4e, 0xf0, 0xaa, 0xe2, 0x00, - 0x9a, 0x95, 0xfd, 0x67, 0x7e, 0x2a, 0x47, 0x6b, 0x23, 0xee, 0x06, 0x2f, 0x88, 0xab, 0x9c, 0xb8, - 0x15, 0xbb, 0x9e, 0x9a, 0xe4, 0x5d, 0x38, 0xc9, 0x0b, 0x9b, 0x63, 0x68, 0x60, 0xec, 0xc8, 0x38, - 0xbe, 0x17, 0x6e, 0x42, 0x7c, 0xb7, 0x7f, 0x57, 0x20, 0x35, 0xe3, 0xbe, 0xe0, 0x2c, 0x72, 0xce, - 0xa9, 0x01, 0x8f, 0x81, 0xfa, 0x55, 0xc2, 0xb3, 0xb9, 0xaf, 0x32, 0x44, 0x24, 0x4d, 0xde, 0x27, - 0x88, 0xaf, 0x10, 0x14, 0xeb, 0x4c, 0x92, 0x52, 0x3c, 0x8b, 0x24, 0xc5, 0xfe, 0xa1, 0x45, 0xe6, - 0x32, 0xb3, 0x11, 0x97, 0x28, 0x61, 0xfc, 0x85, 0x3b, 0x1a, 0x57, 0x12, 0x09, 0x1d, 0x18, 0x54, - 0x32, 0x97, 0x60, 0x61, 0xe4, 0x7a, 0xb2, 0x25, 0x2b, 0x2e, 0x5f, 0x0a, 0x99, 0x5c, 0x22, 0x85, - 0x85, 0x0c, 0xb5, 0xfd, 0x0b, 0x8b, 0xdc, 0x75, 0x52, 0xe7, 0x4b, 0x64, 0x96, 0xd8, 0xde, 0x8a, - 0xb3, 0x15, 0x2b, 0x9d, 0x59, 0x6e, 0xa4, 0xd1, 0x90, 0xa5, 0x17, 0xaf, 0x5d, 0x0c, 0x10, 0x4e, - 0x30, 0x8e, 0x4b, 0xc6, 0x70, 0x30, 0xe9, 0xec, 0x9f, 0x58, 0xc4, 0x0c, 0x5a, 0xe2, 0x2d, 0xc3, - 0x7e, 0x14, 0x0d, 0x24, 0x08, 0x9b, 0xfe, 0xf2, 0x2d, 0xc3, 0x8b, 0x3b, 0x3b, 0x5b, 0x12, 0x08, - 0x09, 0x5e, 0x5c, 0xbe, 0x89, 0x8f, 0x50, 0x51, 0x97, 0x92, 0xcb, 0x37, 0x41, 0xbd, 0xad, 0xc8, - 0x0d, 0x0a, 0x71, 0x53, 0xef, 0xf9, 0x8a, 0x58, 0x3d, 0xaf, 0xac, 0xa9, 0x84, 0x51, 0x51, 0x6a, - 0x9c, 0xfd, 0x07, 0xee, 0xfa, 0x47, 0x6e, 0x83, 0xe8, 0x8d, 0x38, 0x84, 0x59, 0xf9, 0x8d, 0x65, - 0x7c, 0xd8, 0x3b, 0xf5, 0x06, 0xbf, 0x6b, 0x11, 0x92, 0x94, 0x10, 0xb4, 0x47, 0x66, 0x14, 0xe3, - 0x54, 0xdc, 0xcc, 0x33, 0xe1, 0x0b, 0x38, 0x81, 0x99, 0x6d, 0x83, 0x1f, 0xa4, 0xb8, 0x8b, 0xd4, - 0xb8, 0x2f, 0xba, 0x2c, 0xd2, 0x6c, 0x0a, 0xe9, 0x97, 0x3c, 0x2f, 0x69, 0x04, 0x24, 0x34, 0xf6, - 0x8f, 0xa6, 0xc8, 0xc2, 0x98, 0x86, 0xf4, 0xff, 0x71, 0xed, 0xca, 0x03, 0x91, 0x7a, 0xdf, 0x11, - 0x66, 0x03, 0x99, 0x7a, 0xfe, 0x21, 0x8a, 0x40, 0xf5, 0x8f, 0x78, 0x0a, 0xe0, 0x7a, 0x6d, 0xd5, - 0xf8, 0x70, 0x74, 0x29, 0xa2, 0x9a, 0x69, 0x09, 0x18, 0x4c, 0x9a, 0x74, 0xed, 0x52, 0xfe, 0x5c, - 0xd5, 0xec, 0x0c, 0x3e, 0xf9, 0x56, 0xaf, 0x31, 0xa6, 0xf3, 0x6c, 0x88, 0xbc, 0xaf, 0x05, 0x83, - 0x0d, 0xa4, 0x98, 0xd2, 0x1f, 0xf0, 0x88, 0x8c, 0x80, 0xd5, 0x20, 0x72, 0x3b, 0x4e, 0x3b, 0xbe, - 0xb9, 0x3d, 0xa5, 0xc3, 0x5f, 0xc4, 0xc5, 0xcd, 0x43, 0x86, 0x3d, 0x8c, 0x08, 0xb4, 0x6f, 0xf0, - 0xa3, 0x9e, 0xcd, 0x3a, 0xe8, 0xbd, 0xa4, 0xe4, 0x89, 0x57, 0xcf, 0xca, 0x07, 0xc6, 0x96, 0x25, - 0x1f, 0x3b, 0x4b, 0x0c, 0xbd, 0x9f, 0x4c, 0x31, 0xf9, 0x94, 0x59, 0xd9, 0x7b, 0x1c, 0x62, 0xd4, - 0x0b, 0x66, 0x85, 0xb3, 0xdf, 0xe1, 0x65, 0x43, 0x26, 0x69, 0xcb, 0x55, 0x15, 0xdd, 0x30, 0xab, - 0xa2, 0x53, 0xe7, 0x9e, 0xa9, 0xfa, 0xc8, 0xee, 0x90, 0xd9, 0x74, 0x33, 0xd8, 0x48, 0xd5, 0xad, - 0x93, 0x52, 0x75, 0xf1, 0xce, 0xce, 0x11, 0x0f, 0xee, 0xb8, 0x11, 0xe3, 0x5d, 0x6e, 0xdc, 0x4b, - 0x5c, 0x45, 0x38, 0xc4, 0x14, 0xcd, 0x07, 0xde, 0xff, 0xe8, 0xf2, 0x6d, 0x1f, 0xf0, 0xdf, 0x3f, - 0xf9, 0xef, 0xad, 0x8f, 0x2f, 0x5b, 0xef, 0xf3, 0xdf, 0x07, 0xfc, 0xf7, 0x2f, 0xfe, 0xfb, 0xf1, - 0x27, 0x97, 0x6f, 0xbb, 0x51, 0x38, 0x5c, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xcd, - 0xf3, 0xee, 0x80, 0x31, 0x00, 0x00, + // 3167 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe4, 0x3a, 0x4b, 0x6c, 0x23, 0xc7, + 0xb1, 0x1e, 0x92, 0xa2, 0xa8, 0xa2, 0x56, 0x9f, 0xd6, 0xda, 0xab, 0x95, 0xed, 0xb5, 0x3d, 0xf6, + 0x7b, 0xf0, 0x83, 0x6d, 0x0a, 0xbb, 0xfe, 0xbc, 0xf5, 0xf3, 0x57, 0xa4, 0x76, 0x6d, 0xed, 0x5b, + 0xef, 0x2a, 0x25, 0xf9, 0x93, 0x0d, 0x92, 0x60, 0x44, 0x35, 0xa9, 0xb1, 0xc8, 0x19, 0x66, 0x66, + 0x28, 0x5b, 0x40, 0x02, 0x18, 0xf9, 0x00, 0xce, 0x2d, 0xbf, 0x43, 0x2e, 0x41, 0x60, 0x20, 0x9f, + 0x83, 0x0f, 0x41, 0x3e, 0x07, 0x03, 0xb9, 0x24, 0x40, 0x0e, 0x3e, 0xfa, 0x98, 0x93, 0x11, 0xdb, + 0x40, 0x72, 0xce, 0xd5, 0xa7, 0xf4, 0xa7, 0x66, 0xa6, 0x67, 0x48, 0xc9, 0xe6, 0xec, 0xca, 0x08, + 0x90, 0x03, 0x05, 0x4d, 0x55, 0x75, 0x55, 0x77, 0x75, 0x75, 0xfd, 0xba, 0xe1, 0xe9, 0xae, 0x1b, + 0xed, 0x0d, 0x77, 0x1a, 0x6d, 0xbf, 0xbf, 0xea, 0x0f, 0xb8, 0x17, 0xee, 0xb9, 0x9d, 0x68, 0xd5, + 0x0f, 0xdc, 0xae, 0xeb, 0xad, 0x0e, 0xf6, 0xbb, 0xab, 0x3b, 0x43, 0xb7, 0xb7, 0xbb, 0xea, 0x0c, + 0xdc, 0xd5, 0x83, 0xf3, 0xab, 0x5d, 0xee, 0xf1, 0xc0, 0x89, 0xf8, 0x6e, 0x63, 0x10, 0xf8, 0x91, + 0xcf, 0x1e, 0x4e, 0x47, 0x37, 0x92, 0xd1, 0x0d, 0x3d, 0xba, 0x21, 0x46, 0x37, 0xd4, 0xe8, 0x86, + 0x18, 0xdd, 0x38, 0x38, 0xbf, 0xf2, 0x88, 0x21, 0xab, 0xeb, 0x77, 0xfd, 0x55, 0xc5, 0x64, 0x67, + 0xd8, 0x51, 0x5f, 0xea, 0x43, 0xfd, 0xa7, 0x99, 0xaf, 0x3c, 0xbe, 0x7f, 0x31, 0x6c, 0xb8, 0xfe, + 0xea, 0xfe, 0x70, 0x87, 0x07, 0x1e, 0x8f, 0x78, 0xa8, 0x26, 0x24, 0xa7, 0x32, 0xf4, 0x0e, 0x78, + 0x10, 0xba, 0xbe, 0xc7, 0x77, 0xf3, 0x73, 0x5a, 0x79, 0xf8, 0xe8, 0x61, 0xa3, 0x2b, 0x58, 0x79, + 0x64, 0x3c, 0x75, 0x30, 0xf4, 0x22, 0xb7, 0xcf, 0x47, 0xc8, 0xcf, 0x8f, 0x27, 0x1f, 0x46, 0x6e, + 0x6f, 0xd5, 0xf5, 0xa2, 0x30, 0x0a, 0xf2, 0x43, 0xec, 0xf7, 0x2a, 0x70, 0xb6, 0xe9, 0x7a, 0x4e, + 0x70, 0xd8, 0x94, 0xca, 0x40, 0xfe, 0x8d, 0x21, 0x0f, 0xa3, 0xeb, 0x83, 0x48, 0x4c, 0x3f, 0x64, + 0xaf, 0x41, 0xad, 0xcf, 0x23, 0x67, 0xd7, 0x89, 0x9c, 0x65, 0xeb, 0x5e, 0xeb, 0xc1, 0xfa, 0x85, + 0x07, 0x1b, 0x5a, 0x46, 0x23, 0x95, 0xa1, 0x54, 0xa9, 0x95, 0xd8, 0xb8, 0xbe, 0xf3, 0x3a, 0x6f, + 0x47, 0x2f, 0x89, 0x31, 0x4d, 0xf6, 0xfe, 0x87, 0xf7, 0xdc, 0xf6, 0xf1, 0x87, 0xf7, 0x40, 0x0a, + 0xc3, 0x84, 0x1b, 0xfb, 0x6f, 0xa8, 0x3a, 0xe1, 0x65, 0xb7, 0xc7, 0x97, 0x4b, 0x82, 0xef, 0x4c, + 0x73, 0x8e, 0xa8, 0xab, 0x6b, 0x0a, 0x8a, 0x84, 0x65, 0x4f, 0xc0, 0x5c, 0xc0, 0x0f, 0x5c, 0xa9, + 0xcd, 0x96, 0xdf, 0xef, 0xbb, 0xd1, 0x72, 0x39, 0x4b, 0xaf, 0xa1, 0x98, 0xa3, 0x62, 0x4f, 0xc2, + 0x7c, 0x0c, 0x79, 0x89, 0x87, 0xa1, 0xd3, 0xe5, 0xcb, 0x15, 0x35, 0x70, 0x9e, 0x06, 0x4e, 0x13, + 0x18, 0xf3, 0x74, 0xac, 0x09, 0x2c, 0x06, 0xad, 0x0d, 0xa3, 0x3d, 0x3f, 0xb8, 0xe6, 0xf4, 0xf9, + 0xf2, 0x94, 0x1a, 0x9d, 0x2c, 0x2a, 0xc5, 0xe0, 0x18, 0x6a, 0x76, 0x09, 0x96, 0xb2, 0xd0, 0x4b, + 0x7d, 0xc7, 0xed, 0x2d, 0x57, 0x15, 0x93, 0x25, 0x62, 0x52, 0x37, 0x50, 0x38, 0x8e, 0x9e, 0xfd, + 0x3f, 0xdc, 0x9e, 0x5d, 0x57, 0xc4, 0xf5, 0x6c, 0xa6, 0x15, 0xa3, 0xdb, 0x89, 0xd1, 0xa9, 0x0c, + 0x12, 0xc7, 0x8f, 0x61, 0xd7, 0xe0, 0x8e, 0x11, 0x84, 0x9e, 0x56, 0x4d, 0x71, 0xbb, 0x83, 0xb8, + 0xcd, 0x65, 0xb1, 0x78, 0xc4, 0x28, 0xfb, 0x29, 0x58, 0x34, 0x2c, 0x67, 0xcb, 0x1f, 0x06, 0x6d, + 0x6e, 0xec, 0xab, 0x75, 0xdc, 0xbe, 0xda, 0x3f, 0x2f, 0xc1, 0x94, 0x1a, 0x77, 0x82, 0x36, 0xf6, + 0x65, 0xa8, 0x84, 0x03, 0xde, 0x56, 0x16, 0x56, 0xbf, 0xf0, 0xbf, 0x8d, 0x49, 0xdc, 0x41, 0x43, + 0x2f, 0x4a, 0x0c, 0x6f, 0xce, 0x92, 0x90, 0x8a, 0xfc, 0x42, 0xc5, 0x92, 0x39, 0x50, 0x0d, 0x23, + 0x27, 0x1a, 0x86, 0xca, 0x1c, 0xeb, 0x17, 0x9e, 0x2c, 0xc2, 0x5c, 0x31, 0x48, 0x35, 0xa4, 0xbf, + 0x91, 0x18, 0xdb, 0xbf, 0x2d, 0x41, 0x5d, 0xd1, 0xb5, 0x7c, 0xaf, 0xe3, 0x76, 0x4f, 0x50, 0x4f, + 0x5f, 0xcf, 0xe8, 0xe9, 0x99, 0x02, 0x4b, 0xd1, 0x53, 0x3c, 0x52, 0x5b, 0xdd, 0x9c, 0xb6, 0x9e, + 0x2b, 0x2e, 0xe2, 0x78, 0x9d, 0x7d, 0x60, 0xc1, 0xbc, 0x41, 0x7d, 0xd5, 0x0d, 0x23, 0xf6, 0xd5, + 0x11, 0xbd, 0xad, 0x1e, 0xa3, 0x37, 0xc3, 0x77, 0x37, 0xe4, 0x70, 0xa5, 0xbe, 0x05, 0x12, 0x57, + 0x8b, 0x21, 0x86, 0xf2, 0xbe, 0x06, 0x53, 0x6e, 0xc4, 0xfb, 0xa1, 0xd0, 0x5e, 0xb9, 0xa0, 0x21, + 0xe8, 0xc9, 0x36, 0x4f, 0x91, 0x94, 0xa9, 0x0d, 0xc9, 0x0f, 0x35, 0x5b, 0xfb, 0x77, 0xa5, 0xcc, + 0x92, 0xa4, 0x56, 0x99, 0x07, 0xb5, 0x48, 0x30, 0xec, 0x8a, 0x99, 0x8a, 0x25, 0x49, 0xb1, 0xcf, + 0x17, 0x10, 0xbb, 0xad, 0x59, 0x6c, 0xfa, 0x3d, 0xb7, 0x7d, 0x98, 0xae, 0x91, 0xc0, 0x21, 0x26, + 0x32, 0xd8, 0x1a, 0xcc, 0x88, 0x90, 0xa3, 0x09, 0xc9, 0x5f, 0xdf, 0x4f, 0xe4, 0x33, 0x18, 0x23, + 0x3e, 0x15, 0x9e, 0x43, 0xc7, 0x90, 0x18, 0x82, 0xe9, 0x28, 0xd6, 0x03, 0x10, 0x53, 0xeb, 0xfb, + 0x9e, 0x5c, 0x00, 0x99, 0xc1, 0xc5, 0xc9, 0x26, 0xdd, 0x4a, 0xc6, 0xa7, 0xf6, 0x9c, 0xc2, 0xd0, + 0xe0, 0x6f, 0x5f, 0x11, 0xae, 0x29, 0x6f, 0x34, 0xec, 0x71, 0xa8, 0xf7, 0x9c, 0x30, 0x7a, 0x45, + 0xef, 0xaf, 0xb2, 0x85, 0x72, 0xea, 0x8b, 0xaf, 0xa6, 0x28, 0x34, 0xe9, 0xec, 0xbf, 0x58, 0x30, + 0xa3, 0x98, 0x7d, 0x11, 0xd6, 0xf4, 0x5a, 0xd6, 0x9a, 0x1e, 0x2d, 0xb0, 0xad, 0x47, 0xd8, 0x11, + 0x40, 0x4d, 0xaf, 0xc2, 0xef, 0xda, 0x6f, 0x57, 0xc8, 0xa6, 0xc4, 0x47, 0x1c, 0xea, 0x57, 0x61, + 0xa6, 0xed, 0x7b, 0x91, 0xe3, 0x8a, 0xfc, 0x80, 0x7c, 0xf7, 0x62, 0xbc, 0xc7, 0xad, 0x18, 0x81, + 0x29, 0x8d, 0xf4, 0xf4, 0x1d, 0xbf, 0xd7, 0xf3, 0xdf, 0x50, 0x16, 0x51, 0x4b, 0xcf, 0xe4, 0x65, + 0x05, 0x45, 0xc2, 0xb2, 0x87, 0xa1, 0x36, 0x90, 0x11, 0xc4, 0xa7, 0xe3, 0x5f, 0x4b, 0x15, 0xb0, + 0x49, 0x70, 0x4c, 0x28, 0xd8, 0x63, 0x30, 0x1b, 0xba, 0x5e, 0x9b, 0x6f, 0x71, 0x21, 0x69, 0x37, + 0x54, 0x41, 0xbb, 0xdc, 0x5c, 0x10, 0xd4, 0xb3, 0x5b, 0x06, 0x1c, 0x33, 0x54, 0x42, 0x6d, 0x33, + 0xea, 0x7b, 0xdb, 0xa5, 0x48, 0x5d, 0xbf, 0xf0, 0xd0, 0xe7, 0xdc, 0x16, 0x39, 0xa4, 0x79, 0x4a, + 0xae, 0x72, 0x2b, 0xe6, 0x80, 0x29, 0x33, 0x76, 0x01, 0x40, 0xa6, 0x5a, 0xc2, 0xbf, 0xf4, 0x07, + 0xa1, 0x8a, 0xdf, 0xb5, 0xd4, 0xfa, 0xb6, 0x13, 0x0c, 0x1a, 0x54, 0xec, 0x21, 0x98, 0x11, 0x3a, + 0xea, 0x5d, 0x15, 0x6a, 0x0a, 0x55, 0xa4, 0x2e, 0x6b, 0x01, 0xdb, 0x31, 0x10, 0x53, 0x3c, 0x6b, + 0x00, 0xf4, 0x5c, 0x11, 0x56, 0x9b, 0x87, 0x62, 0x86, 0x2a, 0x12, 0x97, 0x9b, 0x73, 0x92, 0xf9, + 0xd5, 0x04, 0x8a, 0x06, 0x85, 0x54, 0xbb, 0xe7, 0xbf, 0xe1, 0x88, 0x44, 0x68, 0x26, 0xab, 0xf6, + 0x6b, 0xfe, 0xab, 0x02, 0x8a, 0x84, 0x65, 0xff, 0x05, 0xd3, 0xb4, 0xc8, 0x65, 0x50, 0x4c, 0xeb, + 0x32, 0xe9, 0x89, 0x2d, 0x3c, 0xc6, 0xd9, 0xef, 0x59, 0x14, 0x65, 0xae, 0x0f, 0xa3, 0xc1, 0x30, + 0x12, 0x89, 0x4b, 0x29, 0xf2, 0xc9, 0xb2, 0x1f, 0xf9, 0x3c, 0xf1, 0x05, 0x79, 0x87, 0x07, 0x5c, + 0xa8, 0xab, 0x59, 0x15, 0x02, 0x4a, 0xdb, 0x3e, 0x0a, 0x06, 0x6c, 0x07, 0x60, 0x30, 0x0c, 0xf7, + 0xc4, 0xfe, 0x04, 0x3c, 0xa2, 0xc0, 0x72, 0xe1, 0x78, 0x76, 0x57, 0xfd, 0xb6, 0xd3, 0xcb, 0xf3, + 0x54, 0x9a, 0xd8, 0x4c, 0x38, 0xa1, 0xc1, 0xd5, 0xfe, 0xb6, 0x05, 0x4b, 0x6a, 0xea, 0x9b, 0x7e, + 0x18, 0xe9, 0xdc, 0x44, 0x79, 0x47, 0xb1, 0x72, 0xe9, 0x0a, 0x1c, 0x6f, 0x57, 0x39, 0xc7, 0x19, + 0xbd, 0xf2, 0x96, 0x06, 0x61, 0x8c, 0x63, 0x77, 0x41, 0xc5, 0x09, 0xba, 0xfa, 0xa4, 0xcd, 0x34, + 0x6b, 0x32, 0x64, 0xad, 0x89, 0x6f, 0x54, 0x50, 0xa9, 0xe6, 0xb0, 0x1d, 0xb8, 0x83, 0x91, 0x7c, + 0x73, 0x4b, 0x41, 0x91, 0xb0, 0xf6, 0x27, 0x53, 0x30, 0x6b, 0x66, 0xce, 0x27, 0x18, 0xa6, 0x3b, + 0x50, 0x8b, 0x33, 0x31, 0xd2, 0xe8, 0xd3, 0x93, 0xb9, 0x07, 0x9d, 0xa2, 0x21, 0xf1, 0x68, 0xce, + 0xca, 0x23, 0x18, 0x7f, 0x61, 0xc2, 0x9b, 0xf9, 0xb0, 0x40, 0x9e, 0x9f, 0xef, 0x36, 0x0f, 0x37, + 0xfa, 0x32, 0x77, 0x2e, 0x17, 0x31, 0x88, 0xd3, 0x42, 0xc0, 0xc2, 0x76, 0x8e, 0x15, 0x8e, 0x30, + 0x17, 0x59, 0x6e, 0xa5, 0x13, 0xf8, 0x7d, 0x75, 0xd6, 0x27, 0x16, 0xa2, 0x36, 0xee, 0xb2, 0x18, + 0x8e, 0x8a, 0x09, 0x6b, 0x43, 0x75, 0x47, 0x65, 0xa5, 0xe4, 0x07, 0x26, 0xcd, 0x35, 0xf2, 0x19, + 0x6d, 0x13, 0xe4, 0xae, 0x6b, 0x30, 0x12, 0x6b, 0x76, 0x3e, 0x1b, 0x4a, 0xaa, 0xea, 0x80, 0xcd, + 0x1f, 0x17, 0x46, 0x58, 0x0b, 0xca, 0xdc, 0x3b, 0x10, 0xee, 0x40, 0xfa, 0xf5, 0x07, 0x8e, 0x5f, + 0xe3, 0x25, 0xef, 0xe0, 0x15, 0x27, 0x68, 0xd6, 0xc9, 0x1c, 0xca, 0xe2, 0x1b, 0xe5, 0x68, 0x76, + 0x00, 0x75, 0x43, 0x7b, 0xc2, 0x5b, 0x94, 0x0b, 0x66, 0x53, 0xb4, 0x2b, 0x2d, 0x67, 0x18, 0xf2, + 0x34, 0x06, 0x1a, 0x7b, 0x85, 0xa6, 0x20, 0xfb, 0x67, 0x53, 0xe4, 0x25, 0x28, 0xcb, 0x7f, 0x14, + 0x2a, 0xd1, 0xe1, 0x20, 0xce, 0xf1, 0xef, 0x89, 0x53, 0xbe, 0x6d, 0x01, 0x13, 0x69, 0xc0, 0xbc, + 0x41, 0x2a, 0x41, 0xa8, 0x88, 0x8d, 0x9d, 0x29, 0x9d, 0xdc, 0xce, 0x08, 0x77, 0xba, 0xeb, 0xb7, + 0xf7, 0x79, 0xd0, 0x91, 0x35, 0x08, 0x9d, 0x5d, 0x79, 0xa4, 0xd6, 0x13, 0x28, 0x1a, 0x14, 0xec, + 0x55, 0x28, 0x8b, 0x59, 0x90, 0xe9, 0x4d, 0x78, 0x9e, 0x5e, 0x10, 0x3e, 0xd9, 0x98, 0xce, 0xb4, + 0xdc, 0x2a, 0x01, 0x43, 0xc9, 0x51, 0x56, 0x08, 0xae, 0xb4, 0xee, 0x50, 0xd8, 0x61, 0x81, 0xc4, + 0x50, 0x9d, 0x0c, 0x62, 0x9c, 0xf8, 0x1e, 0x05, 0x14, 0xd9, 0xae, 0x66, 0x2c, 0x63, 0x93, 0x0c, + 0xc7, 0xfc, 0xcd, 0x68, 0xdd, 0x0d, 0xa8, 0xb6, 0x34, 0x32, 0xa3, 0x18, 0x83, 0x06, 0x15, 0xdb, + 0x13, 0xf1, 0x55, 0x71, 0x25, 0xd7, 0x3c, 0x5d, 0xd8, 0x35, 0xeb, 0x98, 0x6c, 0xf0, 0xc2, 0x0c, + 0x67, 0xf6, 0x3a, 0x4c, 0x87, 0xea, 0xbf, 0xb0, 0x98, 0x9d, 0x6a, 0x36, 0xa6, 0x82, 0x93, 0xd2, + 0x5d, 0xa3, 0x42, 0x8c, 0x05, 0xd8, 0xff, 0x8c, 0x73, 0x34, 0x15, 0x00, 0xb2, 0xb9, 0xa6, 0x75, + 0xb2, 0xb9, 0x66, 0xfe, 0x4c, 0x96, 0xbe, 0xa8, 0x33, 0xf9, 0x6e, 0x72, 0x26, 0x75, 0x7a, 0x7b, + 0x1e, 0xa6, 0x06, 0x7b, 0x4e, 0x18, 0x1f, 0xca, 0x3b, 0xe3, 0x2c, 0x70, 0x53, 0x02, 0xc5, 0xa9, + 0x04, 0x1d, 0x2b, 0xe5, 0x17, 0x6a, 0x4a, 0x95, 0xf3, 0x39, 0x62, 0x2f, 0x7b, 0x3d, 0xbe, 0x4b, + 0x59, 0x5c, 0x9a, 0xf3, 0xc5, 0x08, 0x4c, 0x69, 0xd8, 0x13, 0x50, 0x0d, 0xb8, 0x13, 0x0a, 0x97, + 0xa7, 0x4f, 0xd6, 0xb9, 0xd8, 0x32, 0x51, 0x41, 0x3f, 0x95, 0x16, 0xa1, 0x2b, 0x32, 0xf5, 0x8d, + 0x44, 0xcd, 0xfe, 0x07, 0xa6, 0xfb, 0xc7, 0x77, 0x61, 0x62, 0xbc, 0xa8, 0x15, 0xe7, 0x44, 0x1a, + 0x15, 0x44, 0x49, 0x6e, 0x55, 0x24, 0x9f, 0x63, 0xb2, 0x8d, 0xb1, 0x95, 0x61, 0x83, 0x39, 0xb6, + 0x62, 0xdf, 0x96, 0xc4, 0xe6, 0x0c, 0x7a, 0x5c, 0xe6, 0xbf, 0xa9, 0xb4, 0xea, 0xe4, 0xd2, 0xce, + 0x08, 0x69, 0x4b, 0xad, 0x51, 0x5e, 0x38, 0x4e, 0x00, 0x7b, 0x06, 0x6a, 0xbb, 0xc3, 0xc0, 0x91, + 0x40, 0x4a, 0x0e, 0xef, 0x8b, 0xf3, 0xe1, 0x75, 0x82, 0x0b, 0x3d, 0x9e, 0x92, 0xf9, 0x64, 0x23, + 0x06, 0x60, 0x32, 0x44, 0x64, 0x56, 0x2b, 0xbe, 0x4a, 0xd5, 0xb4, 0x43, 0xd3, 0x31, 0x35, 0x3e, + 0x94, 0xd4, 0xc9, 0xb1, 0x89, 0xe1, 0xca, 0xf5, 0x23, 0x29, 0xf1, 0x18, 0x2e, 0xec, 0x4b, 0x50, + 0x6d, 0xab, 0xca, 0x49, 0xe5, 0x98, 0x13, 0x87, 0x64, 0xd0, 0x7d, 0x39, 0xc9, 0x00, 0x89, 0x91, + 0xfd, 0x8f, 0x0a, 0x9c, 0x22, 0x6b, 0x95, 0xed, 0xc7, 0xee, 0xa1, 0x28, 0xc7, 0xcc, 0x18, 0x72, + 0x5f, 0x2e, 0x86, 0x2c, 0x66, 0x88, 0x8d, 0x28, 0xf2, 0x2d, 0x98, 0xd3, 0xee, 0x3b, 0xc6, 0x51, + 0x34, 0x59, 0x9b, 0xec, 0xc4, 0xe9, 0x75, 0x67, 0x84, 0x68, 0xab, 0x59, 0xcf, 0x30, 0xc7, 0x9c, + 0x30, 0x29, 0x9e, 0xbc, 0x5c, 0x2c, 0xbe, 0x5c, 0x44, 0x3c, 0x79, 0xb4, 0x51, 0xf1, 0x5b, 0x19, + 0xe6, 0x98, 0x13, 0x26, 0xc5, 0xb7, 0x87, 0x61, 0xe4, 0xf7, 0x13, 0xf1, 0x95, 0x22, 0xe2, 0x5b, + 0x8a, 0xc7, 0x18, 0xf1, 0xad, 0x0c, 0x73, 0xcc, 0x09, 0x63, 0xef, 0x58, 0x70, 0xe6, 0x75, 0xee, + 0xed, 0xbb, 0x5e, 0xb8, 0xe9, 0x0e, 0x78, 0x4f, 0x54, 0x30, 0xc9, 0x44, 0xf4, 0x31, 0xbd, 0x32, + 0xd9, 0x44, 0xae, 0x64, 0x99, 0x65, 0x67, 0x74, 0xa7, 0x98, 0xd1, 0x99, 0x2b, 0xe3, 0xc5, 0xe1, + 0x51, 0xf3, 0xb0, 0xff, 0x58, 0xa6, 0xe2, 0xdf, 0xf4, 0xa7, 0xa6, 0x07, 0xb2, 0x3e, 0xc3, 0x03, + 0x09, 0x1d, 0xab, 0x2e, 0xb9, 0xdb, 0x7e, 0x95, 0xef, 0xbc, 0xe8, 0xfb, 0xfb, 0xc5, 0x2c, 0xec, + 0x85, 0x0c, 0x0f, 0xed, 0xd5, 0x95, 0x8e, 0xb3, 0x08, 0xcc, 0x09, 0x63, 0x87, 0x70, 0x4a, 0xcb, + 0x89, 0xa5, 0x6b, 0x03, 0x7b, 0x7e, 0xe2, 0xdc, 0xe4, 0xc5, 0x84, 0x85, 0x16, 0xbe, 0x28, 0x3b, + 0xc5, 0x19, 0x38, 0x66, 0x25, 0xb1, 0xb7, 0x2c, 0x58, 0x50, 0xb9, 0x45, 0x6b, 0xcf, 0xf1, 0xba, + 0x7a, 0x37, 0xc8, 0xc0, 0x9e, 0x2d, 0x90, 0xbe, 0x68, 0x2e, 0x5a, 0xb8, 0xaa, 0x05, 0x36, 0x72, + 0xbc, 0x71, 0x44, 0x9a, 0xfd, 0x93, 0x32, 0xb0, 0xd1, 0xee, 0x14, 0x7b, 0x2c, 0xe3, 0x2c, 0xee, + 0xcd, 0x39, 0x8b, 0x05, 0x73, 0x84, 0xe1, 0x2b, 0xba, 0x50, 0xd5, 0xb3, 0x2e, 0x56, 0x2f, 0x91, + 0x5a, 0x88, 0xef, 0x38, 0xfd, 0x11, 0x7b, 0x99, 0xeb, 0xd0, 0x2e, 0xd2, 0x6e, 0xdd, 0x9c, 0xa4, + 0x71, 0x66, 0x12, 0x0b, 0x60, 0x21, 0xd4, 0x0d, 0xad, 0xd1, 0xf6, 0x3c, 0x5f, 0x78, 0x7b, 0x62, + 0x99, 0xaa, 0x7a, 0x31, 0xe0, 0x68, 0x4a, 0xb1, 0xff, 0x3e, 0x0d, 0x46, 0xfe, 0xc3, 0x9e, 0x15, + 0x5e, 0x90, 0x07, 0x07, 0x6e, 0x9b, 0xaf, 0xb5, 0xdb, 0xfe, 0xd0, 0x8b, 0x68, 0x63, 0x92, 0x2b, + 0x84, 0xad, 0x0c, 0x16, 0x73, 0xd4, 0xaa, 0x7d, 0xae, 0x1c, 0x1b, 0x6d, 0x4c, 0xa1, 0xf6, 0x79, + 0x2e, 0x39, 0xa6, 0xea, 0x96, 0x18, 0x67, 0xaa, 0xe5, 0xf2, 0x09, 0x56, 0xcb, 0x2e, 0xd4, 0xc2, + 0xac, 0x2f, 0x7e, 0xaa, 0xd0, 0x5d, 0x00, 0xf9, 0xbc, 0xa4, 0x37, 0x96, 0x38, 0xba, 0x84, 0xbd, + 0xd4, 0x9a, 0x0e, 0xda, 0xe4, 0x6b, 0x8b, 0x68, 0x4d, 0x67, 0x04, 0xa9, 0xd6, 0xf4, 0x37, 0x12, + 0x63, 0x51, 0xa3, 0xcd, 0x04, 0x5c, 0x6b, 0x30, 0xa4, 0x54, 0xe8, 0x33, 0x6a, 0x03, 0x24, 0x72, + 0xd9, 0xff, 0x70, 0x03, 0xde, 0xe7, 0x5e, 0x14, 0xa6, 0x59, 0x64, 0x8c, 0x0d, 0x31, 0xe5, 0xcb, + 0x86, 0x00, 0x83, 0xa4, 0x65, 0x43, 0x15, 0xc8, 0x5a, 0x81, 0xb5, 0x64, 0xfb, 0x3e, 0x69, 0xa2, + 0x9e, 0xc2, 0xd1, 0x10, 0xc4, 0xbe, 0x02, 0x67, 0xd3, 0x7c, 0x6c, 0x9d, 0x3b, 0xbb, 0x2a, 0x6c, + 0x50, 0x9f, 0x51, 0x37, 0xde, 0xee, 0x16, 0xc3, 0xcf, 0xb6, 0x8e, 0x22, 0xc2, 0xa3, 0xc7, 0xb3, + 0xef, 0x5a, 0x30, 0xeb, 0xf9, 0xbb, 0xe2, 0xbb, 0x27, 0x72, 0x21, 0x3f, 0x10, 0x99, 0x53, 0x79, + 0xf2, 0x70, 0x98, 0x1e, 0xb1, 0xc6, 0x35, 0x83, 0xd9, 0x25, 0x2f, 0x12, 0x95, 0xef, 0x69, 0x5a, + 0xdf, 0xac, 0x89, 0xc2, 0x8c, 0xd4, 0x95, 0xe7, 0x60, 0x71, 0x64, 0x20, 0x5b, 0x80, 0xf2, 0x3e, + 0x3f, 0xd4, 0x47, 0x14, 0xe5, 0xbf, 0xec, 0x34, 0x4c, 0x1d, 0x38, 0xbd, 0x21, 0x5d, 0xbe, 0xa2, + 0xfe, 0xf8, 0xbf, 0xd2, 0x45, 0xcb, 0xfe, 0x43, 0x05, 0x96, 0xc6, 0x64, 0x07, 0xec, 0x3a, 0xf5, + 0x68, 0x0a, 0x75, 0x06, 0x93, 0x3b, 0x21, 0xa3, 0x4f, 0xa3, 0x3a, 0x84, 0xbd, 0xde, 0xad, 0xea, + 0x10, 0xc6, 0x9c, 0xd0, 0xe0, 0x1a, 0xf7, 0x5c, 0xca, 0x37, 0xd5, 0x73, 0xb9, 0x02, 0x8c, 0xbf, + 0x29, 0xcc, 0x88, 0x53, 0x66, 0x28, 0xff, 0xea, 0x86, 0x41, 0xad, 0xb9, 0x42, 0xd4, 0xec, 0xd2, + 0x08, 0x05, 0x8e, 0x19, 0x25, 0x0b, 0xae, 0x8e, 0x2f, 0xce, 0x80, 0x9c, 0xaf, 0x3a, 0xc4, 0x46, + 0xc1, 0x75, 0x39, 0x46, 0x60, 0x4a, 0x23, 0xce, 0x63, 0x52, 0x44, 0x57, 0xd5, 0x2a, 0x2e, 0x16, + 0x29, 0xa2, 0xd5, 0xf1, 0x38, 0xb2, 0x7a, 0x66, 0x6b, 0x30, 0xaf, 0x06, 0xad, 0x6d, 0x6e, 0xc4, + 0x1d, 0x2d, 0x7d, 0xbf, 0x7c, 0x86, 0x86, 0xe8, 0x86, 0x4e, 0x8a, 0xc6, 0x3c, 0xbd, 0xfd, 0xeb, + 0x32, 0x2c, 0x8d, 0x49, 0xa9, 0x93, 0xd6, 0x9e, 0x75, 0x2b, 0x5a, 0x7b, 0x5f, 0x84, 0xc9, 0x88, + 0x3c, 0xd1, 0xf3, 0x5b, 0x4e, 0x7b, 0x8f, 0xd3, 0x65, 0x45, 0xa2, 0xb6, 0x6b, 0x1a, 0x8c, 0x31, + 0x3e, 0xb6, 0xae, 0xca, 0x4d, 0x59, 0xd7, 0xc4, 0x16, 0xf1, 0x6c, 0x5c, 0xff, 0xc8, 0xf6, 0xd5, + 0xa6, 0x13, 0xed, 0x51, 0xe3, 0x27, 0x09, 0xbd, 0xeb, 0x19, 0x2c, 0xe6, 0xa8, 0xed, 0x5f, 0x5a, + 0xb0, 0x34, 0x26, 0x35, 0xcd, 0xc4, 0x4b, 0xeb, 0x04, 0xe3, 0xa5, 0x6c, 0xac, 0xa7, 0x1b, 0x68, + 0x36, 0xd6, 0xf5, 0x66, 0x10, 0xd6, 0xfe, 0x68, 0x64, 0x9e, 0x97, 0x0e, 0x44, 0x6c, 0x29, 0xd6, + 0x7a, 0xdc, 0xd4, 0x5d, 0x3e, 0x6d, 0x32, 0x8f, 0x4f, 0x9c, 0x49, 0x6f, 0x78, 0x1d, 0x3f, 0xd7, + 0xde, 0xbb, 0x15, 0xae, 0xc5, 0xfe, 0x93, 0x05, 0x73, 0xd9, 0x26, 0x22, 0xbb, 0x1b, 0xca, 0xc3, + 0xc0, 0xa5, 0xd5, 0x25, 0x23, 0x5e, 0xc6, 0x0d, 0x94, 0x70, 0x89, 0x0e, 0x78, 0x87, 0x54, 0x97, + 0xa0, 0x85, 0x69, 0xa3, 0x84, 0xb3, 0x01, 0xd4, 0x07, 0x81, 0xff, 0xe6, 0xa1, 0x2e, 0xbe, 0x8b, + 0xbd, 0x4d, 0xd8, 0x4c, 0x19, 0xa4, 0x5d, 0x28, 0x03, 0x88, 0xa6, 0x08, 0xfb, 0x17, 0x16, 0xb0, + 0xd1, 0x5a, 0xe3, 0xdf, 0xce, 0x9a, 0x7e, 0x54, 0x82, 0x69, 0xda, 0x48, 0xf6, 0x4d, 0x51, 0xdf, + 0x65, 0x94, 0x5e, 0x6c, 0x86, 0xb9, 0xee, 0x6f, 0x72, 0xfe, 0xb2, 0x70, 0xcc, 0xc9, 0x62, 0x6f, + 0x5b, 0xb0, 0x28, 0x40, 0xd9, 0xf5, 0x15, 0xeb, 0x88, 0xbf, 0x90, 0x67, 0xd3, 0x3c, 0x4b, 0x93, + 0x58, 0x1c, 0x41, 0xe1, 0xa8, 0x50, 0xfb, 0xcf, 0x25, 0x18, 0x25, 0x94, 0x2a, 0x6d, 0xeb, 0xcc, + 0xcc, 0x1a, 0xfb, 0xd2, 0x8a, 0xb0, 0xb2, 0xb8, 0x72, 0xd4, 0x53, 0xa5, 0x62, 0x93, 0xd7, 0x52, + 0x65, 0x97, 0x3a, 0xf0, 0x7b, 0x2f, 0x8b, 0xfa, 0xc0, 0x78, 0x2a, 0xa4, 0xd8, 0x22, 0xb1, 0x17, + 0x46, 0x3d, 0xd3, 0x8e, 0x5f, 0x1e, 0x15, 0x7b, 0x40, 0x32, 0x2a, 0xcb, 0xb8, 0xda, 0x26, 0xce, + 0x98, 0x0a, 0x99, 0xa0, 0x5d, 0x69, 0xff, 0x58, 0x94, 0xcc, 0xf9, 0x62, 0x57, 0x8e, 0x57, 0xc5, + 0xd3, 0xc6, 0x7a, 0xbe, 0xd9, 0xb0, 0xa1, 0xc1, 0x18, 0xe3, 0xd9, 0x36, 0x4c, 0xcb, 0xd8, 0x86, + 0x74, 0xa8, 0x27, 0x8e, 0x91, 0xea, 0x6e, 0xf3, 0xb2, 0xe6, 0x80, 0x31, 0x2b, 0xfb, 0xf7, 0xe2, + 0x54, 0x8e, 0xd6, 0x78, 0xc2, 0x0d, 0x9e, 0x96, 0x57, 0x52, 0x49, 0x4b, 0x79, 0x23, 0x33, 0xc9, + 0xbb, 0x68, 0x92, 0xa7, 0xaf, 0x8e, 0xa1, 0xc1, 0xb1, 0x23, 0x93, 0xf8, 0x5e, 0xba, 0x05, 0xf1, + 0xdd, 0xfe, 0x55, 0x09, 0xea, 0xc6, 0xbd, 0xc7, 0x49, 0xe4, 0x9c, 0x53, 0x03, 0x11, 0x03, 0xe3, + 0xd7, 0x15, 0xcf, 0x14, 0xbe, 0x92, 0x91, 0x91, 0x34, 0x7d, 0x67, 0x21, 0xbf, 0x42, 0xd4, 0xac, + 0x73, 0x49, 0x4a, 0xf9, 0x24, 0x92, 0x14, 0xfb, 0x7b, 0x16, 0xcc, 0xe7, 0x66, 0x23, 0x2f, 0x83, + 0xc2, 0xe4, 0x8b, 0x76, 0x34, 0xa9, 0x88, 0x52, 0x3a, 0x34, 0xa8, 0x54, 0x2e, 0xc1, 0xc3, 0xc8, + 0xf5, 0x54, 0x6b, 0x59, 0x5e, 0x22, 0x95, 0x72, 0xb9, 0x44, 0x06, 0x8b, 0x39, 0x6a, 0xfb, 0xa7, + 0x16, 0xdc, 0x75, 0x5c, 0x07, 0x4f, 0x66, 0x96, 0xd4, 0xa6, 0x4b, 0xb2, 0x15, 0x2b, 0x9b, 0x59, + 0x5e, 0xc9, 0xa2, 0x31, 0x4f, 0x2f, 0x5f, 0xed, 0x18, 0x20, 0x9a, 0x60, 0x12, 0x97, 0x8c, 0xe1, + 0x68, 0xd2, 0xd9, 0x3f, 0xb4, 0xc0, 0x0c, 0x5a, 0xf2, 0x4d, 0xc6, 0x5e, 0x14, 0x0d, 0x14, 0x88, + 0x2e, 0x2f, 0xd4, 0x9b, 0x8c, 0x17, 0xb7, 0xb7, 0x37, 0x15, 0x10, 0x53, 0xbc, 0xbc, 0x44, 0x94, + 0x1f, 0xa1, 0xa6, 0xae, 0xa4, 0x97, 0x88, 0x92, 0x7a, 0x4b, 0x93, 0x1b, 0x14, 0xf2, 0xc5, 0x81, + 0xe7, 0x6b, 0x62, 0xfd, 0x4c, 0xb4, 0xae, 0x13, 0x46, 0x4d, 0x19, 0xe3, 0xec, 0xdf, 0x08, 0xd7, + 0x3f, 0x72, 0xab, 0xc5, 0x6e, 0x24, 0x21, 0xcc, 0x2a, 0x6e, 0x2c, 0xe3, 0xc3, 0xde, 0x4d, 0x6f, + 0xf0, 0xbb, 0x16, 0x40, 0x5a, 0x42, 0xb0, 0x1e, 0xcc, 0x6a, 0xc6, 0x99, 0xb8, 0x59, 0x64, 0xc2, + 0x49, 0x2d, 0xbb, 0x65, 0xf0, 0xc3, 0x0c, 0x77, 0x99, 0x1a, 0xf7, 0x65, 0xb7, 0x48, 0x99, 0x4d, + 0x29, 0xfb, 0x22, 0xe9, 0xa5, 0x18, 0x81, 0x29, 0x8d, 0xfd, 0xfd, 0x29, 0x58, 0x1a, 0xd3, 0x58, + 0xff, 0x0f, 0xae, 0x5d, 0x45, 0x20, 0xd2, 0xef, 0x54, 0xc2, 0x7c, 0x20, 0xd3, 0xcf, 0x58, 0x64, + 0x11, 0xa8, 0xff, 0x91, 0x4f, 0x1a, 0x5c, 0xaf, 0xad, 0x1b, 0x38, 0x4e, 0x5c, 0x8a, 0xe8, 0xa6, + 0x60, 0x0a, 0x46, 0x93, 0x26, 0x5b, 0xbb, 0x54, 0x3f, 0x57, 0x35, 0x3b, 0x4b, 0x4f, 0xd7, 0xf5, + 0xab, 0x92, 0xe9, 0x22, 0x1b, 0xa2, 0xee, 0x9d, 0xd1, 0x60, 0x83, 0x19, 0xa6, 0xec, 0x3b, 0x22, + 0x22, 0x13, 0x60, 0x2d, 0x88, 0xdc, 0x8e, 0xd3, 0x4e, 0x6e, 0xa0, 0x6f, 0xd2, 0xe1, 0x2f, 0xd3, + 0xe2, 0x16, 0x30, 0xc7, 0x1e, 0x47, 0x04, 0xda, 0x37, 0xc4, 0x51, 0xcf, 0x67, 0x1d, 0xec, 0x5e, + 0xa8, 0x78, 0xf2, 0xf5, 0xb6, 0xf6, 0x81, 0x89, 0x65, 0xa9, 0x47, 0xdb, 0x0a, 0xc3, 0xee, 0x87, + 0x29, 0xae, 0x9e, 0x64, 0x6b, 0x7b, 0x4f, 0x42, 0x8c, 0x7e, 0x89, 0xad, 0x71, 0xf6, 0x3b, 0xa2, + 0x6c, 0xc8, 0x25, 0x6d, 0x85, 0xaa, 0xa2, 0x1b, 0x66, 0x55, 0x74, 0xd3, 0xb9, 0x67, 0xa6, 0x3e, + 0xb2, 0x3b, 0x30, 0x97, 0x6d, 0x6a, 0x1b, 0xa9, 0xba, 0x75, 0x5c, 0xaa, 0x2e, 0xdf, 0x0b, 0x3a, + 0xf2, 0xe1, 0xa0, 0x30, 0x62, 0xba, 0x93, 0x4e, 0x7a, 0xa2, 0x6b, 0x04, 0xc7, 0x84, 0xa2, 0xf9, + 0xc0, 0xfb, 0x1f, 0x9d, 0xbb, 0xed, 0x03, 0xf1, 0xfb, 0xab, 0xf8, 0xbd, 0xf5, 0xf1, 0x39, 0xeb, + 0x7d, 0xf1, 0xfb, 0x40, 0xfc, 0xfe, 0x26, 0x7e, 0x3f, 0xf8, 0xe4, 0xdc, 0x6d, 0x37, 0x4a, 0x07, + 0xe7, 0xff, 0x15, 0x00, 0x00, 0xff, 0xff, 0xa2, 0xea, 0xf1, 0x9b, 0x48, 0x32, 0x00, 0x00, } diff --git a/pkg/build/api/v1/generated.proto b/pkg/build/api/v1/generated.proto index 3dc70cfcbb75..8a613cea15bb 100644 --- a/pkg/build/api/v1/generated.proto +++ b/pkg/build/api/v1/generated.proto @@ -489,6 +489,9 @@ message CommonSpec { // be active on a node before the system actively tries to terminate the // build; value must be positive integer optional int64 completionDeadlineSeconds = 8; + + // nodeSelector is a selector which must be true for the build pod to fit on a node + map nodeSelector = 9; } // CustomBuildStrategy defines input parameters specific to Custom build. diff --git a/pkg/build/api/v1/swagger_doc.go b/pkg/build/api/v1/swagger_doc.go index f8a92998e60f..8d3167d003b0 100644 --- a/pkg/build/api/v1/swagger_doc.go +++ b/pkg/build/api/v1/swagger_doc.go @@ -243,6 +243,7 @@ var map_CommonSpec = map[string]string{ "resources": "resources computes resource requirements to execute the build.", "postCommit": "postCommit is a build hook executed after the build output image is committed, before it is pushed to a registry.", "completionDeadlineSeconds": "completionDeadlineSeconds is an optional duration in seconds, counted from the time when a build pod gets scheduled in the system, that the build may be active on a node before the system actively tries to terminate the build; value must be positive integer", + "nodeSelector": "nodeSelector is a selector which must be true for the build pod to fit on a node", } func (CommonSpec) SwaggerDoc() map[string]string { diff --git a/pkg/build/api/v1/types.go b/pkg/build/api/v1/types.go index f81018013c8e..e3497062f87e 100644 --- a/pkg/build/api/v1/types.go +++ b/pkg/build/api/v1/types.go @@ -66,6 +66,9 @@ type CommonSpec struct { // be active on a node before the system actively tries to terminate the // build; value must be positive integer CompletionDeadlineSeconds *int64 `json:"completionDeadlineSeconds,omitempty" protobuf:"varint,8,opt,name=completionDeadlineSeconds"` + + // nodeSelector is a selector which must be true for the build pod to fit on a node + NodeSelector map[string]string `json:"nodeSelector,omitempty" protobuf:"bytes,9,opt,name=nodeSelector"` } // BuildTriggerCause holds information about a triggered build. It is used for diff --git a/pkg/build/api/v1/zz_generated.conversion.go b/pkg/build/api/v1/zz_generated.conversion.go index a7ced5a2285a..66d25025fdd5 100644 --- a/pkg/build/api/v1/zz_generated.conversion.go +++ b/pkg/build/api/v1/zz_generated.conversion.go @@ -1147,6 +1147,7 @@ func autoConvert_v1_CommonSpec_To_api_CommonSpec(in *CommonSpec, out *api.Common return err } out.CompletionDeadlineSeconds = in.CompletionDeadlineSeconds + out.NodeSelector = in.NodeSelector return nil } @@ -1181,6 +1182,7 @@ func autoConvert_api_CommonSpec_To_v1_CommonSpec(in *api.CommonSpec, out *Common return err } out.CompletionDeadlineSeconds = in.CompletionDeadlineSeconds + out.NodeSelector = in.NodeSelector return nil } diff --git a/pkg/build/api/v1/zz_generated.deepcopy.go b/pkg/build/api/v1/zz_generated.deepcopy.go index 12805adf842c..ea3ff1fe40a5 100644 --- a/pkg/build/api/v1/zz_generated.deepcopy.go +++ b/pkg/build/api/v1/zz_generated.deepcopy.go @@ -637,6 +637,15 @@ func DeepCopy_v1_CommonSpec(in interface{}, out interface{}, c *conversion.Clone } else { out.CompletionDeadlineSeconds = nil } + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string) + for key, val := range *in { + (*out)[key] = val + } + } else { + out.NodeSelector = nil + } return nil } } diff --git a/pkg/build/api/zz_generated.deepcopy.go b/pkg/build/api/zz_generated.deepcopy.go index 56f8e90b672b..a05e9072c682 100644 --- a/pkg/build/api/zz_generated.deepcopy.go +++ b/pkg/build/api/zz_generated.deepcopy.go @@ -636,6 +636,15 @@ func DeepCopy_api_CommonSpec(in interface{}, out interface{}, c *conversion.Clon } else { out.CompletionDeadlineSeconds = nil } + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string) + for key, val := range *in { + (*out)[key] = val + } + } else { + out.NodeSelector = nil + } return nil } } diff --git a/pkg/build/controller/strategy/custom.go b/pkg/build/controller/strategy/custom.go index 658e8b24f0eb..7069265374d6 100644 --- a/pkg/build/controller/strategy/custom.go +++ b/pkg/build/controller/strategy/custom.go @@ -89,6 +89,7 @@ func (bs *CustomBuildStrategy) CreateBuildPod(build *buildapi.Build) (*kapi.Pod, }, }, RestartPolicy: kapi.RestartPolicyNever, + NodeSelector: build.Spec.NodeSelector, }, } if build.Spec.CompletionDeadlineSeconds != nil { diff --git a/pkg/build/controller/strategy/custom_test.go b/pkg/build/controller/strategy/custom_test.go index 61aaccd45435..4e5e18e7e26a 100644 --- a/pkg/build/controller/strategy/custom_test.go +++ b/pkg/build/controller/strategy/custom_test.go @@ -30,18 +30,22 @@ func TestCustomCreateBuildPod(t *testing.T) { t.Errorf("Expected error when Image is empty, got nothing") } - expected := mockCustomBuild(false, false) - actual, err := strategy.CreateBuildPod(expected) + build := mockCustomBuild(false, false) + actual, err := strategy.CreateBuildPod(build) if err != nil { t.Fatalf("Unexpected error: %v", err) } - if expected, actual := buildapi.GetBuildPodName(expected), actual.ObjectMeta.Name; expected != actual { + if expected, actual := buildapi.GetBuildPodName(build), actual.ObjectMeta.Name; expected != actual { t.Errorf("Expected %s, but got %s!", expected, actual) } - if !reflect.DeepEqual(map[string]string{buildapi.BuildLabel: buildapi.LabelValue(expected.Name)}, actual.Labels) { + if !reflect.DeepEqual(map[string]string{buildapi.BuildLabel: buildapi.LabelValue(build.Name)}, actual.Labels) { t.Errorf("Pod Labels does not match Build Labels!") } + if !reflect.DeepEqual(nodeSelector, actual.Spec.NodeSelector) { + t.Errorf("Pod NodeSelector does not match Build NodeSelector. Expected: %v, got: %v", nodeSelector, actual.Spec.NodeSelector) + } + container := actual.Spec.Containers[0] if container.Name != "custom-build" { t.Errorf("Expected custom-build, but got %s!", container.Name) @@ -63,13 +67,13 @@ func TestCustomCreateBuildPod(t *testing.T) { t.Fatalf("Expected %s in VolumeMount[%d], got %s", expected, i, container.VolumeMounts[i].MountPath) } } - if !kapi.Semantic.DeepEqual(container.Resources, expected.Spec.Resources) { - t.Fatalf("Expected actual=expected, %v != %v", container.Resources, expected.Spec.Resources) + if !kapi.Semantic.DeepEqual(container.Resources, build.Spec.Resources) { + t.Fatalf("Expected actual=expected, %v != %v", container.Resources, build.Spec.Resources) } if len(actual.Spec.Volumes) != 3 { t.Fatalf("Expected 3 volumes in Build pod, got %d", len(actual.Spec.Volumes)) } - buildJSON, _ := runtime.Encode(kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), expected) + buildJSON, _ := runtime.Encode(kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), build) errorCases := map[int][]string{ 0: {"BUILD", string(buildJSON)}, } @@ -218,6 +222,7 @@ func mockCustomBuild(forcePull, emptySource bool) *buildapi.Build { }, }, CompletionDeadlineSeconds: &timeout, + NodeSelector: nodeSelector, }, }, Status: buildapi.BuildStatus{ diff --git a/pkg/build/controller/strategy/docker.go b/pkg/build/controller/strategy/docker.go index c08f485622ad..cd336641ccd5 100644 --- a/pkg/build/controller/strategy/docker.go +++ b/pkg/build/controller/strategy/docker.go @@ -61,6 +61,7 @@ func (bs *DockerBuildStrategy) CreateBuildPod(build *buildapi.Build) (*kapi.Pod, }, }, RestartPolicy: kapi.RestartPolicyNever, + NodeSelector: build.Spec.NodeSelector, }, } pod.Spec.Containers[0].ImagePullPolicy = kapi.PullIfNotPresent diff --git a/pkg/build/controller/strategy/docker_test.go b/pkg/build/controller/strategy/docker_test.go index bdf8cc1b70ec..5c5bbaa1da27 100644 --- a/pkg/build/controller/strategy/docker_test.go +++ b/pkg/build/controller/strategy/docker_test.go @@ -20,18 +20,22 @@ func TestDockerCreateBuildPod(t *testing.T) { Codec: kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), } - expected := mockDockerBuild() - actual, err := strategy.CreateBuildPod(expected) + build := mockDockerBuild() + actual, err := strategy.CreateBuildPod(build) if err != nil { t.Errorf("Unexpected error: %v", err) } - if expected, actual := buildapi.GetBuildPodName(expected), actual.ObjectMeta.Name; expected != actual { + if expected, actual := buildapi.GetBuildPodName(build), actual.ObjectMeta.Name; expected != actual { t.Errorf("Expected %s, but got %s!", expected, actual) } - if !reflect.DeepEqual(map[string]string{buildapi.BuildLabel: buildapi.LabelValue(expected.Name)}, actual.Labels) { + if !reflect.DeepEqual(map[string]string{buildapi.BuildLabel: buildapi.LabelValue(build.Name)}, actual.Labels) { t.Errorf("Pod Labels does not match Build Labels!") } + if !reflect.DeepEqual(nodeSelector, actual.Spec.NodeSelector) { + t.Errorf("Pod NodeSelector does not match Build NodeSelector. Expected: %v, got: %v", nodeSelector, actual.Spec.NodeSelector) + } + container := actual.Spec.Containers[0] if container.Name != "docker-build" { t.Errorf("Expected docker-build, but got %s!", container.Name) @@ -66,8 +70,8 @@ func TestDockerCreateBuildPod(t *testing.T) { if len(actual.Spec.Volumes) != 4 { t.Fatalf("Expected 4 volumes in Build pod, got %d", len(actual.Spec.Volumes)) } - if !kapi.Semantic.DeepEqual(container.Resources, expected.Spec.Resources) { - t.Fatalf("Expected actual=expected, %v != %v", container.Resources, expected.Spec.Resources) + if !kapi.Semantic.DeepEqual(container.Resources, build.Spec.Resources) { + t.Fatalf("Expected actual=expected, %v != %v", container.Resources, build.Spec.Resources) } found := false foundIllegal := false @@ -86,7 +90,7 @@ func TestDockerCreateBuildPod(t *testing.T) { t.Fatalf("Found illegal environment variable 'ILLEGAL' defined on container") } - buildJSON, _ := runtime.Encode(kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), expected) + buildJSON, _ := runtime.Encode(kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), build) errorCases := map[int][]string{ 0: {"BUILD", string(buildJSON)}, } @@ -158,6 +162,7 @@ func mockDockerBuild() *buildapi.Build { }, }, CompletionDeadlineSeconds: &timeout, + NodeSelector: nodeSelector, }, }, Status: buildapi.BuildStatus{ diff --git a/pkg/build/controller/strategy/sti.go b/pkg/build/controller/strategy/sti.go index 0553f6badb8c..e88db4982f6b 100644 --- a/pkg/build/controller/strategy/sti.go +++ b/pkg/build/controller/strategy/sti.go @@ -84,6 +84,7 @@ func (bs *SourceBuildStrategy) CreateBuildPod(build *buildapi.Build) (*kapi.Pod, }, }, RestartPolicy: kapi.RestartPolicyNever, + NodeSelector: build.Spec.NodeSelector, }, } pod.Spec.Containers[0].ImagePullPolicy = kapi.PullIfNotPresent diff --git a/pkg/build/controller/strategy/sti_test.go b/pkg/build/controller/strategy/sti_test.go index ff3036d7746c..a9267e9401bd 100644 --- a/pkg/build/controller/strategy/sti_test.go +++ b/pkg/build/controller/strategy/sti_test.go @@ -39,6 +39,8 @@ func TestSTICreateBuildPodRootAllowed(t *testing.T) { testSTICreateBuildPod(t, true) } +var nodeSelector = map[string]string{"node": "mynode"} + func testSTICreateBuildPod(t *testing.T, rootAllowed bool) { strategy := &SourceBuildStrategy{ Image: "sti-test-image", @@ -46,18 +48,22 @@ func testSTICreateBuildPod(t *testing.T, rootAllowed bool) { AdmissionControl: &FakeAdmissionControl{admit: rootAllowed}, } - expected := mockSTIBuild() - actual, err := strategy.CreateBuildPod(expected) + build := mockSTIBuild() + actual, err := strategy.CreateBuildPod(build) if err != nil { t.Errorf("Unexpected error: %v", err) } - if expected, actual := buildapi.GetBuildPodName(expected), actual.ObjectMeta.Name; expected != actual { + if expected, actual := buildapi.GetBuildPodName(build), actual.ObjectMeta.Name; expected != actual { t.Errorf("Expected %s, but got %s!", expected, actual) } - if !reflect.DeepEqual(map[string]string{buildapi.BuildLabel: buildapi.LabelValue(expected.Name)}, actual.Labels) { + if !reflect.DeepEqual(map[string]string{buildapi.BuildLabel: buildapi.LabelValue(build.Name)}, actual.Labels) { t.Errorf("Pod Labels does not match Build Labels!") } + if !reflect.DeepEqual(nodeSelector, actual.Spec.NodeSelector) { + t.Errorf("Pod NodeSelector does not match Build NodeSelector. Expected: %v, got: %v", nodeSelector, actual.Spec.NodeSelector) + } + container := actual.Spec.Containers[0] if container.Name != "sti-build" { t.Errorf("Expected sti-build, but got %s!", container.Name) @@ -71,6 +77,7 @@ func testSTICreateBuildPod(t *testing.T, rootAllowed bool) { if actual.Spec.RestartPolicy != kapi.RestartPolicyNever { t.Errorf("Expected never, got %#v", actual.Spec.RestartPolicy) } + // strategy ENV is whitelisted into the container environment, and not all // the values are allowed, so only expect 10 not 11 values. expectedEnvCount := 10 @@ -98,8 +105,8 @@ func testSTICreateBuildPod(t *testing.T, rootAllowed bool) { if *actual.Spec.ActiveDeadlineSeconds != 60 { t.Errorf("Expected ActiveDeadlineSeconds 60, got %d", *actual.Spec.ActiveDeadlineSeconds) } - if !kapi.Semantic.DeepEqual(container.Resources, expected.Spec.Resources) { - t.Fatalf("Expected actual=expected, %v != %v", container.Resources, expected.Spec.Resources) + if !kapi.Semantic.DeepEqual(container.Resources, build.Spec.Resources) { + t.Fatalf("Expected actual=expected, %v != %v", container.Resources, build.Spec.Resources) } found := false foundIllegal := false @@ -137,7 +144,7 @@ func testSTICreateBuildPod(t *testing.T, rootAllowed bool) { if !foundDropCaps && !rootAllowed { t.Fatalf("Expected %s when root is not allowed", buildapi.DropCapabilities) } - buildJSON, _ := runtime.Encode(kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), expected) + buildJSON, _ := runtime.Encode(kapi.Codecs.LegacyCodec(buildapi.SchemeGroupVersion), build) errorCases := map[int][]string{ 0: {"BUILD", string(buildJSON)}, } @@ -215,6 +222,7 @@ func mockSTIBuild() *buildapi.Build { }, }, CompletionDeadlineSeconds: &timeout, + NodeSelector: nodeSelector, }, }, Status: buildapi.BuildStatus{ diff --git a/pkg/build/generator/generator.go b/pkg/build/generator/generator.go index d0bf8bd0675e..3712a261bc58 100644 --- a/pkg/build/generator/generator.go +++ b/pkg/build/generator/generator.go @@ -405,6 +405,7 @@ func (g *BuildGenerator) generateBuildFromConfig(ctx kapi.Context, bc *buildapi. Resources: bcCopy.Spec.Resources, PostCommit: bcCopy.Spec.PostCommit, CompletionDeadlineSeconds: bcCopy.Spec.CompletionDeadlineSeconds, + NodeSelector: bcCopy.Spec.NodeSelector, }, }, ObjectMeta: kapi.ObjectMeta{ diff --git a/pkg/build/generator/generator_test.go b/pkg/build/generator/generator_test.go index a72c7e344ae1..0b27134efa8d 100644 --- a/pkg/build/generator/generator_test.go +++ b/pkg/build/generator/generator_test.go @@ -752,9 +752,10 @@ func TestGenerateBuildFromConfig(t *testing.T) { Commit: "1234", }, }, - Strategy: strategy, - Output: output, - Resources: resources, + Strategy: strategy, + Output: output, + Resources: resources, + NodeSelector: map[string]string{"node": "mynode"}, }, }, Status: buildapi.BuildConfigStatus{ @@ -794,6 +795,9 @@ func TestGenerateBuildFromConfig(t *testing.T) { if build.Labels["testlabel"] != bc.Labels["testlabel"] { t.Errorf("Build does not contain labels from BuildConfig") } + if !reflect.DeepEqual(map[string]string{"node": "mynode"}, build.Spec.NodeSelector) { + t.Errorf("Build nodeselector does not match passed in nodeselector") + } if build.Annotations[buildapi.BuildConfigAnnotation] != bc.Name { t.Errorf("Build does not contain annotation from BuildConfig") } diff --git a/pkg/cmd/server/origin/master_config.go b/pkg/cmd/server/origin/master_config.go index 78b250f2ce15..20ed96031d5d 100644 --- a/pkg/cmd/server/origin/master_config.go +++ b/pkg/cmd/server/origin/master_config.go @@ -336,6 +336,10 @@ var ( KubeAdmissionPlugins = []string{ "RunOnceDuration", lifecycle.PluginName, + // BuildDefaults and BuildOverrides must come before + // PodNodeConstraints and OriginPodNodeEnvironment + "BuildDefaults", + "BuildOverrides", "PodNodeConstraints", "OriginPodNodeEnvironment", overrideapi.PluginName, @@ -346,8 +350,6 @@ var ( "LimitRanger", "ServiceAccount", "SecurityContextConstraint", - "BuildDefaults", - "BuildOverrides", storageclassdefaultadmission.PluginName, "AlwaysPullImages", "LimitPodHardAntiAffinityTopology", @@ -372,6 +374,8 @@ var ( imageadmission.PluginName, "RunOnceDuration", lifecycle.PluginName, + "BuildDefaults", + "BuildOverrides", "PodNodeConstraints", "OriginPodNodeEnvironment", overrideapi.PluginName, @@ -382,8 +386,6 @@ var ( "LimitRanger", "ServiceAccount", "SecurityContextConstraint", - "BuildDefaults", - "BuildOverrides", storageclassdefaultadmission.PluginName, "AlwaysPullImages", "LimitPodHardAntiAffinityTopology", diff --git a/pkg/cmd/server/origin/master_config_test.go b/pkg/cmd/server/origin/master_config_test.go index 138a4f1db5e8..7e3b272f1683 100644 --- a/pkg/cmd/server/origin/master_config_test.go +++ b/pkg/cmd/server/origin/master_config_test.go @@ -29,3 +29,28 @@ func TestQuotaAdmissionPluginsAreLast(t *testing.T) { t.Errorf("CombinedAdmissionControlPlugins must have ClusterResourceQuota as the last plugin") } } + +func TestBuildAdmissionBeforeNodeConstraints(t *testing.T) { + foundOverrides := false + foundDefaults := false + for _, plugin := range KubeAdmissionPlugins { + if plugin == "PodNodeContraints" && !(foundOverrides && foundDefaults) { + t.Errorf("PodNodeConstraints appears before the build admission controllers") + } + if plugin == "OriginPodNodeEnvironment" && !(foundOverrides && foundDefaults) { + t.Errorf("PodNodeConstraints appears before the build admission controllers") + } + if plugin == "BuildDefaults" { + foundDefaults = true + } + if plugin == "BuildOverrides" { + foundOverrides = true + } + } + if !foundOverrides { + t.Errorf("BuildOverrides admission controller not registered") + } + if !foundDefaults { + t.Errorf("BuildDefaults admission controller not registered") + } +} diff --git a/vendor/k8s.io/client-go/1.4/pkg/version/base.go b/vendor/k8s.io/client-go/1.4/pkg/version/base.go index c377705fe8f1..8c83d46fa134 100644 --- a/vendor/k8s.io/client-go/1.4/pkg/version/base.go +++ b/vendor/k8s.io/client-go/1.4/pkg/version/base.go @@ -51,8 +51,8 @@ var ( // semantic version is a git hash, but the version itself is no // longer the direct output of "git describe", but a slight // translation to be semver compliant. - gitVersion string = "v0.0.0-master+$Format:%h$" - gitCommit string = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) + gitVersion string = "v0.0.0-master+2b98766" + gitCommit string = "2b9876600ebfc8ab5f1a9a5dc529191eec7e7beb" // sha1 from git, output of $(git rev-parse HEAD) gitTreeState string = "not a git tree" // state of git tree, either "clean" or "dirty" buildDate string = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') diff --git a/vendor/k8s.io/kubernetes/pkg/version/base.go b/vendor/k8s.io/kubernetes/pkg/version/base.go index 75dcdcea2853..30573d1192a6 100644 --- a/vendor/k8s.io/kubernetes/pkg/version/base.go +++ b/vendor/k8s.io/kubernetes/pkg/version/base.go @@ -51,8 +51,8 @@ var ( // semantic version is a git hash, but the version itself is no // longer the direct output of "git describe", but a slight // translation to be semver compliant. - gitVersion string = "v1.4.0+$Format:%h$" - gitCommit string = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) + gitVersion string = "v1.4.0+2b98766" + gitCommit string = "2b9876600ebfc8ab5f1a9a5dc529191eec7e7beb" // sha1 from git, output of $(git rev-parse HEAD) gitTreeState string = "not a git tree" // state of git tree, either "clean" or "dirty" buildDate string = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')