diff --git a/api/docs/apis-build.openshift.io/v1.Build.adoc b/api/docs/apis-build.openshift.io/v1.Build.adoc index 10ca9720029a..ddbd479e5467 100644 --- a/api/docs/apis-build.openshift.io/v1.Build.adoc +++ b/api/docs/apis-build.openshift.io/v1.Build.adoc @@ -133,6 +133,10 @@ Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-gu
source:
binary:
asFile: +
configMaps: +
- configMap: +
- name: +
destinationDir:
contextDir:
dockerfile:
git: diff --git a/api/docs/apis-build.openshift.io/v1.BuildConfig.adoc b/api/docs/apis-build.openshift.io/v1.BuildConfig.adoc index 3b907aa12623..1d83853c169d 100644 --- a/api/docs/apis-build.openshift.io/v1.BuildConfig.adoc +++ b/api/docs/apis-build.openshift.io/v1.BuildConfig.adoc @@ -137,6 +137,10 @@ Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-gu
source:
binary:
asFile: +
configMaps: +
- configMap: +
- name: +
destinationDir:
contextDir:
dockerfile:
git: diff --git a/api/docs/oapi/v1.Build.adoc b/api/docs/oapi/v1.Build.adoc index 70b743f7b4df..073abe4011ec 100644 --- a/api/docs/oapi/v1.Build.adoc +++ b/api/docs/oapi/v1.Build.adoc @@ -133,6 +133,10 @@ Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-gu
source:
binary:
asFile: +
configMaps: +
- configMap: +
- name: +
destinationDir:
contextDir:
dockerfile:
git: diff --git a/api/docs/oapi/v1.BuildConfig.adoc b/api/docs/oapi/v1.BuildConfig.adoc index cbfe7e81652b..bb8b63e8b272 100644 --- a/api/docs/oapi/v1.BuildConfig.adoc +++ b/api/docs/oapi/v1.BuildConfig.adoc @@ -137,6 +137,10 @@ Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-gu
source:
binary:
asFile: +
configMaps: +
- configMap: +
- name: +
destinationDir:
contextDir:
dockerfile:
git: diff --git a/api/protobuf-spec/github_com_openshift_api_build_v1.proto b/api/protobuf-spec/github_com_openshift_api_build_v1.proto index b0b4e5db69e6..2f6b987b077a 100644 --- a/api/protobuf-spec/github_com_openshift_api_build_v1.proto +++ b/api/protobuf-spec/github_com_openshift_api_build_v1.proto @@ -375,6 +375,10 @@ message BuildSource { // secrets represents a list of secrets and their destinations that will // be used only for the build. repeated SecretBuildSource secrets = 8; + + // configMaps represents a list of configMaps and their destinations that will + // be used for the build. + repeated ConfigMapBuildSource configMaps = 9; } // BuildSpec has the information to represent a build and also additional @@ -577,6 +581,24 @@ message CommonWebHookCause { optional string secret = 2; } +// ConfigMapBuildSource describes a configmap and its destination directory that will be +// used only at the build time. The content of the configmap referenced here will +// be copied into the destination directory instead of mounting. +message ConfigMapBuildSource { + // configMap is a reference to an existing configmap that you want to use in your + // build. + optional k8s.io.api.core.v1.LocalObjectReference configMap = 1; + + // destinationDir is the directory where the files from the configmap should be + // available for the build time. + // For the Source build strategy, these will be injected into a container + // where the assemble script runs. + // For the Docker build strategy, these will be copied into the build + // directory, where the Dockerfile is located, so users can ADD or COPY them + // during docker build. + optional string destinationDir = 2; +} + // CustomBuildStrategy defines input parameters specific to Custom build. message CustomBuildStrategy { // from is reference to an DockerImage, ImageStreamTag, or ImageStreamImage from which diff --git a/api/swagger-spec/oapi-v1.json b/api/swagger-spec/oapi-v1.json index 6e881a7f70f5..b9b072cd6304 100644 --- a/api/swagger-spec/oapi-v1.json +++ b/api/swagger-spec/oapi-v1.json @@ -24329,6 +24329,13 @@ "$ref": "v1.SecretBuildSource" }, "description": "secrets represents a list of secrets and their destinations that will be used only for the build." + }, + "configMaps": { + "type": "array", + "items": { + "$ref": "v1.ConfigMapBuildSource" + }, + "description": "configMaps represents a list of configMaps and their destinations that will be used for the build." } } }, @@ -24449,6 +24456,23 @@ } } }, + "v1.ConfigMapBuildSource": { + "id": "v1.ConfigMapBuildSource", + "description": "ConfigMapBuildSource describes a configmap and its destination directory that will be used only at the build time. The content of the configmap referenced here will be copied into the destination directory instead of mounting.", + "required": [ + "configMap" + ], + "properties": { + "configMap": { + "$ref": "v1.LocalObjectReference", + "description": "configMap is a reference to an existing configmap that you want to use in your build." + }, + "destinationDir": { + "type": "string", + "description": "destinationDir is the directory where the files from the configmap should be available for the build time. For the Source build strategy, these will be injected into a container where the assemble script runs. For the Docker build strategy, these will be copied into the build directory, where the Dockerfile is located, so users can ADD or COPY them during docker build." + } + } + }, "v1.SourceRevision": { "id": "v1.SourceRevision", "description": "SourceRevision is the revision or commit information from the source for the build", diff --git a/api/swagger-spec/openshift-openapi-spec.json b/api/swagger-spec/openshift-openapi-spec.json index 4ae5f4d67751..1ed29e1e4c00 100644 --- a/api/swagger-spec/openshift-openapi-spec.json +++ b/api/swagger-spec/openshift-openapi-spec.json @@ -119142,6 +119142,13 @@ "description": "binary builds accept a binary as their input. The binary is generally assumed to be a tar, gzipped tar, or zip file depending on the strategy. For Docker builds, this is the build context and an optional Dockerfile may be specified to override any Dockerfile in the build context. For Source builds, this is assumed to be an archive as described above. For Source and Docker builds, if binary.asFile is set the build will receive a directory with a single file. contextDir may be used when an archive is provided. Custom builds will receive this binary as input on STDIN.", "$ref": "#/definitions/com.github.openshift.api.build.v1.BinaryBuildSource" }, + "configMaps": { + "description": "configMaps represents a list of configMaps and their destinations that will be used for the build.", + "type": "array", + "items": { + "$ref": "#/definitions/com.github.openshift.api.build.v1.ConfigMapBuildSource" + } + }, "contextDir": { "description": "contextDir specifies the sub-directory where the source code for the application exists. This allows to have buildable sources in directory other than root of repository.", "type": "string" @@ -119402,6 +119409,22 @@ } } }, + "com.github.openshift.api.build.v1.ConfigMapBuildSource": { + "description": "ConfigMapBuildSource describes a configmap and its destination directory that will be used only at the build time. The content of the configmap referenced here will be copied into the destination directory instead of mounting.", + "required": [ + "configMap" + ], + "properties": { + "configMap": { + "description": "configMap is a reference to an existing configmap that you want to use in your build.", + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference" + }, + "destinationDir": { + "description": "destinationDir is the directory where the files from the configmap should be available for the build time. For the Source build strategy, these will be injected into a container where the assemble script runs. For the Docker build strategy, these will be copied into the build directory, where the Dockerfile is located, so users can ADD or COPY them during docker build.", + "type": "string" + } + } + }, "com.github.openshift.api.build.v1.CustomBuildStrategy": { "description": "CustomBuildStrategy defines input parameters specific to Custom build.", "required": [ diff --git a/glide.lock b/glide.lock index 2931fee1b6af..d95aac3e3789 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 1511c1c08d724d5b2f6c586490bfa154f305c5b0038fb2a4bf3c0404aabc72a6 -updated: 2018-06-13T17:31:37.381725-04:00 +hash: fd0d3ccfd367c1a3eaf92bffa4738270b4478428cb8262e6cf84c26ab6269dbc +updated: 2018-06-19T15:18:05.726174-04:00 imports: - name: bitbucket.org/ww/goautoneg version: 75cd24fc2f2c2a2088577d12123ddee5f54e0675 @@ -819,7 +819,7 @@ imports: - go-selinux - go-selinux/label - name: github.com/openshift/api - version: 6ef6704e604af539af656171d5c0bde774923a43 + version: 0ce1df2db7debb15eddb25f3ae76df4180777221 subpackages: - apps/v1 - authorization/v1 @@ -1815,7 +1815,7 @@ imports: - pkg/util/proto - pkg/util/proto/validation - name: k8s.io/kubernetes - version: 8afc46914f13dc03452e1d2df354a01ab738e2f0 + version: 6d1dd08538863a8d01b84012b8fdff5b2e6f2240 repo: https://github.com/openshift/kubernetes.git subpackages: - cmd/controller-manager/app diff --git a/glide.yaml b/glide.yaml index 7c0c32a3834f..9f2069b8c406 100644 --- a/glide.yaml +++ b/glide.yaml @@ -38,7 +38,7 @@ import: # openshift second - package: github.com/openshift/api - version: release-3.10 + version: temporary-pre-3.11 - package: github.com/openshift/client-go version: release-3.10 - package: github.com/openshift/imagebuilder diff --git a/pkg/build/apis/build/types.go b/pkg/build/apis/build/types.go index 8a973d29801f..9eca34dcd84c 100644 --- a/pkg/build/apis/build/types.go +++ b/pkg/build/apis/build/types.go @@ -604,6 +604,10 @@ type BuildSource struct { // Secrets represents a list of secrets and their destinations that will // be used only for the build. Secrets []SecretBuildSource + + // ConfigMaps represents a list of configMaps and their destinations that will + // be used only for the build. + ConfigMaps []ConfigMapBuildSource } // ImageSource is used to describe build source that will be extracted from an image or used during a @@ -669,6 +673,24 @@ type SecretBuildSource struct { DestinationDir string } +// ConfigMapBuildSource describes a configMap and its destination directory that will be +// used only at the build time. The content of the configMap referenced here will +// be copied into the destination directory instead of mounting. +type ConfigMapBuildSource struct { + // ConfigMap is a reference to an existing configMap that you want to use in your + // build. + ConfigMap kapi.LocalObjectReference + + // DestinationDir is the directory where the files from the configMap should be + // available for the build time. + // For the Source build strategy, these will be injected into a container + // where the assemble script runs. + // For the Docker build strategy, these will be copied into the build + // directory, where the Dockerfile is located, so users can ADD or COPY them + // during docker build. + DestinationDir string +} + type BinaryBuildSource struct { // AsFile indicates that the provided binary input should be considered a single file // within the build input. For example, specifying "webapp.war" would place the provided diff --git a/pkg/build/apis/build/v1/zz_generated.conversion.go b/pkg/build/apis/build/v1/zz_generated.conversion.go index 9438748d7504..03c92cf4e683 100644 --- a/pkg/build/apis/build/v1/zz_generated.conversion.go +++ b/pkg/build/apis/build/v1/zz_generated.conversion.go @@ -74,6 +74,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_build_CommonSpec_To_v1_CommonSpec, Convert_v1_CommonWebHookCause_To_build_CommonWebHookCause, Convert_build_CommonWebHookCause_To_v1_CommonWebHookCause, + Convert_v1_ConfigMapBuildSource_To_build_ConfigMapBuildSource, + Convert_build_ConfigMapBuildSource_To_v1_ConfigMapBuildSource, Convert_v1_CustomBuildStrategy_To_build_CustomBuildStrategy, Convert_build_CustomBuildStrategy_To_v1_CustomBuildStrategy, Convert_v1_DockerBuildStrategy_To_build_DockerBuildStrategy, @@ -734,6 +736,17 @@ func autoConvert_v1_BuildSource_To_build_BuildSource(in *v1.BuildSource, out *bu } else { out.Secrets = nil } + if in.ConfigMaps != nil { + in, out := &in.ConfigMaps, &out.ConfigMaps + *out = make([]build.ConfigMapBuildSource, len(*in)) + for i := range *in { + if err := Convert_v1_ConfigMapBuildSource_To_build_ConfigMapBuildSource(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.ConfigMaps = nil + } return nil } @@ -778,6 +791,17 @@ func autoConvert_build_BuildSource_To_v1_BuildSource(in *build.BuildSource, out } else { out.Secrets = nil } + if in.ConfigMaps != nil { + in, out := &in.ConfigMaps, &out.ConfigMaps + *out = make([]v1.ConfigMapBuildSource, len(*in)) + for i := range *in { + if err := Convert_build_ConfigMapBuildSource_To_v1_ConfigMapBuildSource(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.ConfigMaps = nil + } return nil } @@ -1276,6 +1300,32 @@ func Convert_build_CommonWebHookCause_To_v1_CommonWebHookCause(in *build.CommonW return autoConvert_build_CommonWebHookCause_To_v1_CommonWebHookCause(in, out, s) } +func autoConvert_v1_ConfigMapBuildSource_To_build_ConfigMapBuildSource(in *v1.ConfigMapBuildSource, out *build.ConfigMapBuildSource, s conversion.Scope) error { + if err := core_v1.Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.ConfigMap, &out.ConfigMap, s); err != nil { + return err + } + out.DestinationDir = in.DestinationDir + return nil +} + +// Convert_v1_ConfigMapBuildSource_To_build_ConfigMapBuildSource is an autogenerated conversion function. +func Convert_v1_ConfigMapBuildSource_To_build_ConfigMapBuildSource(in *v1.ConfigMapBuildSource, out *build.ConfigMapBuildSource, s conversion.Scope) error { + return autoConvert_v1_ConfigMapBuildSource_To_build_ConfigMapBuildSource(in, out, s) +} + +func autoConvert_build_ConfigMapBuildSource_To_v1_ConfigMapBuildSource(in *build.ConfigMapBuildSource, out *v1.ConfigMapBuildSource, s conversion.Scope) error { + if err := core_v1.Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.ConfigMap, &out.ConfigMap, s); err != nil { + return err + } + out.DestinationDir = in.DestinationDir + return nil +} + +// Convert_build_ConfigMapBuildSource_To_v1_ConfigMapBuildSource is an autogenerated conversion function. +func Convert_build_ConfigMapBuildSource_To_v1_ConfigMapBuildSource(in *build.ConfigMapBuildSource, out *v1.ConfigMapBuildSource, s conversion.Scope) error { + return autoConvert_build_ConfigMapBuildSource_To_v1_ConfigMapBuildSource(in, out, s) +} + func autoConvert_v1_CustomBuildStrategy_To_build_CustomBuildStrategy(in *v1.CustomBuildStrategy, out *build.CustomBuildStrategy, s conversion.Scope) error { if err := core_v1.Convert_v1_ObjectReference_To_core_ObjectReference(&in.From, &out.From, s); err != nil { return err diff --git a/pkg/build/apis/build/validation/validation.go b/pkg/build/apis/build/validation/validation.go index 0c93d5bc2f93..fd35ff4f2d35 100644 --- a/pkg/build/apis/build/validation/validation.go +++ b/pkg/build/apis/build/validation/validation.go @@ -218,6 +218,7 @@ func validateSource(input *buildapi.BuildSource, isCustomStrategy, isDockerStrat } allErrs = append(allErrs, validateSecrets(input.Secrets, isDockerStrategy, fldPath.Child("secrets"))...) + allErrs = append(allErrs, validateConfigMaps(input.ConfigMaps, isDockerStrategy, fldPath.Child("configMaps"))...) allErrs = append(allErrs, validateSecretRef(input.SourceSecret, fldPath.Child("sourceSecret"))...) @@ -275,6 +276,25 @@ func validateGitSource(git *buildapi.GitBuildSource, fldPath *field.Path) field. return allErrs } +func validateConfigMaps(configs []buildapi.ConfigMapBuildSource, isDockerStrategy bool, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + for i, c := range configs { + if len(c.ConfigMap.Name) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Index(i).Child("configMap"), "")) + } + if reasons := validation.ValidateConfigMapName(c.ConfigMap.Name, false); len(reasons) != 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("configMap"), c, "must be valid configMap name")) + } + if strings.HasPrefix(path.Clean(c.DestinationDir), "..") { + allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("destinationDir"), c.DestinationDir, "destination dir cannot start with '..'")) + } + if isDockerStrategy && filepath.IsAbs(c.DestinationDir) { + allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("destinationDir"), c.DestinationDir, "for the docker strategy the destinationDir has to be relative path")) + } + } + return allErrs +} + func validateSecrets(secrets []buildapi.SecretBuildSource, isDockerStrategy bool, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} for i, s := range secrets { diff --git a/pkg/build/apis/build/validation/validation_test.go b/pkg/build/apis/build/validation/validation_test.go index ee0a3fc1258e..4f2977e163de 100644 --- a/pkg/build/apis/build/validation/validation_test.go +++ b/pkg/build/apis/build/validation/validation_test.go @@ -820,11 +820,14 @@ func TestValidateSource(t *testing.T) { dockerfile := "FROM something" invalidProxyAddress := "some!@#$%^&*()url" errorCases := []struct { - t field.ErrorType - path string - source *buildapi.BuildSource - ok bool - multiple bool + t field.ErrorType + path string + source *buildapi.BuildSource + ok bool + multiple bool + customStrategy bool + dockerStrategy bool + jenkinsStrategy bool }{ // 0 { @@ -1189,10 +1192,130 @@ func TestValidateSource(t *testing.T) { }, }, }, + // 25 - invalid configMap name + { + t: field.ErrorTypeInvalid, + path: "configMaps[0].configMap", + source: &buildapi.BuildSource{ + ConfigMaps: []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "A@ba!dn#me", + }, + DestinationDir: "./some/relative/path", + }, + }, + }, + }, + // 26 - invalid relative path + { + t: field.ErrorTypeInvalid, + path: "configMaps[0].destinationDir", + source: &buildapi.BuildSource{ + ConfigMaps: []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "good-secret-name", + }, + DestinationDir: "../bad/parent/path", + }, + }, + }, + }, + // 27 - invalid abs path with Docker strategy + { + t: field.ErrorTypeInvalid, + path: "configMaps[0].destinationDir", + dockerStrategy: true, + source: &buildapi.BuildSource{ + ConfigMaps: []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "good-secret-name", + }, + DestinationDir: "/var/log/something", + }, + }, + }, + }, + // 28 - ok abs path without Docker strategy + { + ok: true, + source: &buildapi.BuildSource{ + ConfigMaps: []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "good-secret-name", + }, + DestinationDir: "/var/log/something", + }, + }, + }, + }, + // 29 - invalid secret name + { + t: field.ErrorTypeInvalid, + path: "secrets[0].secret", + source: &buildapi.BuildSource{ + Secrets: []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "A@ba!dn#me", + }, + DestinationDir: "./some/relative/path", + }, + }, + }, + }, + // 30 - invalid secret relative path + { + t: field.ErrorTypeInvalid, + path: "secrets[0].destinationDir", + source: &buildapi.BuildSource{ + Secrets: []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "good-secret-name", + }, + DestinationDir: "../bad/parent/path", + }, + }, + }, + }, + // 31 - invalid abs path with Docker strategy + { + t: field.ErrorTypeInvalid, + path: "secrets[0].destinationDir", + dockerStrategy: true, + source: &buildapi.BuildSource{ + Secrets: []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "good-secret-name", + }, + DestinationDir: "/var/log/something", + }, + }, + }, + }, + // 32 - ok abs path without Docker strategy + { + ok: true, + source: &buildapi.BuildSource{ + Secrets: []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "good-secret-name", + }, + DestinationDir: "/var/log/something", + }, + }, + }, + }, } for i, tc := range errorCases { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { - errors := validateSource(tc.source, false, false, false, nil) + errors := validateSource(tc.source, tc.customStrategy, tc.dockerStrategy, tc.jenkinsStrategy, nil) switch len(errors) { case 0: if !tc.ok { diff --git a/pkg/build/apis/build/zz_generated.deepcopy.go b/pkg/build/apis/build/zz_generated.deepcopy.go index 39f417811419..14976996d005 100644 --- a/pkg/build/apis/build/zz_generated.deepcopy.go +++ b/pkg/build/apis/build/zz_generated.deepcopy.go @@ -610,6 +610,11 @@ func (in *BuildSource) DeepCopyInto(out *BuildSource) { *out = make([]SecretBuildSource, len(*in)) copy(*out, *in) } + if in.ConfigMaps != nil { + in, out := &in.ConfigMaps, &out.ConfigMaps + *out = make([]ConfigMapBuildSource, len(*in)) + copy(*out, *in) + } return } @@ -982,6 +987,23 @@ func (in *CommonWebHookCause) DeepCopy() *CommonWebHookCause { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConfigMapBuildSource) DeepCopyInto(out *ConfigMapBuildSource) { + *out = *in + out.ConfigMap = in.ConfigMap + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapBuildSource. +func (in *ConfigMapBuildSource) DeepCopy() *ConfigMapBuildSource { + if in == nil { + return nil + } + out := new(ConfigMapBuildSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomBuildStrategy) DeepCopyInto(out *CustomBuildStrategy) { *out = *in diff --git a/pkg/build/builder/common.go b/pkg/build/builder/common.go index d4aec577d0a0..1f67b4c59a48 100644 --- a/pkg/build/builder/common.go +++ b/pkg/build/builder/common.go @@ -14,6 +14,7 @@ import ( "strings" "time" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" @@ -66,6 +67,51 @@ type GitClient interface { GetInfo(location string) (*git.SourceInfo, []error) } +// localObjectBuildSource is a build source that is copied into a build from a Kubernetes +// key-value store, such as a `Secret` or `ConfigMap`. +type localObjectBuildSource interface { + // LocalObjectRef returns a reference to a local Kubernetes object by name. + LocalObjectRef() corev1.LocalObjectReference + // DestinationPath returns the directory where the files from the build source should be + // available for the build time. + // For the Source build strategy, these will be injected into a container + // where the assemble script runs. + // For the Docker build strategy, these will be copied into the build + // directory, where the Dockerfile is located, so users can ADD or COPY them + // during docker build. + DestinationPath() string + // IsSecret returns `true` if the build source is a `Secret` containing sensitive data. + IsSecret() bool +} + +type configMapSource buildapiv1.ConfigMapBuildSource + +func (c configMapSource) LocalObjectRef() corev1.LocalObjectReference { + return c.ConfigMap +} + +func (c configMapSource) DestinationPath() string { + return c.DestinationDir +} + +func (c configMapSource) IsSecret() bool { + return false +} + +type secretSource buildapiv1.SecretBuildSource + +func (s secretSource) LocalObjectRef() corev1.LocalObjectReference { + return s.Secret +} + +func (s secretSource) DestinationPath() string { + return s.DestinationDir +} + +func (s secretSource) IsSecret() bool { + return true +} + // buildInfo returns a slice of KeyValue pairs with build metadata to be // inserted into Docker images produced by build. func buildInfo(build *buildapiv1.Build, sourceInfo *git.SourceInfo) []KeyValue { diff --git a/pkg/build/builder/docker.go b/pkg/build/builder/docker.go index 9f27ad7f3913..6a4798e67e7a 100644 --- a/pkg/build/builder/docker.go +++ b/pkg/build/builder/docker.go @@ -137,7 +137,7 @@ func (d *DockerBuilder) Build() error { } startTime := metav1.Now() - err = d.dockerBuild(buildDir, buildTag, d.build.Spec.Source.Secrets) + err = d.dockerBuild(buildDir, buildTag) timing.RecordNewStep(ctx, buildapiv1.StageBuild, buildapiv1.StepDockerBuild, startTime, metav1.Now()) @@ -205,59 +205,82 @@ func (d *DockerBuilder) Build() error { return nil } +// copyConfigMaps copies all files from the directory where the configMap is +// mounted in the builder pod to a directory where the is the Dockerfile, so +// users can ADD or COPY the files inside their Dockerfile. +func (d *DockerBuilder) copyConfigMaps(configs []buildapiv1.ConfigMapBuildSource, targetDir string) error { + var err error + for _, c := range configs { + err = d.copyLocalObject(configMapSource(c), strategy.ConfigMapBuildSourceBaseMountPath, targetDir) + if err != nil { + return err + } + } + return nil +} + // copySecrets copies all files from the directory where the secret is // mounted in the builder pod to a directory where the is the Dockerfile, so // users can ADD or COPY the files inside their Dockerfile. -func (d *DockerBuilder) copySecrets(secrets []buildapiv1.SecretBuildSource, buildDir string) error { +func (d *DockerBuilder) copySecrets(secrets []buildapiv1.SecretBuildSource, targetDir string) error { + var err error for _, s := range secrets { - dstDir := filepath.Join(buildDir, s.DestinationDir) - if err := os.MkdirAll(dstDir, 0777); err != nil { + err = d.copyLocalObject(secretSource(s), strategy.SecretBuildSourceBaseMountPath, targetDir) + if err != nil { return err } - glog.V(3).Infof("Copying files from the build secret %q to %q", s.Secret.Name, dstDir) - - // Secrets contain nested directories and fairly baroque links. To prevent extra data being - // copied, perform the following steps: - // - // 1. Only top level files and directories within the secret directory are candidates - // 2. Any item starting with '..' is ignored - // 3. Destination directories are created first with 0777 - // 4. Use the '-L' option to cp to copy only contents. - // - srcDir := filepath.Join(strategy.SecretBuildSourceBaseMountPath, s.Secret.Name) - if err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if srcDir == path { - return nil - } + } + return nil +} - // skip any contents that begin with ".." - if strings.HasPrefix(filepath.Base(path), "..") { - if info.IsDir() { - return filepath.SkipDir - } - return nil - } +func (d *DockerBuilder) copyLocalObject(s localObjectBuildSource, sourceDir, targetDir string) error { + dstDir := filepath.Join(targetDir, s.DestinationPath()) + if err := os.MkdirAll(dstDir, 0777); err != nil { + return err + } + glog.V(3).Infof("Copying files from the build source %q to %q", s.LocalObjectRef().Name, dstDir) + + // Build sources contain nested directories and fairly baroque links. To prevent extra data being + // copied, perform the following steps: + // + // 1. Only top level files and directories within the secret directory are candidates + // 2. Any item starting with '..' is ignored + // 3. Destination directories are created first with 0777 + // 4. Use the '-L' option to cp to copy only contents. + // + srcDir := filepath.Join(sourceDir, s.LocalObjectRef().Name) + if err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if srcDir == path { + return nil + } - // ensure all directories are traversable + // skip any contents that begin with ".." + if strings.HasPrefix(filepath.Base(path), "..") { if info.IsDir() { - if err := os.MkdirAll(dstDir, 0777); err != nil { - return err - } + return filepath.SkipDir } - out, err := exec.Command("cp", "-vLRf", path, dstDir+"/").Output() - if err != nil { - glog.V(4).Infof("Secret %q failed to copy: %q", s.Secret.Name, string(out)) + return nil + } + + // ensure all directories are traversable + if info.IsDir() { + if err := os.MkdirAll(dstDir, 0777); err != nil { return err } - // See what is copied when debugging. - glog.V(5).Infof("Result of secret copy %s\n%s", s.Secret.Name, string(out)) - return nil - }); err != nil { + } + out, err := exec.Command("cp", "-vLRf", path, dstDir+"/").Output() + if err != nil { + glog.V(4).Infof("Build source %q failed to copy: %q", s.LocalObjectRef().Name, string(out)) return err } + // See what is copied when debugging. + glog.V(5).Infof("Result of build source copy %s\n%s", s.LocalObjectRef().Name, string(out)) + return nil + }); err != nil { + return err } return nil } @@ -282,7 +305,7 @@ func (d *DockerBuilder) setupPullSecret() (*docker.AuthConfigurations, error) { } // dockerBuild performs a docker build on the source that has been retrieved -func (d *DockerBuilder) dockerBuild(dir string, tag string, secrets []buildapiv1.SecretBuildSource) error { +func (d *DockerBuilder) dockerBuild(dir string, tag string) error { var noCache bool var forcePull bool var buildArgs []docker.BuildArg @@ -304,7 +327,10 @@ func (d *DockerBuilder) dockerBuild(dir string, tag string, secrets []buildapiv1 if err != nil { return err } - if err := d.copySecrets(secrets, dir); err != nil { + if err := d.copySecrets(d.build.Spec.Source.Secrets, dir); err != nil { + return err + } + if err = d.copyConfigMaps(d.build.Spec.Source.ConfigMaps, dir); err != nil { return err } diff --git a/pkg/build/builder/docker_test.go b/pkg/build/builder/docker_test.go index 310719404df9..8aa9bde799f2 100644 --- a/pkg/build/builder/docker_test.go +++ b/pkg/build/builder/docker_test.go @@ -285,7 +285,7 @@ func TestDockerfilePath(t *testing.T) { } // check that the docker client is called with the right Dockerfile parameter - if err = dockerBuilder.dockerBuild(buildDir, "", []buildapiv1.SecretBuildSource{}); err != nil { + if err = dockerBuilder.dockerBuild(buildDir, ""); err != nil { t.Errorf("failed to build: %v", err) continue } diff --git a/pkg/build/builder/sti.go b/pkg/build/builder/sti.go index 40fad46605dc..6088c5c71206 100644 --- a/pkg/build/builder/sti.go +++ b/pkg/build/builder/sti.go @@ -99,6 +99,33 @@ func newS2IBuilder(dockerClient DockerClient, dockerSocket string, buildsClient } } +// injectConfigMaps creates an s2i `VolumeSpec` from each provided `ConfigMapBuildSource` +func injectConfigMaps(configMaps []buildapiv1.ConfigMapBuildSource) []s2iapi.VolumeSpec { + vols := make([]s2iapi.VolumeSpec, len(configMaps)) + for i, c := range configMaps { + vols[i] = makeVolumeSpec(configMapSource(c), strategy.ConfigMapBuildSourceBaseMountPath) + } + return vols +} + +// injectSecrets creates an s2i `VolumeSpec` from each provided `SecretBuildSource` +func injectSecrets(secrets []buildapiv1.SecretBuildSource) []s2iapi.VolumeSpec { + vols := make([]s2iapi.VolumeSpec, len(secrets)) + for i, s := range secrets { + vols[i] = makeVolumeSpec(secretSource(s), strategy.SecretBuildSourceBaseMountPath) + } + return vols +} + +func makeVolumeSpec(src localObjectBuildSource, mountPath string) s2iapi.VolumeSpec { + glog.V(3).Infof("Injecting build source %q into a build into %q", src.LocalObjectRef().Name, filepath.Clean(src.DestinationPath())) + return s2iapi.VolumeSpec{ + Source: filepath.Join(mountPath, src.LocalObjectRef().Name), + Destination: src.DestinationPath(), + Keep: !src.IsSecret(), + } +} + // Build executes S2I build based on configured builder, S2I builder factory // and S2I config validator func (s *S2IBuilder) Build() error { @@ -133,14 +160,8 @@ func (s *S2IBuilder) Build() error { s2iSourceInfo = toS2ISourceInfo(sourceInfo) } injections := s2iapi.VolumeList{} - for _, s := range s.build.Spec.Source.Secrets { - glog.V(3).Infof("Injecting secret %q into a build into %q", s.Secret.Name, filepath.Clean(s.DestinationDir)) - secretSourcePath := filepath.Join(strategy.SecretBuildSourceBaseMountPath, s.Secret.Name) - injections = append(injections, s2iapi.VolumeSpec{ - Source: secretSourcePath, - Destination: s.DestinationDir, - }) - } + injections = append(injections, injectSecrets(s.build.Spec.Source.Secrets)...) + injections = append(injections, injectConfigMaps(s.build.Spec.Source.ConfigMaps)...) buildTag := randomBuildTag(s.build.Namespace, s.build.Name) scriptDownloadProxyConfig, err := scriptProxyConfig(s.build) diff --git a/pkg/build/builder/sti_test.go b/pkg/build/builder/sti_test.go index cd74e3617d9b..b98c8ab70800 100644 --- a/pkg/build/builder/sti_test.go +++ b/pkg/build/builder/sti_test.go @@ -159,6 +159,58 @@ func TestCopyToVolumeList(t *testing.T) { } } +func TestInjectSecrets(t *testing.T) { + secrets := []buildapiv1.SecretBuildSource{ + { + Secret: corev1.LocalObjectReference{ + Name: "secret1", + }, + DestinationDir: "/tmp", + }, + { + Secret: corev1.LocalObjectReference{ + Name: "secret2", + }, + }, + } + output := injectSecrets(secrets) + for i, v := range output { + secret := secrets[i] + if v.Keep { + t.Errorf("secret volume %s should not have been kept", secret.Secret.Name) + } + if secret.DestinationDir != v.Destination { + t.Errorf("expected secret %s to be mounted to %s, got %s", secret.Secret.Name, secret.DestinationDir, v.Destination) + } + } +} + +func TestInjectConfigMaps(t *testing.T) { + configMaps := []buildapiv1.ConfigMapBuildSource{ + { + ConfigMap: corev1.LocalObjectReference{ + Name: "configMap1", + }, + DestinationDir: "/tmp", + }, + { + ConfigMap: corev1.LocalObjectReference{ + Name: "configMap2", + }, + }, + } + output := injectConfigMaps(configMaps) + for i, v := range output { + configMap := configMaps[i] + if !v.Keep { + t.Errorf("configMap volume %s should have been kept", configMap.ConfigMap.Name) + } + if configMap.DestinationDir != v.Destination { + t.Errorf("expected configMap %s to be mounted to %s, got %s", configMap.ConfigMap.Name, configMap.DestinationDir, v.Destination) + } + } +} + func TestBuildEnvVars(t *testing.T) { // In order not complicate this function, the ordering of the expected // EnvironmentList structure and the one that is returned must match, diff --git a/pkg/build/controller/strategy/custom_test.go b/pkg/build/controller/strategy/custom_test.go index e3b89ff8d2b6..a7170368c7aa 100644 --- a/pkg/build/controller/strategy/custom_test.go +++ b/pkg/build/controller/strategy/custom_test.go @@ -60,8 +60,8 @@ func TestCustomCreateBuildPod(t *testing.T) { if actual.Spec.RestartPolicy != v1.RestartPolicyNever { t.Errorf("Expected never, got %#v", actual.Spec.RestartPolicy) } - if len(container.VolumeMounts) != 3 { - t.Fatalf("Expected 3 volumes in container, got %d", len(container.VolumeMounts)) + if len(container.VolumeMounts) != 4 { + t.Fatalf("Expected 4 volumes in container, got %d", len(container.VolumeMounts)) } if *actual.Spec.ActiveDeadlineSeconds != 60 { t.Errorf("Expected ActiveDeadlineSeconds 60, got %d", *actual.Spec.ActiveDeadlineSeconds) @@ -74,8 +74,8 @@ func TestCustomCreateBuildPod(t *testing.T) { if !kapihelper.Semantic.DeepEqual(container.Resources, util.CopyApiResourcesToV1Resources(&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)) + if len(actual.Spec.Volumes) != 4 { + t.Fatalf("Expected 4 volumes in Build pod, got %d", len(actual.Spec.Volumes)) } buildJSON, _ := runtime.Encode(legacyscheme.Codecs.LegacyCodec(buildapi.LegacySchemeGroupVersion), build) errorCases := map[int][]string{ @@ -212,6 +212,14 @@ func mockCustomBuild(forcePull, emptySource bool) *buildapi.Build { }, ExposeDockerSocket: true, ForcePull: forcePull, + Secrets: []buildapi.SecretSpec{ + { + SecretSource: kapi.LocalObjectReference{ + Name: "secret", + }, + MountPath: "secret", + }, + }, }, }, Output: buildapi.BuildOutput{ diff --git a/pkg/build/controller/strategy/docker.go b/pkg/build/controller/strategy/docker.go index 5875f2e7c13e..500aeda25757 100644 --- a/pkg/build/controller/strategy/docker.go +++ b/pkg/build/controller/strategy/docker.go @@ -168,5 +168,6 @@ func (bs *DockerBuildStrategy) CreateBuildPod(build *buildapi.Build) (*v1.Pod, e // location into the working directory. // TODO: consider moving this into the git-clone container and doing the secret copying there instead. setupInputSecrets(pod, &pod.Spec.Containers[0], build.Spec.Source.Secrets) + setupInputConfigMaps(pod, &pod.Spec.Containers[0], build.Spec.Source.ConfigMaps) return pod, nil } diff --git a/pkg/build/controller/strategy/docker_test.go b/pkg/build/controller/strategy/docker_test.go index 87d085ab820e..30784480ea47 100644 --- a/pkg/build/controller/strategy/docker_test.go +++ b/pkg/build/controller/strategy/docker_test.go @@ -65,8 +65,8 @@ func TestDockerCreateBuildPod(t *testing.T) { } // the pod has 6 volumes but the git source secret is not mounted into the main container. - if len(container.VolumeMounts) != 5 { - t.Fatalf("Expected 5 volumes in container, got %d", len(container.VolumeMounts)) + if len(container.VolumeMounts) != 7 { + t.Fatalf("Expected 7 volumes in container, got %d", len(container.VolumeMounts)) } if *actual.Spec.ActiveDeadlineSeconds != 60 { t.Errorf("Expected ActiveDeadlineSeconds 60, got %d", *actual.Spec.ActiveDeadlineSeconds) @@ -76,8 +76,8 @@ func TestDockerCreateBuildPod(t *testing.T) { t.Fatalf("Expected %s in VolumeMount[%d], got %s", expected, i, container.VolumeMounts[i].MountPath) } } - if len(actual.Spec.Volumes) != 6 { - t.Fatalf("Expected 6 volumes in Build pod, got %d", len(actual.Spec.Volumes)) + if len(actual.Spec.Volumes) != 8 { + t.Fatalf("Expected 8 volumes in Build pod, got %d", len(actual.Spec.Volumes)) } if !kapihelper.Semantic.DeepEqual(container.Resources, util.CopyApiResourcesToV1Resources(&build.Spec.Resources)) { t.Fatalf("Expected actual=expected, %v != %v", container.Resources, build.Spec.Resources) @@ -149,6 +149,22 @@ func mockDockerBuild() *buildapi.Build { }, ContextDir: "my/test/dir", SourceSecret: &kapi.LocalObjectReference{Name: "secretFoo"}, + Secrets: []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "super-secret", + }, + DestinationDir: "a/path/for/secret", + }, + }, + ConfigMaps: []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "build-config", + }, + DestinationDir: "a/path/for/config", + }, + }, }, Strategy: buildapi.BuildStrategy{ DockerStrategy: &buildapi.DockerBuildStrategy{ diff --git a/pkg/build/controller/strategy/sti.go b/pkg/build/controller/strategy/sti.go index b41fe5a14e8d..b5e61ce153bc 100644 --- a/pkg/build/controller/strategy/sti.go +++ b/pkg/build/controller/strategy/sti.go @@ -188,6 +188,7 @@ func (bs *SourceBuildStrategy) CreateBuildPod(build *buildapi.Build) (*v1.Pod, e // location into the working directory. // TODO: consider moving this into the git-clone container and doing the secret copying there instead. setupInputSecrets(pod, &pod.Spec.Containers[0], build.Spec.Source.Secrets) + setupInputConfigMaps(pod, &pod.Spec.Containers[0], build.Spec.Source.ConfigMaps) return pod, nil } diff --git a/pkg/build/controller/strategy/sti_test.go b/pkg/build/controller/strategy/sti_test.go index 60f64f8826a6..a1272325fd25 100644 --- a/pkg/build/controller/strategy/sti_test.go +++ b/pkg/build/controller/strategy/sti_test.go @@ -103,17 +103,17 @@ func testSTICreateBuildPod(t *testing.T, rootAllowed bool) { t.Errorf("Expected environment keys:\n%v\ngot keys\n%v", expectedKeys, gotKeys) } - // the pod has 6 volumes but the git source secret is not mounted into the main container. - if len(container.VolumeMounts) != 5 { - t.Fatalf("Expected 5 volumes in container, got %d", len(container.VolumeMounts)) + // the pod has 8 volumes but the git source secret is not mounted into the main container. + if len(container.VolumeMounts) != 7 { + t.Fatalf("Expected 7 volumes in container, got %d", len(container.VolumeMounts)) } for i, expected := range []string{buildutil.BuildWorkDirMount, dockerSocketPath, "/var/run/crio/crio.sock", DockerPushSecretMountPath, DockerPullSecretMountPath} { if container.VolumeMounts[i].MountPath != expected { t.Fatalf("Expected %s in VolumeMount[%d], got %s", expected, i, container.VolumeMounts[i].MountPath) } } - if len(actual.Spec.Volumes) != 6 { - t.Fatalf("Expected 6 volumes in Build pod, got %d", len(actual.Spec.Volumes)) + if len(actual.Spec.Volumes) != 8 { + t.Fatalf("Expected 8 volumes in Build pod, got %d", len(actual.Spec.Volumes)) } if *actual.Spec.ActiveDeadlineSeconds != 60 { t.Errorf("Expected ActiveDeadlineSeconds 60, got %d", *actual.Spec.ActiveDeadlineSeconds) @@ -208,6 +208,22 @@ func mockSTIBuild() *buildapi.Build { }, ContextDir: "foo", SourceSecret: &kapi.LocalObjectReference{Name: "fooSecret"}, + Secrets: []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "secret", + }, + DestinationDir: "/tmp", + }, + }, + ConfigMaps: []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "configmap", + }, + DestinationDir: "relpath", + }, + }, }, Strategy: buildapi.BuildStrategy{ SourceStrategy: &buildapi.SourceBuildStrategy{ diff --git a/pkg/build/controller/strategy/util.go b/pkg/build/controller/strategy/util.go index a705d87015e0..e2e5cee69ff8 100644 --- a/pkg/build/controller/strategy/util.go +++ b/pkg/build/controller/strategy/util.go @@ -13,6 +13,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kvalidation "k8s.io/apimachinery/pkg/util/validation" kapi "k8s.io/kubernetes/pkg/apis/core" + kext "k8s.io/kubernetes/pkg/apis/extensions" buildapiv1 "github.com/openshift/api/build/v1" "github.com/openshift/origin/pkg/api/apihelpers" @@ -25,10 +26,11 @@ const ( dockerSocketPath = "/var/run/docker.sock" sourceSecretMountPath = "/var/run/secrets/openshift.io/source" - DockerPushSecretMountPath = "/var/run/secrets/openshift.io/push" - DockerPullSecretMountPath = "/var/run/secrets/openshift.io/pull" - SecretBuildSourceBaseMountPath = "/var/run/secrets/openshift.io/build" - SourceImagePullSecretMountPath = "/var/run/secrets/openshift.io/source-image" + DockerPushSecretMountPath = "/var/run/secrets/openshift.io/push" + DockerPullSecretMountPath = "/var/run/secrets/openshift.io/pull" + ConfigMapBuildSourceBaseMountPath = "/var/run/configs/openshift.io/build" + SecretBuildSourceBaseMountPath = "/var/run/secrets/openshift.io/build" + SourceImagePullSecretMountPath = "/var/run/secrets/openshift.io/source-image" // ExtractImageContentContainer is the name of the container that will // pull down input images and extract their content for input to the build. @@ -122,10 +124,26 @@ func setupCrioSocket(pod *v1.Pod) { crioSocketVolumeMount) } +// mountConfigMapVolume is a helper method responsible for actual mounting configMap +// volumes into a pod. +func mountConfigMapVolume(pod *v1.Pod, container *v1.Container, configMapName, mountPath, volumeSuffix string) { + mountVolume(pod, container, configMapName, mountPath, volumeSuffix, kext.ConfigMap) +} + // mountSecretVolume is a helper method responsible for actual mounting secret // volumes into a pod. func mountSecretVolume(pod *v1.Pod, container *v1.Container, secretName, mountPath, volumeSuffix string) { - volumeName := apihelpers.GetName(secretName, volumeSuffix, kvalidation.DNS1123LabelMaxLength) + mountVolume(pod, container, secretName, mountPath, volumeSuffix, kext.Secret) +} + +// mountVolume is a helper method responsible for mounting volumes into a pod. +// The following file system types for the volume are supported: +// +// 1. ConfigMap +// 2. EmptyDir +// 3. Secret +func mountVolume(pod *v1.Pod, container *v1.Container, objName, mountPath, volumeSuffix string, fsType kext.FSType) { + volumeName := apihelpers.GetName(objName, volumeSuffix, kvalidation.DNS1123LabelMaxLength) // coerce from RFC1123 subdomain to RFC1123 label. volumeName = strings.Replace(volumeName, ".", "-", -1) @@ -139,15 +157,7 @@ func mountSecretVolume(pod *v1.Pod, container *v1.Container, secretName, mountPa } mode := int32(0600) if !volumeExists { - volume := v1.Volume{ - Name: volumeName, - VolumeSource: v1.VolumeSource{ - Secret: &v1.SecretVolumeSource{ - SecretName: secretName, - DefaultMode: &mode, - }, - }, - } + volume := makeVolume(volumeName, objName, mode, fsType) pod.Spec.Volumes = append(pod.Spec.Volumes, volume) } @@ -159,6 +169,35 @@ func mountSecretVolume(pod *v1.Pod, container *v1.Container, secretName, mountPa container.VolumeMounts = append(container.VolumeMounts, volumeMount) } +func makeVolume(volumeName, refName string, mode int32, fsType kext.FSType) v1.Volume { + // TODO: Add support for key-based paths for secrets and configMaps? + vol := v1.Volume{ + Name: volumeName, + VolumeSource: v1.VolumeSource{}, + } + switch fsType { + case kext.ConfigMap: + vol.VolumeSource.ConfigMap = &v1.ConfigMapVolumeSource{ + LocalObjectReference: v1.LocalObjectReference{ + Name: refName, + }, + DefaultMode: &mode, + } + case kext.EmptyDir: + vol.VolumeSource.EmptyDir = &v1.EmptyDirVolumeSource{} + case kext.Secret: + vol.VolumeSource.Secret = &v1.SecretVolumeSource{ + SecretName: refName, + DefaultMode: &mode, + } + default: + glog.V(3).Infof("File system %s is not supported for volumes. Using empty directory instead.", fsType) + vol.VolumeSource.EmptyDir = &v1.EmptyDirVolumeSource{} + } + + return vol +} + // setupDockerSecrets mounts Docker Registry secrets into Pod running the build, // allowing Docker to authenticate against private registries or Docker Hub. func setupDockerSecrets(pod *v1.Pod, container *v1.Container, pushSecret, pullSecret *kapi.LocalObjectReference, imageSources []buildapi.ImageSource) { @@ -205,6 +244,15 @@ func setupSourceSecrets(pod *v1.Pod, container *v1.Container, sourceSecret *kapi }...) } +// setupInputConfigMaps mounts the configMaps referenced by the ConfigMapBuildSource +// into a builder container. +func setupInputConfigMaps(pod *v1.Pod, container *v1.Container, configs []buildapi.ConfigMapBuildSource) { + for _, c := range configs { + mountConfigMapVolume(pod, container, c.ConfigMap.Name, filepath.Join(ConfigMapBuildSourceBaseMountPath, c.ConfigMap.Name), "build") + glog.V(3).Infof("%s will be used as a build config in %s", c.ConfigMap.Name, ConfigMapBuildSourceBaseMountPath) + } +} + // setupInputSecrets mounts the secrets referenced by the SecretBuildSource // into a builder container. func setupInputSecrets(pod *v1.Pod, container *v1.Container, secrets []buildapi.SecretBuildSource) { diff --git a/pkg/build/controller/strategy/util_test.go b/pkg/build/controller/strategy/util_test.go index 5b6756c80557..321ab167bbed 100644 --- a/pkg/build/controller/strategy/util_test.go +++ b/pkg/build/controller/strategy/util_test.go @@ -72,13 +72,7 @@ func isVolumeSourceEmpty(volumeSource v1.VolumeSource) bool { } func TestSetupDockerSecrets(t *testing.T) { - pod := v1.Pod{ - Spec: v1.PodSpec{ - Containers: []v1.Container{ - {}, - }, - }, - } + pod := emptyPod() pushSecret := &kapi.LocalObjectReference{ Name: "my.pushSecret.with.full.stops.and.longer.than.sixty.three.characters", @@ -135,6 +129,16 @@ func TestSetupDockerSecrets(t *testing.T) { } } +func emptyPod() v1.Pod { + return v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + {}, + }, + }, + } +} + func TestCopyEnvVarSlice(t *testing.T) { s1 := []v1.EnvVar{{Name: "FOO", Value: "bar"}, {Name: "BAZ", Value: "qux"}} s2 := copyEnvVarSlice(s1) @@ -167,3 +171,71 @@ func checkAliasing(t *testing.T, pod *v1.Pod) { m[p] = true } } + +// TODO: Add tests for mounting secrets and configMaps +func TestMountConfigsAndSecrets(t *testing.T) { + pod := emptyPod() + configs := []buildapi.ConfigMapBuildSource{ + { + ConfigMap: kapi.LocalObjectReference{ + Name: "my.config.with.full.stops.and.longer.than.sixty.three.characters", + }, + DestinationDir: "./a/rel/path", + }, + { + ConfigMap: kapi.LocalObjectReference{ + Name: "config", + }, + DestinationDir: "some/path", + }, + } + secrets := []buildapi.SecretBuildSource{ + { + Secret: kapi.LocalObjectReference{ + Name: "my.secret.with.full.stops.and.longer.than.sixty.three.characters", + }, + DestinationDir: "./a/secret/path", + }, + { + Secret: kapi.LocalObjectReference{ + Name: "super-secret", + }, + DestinationDir: "secret/path", + }, + } + setupInputConfigMaps(&pod, &pod.Spec.Containers[0], configs) + setupInputSecrets(&pod, &pod.Spec.Containers[0], secrets) + if len(pod.Spec.Volumes) != 4 { + t.Fatalf("Expected 4 volumes, got: %#v", pod.Spec.Volumes) + } + + seenName := map[string]bool{} + for _, v := range pod.Spec.Volumes { + if seenName[v.Name] { + t.Errorf("Duplicate volume name %s", v.Name) + } + seenName[v.Name] = true + t.Logf("Saw volume %s", v.Name) + } + seenMount := map[string]bool{} + for _, m := range pod.Spec.Containers[0].VolumeMounts { + if seenMount[m.Name] { + t.Errorf("Duplicate volume mount name %s", m.Name) + } + seenMount[m.Name] = true + } + expectedVols := []string{ + "my-config-with-full-stops-and-longer-than-sixty--1935b127-build", + "config-build", + "my-secret-with-full-stops-and-longer-than-sixty--2f06b2d9-build", + "super-secret-build", + } + for _, vol := range expectedVols { + if !seenName[vol] { + t.Errorf("volume %s was not seen", vol) + } + if !seenMount[vol] { + t.Errorf("volumemount %s was not seen", vol) + } + } +} diff --git a/pkg/openapi/zz_generated.openapi.go b/pkg/openapi/zz_generated.openapi.go index 3be602d04ff8..42641df82a83 100644 --- a/pkg/openapi/zz_generated.openapi.go +++ b/pkg/openapi/zz_generated.openapi.go @@ -95,6 +95,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/openshift/api/build/v1.BuildTriggerPolicy": schema_openshift_api_build_v1_BuildTriggerPolicy(ref), "github.com/openshift/api/build/v1.CommonSpec": schema_openshift_api_build_v1_CommonSpec(ref), "github.com/openshift/api/build/v1.CommonWebHookCause": schema_openshift_api_build_v1_CommonWebHookCause(ref), + "github.com/openshift/api/build/v1.ConfigMapBuildSource": schema_openshift_api_build_v1_ConfigMapBuildSource(ref), "github.com/openshift/api/build/v1.CustomBuildStrategy": schema_openshift_api_build_v1_CustomBuildStrategy(ref), "github.com/openshift/api/build/v1.DockerBuildStrategy": schema_openshift_api_build_v1_DockerBuildStrategy(ref), "github.com/openshift/api/build/v1.DockerStrategyOptions": schema_openshift_api_build_v1_DockerStrategyOptions(ref), @@ -4710,12 +4711,25 @@ func schema_openshift_api_build_v1_BuildSource(ref common.ReferenceCallback) com }, }, }, + "configMaps": { + SchemaProps: spec.SchemaProps{ + Description: "configMaps represents a list of configMaps and their destinations that will be used for the build.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/openshift/api/build/v1.ConfigMapBuildSource"), + }, + }, + }, + }, + }, }, Required: []string{"type"}, }, }, Dependencies: []string{ - "github.com/openshift/api/build/v1.BinaryBuildSource", "github.com/openshift/api/build/v1.GitBuildSource", "github.com/openshift/api/build/v1.ImageSource", "github.com/openshift/api/build/v1.SecretBuildSource", "k8s.io/api/core/v1.LocalObjectReference"}, + "github.com/openshift/api/build/v1.BinaryBuildSource", "github.com/openshift/api/build/v1.ConfigMapBuildSource", "github.com/openshift/api/build/v1.GitBuildSource", "github.com/openshift/api/build/v1.ImageSource", "github.com/openshift/api/build/v1.SecretBuildSource", "k8s.io/api/core/v1.LocalObjectReference"}, } } @@ -5207,6 +5221,34 @@ func schema_openshift_api_build_v1_CommonWebHookCause(ref common.ReferenceCallba } } +func schema_openshift_api_build_v1_ConfigMapBuildSource(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ConfigMapBuildSource describes a configmap and its destination directory that will be used only at the build time. The content of the configmap referenced here will be copied into the destination directory instead of mounting.", + Properties: map[string]spec.Schema{ + "configMap": { + SchemaProps: spec.SchemaProps{ + Description: "configMap is a reference to an existing configmap that you want to use in your build.", + Ref: ref("k8s.io/api/core/v1.LocalObjectReference"), + }, + }, + "destinationDir": { + SchemaProps: spec.SchemaProps{ + Description: "destinationDir is the directory where the files from the configmap should be available for the build time. For the Source build strategy, these will be injected into a container where the assemble script runs. For the Docker build strategy, these will be copied into the build directory, where the Dockerfile is located, so users can ADD or COPY them during docker build.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"configMap"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.LocalObjectReference"}, + } +} + func schema_openshift_api_build_v1_CustomBuildStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/test/extended/builds/secrets.go b/test/extended/builds/secrets.go index c1422ab3a1d7..3d16e5c37bbe 100644 --- a/test/extended/builds/secrets.go +++ b/test/extended/builds/secrets.go @@ -14,15 +14,17 @@ import ( var _ = g.Describe("[Feature:Builds][Slow] can use build secrets", func() { defer g.GinkgoRecover() var ( - buildSecretBaseDir = exutil.FixturePath("testdata", "builds", "build-secrets") - secretsFixture = filepath.Join(buildSecretBaseDir, "test-secret.json") - secondSecretsFixture = filepath.Join(buildSecretBaseDir, "test-secret-2.json") - isFixture = filepath.Join(buildSecretBaseDir, "test-is.json") - dockerBuildFixture = filepath.Join(buildSecretBaseDir, "test-docker-build.json") - dockerBuildDockerfile = filepath.Join(buildSecretBaseDir, "Dockerfile") - sourceBuildFixture = filepath.Join(buildSecretBaseDir, "test-s2i-build.json") - sourceBuildBinDir = filepath.Join(buildSecretBaseDir, "s2i-binary-dir") - oc = exutil.NewCLI("build-secrets", exutil.KubeConfigPath()) + buildSecretBaseDir = exutil.FixturePath("testdata", "builds", "build-secrets") + secretsFixture = filepath.Join(buildSecretBaseDir, "test-secret.json") + secondSecretsFixture = filepath.Join(buildSecretBaseDir, "test-secret-2.json") + configMapFixture = filepath.Join(buildSecretBaseDir, "test-configmap.json") + secondConfigMapFixture = filepath.Join(buildSecretBaseDir, "test-configmap-2.json") + isFixture = filepath.Join(buildSecretBaseDir, "test-is.json") + dockerBuildFixture = filepath.Join(buildSecretBaseDir, "test-docker-build.json") + dockerBuildDockerfile = filepath.Join(buildSecretBaseDir, "Dockerfile") + sourceBuildFixture = filepath.Join(buildSecretBaseDir, "test-s2i-build.json") + sourceBuildBinDir = filepath.Join(buildSecretBaseDir, "s2i-binary-dir") + oc = exutil.NewCLI("build-secrets", exutil.KubeConfigPath()) ) g.Context("", func() { @@ -37,21 +39,27 @@ var _ = g.Describe("[Feature:Builds][Slow] can use build secrets", func() { } }) - g.Describe("build with secrets", func() { + g.Describe("build with secrets and configMaps", func() { - g.It("should contain secrets during the source strategy build", func() { - g.By("creating secret fixtures") + g.BeforeEach(func() { + g.By("creating secret and configMap fixtures") err := oc.Run("create").Args("-f", secretsFixture).Execute() o.Expect(err).NotTo(o.HaveOccurred()) err = oc.Run("create").Args("-f", secondSecretsFixture).Execute() o.Expect(err).NotTo(o.HaveOccurred()) + err = oc.Run("create").Args("-f", configMapFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + err = oc.Run("create").Args("-f", secondConfigMapFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) g.By("creating test image stream") err = oc.Run("create").Args("-f", isFixture).Execute() o.Expect(err).NotTo(o.HaveOccurred()) + }) + g.It("should contain secrets during the source strategy build", func() { g.By("creating test build config") - err = oc.Run("create").Args("-f", sourceBuildFixture).Execute() + err := oc.Run("create").Args("-f", sourceBuildFixture).Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("starting the test source build") @@ -62,7 +70,7 @@ var _ = g.Describe("[Feature:Builds][Slow] can use build secrets", func() { image, err := exutil.GetDockerImageReference(oc.ImageClient().Image().ImageStreams(oc.Namespace()), "test", "latest") o.Expect(err).NotTo(o.HaveOccurred()) - g.By("verifying the build secrets were available during build and not present in the output image") + g.By("verifying the build sources were available during build and secrets were not present in the output image") pod := exutil.GetPodForContainer(kapiv1.Container{Name: "test", Image: image}) oc.KubeFramework().TestContainerOutput("test-build-secret-source", pod, 0, []string{ "testsecret/secret1=secret1", @@ -71,22 +79,18 @@ var _ = g.Describe("[Feature:Builds][Slow] can use build secrets", func() { "testsecret2/secret1=secret1", "testsecret2/secret2=secret2", "testsecret2/secret3=secret3", + "testconfig/foo=bar", + "testconfig/red=hat", + "testconfig/this=that", + "testconfig2/foo=bar", + "testconfig2/red=hat", + "testconfig2/this=that", }) }) g.It("should contain secrets during the docker strategy build", func() { - g.By("creating secret fixtures") - err := oc.Run("create").Args("-f", secretsFixture).Execute() - o.Expect(err).NotTo(o.HaveOccurred()) - err = oc.Run("create").Args("-f", secondSecretsFixture).Execute() - o.Expect(err).NotTo(o.HaveOccurred()) - - g.By("creating test image stream") - err = oc.Run("create").Args("-f", isFixture).Execute() - o.Expect(err).NotTo(o.HaveOccurred()) - g.By("creating test build config") - err = oc.Run("create").Args("-f", dockerBuildFixture).Execute() + err := oc.Run("create").Args("-f", dockerBuildFixture).Execute() o.Expect(err).NotTo(o.HaveOccurred()) g.By("starting the test docker build") @@ -97,11 +101,13 @@ var _ = g.Describe("[Feature:Builds][Slow] can use build secrets", func() { image, err := exutil.GetDockerImageReference(oc.ImageClient().Image().ImageStreams(oc.Namespace()), "test", "latest") o.Expect(err).NotTo(o.HaveOccurred()) - g.By("verifying the secrets are present in container output") + g.By("verifying the build sources are present in container output") pod := exutil.GetPodForContainer(kapiv1.Container{Name: "test", Image: image}) oc.KubeFramework().TestContainerOutput("test-build-secret-docker", pod, 0, []string{ "secret1=secret1", "relative-secret2=secret2", + "foo=bar", + "relative-this=that", }) }) }) diff --git a/test/extended/testdata/bindata.go b/test/extended/testdata/bindata.go index e98b13b7bde6..ec2dd9637f2d 100644 --- a/test/extended/testdata/bindata.go +++ b/test/extended/testdata/bindata.go @@ -20,6 +20,8 @@ // test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/run // test/extended/testdata/builds/build-secrets/s2i-binary-dir/Gemfile // test/extended/testdata/builds/build-secrets/s2i-binary-dir/config.ru +// test/extended/testdata/builds/build-secrets/test-configmap-2.json +// test/extended/testdata/builds/build-secrets/test-configmap.json // test/extended/testdata/builds/build-secrets/test-docker-build.json // test/extended/testdata/builds/build-secrets/test-is.json // test/extended/testdata/builds/build-secrets/test-s2i-build.json @@ -812,11 +814,15 @@ var _testExtendedTestdataBuildsBuildSecretsDockerfile = []byte(`FROM centos/ruby USER root ADD ./secret-dir /secrets COPY ./secret2 / +ADD ./config-dir /configs +COPY ./this / -# Create a shell script that will output secrets when the image is run +# Create a shell script that will output secrets and configMaps when the image is run RUN echo '#!/bin/sh' > /secret_report.sh RUN echo '(test -f /secrets/secret1 && echo -n "secret1=" && cat /secrets/secret1)' >> /secret_report.sh RUN echo '(test -f /secret2 && echo -n "relative-secret2=" && cat /secret2)' >> /secret_report.sh +RUN echo '(test -f /configs/foo && echo -n "foo=" && cat /configs/foo)' >> /secret_report.sh +RUN echo '(test -f /this && echo -n "relative-this=" && cat /this)' >> /secret_report.sh RUN chmod 755 /secret_report.sh CMD ["/bin/sh", "-c", "/secret_report.sh"] @@ -857,7 +863,26 @@ if [[ -f secret1 ]]; then else echo "Unable to locate testsecret2 fixture files" exit 2 -fi `) +fi + +mkdir -p "${HOME}/testconfig" +if [[ -f /tmp/configmap/foo ]]; then + # Copy three configMap entries defined in configmap1 fixture to directory + cp /tmp/configmap/* "${HOME}/testconfig" +else + echo "Unable to locate test-configmap fixture files" + exit 3 +fi + +mkdir -p "${HOME}/testconfig2" +if [[ -f configmap2/foo ]]; then + # Copy three configMap entries defined in configmap2 fixture to directory + cp configmap2/* "${HOME}/testconfig2" +else + echo "Unable to locate test-configmap-2 fixture files" + exit 4 +fi +`) func testExtendedTestdataBuildsBuildSecretsS2iBinaryDirS2iBinAssembleBytes() ([]byte, error) { return _testExtendedTestdataBuildsBuildSecretsS2iBinaryDirS2iBinAssemble, nil @@ -877,16 +902,51 @@ func testExtendedTestdataBuildsBuildSecretsS2iBinaryDirS2iBinAssemble() (*asset, var _testExtendedTestdataBuildsBuildSecretsS2iBinaryDirS2iBinRun = []byte(`#!/bin/bash # Ensure none of the build config inject secrets still exist in the file system -for s in /tmp/secret? secret?; do - if [[ -s "${s}" ]]; then - echo "Found secret file which should have been removed: ${s}" + +secrets=(secret1 secret2 secret3) +configMaps=(foo this red) + +function checkSecret() { + dir=$1 + file=$2 + if [[ -a "${dir}/${file}" ]]; then + if [[ -s "${dir}/${file}" ]]; then + echo "Found secret file which should have been truncated: ${dir}/${file}" + exit 1 + fi + else + echo "Secret file ${file} is missing from ${dir}." exit 1 fi +} + +function checkConfigMap() { + dir=$1 + file=$2 + if [[ -a "${dir}/${file}" ]]; then + if [[ ! -s "${dir}/${file}" ]]; then + echo "Found empty configMap file which should not have been truncated: ${dir}/${file}" + exit 1 + fi + else + echo "ConfigMap file ${file} is missing from ${dir}." + exit 1 + fi +} + +for s in ${secrets[@]}; do + checkSecret "/tmp" $s + checkSecret "." $s +done + +for c in ${configMaps[@]}; do + checkConfigMap "/tmp/configmap" $c + checkConfigMap "configmap2" $c done # Print out the secrets copied into the image during assemble cd "${HOME}" -for s in testsecret/* testsecret2/*; do +for s in testsecret/* testsecret2/* testconfig/* testconfig2/*; do echo -n "${s}=" && cat "${s}" done`) @@ -943,6 +1003,65 @@ func testExtendedTestdataBuildsBuildSecretsS2iBinaryDirConfigRu() (*asset, error return a, nil } +var _testExtendedTestdataBuildsBuildSecretsTestConfigmap2Json = []byte(`{ + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "test-configmap-2", + "creationTimestamp": null + }, + "data": { + "foo": "bar\n", + "this": "that\n", + "red": "hat\n" + } +} +`) + +func testExtendedTestdataBuildsBuildSecretsTestConfigmap2JsonBytes() ([]byte, error) { + return _testExtendedTestdataBuildsBuildSecretsTestConfigmap2Json, nil +} + +func testExtendedTestdataBuildsBuildSecretsTestConfigmap2Json() (*asset, error) { + bytes, err := testExtendedTestdataBuildsBuildSecretsTestConfigmap2JsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/extended/testdata/builds/build-secrets/test-configmap-2.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testExtendedTestdataBuildsBuildSecretsTestConfigmapJson = []byte(`{ + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "test-configmap" + }, + "data": { + "foo": "bar\n", + "this": "that\n", + "red": "hat\n" + } +} +`) + +func testExtendedTestdataBuildsBuildSecretsTestConfigmapJsonBytes() ([]byte, error) { + return _testExtendedTestdataBuildsBuildSecretsTestConfigmapJson, nil +} + +func testExtendedTestdataBuildsBuildSecretsTestConfigmapJson() (*asset, error) { + bytes, err := testExtendedTestdataBuildsBuildSecretsTestConfigmapJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/extended/testdata/builds/build-secrets/test-configmap.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _testExtendedTestdataBuildsBuildSecretsTestDockerBuildJson = []byte(`{ "kind": "BuildConfig", "apiVersion": "v1", @@ -969,6 +1088,19 @@ var _testExtendedTestdataBuildsBuildSecretsTestDockerBuildJson = []byte(`{ "name": "testsecret2" } } + ], + "configMaps": [ + { + "configMap": { + "name": "test-configmap" + }, + "destinationDir": "config-dir" + }, + { + "configMap": { + "name": "test-configmap-2" + } + } ] }, "strategy": { @@ -1060,6 +1192,20 @@ var _testExtendedTestdataBuildsBuildSecretsTestS2iBuildJson = []byte(`{ "name": "testsecret2" } } + ], + "configMaps": [ + { + "configMap": { + "name": "test-configmap" + }, + "destinationDir": "/tmp/configmap" + }, + { + "configMap": { + "name": "test-configmap-2" + }, + "destinationDir": "configmap2" + } ] }, "strategy": { @@ -33164,6 +33310,8 @@ var _bindata = map[string]func() (*asset, error){ "test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/run": testExtendedTestdataBuildsBuildSecretsS2iBinaryDirS2iBinRun, "test/extended/testdata/builds/build-secrets/s2i-binary-dir/Gemfile": testExtendedTestdataBuildsBuildSecretsS2iBinaryDirGemfile, "test/extended/testdata/builds/build-secrets/s2i-binary-dir/config.ru": testExtendedTestdataBuildsBuildSecretsS2iBinaryDirConfigRu, + "test/extended/testdata/builds/build-secrets/test-configmap-2.json": testExtendedTestdataBuildsBuildSecretsTestConfigmap2Json, + "test/extended/testdata/builds/build-secrets/test-configmap.json": testExtendedTestdataBuildsBuildSecretsTestConfigmapJson, "test/extended/testdata/builds/build-secrets/test-docker-build.json": testExtendedTestdataBuildsBuildSecretsTestDockerBuildJson, "test/extended/testdata/builds/build-secrets/test-is.json": testExtendedTestdataBuildsBuildSecretsTestIsJson, "test/extended/testdata/builds/build-secrets/test-s2i-build.json": testExtendedTestdataBuildsBuildSecretsTestS2iBuildJson, @@ -33614,6 +33762,8 @@ var _bintree = &bintree{nil, map[string]*bintree{ "Gemfile": &bintree{testExtendedTestdataBuildsBuildSecretsS2iBinaryDirGemfile, map[string]*bintree{}}, "config.ru": &bintree{testExtendedTestdataBuildsBuildSecretsS2iBinaryDirConfigRu, map[string]*bintree{}}, }}, + "test-configmap-2.json": &bintree{testExtendedTestdataBuildsBuildSecretsTestConfigmap2Json, map[string]*bintree{}}, + "test-configmap.json": &bintree{testExtendedTestdataBuildsBuildSecretsTestConfigmapJson, map[string]*bintree{}}, "test-docker-build.json": &bintree{testExtendedTestdataBuildsBuildSecretsTestDockerBuildJson, map[string]*bintree{}}, "test-is.json": &bintree{testExtendedTestdataBuildsBuildSecretsTestIsJson, map[string]*bintree{}}, "test-s2i-build.json": &bintree{testExtendedTestdataBuildsBuildSecretsTestS2iBuildJson, map[string]*bintree{}}, diff --git a/test/extended/testdata/builds/build-secrets/Dockerfile b/test/extended/testdata/builds/build-secrets/Dockerfile index 954e63b7805e..5dd19e8934f6 100644 --- a/test/extended/testdata/builds/build-secrets/Dockerfile +++ b/test/extended/testdata/builds/build-secrets/Dockerfile @@ -3,11 +3,15 @@ FROM centos/ruby-22-centos7 USER root ADD ./secret-dir /secrets COPY ./secret2 / +ADD ./config-dir /configs +COPY ./this / -# Create a shell script that will output secrets when the image is run +# Create a shell script that will output secrets and configMaps when the image is run RUN echo '#!/bin/sh' > /secret_report.sh RUN echo '(test -f /secrets/secret1 && echo -n "secret1=" && cat /secrets/secret1)' >> /secret_report.sh RUN echo '(test -f /secret2 && echo -n "relative-secret2=" && cat /secret2)' >> /secret_report.sh +RUN echo '(test -f /configs/foo && echo -n "foo=" && cat /configs/foo)' >> /secret_report.sh +RUN echo '(test -f /this && echo -n "relative-this=" && cat /this)' >> /secret_report.sh RUN chmod 755 /secret_report.sh CMD ["/bin/sh", "-c", "/secret_report.sh"] diff --git a/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/assemble b/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/assemble index e8b980a4f66c..2436b0dd3581 100755 --- a/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/assemble +++ b/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/assemble @@ -18,4 +18,22 @@ if [[ -f secret1 ]]; then else echo "Unable to locate testsecret2 fixture files" exit 2 -fi \ No newline at end of file +fi + +mkdir -p "${HOME}/testconfig" +if [[ -f /tmp/configmap/foo ]]; then + # Copy three configMap entries defined in configmap1 fixture to directory + cp /tmp/configmap/* "${HOME}/testconfig" +else + echo "Unable to locate test-configmap fixture files" + exit 3 +fi + +mkdir -p "${HOME}/testconfig2" +if [[ -f configmap2/foo ]]; then + # Copy three configMap entries defined in configmap2 fixture to directory + cp configmap2/* "${HOME}/testconfig2" +else + echo "Unable to locate test-configmap-2 fixture files" + exit 4 +fi diff --git a/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/run b/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/run index e75f25589c96..a945474f6d24 100755 --- a/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/run +++ b/test/extended/testdata/builds/build-secrets/s2i-binary-dir/.s2i/bin/run @@ -1,15 +1,50 @@ #!/bin/bash # Ensure none of the build config inject secrets still exist in the file system -for s in /tmp/secret? secret?; do - if [[ -s "${s}" ]]; then - echo "Found secret file which should have been removed: ${s}" + +secrets=(secret1 secret2 secret3) +configMaps=(foo this red) + +function checkSecret() { + dir=$1 + file=$2 + if [[ -a "${dir}/${file}" ]]; then + if [[ -s "${dir}/${file}" ]]; then + echo "Found secret file which should have been truncated: ${dir}/${file}" + exit 1 + fi + else + echo "Secret file ${file} is missing from ${dir}." + exit 1 + fi +} + +function checkConfigMap() { + dir=$1 + file=$2 + if [[ -a "${dir}/${file}" ]]; then + if [[ ! -s "${dir}/${file}" ]]; then + echo "Found empty configMap file which should not have been truncated: ${dir}/${file}" + exit 1 + fi + else + echo "ConfigMap file ${file} is missing from ${dir}." exit 1 fi +} + +for s in ${secrets[@]}; do + checkSecret "/tmp" $s + checkSecret "." $s +done + +for c in ${configMaps[@]}; do + checkConfigMap "/tmp/configmap" $c + checkConfigMap "configmap2" $c done # Print out the secrets copied into the image during assemble cd "${HOME}" -for s in testsecret/* testsecret2/*; do +for s in testsecret/* testsecret2/* testconfig/* testconfig2/*; do echo -n "${s}=" && cat "${s}" done \ No newline at end of file diff --git a/test/extended/testdata/builds/build-secrets/test-configmap-2.json b/test/extended/testdata/builds/build-secrets/test-configmap-2.json new file mode 100644 index 000000000000..faa6c34b7064 --- /dev/null +++ b/test/extended/testdata/builds/build-secrets/test-configmap-2.json @@ -0,0 +1,13 @@ +{ + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "test-configmap-2", + "creationTimestamp": null + }, + "data": { + "foo": "bar\n", + "this": "that\n", + "red": "hat\n" + } +} diff --git a/test/extended/testdata/builds/build-secrets/test-configmap.json b/test/extended/testdata/builds/build-secrets/test-configmap.json new file mode 100644 index 000000000000..9e847458a71d --- /dev/null +++ b/test/extended/testdata/builds/build-secrets/test-configmap.json @@ -0,0 +1,12 @@ +{ + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "test-configmap" + }, + "data": { + "foo": "bar\n", + "this": "that\n", + "red": "hat\n" + } +} diff --git a/test/extended/testdata/builds/build-secrets/test-docker-build.json b/test/extended/testdata/builds/build-secrets/test-docker-build.json index dd7fff5af0bd..459da9c164a5 100644 --- a/test/extended/testdata/builds/build-secrets/test-docker-build.json +++ b/test/extended/testdata/builds/build-secrets/test-docker-build.json @@ -24,6 +24,19 @@ "name": "testsecret2" } } + ], + "configMaps": [ + { + "configMap": { + "name": "test-configmap" + }, + "destinationDir": "config-dir" + }, + { + "configMap": { + "name": "test-configmap-2" + } + } ] }, "strategy": { diff --git a/test/extended/testdata/builds/build-secrets/test-s2i-build.json b/test/extended/testdata/builds/build-secrets/test-s2i-build.json index 8a5d61c588f8..4ab3aa659956 100644 --- a/test/extended/testdata/builds/build-secrets/test-s2i-build.json +++ b/test/extended/testdata/builds/build-secrets/test-s2i-build.json @@ -24,6 +24,20 @@ "name": "testsecret2" } } + ], + "configMaps": [ + { + "configMap": { + "name": "test-configmap" + }, + "destinationDir": "/tmp/configmap" + }, + { + "configMap": { + "name": "test-configmap-2" + }, + "destinationDir": "configmap2" + } ] }, "strategy": { diff --git a/vendor/github.com/openshift/api/build/v1/generated.pb.go b/vendor/github.com/openshift/api/build/v1/generated.pb.go index 9c0fa8a2b61c..2e83d48c165b 100644 --- a/vendor/github.com/openshift/api/build/v1/generated.pb.go +++ b/vendor/github.com/openshift/api/build/v1/generated.pb.go @@ -33,6 +33,7 @@ BuildTriggerPolicy CommonSpec CommonWebHookCause + ConfigMapBuildSource CustomBuildStrategy DockerBuildStrategy DockerStrategyOptions @@ -190,119 +191,123 @@ func (m *CommonWebHookCause) Reset() { *m = CommonWebHookCaus func (*CommonWebHookCause) ProtoMessage() {} func (*CommonWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (m *ConfigMapBuildSource) Reset() { *m = ConfigMapBuildSource{} } +func (*ConfigMapBuildSource) ProtoMessage() {} +func (*ConfigMapBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } + func (m *CustomBuildStrategy) Reset() { *m = CustomBuildStrategy{} } func (*CustomBuildStrategy) ProtoMessage() {} -func (*CustomBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*CustomBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *DockerBuildStrategy) Reset() { *m = DockerBuildStrategy{} } func (*DockerBuildStrategy) ProtoMessage() {} -func (*DockerBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*DockerBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *DockerStrategyOptions) Reset() { *m = DockerStrategyOptions{} } func (*DockerStrategyOptions) ProtoMessage() {} -func (*DockerStrategyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*DockerStrategyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *GenericWebHookCause) Reset() { *m = GenericWebHookCause{} } func (*GenericWebHookCause) ProtoMessage() {} -func (*GenericWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*GenericWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *GenericWebHookEvent) Reset() { *m = GenericWebHookEvent{} } func (*GenericWebHookEvent) ProtoMessage() {} -func (*GenericWebHookEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*GenericWebHookEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *GitBuildSource) Reset() { *m = GitBuildSource{} } func (*GitBuildSource) ProtoMessage() {} -func (*GitBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*GitBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *GitHubWebHookCause) Reset() { *m = GitHubWebHookCause{} } func (*GitHubWebHookCause) ProtoMessage() {} -func (*GitHubWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*GitHubWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *GitInfo) Reset() { *m = GitInfo{} } func (*GitInfo) ProtoMessage() {} -func (*GitInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*GitInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *GitLabWebHookCause) Reset() { *m = GitLabWebHookCause{} } func (*GitLabWebHookCause) ProtoMessage() {} -func (*GitLabWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*GitLabWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *GitSourceRevision) Reset() { *m = GitSourceRevision{} } func (*GitSourceRevision) ProtoMessage() {} -func (*GitSourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*GitSourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *ImageChangeCause) Reset() { *m = ImageChangeCause{} } func (*ImageChangeCause) ProtoMessage() {} -func (*ImageChangeCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*ImageChangeCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *ImageChangeTrigger) Reset() { *m = ImageChangeTrigger{} } func (*ImageChangeTrigger) ProtoMessage() {} -func (*ImageChangeTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*ImageChangeTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *ImageLabel) Reset() { *m = ImageLabel{} } func (*ImageLabel) ProtoMessage() {} -func (*ImageLabel) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*ImageLabel) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *ImageSource) Reset() { *m = ImageSource{} } func (*ImageSource) ProtoMessage() {} -func (*ImageSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*ImageSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *ImageSourcePath) Reset() { *m = ImageSourcePath{} } func (*ImageSourcePath) ProtoMessage() {} -func (*ImageSourcePath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*ImageSourcePath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *JenkinsPipelineBuildStrategy) Reset() { *m = JenkinsPipelineBuildStrategy{} } func (*JenkinsPipelineBuildStrategy) ProtoMessage() {} func (*JenkinsPipelineBuildStrategy) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{39} + return fileDescriptorGenerated, []int{40} } func (m *OptionalNodeSelector) Reset() { *m = OptionalNodeSelector{} } func (*OptionalNodeSelector) ProtoMessage() {} -func (*OptionalNodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*OptionalNodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *ProxyConfig) Reset() { *m = ProxyConfig{} } func (*ProxyConfig) ProtoMessage() {} -func (*ProxyConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*ProxyConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *SecretBuildSource) Reset() { *m = SecretBuildSource{} } func (*SecretBuildSource) ProtoMessage() {} -func (*SecretBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*SecretBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *SecretLocalReference) Reset() { *m = SecretLocalReference{} } func (*SecretLocalReference) ProtoMessage() {} -func (*SecretLocalReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*SecretLocalReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *SecretSpec) Reset() { *m = SecretSpec{} } func (*SecretSpec) ProtoMessage() {} -func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *SourceBuildStrategy) Reset() { *m = SourceBuildStrategy{} } func (*SourceBuildStrategy) ProtoMessage() {} -func (*SourceBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*SourceBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *SourceControlUser) Reset() { *m = SourceControlUser{} } func (*SourceControlUser) ProtoMessage() {} -func (*SourceControlUser) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*SourceControlUser) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *SourceRevision) Reset() { *m = SourceRevision{} } func (*SourceRevision) ProtoMessage() {} -func (*SourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*SourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } func (m *SourceStrategyOptions) Reset() { *m = SourceStrategyOptions{} } func (*SourceStrategyOptions) ProtoMessage() {} -func (*SourceStrategyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } +func (*SourceStrategyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } func (m *StageInfo) Reset() { *m = StageInfo{} } func (*StageInfo) ProtoMessage() {} -func (*StageInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*StageInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *StepInfo) Reset() { *m = StepInfo{} } func (*StepInfo) ProtoMessage() {} -func (*StepInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*StepInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *WebHookTrigger) Reset() { *m = WebHookTrigger{} } func (*WebHookTrigger) ProtoMessage() {} -func (*WebHookTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } +func (*WebHookTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } func init() { proto.RegisterType((*BinaryBuildRequestOptions)(nil), "github.com.openshift.api.build.v1.BinaryBuildRequestOptions") @@ -329,6 +334,7 @@ func init() { proto.RegisterType((*BuildTriggerPolicy)(nil), "github.com.openshift.api.build.v1.BuildTriggerPolicy") proto.RegisterType((*CommonSpec)(nil), "github.com.openshift.api.build.v1.CommonSpec") proto.RegisterType((*CommonWebHookCause)(nil), "github.com.openshift.api.build.v1.CommonWebHookCause") + proto.RegisterType((*ConfigMapBuildSource)(nil), "github.com.openshift.api.build.v1.ConfigMapBuildSource") proto.RegisterType((*CustomBuildStrategy)(nil), "github.com.openshift.api.build.v1.CustomBuildStrategy") proto.RegisterType((*DockerBuildStrategy)(nil), "github.com.openshift.api.build.v1.DockerBuildStrategy") proto.RegisterType((*DockerStrategyOptions)(nil), "github.com.openshift.api.build.v1.DockerStrategyOptions") @@ -1095,6 +1101,18 @@ func (m *BuildSource) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.ConfigMaps) > 0 { + for _, msg := range m.ConfigMaps { + dAtA[i] = 0x4a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -1610,6 +1628,36 @@ func (m *CommonWebHookCause) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ConfigMapBuildSource) 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 *ConfigMapBuildSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) + n53, err := m.ConfigMap.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n53 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DestinationDir))) + i += copy(dAtA[i:], m.DestinationDir) + return i, nil +} + func (m *CustomBuildStrategy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1628,20 +1676,20 @@ func (m *CustomBuildStrategy) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.From.Size())) - n53, err := m.From.MarshalTo(dAtA[i:]) + n54, err := m.From.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 if m.PullSecret != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PullSecret.Size())) - n54, err := m.PullSecret.MarshalTo(dAtA[i:]) + n55, err := m.PullSecret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n55 } if len(m.Env) > 0 { for _, msg := range m.Env { @@ -1709,21 +1757,21 @@ func (m *DockerBuildStrategy) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.From.Size())) - n55, err := m.From.MarshalTo(dAtA[i:]) + n56, err := m.From.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n56 } if m.PullSecret != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PullSecret.Size())) - n56, err := m.PullSecret.MarshalTo(dAtA[i:]) + n57, err := m.PullSecret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n57 } dAtA[i] = 0x18 i++ @@ -1837,11 +1885,11 @@ func (m *GenericWebHookCause) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Revision.Size())) - n57, err := m.Revision.MarshalTo(dAtA[i:]) + n58, err := m.Revision.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n58 } dAtA[i] = 0x12 i++ @@ -1873,11 +1921,11 @@ func (m *GenericWebHookEvent) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Git.Size())) - n58, err := m.Git.MarshalTo(dAtA[i:]) + n59, err := m.Git.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n59 } if len(m.Env) > 0 { for _, msg := range m.Env { @@ -1895,11 +1943,11 @@ func (m *GenericWebHookEvent) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DockerStrategyOptions.Size())) - n59, err := m.DockerStrategyOptions.MarshalTo(dAtA[i:]) + n60, err := m.DockerStrategyOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n59 + i += n60 } return i, nil } @@ -1930,11 +1978,11 @@ func (m *GitBuildSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ProxyConfig.Size())) - n60, err := m.ProxyConfig.MarshalTo(dAtA[i:]) + n61, err := m.ProxyConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n60 + i += n61 return i, nil } @@ -1957,11 +2005,11 @@ func (m *GitHubWebHookCause) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Revision.Size())) - n61, err := m.Revision.MarshalTo(dAtA[i:]) + n62, err := m.Revision.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n61 + i += n62 } dAtA[i] = 0x12 i++ @@ -1988,19 +2036,19 @@ func (m *GitInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitBuildSource.Size())) - n62, err := m.GitBuildSource.MarshalTo(dAtA[i:]) + n63, err := m.GitBuildSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n62 + i += n63 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitSourceRevision.Size())) - n63, err := m.GitSourceRevision.MarshalTo(dAtA[i:]) + n64, err := m.GitSourceRevision.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n64 return i, nil } @@ -2022,11 +2070,11 @@ func (m *GitLabWebHookCause) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CommonWebHookCause.Size())) - n64, err := m.CommonWebHookCause.MarshalTo(dAtA[i:]) + n65, err := m.CommonWebHookCause.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n65 return i, nil } @@ -2052,19 +2100,19 @@ func (m *GitSourceRevision) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Author.Size())) - n65, err := m.Author.MarshalTo(dAtA[i:]) + n66, err := m.Author.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n65 + i += n66 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Committer.Size())) - n66, err := m.Committer.MarshalTo(dAtA[i:]) + n67, err := m.Committer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n66 + i += n67 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -2095,11 +2143,11 @@ func (m *ImageChangeCause) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FromRef.Size())) - n67, err := m.FromRef.MarshalTo(dAtA[i:]) + n68, err := m.FromRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n67 + i += n68 } return i, nil } @@ -2127,11 +2175,11 @@ func (m *ImageChangeTrigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.From.Size())) - n68, err := m.From.MarshalTo(dAtA[i:]) + n69, err := m.From.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n68 + i += n69 } return i, nil } @@ -2180,11 +2228,11 @@ func (m *ImageSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.From.Size())) - n69, err := m.From.MarshalTo(dAtA[i:]) + n70, err := m.From.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n69 + i += n70 if len(m.Paths) > 0 { for _, msg := range m.Paths { dAtA[i] = 0x12 @@ -2201,11 +2249,11 @@ func (m *ImageSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PullSecret.Size())) - n70, err := m.PullSecret.MarshalTo(dAtA[i:]) + n71, err := m.PullSecret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n70 + i += n71 } if len(m.As) > 0 { for _, s := range m.As { @@ -2383,11 +2431,11 @@ func (m *SecretBuildSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n71, err := m.Secret.MarshalTo(dAtA[i:]) + n72, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n71 + i += n72 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.DestinationDir))) @@ -2435,11 +2483,11 @@ func (m *SecretSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretSource.Size())) - n72, err := m.SecretSource.MarshalTo(dAtA[i:]) + n73, err := m.SecretSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n72 + i += n73 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.MountPath))) @@ -2465,20 +2513,20 @@ func (m *SourceBuildStrategy) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.From.Size())) - n73, err := m.From.MarshalTo(dAtA[i:]) + n74, err := m.From.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n73 + i += n74 if m.PullSecret != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PullSecret.Size())) - n74, err := m.PullSecret.MarshalTo(dAtA[i:]) + n75, err := m.PullSecret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n74 + i += n75 } if len(m.Env) > 0 { for _, msg := range m.Env { @@ -2566,11 +2614,11 @@ func (m *SourceRevision) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Git.Size())) - n75, err := m.Git.MarshalTo(dAtA[i:]) + n76, err := m.Git.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n75 + i += n76 } return i, nil } @@ -2625,11 +2673,11 @@ func (m *StageInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n76, err := m.StartTime.MarshalTo(dAtA[i:]) + n77, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n76 + i += n77 dAtA[i] = 0x18 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DurationMilliseconds)) @@ -2670,11 +2718,11 @@ func (m *StepInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n77, err := m.StartTime.MarshalTo(dAtA[i:]) + n78, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n77 + i += n78 dAtA[i] = 0x18 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DurationMilliseconds)) @@ -2712,11 +2760,11 @@ func (m *WebHookTrigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretReference.Size())) - n78, err := m.SecretReference.MarshalTo(dAtA[i:]) + n79, err := m.SecretReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n78 + i += n79 } return i, nil } @@ -3023,6 +3071,12 @@ func (m *BuildSource) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.ConfigMaps) > 0 { + for _, e := range m.ConfigMaps { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -3217,6 +3271,16 @@ func (m *CommonWebHookCause) Size() (n int) { return n } +func (m *ConfigMapBuildSource) Size() (n int) { + var l int + _ = l + l = m.ConfigMap.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.DestinationDir) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *CustomBuildStrategy) Size() (n int) { var l int _ = l @@ -3828,6 +3892,7 @@ func (this *BuildSource) String() string { `ContextDir:` + fmt.Sprintf("%v", this.ContextDir) + `,`, `SourceSecret:` + strings.Replace(fmt.Sprintf("%v", this.SourceSecret), "LocalObjectReference", "k8s_io_api_core_v1.LocalObjectReference", 1) + `,`, `Secrets:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Secrets), "SecretBuildSource", "SecretBuildSource", 1), `&`, ``, 1) + `,`, + `ConfigMaps:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ConfigMaps), "ConfigMapBuildSource", "ConfigMapBuildSource", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -3957,6 +4022,17 @@ func (this *CommonWebHookCause) String() string { }, "") return s } +func (this *ConfigMapBuildSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ConfigMapBuildSource{`, + `ConfigMap:` + strings.Replace(strings.Replace(this.ConfigMap.String(), "LocalObjectReference", "k8s_io_api_core_v1.LocalObjectReference", 1), `&`, ``, 1) + `,`, + `DestinationDir:` + fmt.Sprintf("%v", this.DestinationDir) + `,`, + `}`, + }, "") + return s +} func (this *CustomBuildStrategy) String() string { if this == nil { return "nil" @@ -6724,6 +6800,37 @@ func (m *BuildSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMaps", 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 + } + m.ConfigMaps = append(m.ConfigMaps, ConfigMapBuildSource{}) + if err := m.ConfigMaps[len(m.ConfigMaps)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -8538,6 +8645,115 @@ func (m *CommonWebHookCause) Unmarshal(dAtA []byte) error { } return nil } +func (m *ConfigMapBuildSource) Unmarshal(dAtA []byte) 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: ConfigMapBuildSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigMapBuildSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", 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 + } + if err := m.ConfigMap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestinationDir", 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.DestinationDir = 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 *CustomBuildStrategy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -12446,244 +12662,248 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3820 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0xcd, 0x6f, 0x1b, 0x47, - 0x7b, 0xf7, 0x92, 0x14, 0x45, 0x3e, 0x94, 0xf5, 0x31, 0xb2, 0x63, 0x5a, 0x71, 0x44, 0x67, 0x83, - 0x04, 0x4e, 0xe3, 0x50, 0x91, 0x62, 0xbb, 0x4e, 0x82, 0xa6, 0x10, 0x25, 0xd9, 0x96, 0x23, 0xdb, - 0xc2, 0x50, 0xb1, 0xdd, 0xc4, 0x48, 0xbb, 0x5a, 0x8d, 0xa8, 0x8d, 0x96, 0xbb, 0xf4, 0xce, 0x52, - 0x89, 0x02, 0x14, 0x08, 0x0a, 0x04, 0x41, 0x92, 0x4b, 0x73, 0x09, 0xda, 0x5e, 0xda, 0xa2, 0xe8, - 0xa1, 0xe8, 0xb9, 0x40, 0x80, 0x5c, 0x0a, 0x34, 0x07, 0x1f, 0x7a, 0x08, 0xd0, 0x4b, 0x80, 0x06, - 0x44, 0xc3, 0x1e, 0xf2, 0x3f, 0xb8, 0x97, 0x62, 0x3e, 0x76, 0x77, 0x76, 0xb9, 0x92, 0x97, 0xb2, - 0xe3, 0x37, 0xef, 0x7b, 0x13, 0x9f, 0xcf, 0xf9, 0x78, 0x76, 0x9e, 0xdf, 0xf3, 0xcc, 0x08, 0xe6, - 0x5b, 0x96, 0xbf, 0xd3, 0xdd, 0xac, 0x9b, 0x6e, 0x7b, 0xce, 0xed, 0x10, 0x87, 0xee, 0x58, 0xdb, - 0xfe, 0x9c, 0xd1, 0xb1, 0xe6, 0x36, 0xbb, 0x96, 0xbd, 0x35, 0xb7, 0x37, 0x3f, 0xd7, 0x22, 0x0e, - 0xf1, 0x0c, 0x9f, 0x6c, 0xd5, 0x3b, 0x9e, 0xeb, 0xbb, 0xe8, 0xf9, 0x48, 0xa5, 0x1e, 0xaa, 0xd4, - 0x8d, 0x8e, 0x55, 0xe7, 0x2a, 0xf5, 0xbd, 0xf9, 0x99, 0x57, 0x15, 0xab, 0x2d, 0xb7, 0xe5, 0xce, - 0x71, 0xcd, 0xcd, 0xee, 0x36, 0xff, 0xc5, 0x7f, 0xf0, 0xbf, 0x84, 0xc5, 0x19, 0x7d, 0xf7, 0x32, - 0xad, 0x5b, 0x2e, 0x77, 0x6b, 0xba, 0x1e, 0x49, 0xf1, 0x3a, 0x73, 0x21, 0x92, 0x69, 0x1b, 0xe6, - 0x8e, 0xe5, 0x10, 0x6f, 0x7f, 0xae, 0xb3, 0xdb, 0x62, 0x04, 0x3a, 0xd7, 0x26, 0xbe, 0x91, 0xa6, - 0x35, 0x77, 0x90, 0x96, 0xd7, 0x75, 0x7c, 0xab, 0x4d, 0x06, 0x14, 0x2e, 0x3d, 0x4a, 0x81, 0x9a, - 0x3b, 0xa4, 0x6d, 0x0c, 0xe8, 0xbd, 0x7e, 0x90, 0x5e, 0xd7, 0xb7, 0xec, 0x39, 0xcb, 0xf1, 0xa9, - 0xef, 0x25, 0x95, 0xf4, 0x7f, 0x2f, 0xc0, 0xe9, 0x86, 0xe5, 0x18, 0xde, 0x7e, 0x83, 0xad, 0x1c, - 0x26, 0xf7, 0xbb, 0x84, 0xfa, 0xb7, 0x3a, 0xbe, 0xe5, 0x3a, 0x14, 0xfd, 0x05, 0x94, 0xd8, 0xb4, - 0xb6, 0x0c, 0xdf, 0xa8, 0x6a, 0x67, 0xb5, 0x73, 0x95, 0x85, 0xd7, 0xea, 0xc2, 0x4b, 0x5d, 0xf5, - 0x52, 0xef, 0xec, 0xb6, 0x18, 0x81, 0xd6, 0x99, 0x74, 0x7d, 0x6f, 0xbe, 0x7e, 0x6b, 0xf3, 0x43, - 0x62, 0xfa, 0x37, 0x88, 0x6f, 0x34, 0xd0, 0x83, 0x5e, 0xed, 0x58, 0xbf, 0x57, 0x83, 0x88, 0x86, - 0x43, 0xab, 0xe8, 0x25, 0x28, 0x1a, 0xf4, 0x8a, 0x65, 0x93, 0x6a, 0xee, 0xac, 0x76, 0xae, 0xdc, - 0x18, 0x97, 0xd2, 0xc5, 0x45, 0x4e, 0xc5, 0x92, 0x8b, 0x2e, 0xc1, 0xb8, 0x47, 0xf6, 0x2c, 0x6a, - 0xb9, 0xce, 0x92, 0xdb, 0x6e, 0x5b, 0x7e, 0x35, 0x1f, 0x97, 0x17, 0x54, 0x9c, 0x90, 0x42, 0x6f, - 0xc0, 0x44, 0x40, 0xb9, 0x41, 0x28, 0x35, 0x5a, 0xa4, 0x5a, 0xe0, 0x8a, 0x13, 0x52, 0x71, 0x54, - 0x92, 0x71, 0x52, 0x0e, 0x35, 0x00, 0x05, 0xa4, 0xc5, 0xae, 0xbf, 0xe3, 0x7a, 0x37, 0x8d, 0x36, - 0xa9, 0x8e, 0x70, 0xed, 0x70, 0x52, 0x11, 0x07, 0xa7, 0x48, 0xa3, 0x15, 0x98, 0x8e, 0x53, 0x57, - 0xda, 0x86, 0x65, 0x57, 0x8b, 0xdc, 0xc8, 0xb4, 0x34, 0x52, 0x51, 0x58, 0x38, 0x4d, 0x1e, 0xbd, - 0x03, 0x27, 0xe3, 0xf3, 0xf2, 0x89, 0x18, 0xcd, 0x28, 0x37, 0x74, 0x52, 0x1a, 0x3a, 0x1e, 0x63, - 0xe2, 0x74, 0x1d, 0x74, 0x13, 0x9e, 0x19, 0x60, 0x88, 0x61, 0x95, 0xb8, 0xb5, 0x67, 0xa4, 0xb5, - 0xf1, 0x38, 0x17, 0x1f, 0xa0, 0xa5, 0xbf, 0x05, 0x53, 0x4a, 0x04, 0x35, 0xdd, 0xae, 0x67, 0x12, - 0x65, 0x5f, 0xb5, 0xc3, 0xf6, 0x55, 0xff, 0x52, 0x83, 0x93, 0x0d, 0xcb, 0xdf, 0xec, 0x9a, 0xbb, - 0xc4, 0xbf, 0x43, 0x36, 0xaf, 0xb9, 0xee, 0xee, 0x92, 0xd1, 0xa5, 0x04, 0xdd, 0x07, 0x30, 0xdd, - 0x76, 0xdb, 0x75, 0x9a, 0x1d, 0x62, 0xca, 0xe8, 0xbb, 0x58, 0x7f, 0xe4, 0x87, 0x5f, 0x5f, 0xe2, - 0x4a, 0xaa, 0xa9, 0xc6, 0x8c, 0x74, 0x8e, 0x06, 0x79, 0x58, 0x71, 0xa2, 0x7f, 0x9d, 0x83, 0x11, - 0x3e, 0x89, 0xa7, 0x10, 0xf8, 0x37, 0xa1, 0x40, 0xd9, 0xc4, 0x72, 0xdc, 0xfa, 0xf9, 0x0c, 0x13, - 0x13, 0xcb, 0xdb, 0x21, 0x66, 0x63, 0x4c, 0x5a, 0x2e, 0xb0, 0x5f, 0x98, 0xdb, 0x41, 0xb7, 0xa1, - 0x48, 0x7d, 0xc3, 0xef, 0x52, 0xfe, 0x61, 0x54, 0x16, 0xea, 0x99, 0x2d, 0x72, 0xad, 0x68, 0x83, - 0xc4, 0x6f, 0x2c, 0xad, 0xe9, 0xff, 0x94, 0x83, 0x0a, 0x97, 0x5b, 0x72, 0x9d, 0x6d, 0xab, 0xf5, - 0x14, 0x56, 0x66, 0x23, 0xb6, 0x32, 0x0b, 0x59, 0xe7, 0x21, 0xc6, 0x77, 0xe0, 0xfa, 0xdc, 0x4b, - 0xac, 0xcf, 0x85, 0x21, 0xed, 0x1e, 0xbe, 0x4a, 0xdf, 0x6b, 0x30, 0xa1, 0x48, 0xaf, 0x59, 0xd4, - 0x47, 0xf7, 0x06, 0x56, 0xaa, 0x9e, 0x6d, 0xa5, 0x98, 0x36, 0x5f, 0xa7, 0x49, 0xe9, 0xad, 0x14, - 0x50, 0x94, 0x55, 0x6a, 0xc2, 0x88, 0xe5, 0x93, 0x36, 0xad, 0xe6, 0xce, 0xe6, 0x87, 0xd9, 0x6e, - 0x31, 0xc0, 0xc6, 0x71, 0x69, 0x7a, 0x64, 0x95, 0x19, 0xc1, 0xc2, 0x96, 0xfe, 0x53, 0x3e, 0x36, - 0x0d, 0xb6, 0x7c, 0xc8, 0x84, 0x92, 0xef, 0x59, 0xad, 0x16, 0xf1, 0x68, 0x55, 0xe3, 0xbe, 0x2e, - 0x66, 0xf5, 0xb5, 0x21, 0xf4, 0xd6, 0x5d, 0xdb, 0x32, 0xf7, 0xa3, 0xd9, 0x48, 0x32, 0xc5, 0xa1, - 0x61, 0xb4, 0x08, 0x65, 0xaf, 0xeb, 0x08, 0x41, 0x99, 0x09, 0x5e, 0x90, 0xe2, 0x65, 0x1c, 0x30, - 0x1e, 0xf6, 0x6a, 0xe3, 0x22, 0x4b, 0x05, 0x14, 0x1c, 0x69, 0x21, 0x23, 0x76, 0x5e, 0x88, 0x4d, - 0x7e, 0x35, 0xf3, 0x79, 0xc1, 0xe3, 0x26, 0x8c, 0xcb, 0x88, 0xa6, 0x9e, 0x0f, 0x68, 0x0b, 0xce, - 0xd0, 0xae, 0x69, 0x12, 0x4a, 0xb7, 0xbb, 0x36, 0x1f, 0x09, 0xbd, 0x66, 0x51, 0xdf, 0xf5, 0xf6, - 0xd7, 0x2c, 0x96, 0x92, 0x58, 0x66, 0x19, 0x69, 0x9c, 0xed, 0xf7, 0x6a, 0x67, 0x9a, 0x87, 0xc8, - 0xe1, 0x43, 0xad, 0xa0, 0xbb, 0x50, 0xdd, 0x36, 0x2c, 0x9b, 0x6c, 0xa5, 0x78, 0x18, 0xe1, 0x1e, - 0xce, 0xf4, 0x7b, 0xb5, 0xea, 0x95, 0x03, 0x64, 0xf0, 0x81, 0xda, 0xfa, 0x75, 0x98, 0x1a, 0x08, - 0x69, 0x74, 0x11, 0x2a, 0xb6, 0x41, 0xfd, 0xdb, 0xc4, 0x63, 0x67, 0x3b, 0x8f, 0xd4, 0x7c, 0x94, - 0x9a, 0xd6, 0x22, 0x16, 0x56, 0xe5, 0xf4, 0x6f, 0x35, 0x28, 0x73, 0x63, 0x4f, 0x21, 0xd6, 0x6f, - 0xc4, 0x63, 0xfd, 0x5c, 0xd6, 0xf8, 0x3b, 0x20, 0xca, 0x01, 0x4a, 0x62, 0xe4, 0x6e, 0x4b, 0xff, - 0xbc, 0x20, 0x23, 0x7e, 0xcd, 0x6d, 0x05, 0xa8, 0x67, 0x0e, 0xca, 0xa6, 0xeb, 0xf8, 0x06, 0x1b, - 0xb2, 0x4c, 0x5f, 0x53, 0x41, 0x30, 0x2e, 0x05, 0x0c, 0x1c, 0xc9, 0xb0, 0x64, 0xb7, 0xed, 0xda, - 0xb6, 0xfb, 0x11, 0x0f, 0xdd, 0x52, 0x74, 0x4a, 0x5c, 0xe1, 0x54, 0x2c, 0xb9, 0xe8, 0x3c, 0x94, - 0x3a, 0x2c, 0x89, 0xba, 0xf2, 0x14, 0x2a, 0x45, 0xb3, 0x5e, 0x97, 0x74, 0x1c, 0x4a, 0xa0, 0x0b, - 0x30, 0x46, 0x2d, 0xc7, 0x24, 0x4d, 0x62, 0xba, 0xce, 0x16, 0xe5, 0xd1, 0x95, 0x6f, 0x4c, 0xf6, - 0x7b, 0xb5, 0xb1, 0xa6, 0x42, 0xc7, 0x31, 0x29, 0x74, 0x07, 0xca, 0xfc, 0xf7, 0x86, 0x25, 0xc1, - 0x4a, 0x65, 0xe1, 0x8f, 0xb2, 0x6d, 0x05, 0xd3, 0x68, 0x1c, 0x67, 0x93, 0x6c, 0x06, 0x06, 0x70, - 0x64, 0x0b, 0x2d, 0x00, 0x30, 0xf4, 0x49, 0x7d, 0xa3, 0xdd, 0xa1, 0x1c, 0xc1, 0x94, 0xa2, 0x0f, - 0x66, 0x23, 0xe4, 0x60, 0x45, 0x0a, 0xbd, 0x02, 0x65, 0xdf, 0xb0, 0xec, 0x35, 0xcb, 0x21, 0x94, - 0x63, 0x95, 0xbc, 0x70, 0xb0, 0x11, 0x10, 0x71, 0xc4, 0x47, 0x75, 0x00, 0x9b, 0x85, 0x69, 0x63, - 0xdf, 0x27, 0x94, 0x63, 0x91, 0x7c, 0x63, 0x9c, 0x19, 0x5f, 0x0b, 0xa9, 0x58, 0x91, 0x60, 0xab, - 0xee, 0xb8, 0x1f, 0x19, 0x96, 0x5f, 0x2d, 0xc7, 0x57, 0xfd, 0xa6, 0x7b, 0xc7, 0xb0, 0x7c, 0x2c, - 0xb9, 0xe8, 0x45, 0x18, 0xdd, 0x93, 0xc1, 0x0d, 0xdc, 0x68, 0x85, 0xc1, 0xbe, 0x20, 0xa8, 0x03, - 0x9e, 0xfe, 0x65, 0x90, 0xe8, 0x6e, 0x75, 0xfd, 0x4e, 0xd7, 0x47, 0x6f, 0x41, 0xce, 0x77, 0x65, - 0x30, 0xbf, 0xa0, 0xac, 0x60, 0x9d, 0x95, 0x07, 0x51, 0x42, 0xc3, 0x64, 0x9b, 0x78, 0xc4, 0x31, - 0x49, 0xa3, 0xd8, 0xef, 0xd5, 0x72, 0x1b, 0x2e, 0xce, 0xf9, 0x2e, 0xba, 0x0b, 0xd0, 0xe9, 0xd2, - 0x9d, 0x26, 0x31, 0x3d, 0xe2, 0xcb, 0x4c, 0x76, 0x2e, 0xcd, 0xc8, 0x9a, 0x6b, 0x1a, 0x76, 0xd2, - 0x12, 0x9f, 0xf5, 0x7a, 0xa8, 0x8f, 0x15, 0x5b, 0x68, 0x0b, 0x2a, 0x56, 0xdb, 0x68, 0x91, 0x35, - 0x63, 0x93, 0xd8, 0x2c, 0x8c, 0xf2, 0x19, 0xcf, 0xb9, 0xd5, 0x50, 0x2b, 0xfa, 0xba, 0x23, 0x1a, - 0xc5, 0xaa, 0x59, 0xfd, 0xaf, 0x34, 0x98, 0xe6, 0x8b, 0xb1, 0xee, 0x52, 0x5f, 0xe0, 0x3d, 0x7e, - 0x02, 0xbe, 0x08, 0xa3, 0xec, 0x3c, 0x34, 0x9c, 0x2d, 0x9e, 0x0b, 0xca, 0x62, 0x2d, 0x97, 0x04, - 0x09, 0x07, 0x3c, 0x74, 0x06, 0x0a, 0x86, 0xd7, 0x12, 0xdf, 0x6b, 0xb9, 0x51, 0x62, 0xa9, 0x78, - 0xd1, 0x6b, 0x51, 0xcc, 0xa9, 0x6c, 0xe3, 0xa8, 0xe9, 0x59, 0x9d, 0x01, 0x0c, 0xdf, 0xe4, 0x54, - 0x2c, 0xb9, 0xfa, 0xf7, 0xa3, 0x30, 0xa6, 0x56, 0x25, 0x4f, 0x01, 0x7b, 0xbc, 0x0f, 0xa5, 0x00, - 0xe5, 0xca, 0x5d, 0x9b, 0xcf, 0xb0, 0xb4, 0x02, 0xf3, 0x62, 0xa9, 0xd8, 0x18, 0x63, 0x1f, 0x74, - 0xf0, 0x0b, 0x87, 0x06, 0x11, 0x81, 0x49, 0x99, 0xf0, 0xc8, 0x56, 0x63, 0x9f, 0xaf, 0xbd, 0xcc, - 0x53, 0x99, 0xe2, 0xeb, 0x44, 0xbf, 0x57, 0x9b, 0xdc, 0x48, 0x18, 0xc0, 0x03, 0x26, 0xd1, 0x22, - 0x14, 0xb6, 0x3d, 0xb7, 0xcd, 0xcf, 0x8b, 0x8c, 0xa6, 0xf9, 0x0e, 0x5d, 0xf1, 0xdc, 0x36, 0xe6, - 0xaa, 0xe8, 0x2e, 0x14, 0x37, 0x39, 0xa4, 0x97, 0x27, 0x48, 0x26, 0xb0, 0x94, 0xac, 0x01, 0x1a, - 0xc0, 0xf6, 0x54, 0x90, 0xb1, 0xb4, 0x87, 0xe6, 0xe3, 0xd9, 0xa6, 0xc8, 0x3f, 0xc8, 0x89, 0xc3, - 0x32, 0x0d, 0x7a, 0x03, 0xf2, 0xc4, 0xd9, 0xab, 0x8e, 0xf2, 0x48, 0x9f, 0x49, 0x9b, 0xce, 0x8a, - 0xb3, 0x77, 0xdb, 0xf0, 0x1a, 0x15, 0xb9, 0xb5, 0xf9, 0x15, 0x67, 0x0f, 0x33, 0x1d, 0xb4, 0x0b, - 0x15, 0x65, 0x79, 0xaa, 0x25, 0x6e, 0xe2, 0xc2, 0x90, 0xf0, 0x45, 0xd4, 0x10, 0xe1, 0x37, 0xa3, - 0xec, 0x00, 0x56, 0xad, 0xa3, 0x2f, 0x34, 0x38, 0xb9, 0xe5, 0x9a, 0xbb, 0xc4, 0x6b, 0xfa, 0xac, - 0xc4, 0x6e, 0xed, 0xcb, 0x84, 0xc2, 0xcf, 0xa7, 0xca, 0xc2, 0xe5, 0x0c, 0x7e, 0x97, 0xd3, 0xf4, - 0x1b, 0xa7, 0xfb, 0xbd, 0xda, 0xc9, 0x54, 0x16, 0x4e, 0xf7, 0xc8, 0xc7, 0x42, 0xf9, 0x2e, 0x24, - 0xc7, 0x02, 0x99, 0xc7, 0xd2, 0x4c, 0xd3, 0x17, 0x63, 0x49, 0x65, 0xe1, 0x74, 0x8f, 0xfa, 0x2f, - 0x05, 0x79, 0xb0, 0xca, 0xd2, 0xf0, 0x75, 0x28, 0xf8, 0xfb, 0x9d, 0xa0, 0x30, 0xac, 0x05, 0x58, - 0x7d, 0x63, 0xbf, 0x43, 0x1e, 0xf6, 0x6a, 0x13, 0x8a, 0x28, 0x23, 0x61, 0x2e, 0xac, 0x44, 0x64, - 0xee, 0x09, 0x47, 0x64, 0x1d, 0x40, 0xac, 0xe1, 0x36, 0xab, 0x56, 0xe5, 0x89, 0xc4, 0x0e, 0x88, - 0xe5, 0x90, 0x8a, 0x15, 0x09, 0xb4, 0x06, 0xf9, 0x96, 0xc4, 0x7a, 0xd9, 0x4e, 0x87, 0xab, 0x96, - 0xaf, 0x8e, 0x61, 0x94, 0x45, 0xe8, 0x55, 0xcb, 0xc7, 0xcc, 0x0c, 0x2b, 0xdb, 0xf8, 0xb9, 0x4b, - 0xab, 0x23, 0x99, 0x71, 0x3c, 0xff, 0xcc, 0xa5, 0xb5, 0xf0, 0xec, 0xe4, 0x44, 0x8a, 0xa5, 0x35, - 0x96, 0xad, 0x19, 0x3e, 0x21, 0x1f, 0xfb, 0xcb, 0x96, 0x27, 0xfb, 0x0d, 0x0a, 0xbc, 0x0d, 0x38, - 0x58, 0x91, 0x42, 0x1f, 0xc0, 0x98, 0xdc, 0x41, 0x91, 0xb6, 0x46, 0x87, 0x4c, 0x5b, 0x02, 0x9a, - 0x28, 0x16, 0x70, 0xcc, 0x1e, 0xfa, 0x73, 0x18, 0xa5, 0xfc, 0x2f, 0x3a, 0xc4, 0x97, 0x28, 0x74, - 0xd5, 0x05, 0x0c, 0x3b, 0x37, 0x82, 0x45, 0x71, 0x60, 0x55, 0xff, 0xef, 0x00, 0x93, 0xf2, 0x5c, - 0x65, 0xa4, 0x34, 0x10, 0x9e, 0x70, 0x41, 0x90, 0x38, 0x5f, 0x72, 0xbf, 0xe6, 0xf9, 0xa2, 0x7f, - 0x3e, 0x1a, 0x7c, 0x47, 0x02, 0xb8, 0xcf, 0xc3, 0x48, 0x67, 0xc7, 0xa0, 0xc1, 0x87, 0xf4, 0x6c, - 0x80, 0x75, 0xd7, 0x19, 0xf1, 0x61, 0xaf, 0x06, 0x22, 0x81, 0xb3, 0x5f, 0x58, 0x48, 0x72, 0x64, - 0x6b, 0x38, 0x26, 0xb1, 0x6d, 0xb2, 0x25, 0xb1, 0x6a, 0x84, 0x6c, 0x03, 0x06, 0x8e, 0x64, 0xd0, - 0x25, 0x28, 0x7a, 0xc4, 0xa0, 0xae, 0x23, 0x3f, 0x8c, 0xd9, 0x20, 0xdc, 0x30, 0xa7, 0x3e, 0x64, - 0x1b, 0x2e, 0x2a, 0x61, 0xfe, 0x1b, 0x4b, 0x69, 0xf4, 0x32, 0x8c, 0xb6, 0x0f, 0x6f, 0xb7, 0x05, - 0x7c, 0xb4, 0x0d, 0xe3, 0xd4, 0x37, 0x3c, 0x3f, 0x84, 0x90, 0x47, 0x40, 0xad, 0xa8, 0xdf, 0xab, - 0x8d, 0x37, 0x63, 0x56, 0x70, 0xc2, 0x2a, 0xea, 0xc2, 0xb4, 0xe9, 0xb6, 0x3b, 0x36, 0x61, 0xa7, - 0x52, 0xe4, 0xac, 0x38, 0xb4, 0xb3, 0x53, 0xfd, 0x5e, 0x6d, 0x7a, 0x69, 0xd0, 0x14, 0x4e, 0xb3, - 0x8f, 0xfe, 0x04, 0x4a, 0x5b, 0x5d, 0xcf, 0x60, 0x44, 0x89, 0x80, 0x9f, 0x0f, 0x30, 0xff, 0xb2, - 0xa4, 0x3f, 0xec, 0xd5, 0x8e, 0x33, 0xd0, 0x5c, 0x0f, 0x08, 0x38, 0x54, 0x41, 0x9b, 0x30, 0xe3, - 0x72, 0x3c, 0x2a, 0x4e, 0x23, 0x91, 0xf3, 0x83, 0x2f, 0x4e, 0x36, 0xec, 0x74, 0x69, 0x70, 0xe6, - 0xd6, 0x81, 0x92, 0xf8, 0x10, 0x2b, 0xe8, 0x2a, 0x14, 0x4d, 0x5e, 0x11, 0xca, 0x44, 0x95, 0x09, - 0x32, 0x80, 0x68, 0xba, 0x32, 0x35, 0x2c, 0xd5, 0xd1, 0x3d, 0x28, 0x0a, 0x37, 0x32, 0xcb, 0x5c, - 0x18, 0xae, 0x07, 0x25, 0x86, 0x1f, 0x1d, 0x69, 0xe2, 0x37, 0x96, 0x36, 0xd1, 0x06, 0xef, 0xe0, - 0xb0, 0xa3, 0xb2, 0xc2, 0xbf, 0xb3, 0x2c, 0x3d, 0xb3, 0x26, 0x53, 0x58, 0x75, 0xb6, 0xdd, 0x58, - 0xe7, 0x86, 0x1f, 0x94, 0xc2, 0x16, 0x3b, 0x28, 0x6d, 0xb7, 0xd5, 0x74, 0xac, 0x4e, 0x87, 0xf8, - 0xd5, 0xb1, 0xf8, 0x41, 0xb9, 0x16, 0x72, 0xb0, 0x22, 0xa5, 0x9b, 0xb2, 0x8e, 0x56, 0x87, 0x8d, - 0x6e, 0x2a, 0xf5, 0xc2, 0xa5, 0xa3, 0x4c, 0x7c, 0xc3, 0x55, 0x4b, 0x08, 0x7d, 0x4d, 0x22, 0xf0, - 0xb8, 0x08, 0x2b, 0xd7, 0xf9, 0x11, 0xbf, 0x6c, 0xb5, 0x08, 0xf5, 0xe5, 0xb7, 0x1f, 0x07, 0xf4, - 0x82, 0x85, 0x55, 0x39, 0xfd, 0xbb, 0x02, 0x1c, 0x97, 0xe6, 0x44, 0x76, 0x46, 0x17, 0x63, 0x69, - 0xf8, 0xf9, 0x44, 0x1a, 0x9e, 0x8a, 0x09, 0x2b, 0x89, 0xd8, 0x83, 0xf1, 0x38, 0xe4, 0x90, 0x09, - 0xf9, 0x52, 0x66, 0x74, 0x13, 0xb3, 0x2c, 0x3e, 0xdd, 0x38, 0xb6, 0xc1, 0x09, 0x0f, 0xcc, 0x67, - 0x1c, 0x5a, 0x48, 0xd8, 0x7c, 0x29, 0x33, 0x8a, 0x49, 0xf1, 0x19, 0xc7, 0x30, 0x38, 0xe1, 0x81, - 0xf9, 0x34, 0xbb, 0xd4, 0x77, 0xdb, 0xa1, 0xcf, 0x42, 0x66, 0x9f, 0x4b, 0x5c, 0x31, 0xc5, 0xe7, - 0x52, 0xcc, 0x22, 0x4e, 0x78, 0x40, 0xdf, 0x68, 0x70, 0xea, 0x43, 0xe2, 0xec, 0x5a, 0x0e, 0x5d, - 0xb7, 0x3a, 0xc4, 0xb6, 0x9c, 0x68, 0xc6, 0xe2, 0x50, 0xfc, 0xd3, 0x0c, 0xde, 0xaf, 0xc7, 0x2d, - 0xc4, 0x87, 0xf1, 0x6c, 0xbf, 0x57, 0x3b, 0x75, 0x3d, 0xdd, 0x07, 0x3e, 0xc8, 0xb9, 0xfe, 0xd9, - 0x88, 0x8c, 0x78, 0x35, 0x65, 0xa9, 0x87, 0xbc, 0xf6, 0x88, 0x43, 0xde, 0x83, 0x71, 0x7e, 0xf3, - 0x64, 0x99, 0xb2, 0xf9, 0x3e, 0x44, 0xd4, 0x5c, 0x8d, 0x29, 0x8a, 0x6c, 0xc9, 0x57, 0x33, 0xce, - 0xc0, 0x09, 0x0f, 0xc8, 0x81, 0xe3, 0xc2, 0x78, 0xe0, 0x32, 0x9f, 0xf9, 0x0e, 0xe1, 0xaa, 0xe5, - 0x5f, 0x0b, 0xf5, 0x84, 0xc7, 0xa9, 0x7e, 0xaf, 0x76, 0x3c, 0x46, 0xc7, 0x71, 0xf3, 0xa8, 0x0b, - 0x93, 0xfc, 0x8b, 0x5b, 0xda, 0x31, 0x9c, 0x96, 0x58, 0x76, 0x19, 0x33, 0xaf, 0x67, 0x05, 0x75, - 0x42, 0x55, 0x38, 0xe4, 0xe5, 0xde, 0x6a, 0xc2, 0x20, 0x1e, 0x70, 0x21, 0xa7, 0x69, 0x1b, 0xe1, - 0x34, 0x47, 0x86, 0x99, 0xe6, 0x9a, 0x91, 0x3e, 0xcd, 0x88, 0x8e, 0xe3, 0xe6, 0xd1, 0x27, 0x30, - 0xb9, 0x99, 0xb8, 0xb0, 0x91, 0x49, 0xf4, 0x72, 0x26, 0x4c, 0x9e, 0x72, 0xd7, 0x23, 0xe6, 0x9a, - 0x64, 0xe1, 0x01, 0x3f, 0xfa, 0xb7, 0x05, 0x40, 0x83, 0x9d, 0x65, 0x74, 0x21, 0x76, 0x94, 0x9d, - 0x4d, 0x1c, 0x65, 0x93, 0xaa, 0x86, 0x72, 0x92, 0xdd, 0x83, 0xa2, 0x18, 0xef, 0x10, 0x95, 0xbe, - 0x1c, 0x88, 0x34, 0x96, 0x16, 0x14, 0xd2, 0x26, 0x03, 0xbb, 0x32, 0x1e, 0x65, 0xdc, 0x1d, 0xc1, - 0x7c, 0x5a, 0x94, 0x07, 0x56, 0xd1, 0x8e, 0x4c, 0x04, 0x22, 0x16, 0x64, 0xa4, 0x5d, 0x1c, 0x2e, - 0xd2, 0x02, 0x47, 0x13, 0x61, 0xee, 0x10, 0x74, 0xac, 0x9a, 0x96, 0x0b, 0x65, 0x1b, 0x9b, 0x32, - 0xb4, 0x1e, 0x63, 0xa1, 0x94, 0xb0, 0x92, 0x36, 0x11, 0x81, 0x72, 0xb8, 0xcf, 0x32, 0x90, 0x8e, - 0xe0, 0x20, 0x3d, 0x82, 0x22, 0xcb, 0xfa, 0x7f, 0x16, 0x41, 0x41, 0xf1, 0xe8, 0x6d, 0x18, 0xa7, - 0xc4, 0xdb, 0xb3, 0x4c, 0xb2, 0x68, 0x9a, 0x6e, 0xd7, 0x09, 0x32, 0x69, 0x78, 0xf9, 0xd9, 0x8c, - 0x71, 0x71, 0x42, 0x9a, 0x5f, 0xb7, 0xf1, 0x84, 0x21, 0x83, 0x27, 0xfb, 0x75, 0x5b, 0xa2, 0x6e, - 0x93, 0xbd, 0x23, 0x69, 0x2d, 0xd6, 0x80, 0xca, 0x3f, 0xe9, 0x06, 0xd4, 0x07, 0x50, 0xa2, 0xf1, - 0x6c, 0xf6, 0x5a, 0x76, 0xa0, 0x22, 0x13, 0x48, 0xd8, 0xb1, 0x0e, 0xb3, 0x46, 0x68, 0x93, 0x2d, - 0x8a, 0xc4, 0x7f, 0x23, 0xc3, 0x2d, 0xca, 0x23, 0x90, 0xdf, 0x9f, 0x41, 0xd9, 0x23, 0x62, 0x81, - 0xa8, 0x0c, 0x91, 0xd4, 0xaa, 0x14, 0x4b, 0x21, 0x4c, 0xee, 0x77, 0x2d, 0x8f, 0xb4, 0x89, 0xe3, - 0xd3, 0xa8, 0xc0, 0x09, 0xb8, 0x14, 0x47, 0xd6, 0xd0, 0x87, 0x00, 0x9d, 0xb0, 0xc5, 0x29, 0x2b, - 0xde, 0xcc, 0xe8, 0x2d, 0xde, 0x1c, 0x8d, 0x60, 0x63, 0x44, 0xc7, 0x8a, 0x75, 0xf4, 0x3e, 0x9c, - 0x8e, 0x2a, 0x84, 0x65, 0x62, 0x6c, 0xf1, 0x1c, 0x2b, 0xbb, 0xfb, 0xa2, 0xdf, 0xfd, 0x5c, 0xbf, - 0x57, 0x3b, 0xbd, 0x74, 0x90, 0x10, 0x3e, 0x58, 0x1f, 0xb5, 0x61, 0xcc, 0x71, 0xb7, 0x48, 0x93, - 0xd8, 0xc4, 0xf4, 0x5d, 0x4f, 0x42, 0xf9, 0x3f, 0xce, 0x30, 0x15, 0xd1, 0xa7, 0x31, 0xec, 0x9b, - 0x8a, 0xba, 0xa8, 0xe5, 0x55, 0x0a, 0x8e, 0x99, 0xd7, 0xff, 0x56, 0x83, 0x94, 0xdb, 0xf4, 0x58, - 0xf8, 0x6a, 0x4f, 0x3a, 0x7c, 0x5f, 0x82, 0x22, 0x8d, 0x1a, 0xea, 0x6a, 0xdf, 0x58, 0x74, 0x1b, - 0x24, 0x57, 0xff, 0xaa, 0x00, 0xd3, 0x29, 0x10, 0x0c, 0xad, 0xc8, 0xc6, 0xe8, 0x10, 0x3d, 0xfd, - 0xf0, 0x26, 0x39, 0xd6, 0x1c, 0x85, 0x4e, 0xd7, 0xb6, 0x1f, 0xaf, 0xb7, 0x1f, 0xe8, 0x63, 0xc5, - 0x56, 0xd0, 0xe9, 0xcc, 0x1f, 0xa1, 0xd3, 0x79, 0x1d, 0x10, 0xf9, 0xb8, 0xe3, 0x52, 0x22, 0xa1, - 0xb4, 0xcb, 0x8f, 0xd3, 0x02, 0x2f, 0xf1, 0xc3, 0xe7, 0x0f, 0x2b, 0x03, 0x12, 0x38, 0x45, 0x0b, - 0xcd, 0x41, 0x79, 0xdb, 0xf5, 0x4c, 0xc2, 0x46, 0xc9, 0xbf, 0x64, 0xa5, 0x4b, 0x70, 0x25, 0x60, - 0xe0, 0x48, 0x06, 0xdd, 0x8d, 0x1a, 0x3b, 0xc5, 0xcc, 0xf7, 0x11, 0x62, 0xce, 0xfc, 0xc3, 0x39, - 0xb0, 0xa3, 0x83, 0x16, 0x61, 0x82, 0x2b, 0x2c, 0xae, 0xaf, 0x06, 0x2d, 0x63, 0xf1, 0xe4, 0xe5, - 0x94, 0x54, 0x11, 0xed, 0xc2, 0x88, 0x8d, 0x93, 0xf2, 0xfa, 0x83, 0x02, 0x4c, 0xa7, 0x14, 0x1e, - 0x61, 0x9b, 0x5c, 0x7b, 0x9c, 0x36, 0xf9, 0xaf, 0x15, 0x09, 0x2f, 0xc3, 0xa8, 0xe3, 0x2e, 0x19, - 0xe6, 0x0e, 0x91, 0x17, 0x85, 0xe1, 0x12, 0xdd, 0x14, 0x64, 0x1c, 0xf0, 0x83, 0xa0, 0x29, 0x1c, - 0x21, 0x68, 0x86, 0xde, 0xe8, 0xb7, 0x83, 0xe2, 0x6f, 0xdb, 0xb2, 0xc9, 0xba, 0xe1, 0xef, 0xc8, - 0xce, 0x62, 0x98, 0x35, 0x97, 0x63, 0x5c, 0x9c, 0x90, 0x46, 0xef, 0x40, 0x59, 0x6c, 0x8f, 0xd7, - 0xa2, 0x19, 0x1a, 0xfa, 0xe1, 0x60, 0x1a, 0x81, 0x12, 0x8e, 0xf4, 0x51, 0x07, 0x4e, 0x71, 0x94, - 0xc2, 0xce, 0xaf, 0xb6, 0xf5, 0x09, 0xef, 0x97, 0xc8, 0x17, 0x04, 0xa2, 0x2f, 0x72, 0x89, 0xd5, - 0x3a, 0xab, 0xe9, 0x22, 0x0f, 0x0f, 0x66, 0xe1, 0x83, 0xcc, 0xea, 0x5f, 0x69, 0x90, 0xde, 0x86, - 0x8f, 0x4f, 0x4c, 0x7b, 0xcc, 0x89, 0xbd, 0x18, 0x6d, 0xbe, 0xe8, 0xd1, 0x55, 0xd2, 0x36, 0x5e, - 0xff, 0x3b, 0x0d, 0xa6, 0x53, 0x6a, 0xa3, 0xdf, 0xc6, 0x19, 0xfc, 0x63, 0x2e, 0x39, 0xb8, 0x95, - 0x3d, 0xe2, 0xf8, 0x47, 0x6b, 0xfe, 0xaf, 0x88, 0x96, 0x7b, 0x4e, 0xb6, 0xea, 0x32, 0x15, 0x36, - 0xbc, 0xe9, 0x13, 0xef, 0xb5, 0x3f, 0xc6, 0xf1, 0x7a, 0xf0, 0xdd, 0x4e, 0xe1, 0x69, 0xdf, 0xed, - 0xe8, 0xff, 0xa6, 0xc1, 0x78, 0xfc, 0x4e, 0x01, 0x3d, 0x07, 0xf9, 0xae, 0x67, 0xc9, 0x45, 0x0d, - 0x47, 0xff, 0x2e, 0x5e, 0xc5, 0x8c, 0xce, 0xd8, 0x1e, 0xd9, 0x96, 0x3b, 0x16, 0xb2, 0x31, 0xd9, - 0xc6, 0x8c, 0x8e, 0x08, 0x54, 0x3a, 0x9e, 0xfb, 0xf1, 0xbe, 0xe8, 0xe6, 0x0d, 0xf1, 0x7e, 0x6c, - 0x3d, 0xd2, 0x8a, 0x5a, 0x50, 0x0a, 0x11, 0xab, 0x76, 0x39, 0x64, 0x18, 0x2c, 0xac, 0x7f, 0x1b, - 0xe1, 0xfa, 0x7f, 0x1a, 0x8c, 0xca, 0xa0, 0x41, 0xf7, 0x61, 0xbc, 0x15, 0x5b, 0xde, 0x21, 0x86, - 0x95, 0xb8, 0xeb, 0x09, 0xcf, 0xc5, 0x38, 0x1d, 0x27, 0x1c, 0xa0, 0xbf, 0x84, 0xa9, 0x96, 0xe5, - 0xc7, 0xe7, 0x34, 0xc4, 0x45, 0xd7, 0xd5, 0xa4, 0x6e, 0xe3, 0xb4, 0x74, 0x3c, 0x35, 0xc0, 0xc2, - 0x83, 0x9e, 0xf4, 0xcf, 0xc5, 0xce, 0x24, 0x7a, 0x01, 0xbf, 0x8b, 0x17, 0x98, 0xff, 0x9a, 0x83, - 0xc1, 0x21, 0xb3, 0x5d, 0x34, 0x05, 0x40, 0xd7, 0x52, 0x1f, 0xfd, 0x4a, 0x2e, 0x2b, 0x54, 0x0d, - 0xfe, 0x6a, 0x76, 0x88, 0xb5, 0x13, 0xae, 0x96, 0x5c, 0xc7, 0xf7, 0x5c, 0xfb, 0x5d, 0x4a, 0x3c, - 0xe5, 0xa9, 0x2a, 0xb7, 0x85, 0xa5, 0x4d, 0x56, 0xa8, 0x9a, 0xc1, 0xcb, 0xd7, 0x21, 0x1e, 0x11, - 0x0e, 0x3a, 0x50, 0x1e, 0x13, 0x49, 0x73, 0x38, 0xb2, 0x3c, 0xc4, 0xd5, 0x89, 0xfe, 0x85, 0x06, - 0x93, 0xc9, 0xbe, 0x11, 0xd3, 0xe7, 0xf9, 0x6b, 0x75, 0x39, 0xd9, 0x95, 0x5b, 0x15, 0x64, 0x1c, - 0xf0, 0xd1, 0x75, 0x18, 0x65, 0x38, 0x06, 0xcb, 0xb3, 0x21, 0x23, 0x0a, 0xe2, 0xd9, 0xe8, 0x8a, - 0xd0, 0xc3, 0x81, 0x01, 0xfd, 0x5f, 0x34, 0x40, 0x83, 0x9d, 0x05, 0xb4, 0x0e, 0x27, 0x6c, 0x83, - 0xfa, 0xe1, 0xa5, 0xd6, 0x6a, 0x6c, 0x68, 0x67, 0xe4, 0xd0, 0x4e, 0xac, 0xa5, 0xc8, 0xe0, 0x54, - 0xcd, 0x10, 0xb7, 0xe5, 0x8e, 0x8c, 0xdb, 0xf4, 0x26, 0x40, 0xf4, 0xf2, 0x05, 0x9d, 0x85, 0x82, - 0x63, 0xb4, 0x83, 0x94, 0x14, 0x22, 0x7e, 0xfe, 0x84, 0x9a, 0x73, 0xd0, 0x0b, 0x30, 0xb2, 0x67, - 0xd8, 0xdd, 0xe0, 0x8d, 0x7a, 0xf8, 0xaa, 0xec, 0x36, 0x23, 0x62, 0xc1, 0xd3, 0xff, 0x3e, 0x07, - 0x15, 0xe5, 0x66, 0xf6, 0x49, 0x55, 0x1b, 0x77, 0x60, 0xa4, 0x63, 0xf8, 0x3b, 0xc1, 0xdb, 0xb7, - 0x85, 0xe1, 0xee, 0x87, 0x19, 0xea, 0x8a, 0xc6, 0xcb, 0x7e, 0x51, 0x2c, 0xec, 0x25, 0xc0, 0x6b, - 0xfe, 0x09, 0x82, 0xd7, 0x67, 0x20, 0x67, 0x50, 0x0e, 0x48, 0xcb, 0xe2, 0x46, 0x63, 0x91, 0xe2, - 0x9c, 0x41, 0xf5, 0xcf, 0x34, 0x98, 0x48, 0x8c, 0x0d, 0x2d, 0x00, 0xd0, 0xf0, 0x97, 0xdc, 0x82, - 0xb0, 0x8e, 0x8e, 0xe4, 0xb0, 0x22, 0xc5, 0x51, 0x28, 0xa1, 0xbe, 0xe5, 0x70, 0x6c, 0xb6, 0x6c, - 0x79, 0x72, 0x5f, 0x22, 0x14, 0x1a, 0xe3, 0xe2, 0x84, 0xb4, 0xfe, 0x5f, 0x1a, 0x9c, 0x39, 0xac, - 0x49, 0xce, 0xaa, 0x0e, 0xd9, 0x09, 0x0f, 0x71, 0xae, 0x16, 0xaf, 0x3a, 0xae, 0xc7, 0xd9, 0x38, - 0x29, 0x8f, 0x2e, 0x42, 0x45, 0x21, 0xc9, 0x01, 0x86, 0x39, 0x52, 0x51, 0xc7, 0xaa, 0xdc, 0x63, - 0x40, 0x14, 0xfd, 0x3f, 0x34, 0x38, 0x91, 0x56, 0xca, 0xa3, 0x56, 0xf0, 0x7a, 0x52, 0xe0, 0xd2, - 0xc6, 0x11, 0x5b, 0x02, 0x75, 0xfe, 0x86, 0x72, 0xc5, 0xf1, 0xbd, 0xfd, 0xf4, 0x77, 0x95, 0x33, - 0x97, 0x01, 0x22, 0x19, 0x34, 0x09, 0xf9, 0x5d, 0xb2, 0x2f, 0x16, 0x0e, 0xb3, 0x3f, 0xd1, 0x89, - 0xd8, 0x67, 0x24, 0xbf, 0x9b, 0x37, 0x73, 0x97, 0xb5, 0x37, 0x4b, 0x7f, 0xf3, 0x0f, 0xb5, 0x63, - 0x9f, 0xfe, 0x74, 0xf6, 0x98, 0xfe, 0xb5, 0x06, 0x2a, 0x82, 0x40, 0xaf, 0x40, 0x79, 0xc7, 0xf7, - 0x3b, 0x9c, 0x24, 0xef, 0xa0, 0xf9, 0x0b, 0xc2, 0x6b, 0x1b, 0x1b, 0xeb, 0x9c, 0x88, 0x23, 0x3e, - 0xaa, 0x03, 0xb0, 0x1f, 0x54, 0x48, 0x17, 0xa2, 0xa7, 0x1c, 0x4c, 0xba, 0x29, 0xc4, 0x15, 0x09, - 0x01, 0xb4, 0x85, 0xb0, 0xf8, 0xb7, 0x0e, 0x09, 0xb4, 0x85, 0x64, 0xc0, 0xd3, 0xff, 0x59, 0x83, - 0xa9, 0x81, 0x67, 0x08, 0x68, 0x3d, 0x84, 0x16, 0xda, 0xb0, 0xdf, 0x4e, 0x3a, 0x08, 0x79, 0xec, - 0xb8, 0xbe, 0x0c, 0x27, 0x84, 0x45, 0xee, 0x35, 0xba, 0xdf, 0x7d, 0xe4, 0x01, 0xa7, 0xff, 0xa3, - 0x06, 0x10, 0xd5, 0xe3, 0x68, 0x13, 0xc6, 0xc4, 0x90, 0x62, 0xf8, 0x27, 0xfb, 0x04, 0x4f, 0x48, - 0x17, 0x63, 0x4d, 0xc5, 0x0a, 0x8e, 0xd9, 0x64, 0xb5, 0x67, 0xdb, 0xed, 0x3a, 0x3e, 0xff, 0xba, - 0x72, 0xf1, 0x47, 0xb6, 0x37, 0x02, 0x06, 0x8e, 0x64, 0xf4, 0x4f, 0xf3, 0x30, 0x9d, 0x72, 0x99, - 0xf7, 0x07, 0xdd, 0xd5, 0x79, 0x19, 0x46, 0xc5, 0x5b, 0x48, 0x9a, 0xc4, 0x02, 0xe2, 0xa9, 0x24, - 0xc5, 0x01, 0x1f, 0xcd, 0x43, 0xc5, 0x72, 0x4c, 0xd1, 0xf4, 0x34, 0x82, 0x6a, 0x5e, 0xf4, 0xf5, - 0x23, 0x32, 0x56, 0x65, 0xe2, 0xe5, 0x7f, 0xf1, 0xd1, 0xe5, 0xbf, 0xfe, 0x1e, 0x4c, 0x0d, 0xa0, - 0x99, 0x6c, 0xe9, 0x93, 0xf0, 0xff, 0x2f, 0x4a, 0xa4, 0x4f, 0xf1, 0x6f, 0x45, 0x82, 0xa7, 0x7f, - 0xa3, 0xc1, 0x78, 0x02, 0xf6, 0x1d, 0xa9, 0x56, 0xbc, 0xa5, 0xd6, 0x8a, 0x47, 0x03, 0xcf, 0xb1, - 0xaa, 0x51, 0xbf, 0x0e, 0xe9, 0xcf, 0xdd, 0x92, 0x2b, 0xae, 0x3d, 0x7a, 0xc5, 0xf5, 0xef, 0x72, - 0x50, 0x0e, 0x9f, 0x24, 0xa0, 0x57, 0x63, 0x2b, 0x77, 0x5a, 0x5d, 0xb9, 0x87, 0xbd, 0x9a, 0x10, - 0x54, 0x96, 0xf1, 0x7d, 0x28, 0x87, 0x4f, 0x5a, 0xc2, 0x5a, 0x38, 0xfb, 0xb3, 0x95, 0x70, 0x6b, - 0xc3, 0x77, 0x32, 0x38, 0xb2, 0xc7, 0x70, 0x5a, 0xf0, 0xe6, 0xe4, 0x86, 0x65, 0xdb, 0x16, 0x95, - 0x6d, 0xe9, 0x3c, 0x6f, 0x4b, 0x87, 0x38, 0x6d, 0x39, 0x45, 0x06, 0xa7, 0x6a, 0xa2, 0x75, 0x18, - 0xa1, 0x3e, 0xe9, 0x50, 0xd9, 0x99, 0x7a, 0x25, 0xd3, 0x6b, 0x0d, 0xd2, 0xe1, 0x75, 0x7b, 0x18, - 0x22, 0x8c, 0x42, 0xb1, 0x30, 0xa4, 0xff, 0xa2, 0x41, 0x29, 0x10, 0x41, 0xe7, 0x63, 0x8b, 0x57, - 0x4d, 0x2c, 0x1e, 0x97, 0xfb, 0xbd, 0x5d, 0x3b, 0xbd, 0xa7, 0xc1, 0x78, 0xfc, 0x82, 0x4b, 0xa9, - 0x64, 0xb5, 0xc3, 0x2a, 0x59, 0x74, 0x1e, 0x4a, 0x86, 0x6d, 0xbb, 0x1f, 0xad, 0x38, 0x7b, 0xb2, - 0x7b, 0x14, 0xde, 0xd8, 0x2c, 0x4a, 0x3a, 0x0e, 0x25, 0xd0, 0x1e, 0x4c, 0x08, 0xbd, 0xe8, 0x4d, - 0x51, 0x3e, 0xf3, 0xc5, 0x41, 0x5a, 0xb2, 0x69, 0x4c, 0x33, 0x78, 0xd4, 0x8c, 0xdb, 0xc4, 0x49, - 0x27, 0x8d, 0x73, 0x0f, 0x7e, 0x9e, 0x3d, 0xf6, 0xc3, 0xcf, 0xb3, 0xc7, 0x7e, 0xfc, 0x79, 0xf6, - 0xd8, 0xa7, 0xfd, 0x59, 0xed, 0x41, 0x7f, 0x56, 0xfb, 0xa1, 0x3f, 0xab, 0xfd, 0xd8, 0x9f, 0xd5, - 0xfe, 0xa7, 0x3f, 0xab, 0xfd, 0xf5, 0xff, 0xce, 0x1e, 0x7b, 0x2f, 0xb7, 0x37, 0xff, 0xff, 0x01, - 0x00, 0x00, 0xff, 0xff, 0xd1, 0xb0, 0xa8, 0xfb, 0x1e, 0x3c, 0x00, 0x00, + // 3879 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0xcd, 0x6f, 0x1b, 0x49, + 0x76, 0x77, 0x93, 0x14, 0x45, 0x3e, 0xca, 0xfa, 0x28, 0xc9, 0x63, 0x5a, 0xeb, 0x15, 0x3d, 0x3d, + 0x98, 0x85, 0x27, 0xe3, 0xa1, 0x56, 0x1a, 0xdb, 0xf1, 0xee, 0x22, 0x1b, 0x88, 0x92, 0x6c, 0xcb, + 0x2b, 0xdb, 0x42, 0x51, 0x6b, 0x3b, 0x3b, 0xc6, 0x26, 0xad, 0x56, 0x91, 0xea, 0x51, 0xb3, 0x9b, + 0xee, 0x6a, 0x6a, 0x46, 0x0b, 0x04, 0x18, 0x04, 0x58, 0x0c, 0x76, 0xf7, 0x92, 0xbd, 0x2c, 0x92, + 0x5c, 0x92, 0x20, 0xc8, 0x21, 0xc8, 0x29, 0x87, 0x00, 0x0b, 0xec, 0x25, 0x40, 0xf6, 0xe0, 0x43, + 0x0e, 0x03, 0x24, 0x87, 0x01, 0x32, 0x20, 0x32, 0xcc, 0x21, 0xff, 0x83, 0x73, 0x09, 0xea, 0xa3, + 0xbb, 0xab, 0x9b, 0x4d, 0xb9, 0x29, 0x79, 0x9c, 0x49, 0x6e, 0xe2, 0xfb, 0xf8, 0xbd, 0xaa, 0xea, + 0x57, 0xf5, 0x3e, 0xaa, 0x04, 0x2b, 0x6d, 0xcb, 0x3f, 0xe8, 0xed, 0xd5, 0x4d, 0xb7, 0xb3, 0xec, + 0x76, 0x89, 0x43, 0x0f, 0xac, 0x96, 0xbf, 0x6c, 0x74, 0xad, 0xe5, 0xbd, 0x9e, 0x65, 0xef, 0x2f, + 0x1f, 0xad, 0x2c, 0xb7, 0x89, 0x43, 0x3c, 0xc3, 0x27, 0xfb, 0xf5, 0xae, 0xe7, 0xfa, 0x2e, 0x7a, + 0x33, 0x52, 0xa9, 0x87, 0x2a, 0x75, 0xa3, 0x6b, 0xd5, 0xb9, 0x4a, 0xfd, 0x68, 0x65, 0xf1, 0x3d, + 0x05, 0xb5, 0xed, 0xb6, 0xdd, 0x65, 0xae, 0xb9, 0xd7, 0x6b, 0xf1, 0x5f, 0xfc, 0x07, 0xff, 0x4b, + 0x20, 0x2e, 0xea, 0x87, 0xb7, 0x68, 0xdd, 0x72, 0xb9, 0x59, 0xd3, 0xf5, 0x48, 0x8a, 0xd5, 0xc5, + 0xeb, 0x91, 0x4c, 0xc7, 0x30, 0x0f, 0x2c, 0x87, 0x78, 0xc7, 0xcb, 0xdd, 0xc3, 0x36, 0x23, 0xd0, + 0xe5, 0x0e, 0xf1, 0x8d, 0x34, 0xad, 0xe5, 0x51, 0x5a, 0x5e, 0xcf, 0xf1, 0xad, 0x0e, 0x19, 0x52, + 0xb8, 0xf9, 0x32, 0x05, 0x6a, 0x1e, 0x90, 0x8e, 0x31, 0xa4, 0xf7, 0xfe, 0x28, 0xbd, 0x9e, 0x6f, + 0xd9, 0xcb, 0x96, 0xe3, 0x53, 0xdf, 0x4b, 0x2a, 0xe9, 0xff, 0x54, 0x80, 0x4b, 0x0d, 0xcb, 0x31, + 0xbc, 0xe3, 0x06, 0x5b, 0x39, 0x4c, 0x9e, 0xf5, 0x08, 0xf5, 0x1f, 0x76, 0x7d, 0xcb, 0x75, 0x28, + 0xfa, 0x23, 0x28, 0xb1, 0x69, 0xed, 0x1b, 0xbe, 0x51, 0xd5, 0xae, 0x68, 0x57, 0x2b, 0xab, 0xdf, + 0xae, 0x0b, 0x2b, 0x75, 0xd5, 0x4a, 0xbd, 0x7b, 0xd8, 0x66, 0x04, 0x5a, 0x67, 0xd2, 0xf5, 0xa3, + 0x95, 0xfa, 0xc3, 0xbd, 0x0f, 0x89, 0xe9, 0xdf, 0x27, 0xbe, 0xd1, 0x40, 0xcf, 0xfb, 0xb5, 0x73, + 0x83, 0x7e, 0x0d, 0x22, 0x1a, 0x0e, 0x51, 0xd1, 0xb7, 0xa0, 0x68, 0xd0, 0xdb, 0x96, 0x4d, 0xaa, + 0xb9, 0x2b, 0xda, 0xd5, 0x72, 0x63, 0x5a, 0x4a, 0x17, 0xd7, 0x38, 0x15, 0x4b, 0x2e, 0xba, 0x09, + 0xd3, 0x1e, 0x39, 0xb2, 0xa8, 0xe5, 0x3a, 0xeb, 0x6e, 0xa7, 0x63, 0xf9, 0xd5, 0x7c, 0x5c, 0x5e, + 0x50, 0x71, 0x42, 0x0a, 0x7d, 0x07, 0x66, 0x02, 0xca, 0x7d, 0x42, 0xa9, 0xd1, 0x26, 0xd5, 0x02, + 0x57, 0x9c, 0x91, 0x8a, 0x93, 0x92, 0x8c, 0x93, 0x72, 0xa8, 0x01, 0x28, 0x20, 0xad, 0xf5, 0xfc, + 0x03, 0xd7, 0x7b, 0x60, 0x74, 0x48, 0x75, 0x82, 0x6b, 0x87, 0x93, 0x8a, 0x38, 0x38, 0x45, 0x1a, + 0x6d, 0xc2, 0x7c, 0x9c, 0xba, 0xd9, 0x31, 0x2c, 0xbb, 0x5a, 0xe4, 0x20, 0xf3, 0x12, 0xa4, 0xa2, + 0xb0, 0x70, 0x9a, 0x3c, 0xfa, 0x01, 0x5c, 0x88, 0xcf, 0xcb, 0x27, 0x62, 0x34, 0x93, 0x1c, 0xe8, + 0x82, 0x04, 0x3a, 0x1f, 0x63, 0xe2, 0x74, 0x1d, 0xf4, 0x00, 0xde, 0x18, 0x62, 0x88, 0x61, 0x95, + 0x38, 0xda, 0x1b, 0x12, 0x6d, 0x3a, 0xce, 0xc5, 0x23, 0xb4, 0xf4, 0xef, 0xc1, 0x9c, 0xe2, 0x41, + 0x4d, 0xb7, 0xe7, 0x99, 0x44, 0xf9, 0xae, 0xda, 0x49, 0xdf, 0x55, 0xff, 0xb9, 0x06, 0x17, 0x1a, + 0x96, 0xbf, 0xd7, 0x33, 0x0f, 0x89, 0xff, 0x98, 0xec, 0xdd, 0x75, 0xdd, 0xc3, 0x75, 0xa3, 0x47, + 0x09, 0x7a, 0x06, 0x60, 0xba, 0x9d, 0x8e, 0xeb, 0x34, 0xbb, 0xc4, 0x94, 0xde, 0x77, 0xa3, 0xfe, + 0xd2, 0x8d, 0x5f, 0x5f, 0xe7, 0x4a, 0x2a, 0x54, 0x63, 0x51, 0x1a, 0x47, 0xc3, 0x3c, 0xac, 0x18, + 0xd1, 0x7f, 0x99, 0x83, 0x09, 0x3e, 0x89, 0xd7, 0xe0, 0xf8, 0x0f, 0xa0, 0x40, 0xd9, 0xc4, 0x72, + 0x1c, 0xfd, 0x5a, 0x86, 0x89, 0x89, 0xe5, 0xed, 0x12, 0xb3, 0x31, 0x25, 0x91, 0x0b, 0xec, 0x17, + 0xe6, 0x38, 0xe8, 0x11, 0x14, 0xa9, 0x6f, 0xf8, 0x3d, 0xca, 0x37, 0x46, 0x65, 0xb5, 0x9e, 0x19, + 0x91, 0x6b, 0x45, 0x1f, 0x48, 0xfc, 0xc6, 0x12, 0x4d, 0xff, 0x9b, 0x1c, 0x54, 0xb8, 0xdc, 0xba, + 0xeb, 0xb4, 0xac, 0xf6, 0x6b, 0x58, 0x99, 0xdd, 0xd8, 0xca, 0xac, 0x66, 0x9d, 0x87, 0x18, 0xdf, + 0xc8, 0xf5, 0x79, 0x9a, 0x58, 0x9f, 0xeb, 0x63, 0xe2, 0x9e, 0xbc, 0x4a, 0xbf, 0xd5, 0x60, 0x46, + 0x91, 0xde, 0xb6, 0xa8, 0x8f, 0x9e, 0x0e, 0xad, 0x54, 0x3d, 0xdb, 0x4a, 0x31, 0x6d, 0xbe, 0x4e, + 0xb3, 0xd2, 0x5a, 0x29, 0xa0, 0x28, 0xab, 0xd4, 0x84, 0x09, 0xcb, 0x27, 0x1d, 0x5a, 0xcd, 0x5d, + 0xc9, 0x8f, 0xf3, 0xb9, 0xc5, 0x00, 0x1b, 0xe7, 0x25, 0xf4, 0xc4, 0x16, 0x03, 0xc1, 0x02, 0x4b, + 0xff, 0x22, 0x1f, 0x9b, 0x06, 0x5b, 0x3e, 0x64, 0x42, 0xc9, 0xf7, 0xac, 0x76, 0x9b, 0x78, 0xb4, + 0xaa, 0x71, 0x5b, 0x37, 0xb2, 0xda, 0xda, 0x15, 0x7a, 0x3b, 0xae, 0x6d, 0x99, 0xc7, 0xd1, 0x6c, + 0x24, 0x99, 0xe2, 0x10, 0x18, 0xad, 0x41, 0xd9, 0xeb, 0x39, 0x42, 0x50, 0x46, 0x82, 0xb7, 0xa4, + 0x78, 0x19, 0x07, 0x8c, 0x17, 0xfd, 0xda, 0xb4, 0x88, 0x52, 0x01, 0x05, 0x47, 0x5a, 0xc8, 0x88, + 0x9d, 0x17, 0xe2, 0x23, 0xbf, 0x97, 0xf9, 0xbc, 0xe0, 0x7e, 0x13, 0xfa, 0x65, 0x44, 0x53, 0xcf, + 0x07, 0xb4, 0x0f, 0x97, 0x69, 0xcf, 0x34, 0x09, 0xa5, 0xad, 0x9e, 0xcd, 0x47, 0x42, 0xef, 0x5a, + 0xd4, 0x77, 0xbd, 0xe3, 0x6d, 0x8b, 0x85, 0x24, 0x16, 0x59, 0x26, 0x1a, 0x57, 0x06, 0xfd, 0xda, + 0xe5, 0xe6, 0x09, 0x72, 0xf8, 0x44, 0x14, 0xf4, 0x04, 0xaa, 0x2d, 0xc3, 0xb2, 0xc9, 0x7e, 0x8a, + 0x85, 0x09, 0x6e, 0xe1, 0xf2, 0xa0, 0x5f, 0xab, 0xde, 0x1e, 0x21, 0x83, 0x47, 0x6a, 0xeb, 0xf7, + 0x60, 0x6e, 0xc8, 0xa5, 0xd1, 0x0d, 0xa8, 0xd8, 0x06, 0xf5, 0x1f, 0x11, 0x8f, 0x9d, 0xed, 0xdc, + 0x53, 0xf3, 0x51, 0x68, 0xda, 0x8e, 0x58, 0x58, 0x95, 0xd3, 0x7f, 0xad, 0x41, 0x99, 0x83, 0xbd, + 0x06, 0x5f, 0xbf, 0x1f, 0xf7, 0xf5, 0xab, 0x59, 0xfd, 0x6f, 0x84, 0x97, 0x03, 0x94, 0xc4, 0xc8, + 0xdd, 0xb6, 0xfe, 0x69, 0x41, 0x7a, 0xfc, 0xb6, 0xdb, 0x0e, 0xb2, 0x9e, 0x65, 0x28, 0x9b, 0xae, + 0xe3, 0x1b, 0x6c, 0xc8, 0x32, 0x7c, 0xcd, 0x05, 0xce, 0xb8, 0x1e, 0x30, 0x70, 0x24, 0xc3, 0x82, + 0x5d, 0xcb, 0xb5, 0x6d, 0xf7, 0x23, 0xee, 0xba, 0xa5, 0xe8, 0x94, 0xb8, 0xcd, 0xa9, 0x58, 0x72, + 0xd1, 0x35, 0x28, 0x75, 0x59, 0x10, 0x75, 0xe5, 0x29, 0x54, 0x8a, 0x66, 0xbd, 0x23, 0xe9, 0x38, + 0x94, 0x40, 0xd7, 0x61, 0x8a, 0x5a, 0x8e, 0x49, 0x9a, 0xc4, 0x74, 0x9d, 0x7d, 0xca, 0xbd, 0x2b, + 0xdf, 0x98, 0x1d, 0xf4, 0x6b, 0x53, 0x4d, 0x85, 0x8e, 0x63, 0x52, 0xe8, 0x31, 0x94, 0xf9, 0xef, + 0x5d, 0x4b, 0x26, 0x2b, 0x95, 0xd5, 0xdf, 0xc9, 0xf6, 0x29, 0x98, 0x46, 0xe3, 0x3c, 0x9b, 0x64, + 0x33, 0x00, 0xc0, 0x11, 0x16, 0x5a, 0x05, 0x60, 0xd9, 0x27, 0xf5, 0x8d, 0x4e, 0x97, 0xf2, 0x0c, + 0xa6, 0x14, 0x6d, 0x98, 0xdd, 0x90, 0x83, 0x15, 0x29, 0xf4, 0x2e, 0x94, 0x7d, 0xc3, 0xb2, 0xb7, + 0x2d, 0x87, 0x50, 0x9e, 0xab, 0xe4, 0x85, 0x81, 0xdd, 0x80, 0x88, 0x23, 0x3e, 0xaa, 0x03, 0xd8, + 0xcc, 0x4d, 0x1b, 0xc7, 0x3e, 0xa1, 0x3c, 0x17, 0xc9, 0x37, 0xa6, 0x19, 0xf8, 0x76, 0x48, 0xc5, + 0x8a, 0x04, 0x5b, 0x75, 0xc7, 0xfd, 0xc8, 0xb0, 0xfc, 0x6a, 0x39, 0xbe, 0xea, 0x0f, 0xdc, 0xc7, + 0x86, 0xe5, 0x63, 0xc9, 0x45, 0x6f, 0xc3, 0xe4, 0x91, 0x74, 0x6e, 0xe0, 0xa0, 0x15, 0x96, 0xf6, + 0x05, 0x4e, 0x1d, 0xf0, 0xf4, 0x9f, 0x07, 0x81, 0xee, 0x61, 0xcf, 0xef, 0xf6, 0x7c, 0xf4, 0x3d, + 0xc8, 0xf9, 0xae, 0x74, 0xe6, 0xb7, 0x94, 0x15, 0xac, 0xb3, 0xf2, 0x20, 0x0a, 0x68, 0x98, 0xb4, + 0x88, 0x47, 0x1c, 0x93, 0x34, 0x8a, 0x83, 0x7e, 0x2d, 0xb7, 0xeb, 0xe2, 0x9c, 0xef, 0xa2, 0x27, + 0x00, 0xdd, 0x1e, 0x3d, 0x68, 0x12, 0xd3, 0x23, 0xbe, 0x8c, 0x64, 0x57, 0xd3, 0x40, 0xb6, 0x5d, + 0xd3, 0xb0, 0x93, 0x48, 0x7c, 0xd6, 0x3b, 0xa1, 0x3e, 0x56, 0xb0, 0xd0, 0x3e, 0x54, 0xac, 0x8e, + 0xd1, 0x26, 0xdb, 0xc6, 0x1e, 0xb1, 0x99, 0x1b, 0xe5, 0x33, 0x9e, 0x73, 0x5b, 0xa1, 0x56, 0xb4, + 0xbb, 0x23, 0x1a, 0xc5, 0x2a, 0xac, 0xfe, 0x27, 0x1a, 0xcc, 0xf3, 0xc5, 0xd8, 0x71, 0xa9, 0x2f, + 0xf2, 0x3d, 0x7e, 0x02, 0xbe, 0x0d, 0x93, 0xec, 0x3c, 0x34, 0x9c, 0x7d, 0x1e, 0x0b, 0xca, 0x62, + 0x2d, 0xd7, 0x05, 0x09, 0x07, 0x3c, 0x74, 0x19, 0x0a, 0x86, 0xd7, 0x16, 0xfb, 0xb5, 0xdc, 0x28, + 0xb1, 0x50, 0xbc, 0xe6, 0xb5, 0x29, 0xe6, 0x54, 0xf6, 0xe1, 0xa8, 0xe9, 0x59, 0xdd, 0xa1, 0x1c, + 0xbe, 0xc9, 0xa9, 0x58, 0x72, 0xf5, 0xdf, 0x4e, 0xc2, 0x94, 0x5a, 0x95, 0xbc, 0x86, 0xdc, 0xe3, + 0x03, 0x28, 0x05, 0x59, 0xae, 0xfc, 0x6a, 0x2b, 0x19, 0x96, 0x56, 0xe4, 0xbc, 0x58, 0x2a, 0x36, + 0xa6, 0xd8, 0x86, 0x0e, 0x7e, 0xe1, 0x10, 0x10, 0x11, 0x98, 0x95, 0x01, 0x8f, 0xec, 0x37, 0x8e, + 0xf9, 0xda, 0xcb, 0x38, 0x95, 0xc9, 0xbf, 0x16, 0x06, 0xfd, 0xda, 0xec, 0x6e, 0x02, 0x00, 0x0f, + 0x41, 0xa2, 0x35, 0x28, 0xb4, 0x3c, 0xb7, 0xc3, 0xcf, 0x8b, 0x8c, 0xd0, 0xfc, 0x0b, 0xdd, 0xf6, + 0xdc, 0x0e, 0xe6, 0xaa, 0xe8, 0x09, 0x14, 0xf7, 0x78, 0x4a, 0x2f, 0x4f, 0x90, 0x4c, 0xc9, 0x52, + 0xb2, 0x06, 0x68, 0x00, 0xfb, 0xa6, 0x82, 0x8c, 0x25, 0x1e, 0x5a, 0x89, 0x47, 0x9b, 0x22, 0xdf, + 0x90, 0x33, 0x27, 0x45, 0x1a, 0xf4, 0x1d, 0xc8, 0x13, 0xe7, 0xa8, 0x3a, 0xc9, 0x3d, 0x7d, 0x31, + 0x6d, 0x3a, 0x9b, 0xce, 0xd1, 0x23, 0xc3, 0x6b, 0x54, 0xe4, 0xa7, 0xcd, 0x6f, 0x3a, 0x47, 0x98, + 0xe9, 0xa0, 0x43, 0xa8, 0x28, 0xcb, 0x53, 0x2d, 0x71, 0x88, 0xeb, 0x63, 0xa6, 0x2f, 0xa2, 0x86, + 0x08, 0xf7, 0x8c, 0xf2, 0x05, 0xb0, 0x8a, 0x8e, 0x7e, 0xa6, 0xc1, 0x85, 0x7d, 0xd7, 0x3c, 0x24, + 0x5e, 0xd3, 0x67, 0x25, 0x76, 0xfb, 0x58, 0x06, 0x14, 0x7e, 0x3e, 0x55, 0x56, 0x6f, 0x65, 0xb0, + 0xbb, 0x91, 0xa6, 0xdf, 0xb8, 0x34, 0xe8, 0xd7, 0x2e, 0xa4, 0xb2, 0x70, 0xba, 0x45, 0x3e, 0x16, + 0xca, 0xbf, 0x42, 0x72, 0x2c, 0x90, 0x79, 0x2c, 0xcd, 0x34, 0x7d, 0x31, 0x96, 0x54, 0x16, 0x4e, + 0xb7, 0xa8, 0xff, 0xdb, 0x84, 0x3c, 0x58, 0x65, 0x69, 0xf8, 0x3e, 0x14, 0xfc, 0xe3, 0x6e, 0x50, + 0x18, 0xd6, 0x82, 0x5c, 0x7d, 0xf7, 0xb8, 0x4b, 0x5e, 0xf4, 0x6b, 0x33, 0x8a, 0x28, 0x23, 0x61, + 0x2e, 0xac, 0x78, 0x64, 0xee, 0x15, 0x7b, 0x64, 0x1d, 0x40, 0xac, 0x61, 0x8b, 0x55, 0xab, 0xf2, + 0x44, 0x62, 0x07, 0xc4, 0x46, 0x48, 0xc5, 0x8a, 0x04, 0xda, 0x86, 0x7c, 0x5b, 0xe6, 0x7a, 0xd9, + 0x4e, 0x87, 0x3b, 0x96, 0xaf, 0x8e, 0x61, 0x92, 0x79, 0xe8, 0x1d, 0xcb, 0xc7, 0x0c, 0x86, 0x95, + 0x6d, 0xfc, 0xdc, 0xa5, 0xd5, 0x89, 0xcc, 0x79, 0x3c, 0xdf, 0xe6, 0x12, 0x2d, 0x3c, 0x3b, 0x39, + 0x91, 0x62, 0x89, 0xc6, 0xa2, 0x35, 0xcb, 0x4f, 0xc8, 0xc7, 0xfe, 0x86, 0xe5, 0xc9, 0x7e, 0x83, + 0x92, 0xde, 0x06, 0x1c, 0xac, 0x48, 0xa1, 0x1f, 0xc3, 0x94, 0xfc, 0x82, 0x22, 0x6c, 0x4d, 0x8e, + 0x19, 0xb6, 0x44, 0x6a, 0xa2, 0x20, 0xe0, 0x18, 0x1e, 0xfa, 0x43, 0x98, 0xa4, 0xfc, 0x2f, 0x3a, + 0xc6, 0x4e, 0x14, 0xba, 0xea, 0x02, 0x86, 0x9d, 0x1b, 0xc1, 0xa2, 0x38, 0x40, 0x45, 0x87, 0x7c, + 0xd2, 0x2d, 0xab, 0x7d, 0xdf, 0xe8, 0xb2, 0x5d, 0xc7, 0x6c, 0xfc, 0x6e, 0xa6, 0x12, 0x40, 0x2a, + 0xa9, 0x66, 0xd4, 0xd5, 0x92, 0x90, 0x58, 0x81, 0xd7, 0xff, 0x3d, 0x48, 0x80, 0x79, 0x60, 0x34, + 0x52, 0xba, 0x15, 0xaf, 0xb8, 0xfa, 0x48, 0x1c, 0x66, 0xb9, 0xaf, 0xf2, 0x30, 0xd3, 0x3f, 0x9d, + 0x0c, 0x36, 0xad, 0xa8, 0x12, 0x56, 0x60, 0xa2, 0x7b, 0x60, 0xd0, 0x60, 0xd7, 0x7e, 0x23, 0x48, + 0xac, 0x77, 0x18, 0xf1, 0x45, 0xbf, 0x06, 0x22, 0x5b, 0x60, 0xbf, 0xb0, 0x90, 0xe4, 0x69, 0xb4, + 0xe1, 0x98, 0xc4, 0xb6, 0xc9, 0xbe, 0x4c, 0x8c, 0xa3, 0x34, 0x3a, 0x60, 0xe0, 0x48, 0x06, 0xdd, + 0x84, 0xa2, 0x47, 0x0c, 0xea, 0x3a, 0x72, 0x17, 0x2e, 0x05, 0xbe, 0x8d, 0x39, 0xf5, 0x05, 0xf3, + 0x2e, 0x51, 0x76, 0xf3, 0xdf, 0x58, 0x4a, 0xa3, 0x77, 0x60, 0xb2, 0x73, 0x72, 0x6f, 0x2f, 0xe0, + 0xa3, 0x16, 0x4c, 0x53, 0xdf, 0xf0, 0xfc, 0x30, 0x5f, 0x3d, 0x45, 0x8a, 0x8c, 0x06, 0xfd, 0xda, + 0x74, 0x33, 0x86, 0x82, 0x13, 0xa8, 0xa8, 0x07, 0xf3, 0xa6, 0xdb, 0xe9, 0xda, 0x84, 0x1d, 0x81, + 0x91, 0xb1, 0xe2, 0xd8, 0xc6, 0x2e, 0x0e, 0xfa, 0xb5, 0xf9, 0xf5, 0x61, 0x28, 0x9c, 0x86, 0x8f, + 0x7e, 0x0f, 0x4a, 0xfb, 0x3d, 0xcf, 0x60, 0x44, 0x99, 0x6e, 0xbf, 0x19, 0x14, 0x18, 0x1b, 0x92, + 0xfe, 0xa2, 0x5f, 0x3b, 0xcf, 0x32, 0xf4, 0x7a, 0x40, 0xc0, 0xa1, 0x0a, 0xda, 0x83, 0x45, 0x97, + 0x27, 0xbf, 0xe2, 0xe8, 0x13, 0x09, 0x46, 0xb0, 0xbd, 0x65, 0x77, 0x50, 0x97, 0x80, 0x8b, 0x0f, + 0x47, 0x4a, 0xe2, 0x13, 0x50, 0xd0, 0x1d, 0x28, 0x8a, 0x4d, 0x24, 0xa3, 0x62, 0xa6, 0xfc, 0x04, + 0x44, 0x87, 0x97, 0xa9, 0x61, 0xa9, 0x8e, 0x9e, 0x42, 0x51, 0x98, 0x91, 0x21, 0xed, 0xfa, 0x78, + 0x0d, 0x2f, 0x31, 0xfc, 0xe8, 0xfc, 0x14, 0xbf, 0xb1, 0xc4, 0x44, 0xbb, 0xbc, 0x5d, 0xc4, 0xce, + 0xe5, 0x0a, 0xdf, 0x67, 0x59, 0x1a, 0x74, 0x4d, 0xa6, 0xb0, 0xe5, 0xb4, 0xdc, 0x58, 0x9b, 0x88, + 0x9f, 0xca, 0x02, 0x8b, 0x9d, 0xca, 0xb6, 0xdb, 0x6e, 0x3a, 0x56, 0xb7, 0x4b, 0xfc, 0xea, 0x54, + 0xfc, 0x54, 0xde, 0x0e, 0x39, 0x58, 0x91, 0xd2, 0x4d, 0x59, 0xb4, 0xab, 0xc3, 0x46, 0x0f, 0x94, + 0xe2, 0xe4, 0xe6, 0x69, 0x26, 0xbe, 0xeb, 0xaa, 0xf5, 0x8a, 0xbe, 0x2d, 0xd3, 0xfd, 0xb8, 0x08, + 0xba, 0x21, 0x8b, 0x8d, 0x0d, 0xab, 0x4d, 0xa8, 0x2f, 0xf7, 0x7e, 0xbc, 0x7a, 0x10, 0x2c, 0xac, + 0xca, 0xe9, 0xbf, 0x29, 0xc0, 0x79, 0x09, 0x27, 0x52, 0x01, 0x74, 0x23, 0x16, 0xf3, 0xdf, 0x4c, + 0xc4, 0xfc, 0xb9, 0x98, 0xb0, 0x12, 0xf5, 0x3d, 0x98, 0x8e, 0xe7, 0x37, 0x32, 0xfa, 0xdf, 0xcc, + 0x9c, 0x4a, 0xc5, 0x90, 0xc5, 0xd6, 0x8d, 0x27, 0x52, 0x38, 0x61, 0x81, 0xd9, 0x8c, 0xe7, 0x31, + 0x32, 0x47, 0xbf, 0x99, 0x39, 0x65, 0x4a, 0xb1, 0x19, 0x4f, 0x98, 0x70, 0xc2, 0x02, 0xb3, 0x69, + 0xf6, 0xa8, 0xef, 0x76, 0x42, 0x9b, 0x85, 0xcc, 0x36, 0xd7, 0xb9, 0x62, 0x8a, 0xcd, 0xf5, 0x18, + 0x22, 0x4e, 0x58, 0x40, 0xbf, 0xd2, 0xe0, 0xe2, 0x87, 0xc4, 0x39, 0xb4, 0x1c, 0xba, 0x63, 0x75, + 0x89, 0x6d, 0x39, 0xd1, 0x8c, 0xc5, 0xa1, 0xf8, 0xfb, 0x19, 0xac, 0xdf, 0x8b, 0x23, 0xc4, 0x87, + 0xf1, 0x8d, 0x41, 0xbf, 0x76, 0xf1, 0x5e, 0xba, 0x0d, 0x3c, 0xca, 0xb8, 0xfe, 0xd3, 0x09, 0xe9, + 0xf1, 0x6a, 0xc8, 0x52, 0x0f, 0x79, 0xed, 0x25, 0x87, 0xbc, 0x07, 0xd3, 0xfc, 0x9a, 0xcb, 0x32, + 0x65, 0xa7, 0x7f, 0x0c, 0xaf, 0xb9, 0x13, 0x53, 0x14, 0xd1, 0x92, 0xaf, 0x66, 0x9c, 0x81, 0x13, + 0x16, 0x90, 0x03, 0xe7, 0x05, 0x78, 0x60, 0x32, 0x9f, 0xf9, 0xc2, 0xe2, 0x8e, 0xe5, 0xdf, 0x0d, + 0xf5, 0x84, 0xc5, 0xb9, 0x41, 0xbf, 0x76, 0x3e, 0x46, 0xc7, 0x71, 0x78, 0xd4, 0x83, 0x59, 0xbe, + 0xe3, 0xd6, 0x0f, 0x0c, 0xa7, 0x2d, 0x96, 0x5d, 0xfa, 0xcc, 0xfb, 0x59, 0x33, 0x48, 0xa1, 0x2a, + 0x0c, 0xf2, 0xda, 0x72, 0x2b, 0x01, 0x88, 0x87, 0x4c, 0xc8, 0x69, 0xda, 0x46, 0x38, 0xcd, 0x89, + 0x71, 0xa6, 0xb9, 0x6d, 0xa4, 0x4f, 0x33, 0xa2, 0xe3, 0x38, 0x3c, 0xfa, 0x09, 0xcc, 0xee, 0x25, + 0x6e, 0x87, 0x64, 0x10, 0xbd, 0x95, 0xa9, 0x00, 0x48, 0xb9, 0x58, 0x12, 0x73, 0x4d, 0xb2, 0xf0, + 0x90, 0x1d, 0xfd, 0xd7, 0x05, 0x40, 0xc3, 0x6d, 0x6c, 0x74, 0x3d, 0x76, 0x94, 0x5d, 0x49, 0x1c, + 0x65, 0xb3, 0xaa, 0x86, 0x72, 0x92, 0x3d, 0x85, 0xa2, 0x18, 0xef, 0x18, 0x6d, 0x05, 0x39, 0x10, + 0x09, 0x96, 0xe6, 0x14, 0x12, 0x93, 0x65, 0xd6, 0xd2, 0x1f, 0xa5, 0xdf, 0x9d, 0x02, 0x3e, 0xcd, + 0xcb, 0x03, 0x54, 0x74, 0x20, 0x03, 0x81, 0xf0, 0x05, 0xe9, 0x69, 0x37, 0xc6, 0xf3, 0xb4, 0xc0, + 0xd0, 0x4c, 0x18, 0x3b, 0x04, 0x1d, 0xab, 0xd0, 0x72, 0xa1, 0x6c, 0x63, 0x4f, 0xba, 0xd6, 0x19, + 0x16, 0x4a, 0x71, 0x2b, 0x89, 0x89, 0x08, 0x94, 0xc3, 0xef, 0x2c, 0x1d, 0xe9, 0x14, 0x06, 0xd2, + 0x3d, 0x28, 0x42, 0xd6, 0xff, 0xa5, 0x08, 0x4a, 0x16, 0x8f, 0xbe, 0x0f, 0xd3, 0x94, 0x78, 0x47, + 0x96, 0x49, 0xd6, 0x4c, 0xd3, 0xed, 0x39, 0x41, 0x24, 0x0d, 0x6f, 0x5a, 0x9b, 0x31, 0x2e, 0x4e, + 0x48, 0xf3, 0xbb, 0x3d, 0x1e, 0x30, 0xa4, 0xf3, 0x64, 0xbf, 0xdb, 0x4b, 0x14, 0x89, 0xb2, 0x51, + 0x25, 0xd1, 0x62, 0xdd, 0xae, 0xfc, 0xab, 0xee, 0x76, 0xfd, 0x18, 0x4a, 0x34, 0x1e, 0xcd, 0xbe, + 0x9d, 0x3d, 0x51, 0x91, 0x01, 0x24, 0x6c, 0x8f, 0x87, 0x51, 0x23, 0xc4, 0x64, 0x8b, 0x22, 0xf3, + 0xbf, 0x89, 0xf1, 0x16, 0xe5, 0x25, 0x99, 0xdf, 0x1f, 0x40, 0xd9, 0x23, 0x62, 0x81, 0xa8, 0x74, + 0x91, 0xd4, 0x12, 0x18, 0x4b, 0x21, 0x4c, 0x9e, 0xf5, 0x2c, 0x8f, 0x74, 0x88, 0xe3, 0xd3, 0xa8, + 0xc0, 0x09, 0xb8, 0x14, 0x47, 0x68, 0xe8, 0x43, 0x80, 0x6e, 0xd8, 0x4f, 0x95, 0xe5, 0x75, 0xe6, + 0xec, 0x2d, 0xde, 0x89, 0x8d, 0xd2, 0xc6, 0x88, 0x8e, 0x15, 0x74, 0xf4, 0x01, 0x5c, 0x8a, 0x2a, + 0x84, 0x0d, 0x62, 0xec, 0xf3, 0x18, 0x2b, 0xaf, 0x12, 0x44, 0x73, 0xfd, 0x9b, 0x83, 0x7e, 0xed, + 0xd2, 0xfa, 0x28, 0x21, 0x3c, 0x5a, 0x1f, 0x75, 0x60, 0xca, 0x71, 0xf7, 0x49, 0x93, 0xd8, 0xc4, + 0xf4, 0x5d, 0x4f, 0xa6, 0xf2, 0x59, 0x4a, 0x6d, 0xd1, 0x14, 0x32, 0xec, 0x07, 0x8a, 0xba, 0x68, + 0x1c, 0xa8, 0x14, 0x1c, 0x83, 0xd7, 0xff, 0x5c, 0x83, 0x94, 0xab, 0xfb, 0x98, 0xfb, 0x6a, 0xaf, + 0xda, 0x7d, 0xbf, 0x05, 0x45, 0x1a, 0x75, 0xef, 0xd5, 0x26, 0xb5, 0x68, 0x6d, 0x48, 0xae, 0xfe, + 0x0f, 0x1a, 0x2c, 0xa4, 0xf5, 0x0f, 0x98, 0x1f, 0x85, 0xdd, 0x02, 0x39, 0xbc, 0xec, 0xad, 0x14, + 0xf5, 0xbe, 0x49, 0x40, 0xe0, 0x08, 0x8d, 0x9d, 0x27, 0xfb, 0x84, 0xfa, 0x96, 0xc3, 0xcb, 0xb6, + 0x0d, 0xcb, 0x93, 0x63, 0x0c, 0xcf, 0x93, 0x8d, 0x18, 0x17, 0x27, 0xa4, 0xf5, 0x5f, 0x14, 0x60, + 0x3e, 0x25, 0x6d, 0x44, 0x9b, 0xb2, 0x73, 0x3c, 0xc6, 0xa5, 0x47, 0x78, 0xd5, 0x1e, 0xeb, 0x1e, + 0x43, 0xb7, 0x67, 0xdb, 0x67, 0xbb, 0xfc, 0x08, 0xf4, 0xb1, 0x82, 0x15, 0xb4, 0x82, 0xf3, 0xa7, + 0x68, 0x05, 0xdf, 0x03, 0x44, 0x3e, 0xee, 0xba, 0x94, 0xc8, 0xf4, 0xdf, 0xe5, 0x21, 0xa0, 0xc0, + 0xdb, 0x12, 0xe1, 0xfb, 0x90, 0xcd, 0x21, 0x09, 0x9c, 0xa2, 0x85, 0x96, 0xa1, 0xdc, 0x72, 0x3d, + 0x93, 0xb0, 0x51, 0xf2, 0xd3, 0x47, 0xe9, 0x6c, 0xdc, 0x0e, 0x18, 0x38, 0x92, 0x41, 0x4f, 0xa2, + 0xce, 0x57, 0x31, 0xf3, 0x85, 0x8d, 0x98, 0x33, 0xdf, 0xec, 0xa3, 0x5b, 0x5e, 0x6b, 0x30, 0xc3, + 0x15, 0xd6, 0x76, 0xb6, 0x82, 0x9e, 0xba, 0x78, 0x13, 0x74, 0x51, 0xaa, 0x88, 0x7e, 0x6a, 0xc4, + 0xc6, 0x49, 0x79, 0xfd, 0x79, 0x01, 0xe6, 0x53, 0x8a, 0xa5, 0xf0, 0x1e, 0x41, 0x3b, 0xcb, 0x3d, + 0xc2, 0x57, 0xe5, 0x09, 0xef, 0xc0, 0xa4, 0xe3, 0xae, 0x1b, 0xe6, 0x01, 0x91, 0x37, 0xa9, 0xe1, + 0x12, 0x3d, 0x10, 0x64, 0x1c, 0xf0, 0x03, 0xa7, 0x29, 0x9c, 0xc2, 0x69, 0xc6, 0xfe, 0xd0, 0xdf, + 0x0f, 0x0a, 0xd6, 0x96, 0x65, 0x93, 0x1d, 0xc3, 0x3f, 0x90, 0xad, 0xd7, 0x68, 0x67, 0xc6, 0xb8, + 0x38, 0x21, 0x8d, 0x7e, 0x00, 0x65, 0xf1, 0x79, 0xbc, 0x36, 0xcd, 0x70, 0xe3, 0x11, 0x0e, 0xa6, + 0x11, 0x28, 0xe1, 0x48, 0x1f, 0x75, 0xe1, 0x22, 0xcf, 0xac, 0xd8, 0x99, 0xdb, 0xb1, 0x7e, 0xc2, + 0xb7, 0xbf, 0x7c, 0x62, 0x21, 0x7a, 0x39, 0x37, 0x59, 0x7d, 0xb6, 0x95, 0x2e, 0xf2, 0x62, 0x34, + 0x0b, 0x8f, 0x82, 0xd5, 0x7f, 0xa1, 0x41, 0xfa, 0x3d, 0x45, 0x7c, 0x62, 0xda, 0x19, 0x27, 0xf6, + 0x76, 0xf4, 0xf1, 0x45, 0x5f, 0xb1, 0x92, 0xf6, 0xe1, 0xf5, 0xbf, 0xd0, 0x60, 0x3e, 0xa5, 0x9e, + 0xfb, 0x7a, 0xc4, 0x8d, 0xcf, 0x73, 0xc9, 0xc1, 0x6d, 0x1e, 0x11, 0xc7, 0x3f, 0xdd, 0xed, 0xc8, + 0xa6, 0xb8, 0x93, 0xc8, 0xc9, 0xf6, 0x62, 0xa6, 0x62, 0x8c, 0x37, 0xaa, 0xe2, 0x97, 0x11, 0x67, + 0x38, 0x5e, 0x47, 0x5f, 0x7e, 0x15, 0x5e, 0xf7, 0xe5, 0x97, 0xfe, 0x8f, 0x1a, 0x4c, 0xc7, 0x2f, + 0x5d, 0xd0, 0x37, 0x21, 0xdf, 0xf3, 0x2c, 0xb9, 0xa8, 0xe1, 0xe8, 0x7f, 0x88, 0xb7, 0x30, 0xa3, + 0x33, 0xb6, 0x47, 0x5a, 0xf2, 0x8b, 0x85, 0x6c, 0x4c, 0x5a, 0x98, 0xd1, 0x11, 0x81, 0x4a, 0xd7, + 0x73, 0x3f, 0x3e, 0x16, 0xc1, 0x78, 0x8c, 0x07, 0x76, 0x3b, 0x91, 0x56, 0xd4, 0x36, 0x53, 0x88, + 0x58, 0xc5, 0xe5, 0x69, 0xce, 0x70, 0x33, 0xe0, 0xeb, 0xe1, 0xae, 0xff, 0xad, 0xc1, 0xa4, 0x74, + 0x1a, 0xf4, 0x0c, 0xa6, 0xdb, 0xb1, 0xe5, 0x1d, 0x63, 0x58, 0x89, 0xcb, 0xb0, 0xf0, 0x5c, 0x8c, + 0xd3, 0x71, 0xc2, 0x00, 0xfa, 0x63, 0x98, 0x6b, 0x5b, 0x7e, 0x7c, 0x4e, 0x63, 0xdc, 0x04, 0xde, + 0x49, 0xea, 0x36, 0x2e, 0x49, 0xc3, 0x73, 0x43, 0x2c, 0x3c, 0x6c, 0x49, 0xff, 0x54, 0x7c, 0x99, + 0x44, 0xff, 0xe2, 0x7f, 0xe3, 0x89, 0xea, 0xdf, 0xe7, 0x60, 0x78, 0xc8, 0xec, 0x2b, 0x9a, 0xa2, + 0xa8, 0xd0, 0x52, 0x5f, 0x45, 0x4b, 0x2e, 0x2b, 0xae, 0x0d, 0xfe, 0xac, 0x78, 0x8c, 0xb5, 0x13, + 0xa6, 0xd6, 0x5d, 0xc7, 0xf7, 0x5c, 0xfb, 0x87, 0x94, 0x78, 0xca, 0x5b, 0x5e, 0x8e, 0x85, 0x25, + 0x26, 0x2b, 0xae, 0xcd, 0xe0, 0x69, 0xf0, 0x18, 0xaf, 0x2c, 0x87, 0x0d, 0x28, 0xd9, 0xaf, 0x84, + 0xc3, 0x11, 0xf2, 0x18, 0xd7, 0x3d, 0xfa, 0xcf, 0x34, 0x98, 0x4d, 0xf6, 0xba, 0x98, 0x3e, 0x8f, + 0x5f, 0x5b, 0x1b, 0xc9, 0x4e, 0xe2, 0x96, 0x20, 0xe3, 0x80, 0x8f, 0xee, 0xc1, 0x24, 0xcb, 0x63, + 0xb0, 0x3c, 0x1b, 0x32, 0x66, 0x41, 0x3c, 0x1a, 0xdd, 0x16, 0x7a, 0x38, 0x00, 0xd0, 0xff, 0x4e, + 0x03, 0x34, 0xdc, 0x0d, 0x41, 0x3b, 0xb0, 0x60, 0x1b, 0xd4, 0x0f, 0x2f, 0xe2, 0xb6, 0x62, 0x43, + 0xbb, 0x2c, 0x87, 0xb6, 0xb0, 0x9d, 0x22, 0x83, 0x53, 0x35, 0xc3, 0xbc, 0x2d, 0x77, 0xea, 0xbc, + 0x4d, 0x6f, 0x02, 0x44, 0x4f, 0x83, 0xd0, 0x15, 0x28, 0x38, 0x46, 0x27, 0x08, 0x49, 0x61, 0xc6, + 0xcf, 0xdf, 0x98, 0x73, 0x0e, 0x7a, 0x0b, 0x26, 0x8e, 0x0c, 0xbb, 0x17, 0x3c, 0xe2, 0x0f, 0x9f, + 0xdd, 0x3d, 0x62, 0x44, 0x2c, 0x78, 0xfa, 0x5f, 0xe6, 0xa0, 0xa2, 0x5c, 0x5d, 0xbf, 0xaa, 0x6a, + 0xe3, 0x31, 0x4c, 0x74, 0x0d, 0xff, 0x20, 0x78, 0x1c, 0xb8, 0x3a, 0xde, 0x05, 0x3a, 0xcb, 0xba, + 0xa2, 0xf1, 0xb2, 0x5f, 0x14, 0x0b, 0xbc, 0x44, 0xf2, 0x9a, 0x7f, 0x85, 0xc9, 0xeb, 0x1b, 0x90, + 0x33, 0x28, 0x4f, 0x48, 0xcb, 0xe2, 0x16, 0x66, 0x8d, 0xe2, 0x9c, 0x41, 0xf5, 0x9f, 0x6a, 0x30, + 0x93, 0x18, 0x1b, 0x5a, 0x05, 0xa0, 0xe1, 0x2f, 0xf9, 0x09, 0xc2, 0xda, 0x3f, 0x92, 0xc3, 0x8a, + 0xd4, 0x99, 0xeb, 0xc3, 0x7f, 0xd5, 0xe0, 0xf2, 0x49, 0x8d, 0x7d, 0x56, 0x75, 0xc8, 0xee, 0x7d, + 0x98, 0xe7, 0x6a, 0xf1, 0xaa, 0xe3, 0x5e, 0x9c, 0x8d, 0x93, 0xf2, 0xe8, 0x06, 0x54, 0x14, 0x92, + 0x1c, 0x60, 0x18, 0x23, 0x15, 0x75, 0xac, 0xca, 0x9d, 0x21, 0x45, 0xd1, 0xff, 0x59, 0x83, 0x85, + 0xb4, 0xf6, 0x03, 0x6a, 0x07, 0xcf, 0x4b, 0x45, 0x5e, 0xda, 0x38, 0x65, 0x1b, 0xa3, 0xce, 0x1f, + 0x99, 0x6e, 0x3a, 0xbe, 0x77, 0x9c, 0xfe, 0xf0, 0x74, 0xf1, 0x16, 0x40, 0x24, 0x83, 0x66, 0x21, + 0x7f, 0x48, 0x8e, 0xc5, 0xc2, 0x61, 0xf6, 0x27, 0x5a, 0x88, 0x6d, 0x23, 0xb9, 0x6f, 0xbe, 0x9b, + 0xbb, 0xa5, 0x7d, 0xb7, 0xf4, 0x67, 0x7f, 0x55, 0x3b, 0xf7, 0xc9, 0x17, 0x57, 0xce, 0xe9, 0xbf, + 0xd4, 0x40, 0xcd, 0x20, 0xd0, 0xbb, 0x50, 0x3e, 0xf0, 0xfd, 0x2e, 0x27, 0xc9, 0x7b, 0x73, 0xfe, + 0xc4, 0xf2, 0xee, 0xee, 0xee, 0x0e, 0x27, 0xe2, 0x88, 0x8f, 0xea, 0x00, 0xec, 0x07, 0x15, 0xd2, + 0x85, 0xe8, 0xad, 0x0b, 0x93, 0x6e, 0x0a, 0x71, 0x45, 0x42, 0x24, 0xda, 0x42, 0x58, 0xfc, 0xdf, + 0x8b, 0x4c, 0xb4, 0x85, 0x64, 0xc0, 0xd3, 0xff, 0x56, 0x83, 0xb9, 0xa1, 0x77, 0x1a, 0x68, 0x27, + 0x4c, 0x2d, 0xc6, 0xed, 0x7e, 0x8c, 0x48, 0x42, 0xce, 0xec, 0xd7, 0xb7, 0x60, 0x41, 0x20, 0x72, + 0xab, 0xd1, 0x9d, 0xf4, 0x4b, 0x0f, 0x38, 0xfd, 0xaf, 0x35, 0x80, 0xa8, 0x1e, 0x47, 0x7b, 0x30, + 0x25, 0x86, 0x14, 0xcb, 0x7f, 0xb2, 0x4f, 0x70, 0x41, 0x9a, 0x98, 0x6a, 0x2a, 0x28, 0x38, 0x86, + 0xc9, 0x6a, 0xcf, 0x8e, 0xdb, 0x73, 0x7c, 0xbe, 0xbb, 0x72, 0xf1, 0x57, 0xc8, 0xf7, 0x03, 0x06, + 0x8e, 0x64, 0xf4, 0x4f, 0xf2, 0x30, 0x9f, 0x72, 0x01, 0xf9, 0xff, 0xba, 0xab, 0xf3, 0x0e, 0x4c, + 0x8a, 0xc7, 0xa2, 0x34, 0x99, 0x0b, 0x88, 0xb7, 0xa4, 0x14, 0x07, 0x7c, 0xb4, 0x02, 0x15, 0xcb, + 0x31, 0x45, 0xa3, 0xd6, 0x08, 0xaa, 0x79, 0x71, 0x17, 0x11, 0x91, 0xb1, 0x2a, 0x13, 0x2f, 0xff, + 0x8b, 0x2f, 0x2f, 0xff, 0xf5, 0x1f, 0xc1, 0xdc, 0x50, 0x36, 0x93, 0x2d, 0x7c, 0x12, 0xfe, 0x0f, + 0x58, 0x89, 0xf0, 0x29, 0xfe, 0xef, 0x4a, 0xf0, 0xf4, 0x5f, 0x69, 0x30, 0x9d, 0x48, 0xfb, 0x4e, + 0x55, 0x2b, 0x3e, 0x54, 0x6b, 0xc5, 0xd3, 0x25, 0xcf, 0xb1, 0xaa, 0x51, 0xbf, 0x07, 0xe9, 0xef, + 0x01, 0x93, 0x2b, 0xae, 0xbd, 0x7c, 0xc5, 0xf5, 0xdf, 0xe4, 0xa0, 0x1c, 0x3e, 0xa3, 0x40, 0xef, + 0xc5, 0x56, 0xee, 0x92, 0xba, 0x72, 0x2f, 0xfa, 0x35, 0x21, 0xa8, 0x2c, 0xe3, 0x07, 0x50, 0x0e, + 0x9f, 0xe1, 0x84, 0xb5, 0x70, 0xf6, 0xa7, 0x36, 0xe1, 0xa7, 0x0d, 0xdf, 0xf6, 0xe0, 0x08, 0x8f, + 0xe5, 0x69, 0xc1, 0x3b, 0x99, 0xfb, 0x96, 0x6d, 0x5b, 0x54, 0xb6, 0xd2, 0xf3, 0xbc, 0x95, 0x1e, + 0xe6, 0x69, 0x1b, 0x29, 0x32, 0x38, 0x55, 0x13, 0xed, 0xc0, 0x04, 0xf5, 0x49, 0x97, 0xca, 0xce, + 0xd4, 0xbb, 0x99, 0x5e, 0x98, 0x90, 0x2e, 0xaf, 0xdb, 0x43, 0x17, 0x61, 0x14, 0x8a, 0x05, 0x90, + 0xfe, 0x5f, 0x1a, 0x94, 0x02, 0x11, 0x74, 0x2d, 0xb6, 0x78, 0xd5, 0xc4, 0xe2, 0x71, 0xb9, 0xff, + 0xb3, 0x6b, 0xa7, 0xf7, 0x35, 0x98, 0x8e, 0x5f, 0xca, 0x29, 0x95, 0xac, 0x76, 0x52, 0x25, 0x8b, + 0xae, 0x41, 0xc9, 0xb0, 0x6d, 0xf7, 0xa3, 0x4d, 0xe7, 0x48, 0x76, 0x8f, 0xc2, 0x5b, 0xa6, 0x35, + 0x49, 0xc7, 0xa1, 0x04, 0x3a, 0x82, 0x19, 0xa1, 0x17, 0xbd, 0x83, 0xca, 0x67, 0xbe, 0xec, 0x48, + 0x0b, 0x36, 0x8d, 0x79, 0x96, 0x1e, 0x35, 0xe3, 0x98, 0x38, 0x69, 0xa4, 0x71, 0xf5, 0xf9, 0x97, + 0x4b, 0xe7, 0x3e, 0xfb, 0x72, 0xe9, 0xdc, 0xe7, 0x5f, 0x2e, 0x9d, 0xfb, 0x64, 0xb0, 0xa4, 0x3d, + 0x1f, 0x2c, 0x69, 0x9f, 0x0d, 0x96, 0xb4, 0xcf, 0x07, 0x4b, 0xda, 0x7f, 0x0c, 0x96, 0xb4, 0x3f, + 0xfd, 0xcf, 0xa5, 0x73, 0x3f, 0xca, 0x1d, 0xad, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, + 0x63, 0xae, 0x93, 0x3f, 0x3d, 0x00, 0x00, } diff --git a/vendor/github.com/openshift/api/build/v1/generated.proto b/vendor/github.com/openshift/api/build/v1/generated.proto index b0b4e5db69e6..2f6b987b077a 100644 --- a/vendor/github.com/openshift/api/build/v1/generated.proto +++ b/vendor/github.com/openshift/api/build/v1/generated.proto @@ -375,6 +375,10 @@ message BuildSource { // secrets represents a list of secrets and their destinations that will // be used only for the build. repeated SecretBuildSource secrets = 8; + + // configMaps represents a list of configMaps and their destinations that will + // be used for the build. + repeated ConfigMapBuildSource configMaps = 9; } // BuildSpec has the information to represent a build and also additional @@ -577,6 +581,24 @@ message CommonWebHookCause { optional string secret = 2; } +// ConfigMapBuildSource describes a configmap and its destination directory that will be +// used only at the build time. The content of the configmap referenced here will +// be copied into the destination directory instead of mounting. +message ConfigMapBuildSource { + // configMap is a reference to an existing configmap that you want to use in your + // build. + optional k8s.io.api.core.v1.LocalObjectReference configMap = 1; + + // destinationDir is the directory where the files from the configmap should be + // available for the build time. + // For the Source build strategy, these will be injected into a container + // where the assemble script runs. + // For the Docker build strategy, these will be copied into the build + // directory, where the Dockerfile is located, so users can ADD or COPY them + // during docker build. + optional string destinationDir = 2; +} + // CustomBuildStrategy defines input parameters specific to Custom build. message CustomBuildStrategy { // from is reference to an DockerImage, ImageStreamTag, or ImageStreamImage from which diff --git a/vendor/github.com/openshift/api/build/v1/types.go b/vendor/github.com/openshift/api/build/v1/types.go index d2ad3c4ababd..7b1fe2a70aea 100644 --- a/vendor/github.com/openshift/api/build/v1/types.go +++ b/vendor/github.com/openshift/api/build/v1/types.go @@ -416,6 +416,10 @@ type BuildSource struct { // secrets represents a list of secrets and their destinations that will // be used only for the build. Secrets []SecretBuildSource `json:"secrets,omitempty" protobuf:"bytes,8,rep,name=secrets"` + + // configMaps represents a list of configMaps and their destinations that will + // be used for the build. + ConfigMaps []ConfigMapBuildSource `json:"configMaps,omitempty" protobuf:"bytes,9,rep,name=configMaps"` } // ImageSource is used to describe build source that will be extracted from an image or used during a @@ -481,6 +485,24 @@ type SecretBuildSource struct { DestinationDir string `json:"destinationDir,omitempty" protobuf:"bytes,2,opt,name=destinationDir"` } +// ConfigMapBuildSource describes a configmap and its destination directory that will be +// used only at the build time. The content of the configmap referenced here will +// be copied into the destination directory instead of mounting. +type ConfigMapBuildSource struct { + // configMap is a reference to an existing configmap that you want to use in your + // build. + ConfigMap corev1.LocalObjectReference `json:"configMap" protobuf:"bytes,1,opt,name=configMap"` + + // destinationDir is the directory where the files from the configmap should be + // available for the build time. + // For the Source build strategy, these will be injected into a container + // where the assemble script runs. + // For the Docker build strategy, these will be copied into the build + // directory, where the Dockerfile is located, so users can ADD or COPY them + // during docker build. + DestinationDir string `json:"destinationDir,omitempty" protobuf:"bytes,2,opt,name=destinationDir"` +} + // BinaryBuildSource describes a binary file to be used for the Docker and Source build strategies, // where the file will be extracted and used as the build source. type BinaryBuildSource struct { diff --git a/vendor/github.com/openshift/api/build/v1/types_swagger_doc_generated.go b/vendor/github.com/openshift/api/build/v1/types_swagger_doc_generated.go index c16ecf0d176e..fd52fe793bf3 100644 --- a/vendor/github.com/openshift/api/build/v1/types_swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/build/v1/types_swagger_doc_generated.go @@ -183,6 +183,7 @@ var map_BuildSource = map[string]string{ "contextDir": "contextDir specifies the sub-directory where the source code for the application exists. This allows to have buildable sources in directory other than root of repository.", "sourceSecret": "sourceSecret is the name of a Secret that would be used for setting up the authentication for cloning private repository. The secret contains valid credentials for remote repository, where the data's key represent the authentication method to be used and value is the base64 encoded credentials. Supported auth methods are: ssh-privatekey.", "secrets": "secrets represents a list of secrets and their destinations that will be used only for the build.", + "configMaps": "configMaps represents a list of configMaps and their destinations that will be used for the build.", } func (BuildSource) SwaggerDoc() map[string]string { @@ -304,6 +305,16 @@ func (CommonWebHookCause) SwaggerDoc() map[string]string { return map_CommonWebHookCause } +var map_ConfigMapBuildSource = map[string]string{ + "": "ConfigMapBuildSource describes a configmap and its destination directory that will be used only at the build time. The content of the configmap referenced here will be copied into the destination directory instead of mounting.", + "configMap": "configMap is a reference to an existing configmap that you want to use in your build.", + "destinationDir": "destinationDir is the directory where the files from the configmap should be available for the build time. For the Source build strategy, these will be injected into a container where the assemble script runs. For the Docker build strategy, these will be copied into the build directory, where the Dockerfile is located, so users can ADD or COPY them during docker build.", +} + +func (ConfigMapBuildSource) SwaggerDoc() map[string]string { + return map_ConfigMapBuildSource +} + var map_CustomBuildStrategy = map[string]string{ "": "CustomBuildStrategy defines input parameters specific to Custom build.", "from": "from is reference to an DockerImage, ImageStreamTag, or ImageStreamImage from which the docker image should be pulled", diff --git a/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go index e586f3ef2a68..05bb3d1567ad 100644 --- a/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go @@ -561,6 +561,11 @@ func (in *BuildSource) DeepCopyInto(out *BuildSource) { *out = make([]SecretBuildSource, len(*in)) copy(*out, *in) } + if in.ConfigMaps != nil { + in, out := &in.ConfigMaps, &out.ConfigMaps + *out = make([]ConfigMapBuildSource, len(*in)) + copy(*out, *in) + } return } @@ -933,6 +938,23 @@ func (in *CommonWebHookCause) DeepCopy() *CommonWebHookCause { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConfigMapBuildSource) DeepCopyInto(out *ConfigMapBuildSource) { + *out = *in + out.ConfigMap = in.ConfigMap + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapBuildSource. +func (in *ConfigMapBuildSource) DeepCopy() *ConfigMapBuildSource { + if in == nil { + return nil + } + out := new(ConfigMapBuildSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomBuildStrategy) DeepCopyInto(out *CustomBuildStrategy) { *out = *in diff --git a/vendor/github.com/openshift/api/glide.lock b/vendor/github.com/openshift/api/glide.lock index de433140ec13..9d6254be7b22 100644 --- a/vendor/github.com/openshift/api/glide.lock +++ b/vendor/github.com/openshift/api/glide.lock @@ -1,5 +1,5 @@ -hash: 20ea6bac74810681fc4db0d365aee6743b463aea79b36be69e2d39c9f2c14f86 -updated: 2018-05-10T23:25:42.767241-04:00 +hash: b83a936fc81f16f06f7a2d3e381b77f43d04daa5d4c949948fa787975260ed12 +updated: 2018-06-14T11:13:15.340444591-04:00 imports: - name: github.com/davecgh/go-spew version: 782f4967f2dc4564575ca782fe2d04090b5faca8 @@ -15,19 +15,19 @@ imports: - name: github.com/golang/glog version: 44145f04b68cf362d9c4df2182967c2275eaefed - name: github.com/golang/protobuf - version: 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9 + version: b4deda0973fb4c70b50d226b1af49f3da59f5265 subpackages: - proto - - ptypes - - ptypes/any - - ptypes/duration - - ptypes/timestamp - name: github.com/google/gofuzz version: 44d81051d367757e1c7c6a5a86423ece9afcf63c - name: github.com/json-iterator/go - version: 13f86432b882000a51c6e610c620974462691a97 + version: 2ddf6d758266fcb080a4f9e054b9f292c85e6798 +- name: github.com/modern-go/concurrent + version: bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94 +- name: github.com/modern-go/reflect2 + version: 05fbef0ca5da472bbf96c9322b84a53edc03c9fd - name: github.com/spf13/pflag - version: 4c012f6dcd9546820e378d0bdda4d8fc772cdfea + version: 583c0c0531f06d5278b7d917446061adc344b5cd - name: golang.org/x/net version: 1c05540f6879653db88113bc4a2b70aec4bd491f subpackages: @@ -47,14 +47,14 @@ imports: - name: gopkg.in/yaml.v2 version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: 73d903622b7391f3312dcbac6483fed484e185f8 + version: 8c14244ab7eeffb1e4acd1ac1afb315b30fe67bf subpackages: - apps/v1beta1 - core/v1 - extensions/v1beta1 - rbac/v1 - name: k8s.io/apimachinery - version: 302974c03f7e50f16561ba237db776ab93594ef6 + version: 1369ad3fdc6dcb2c933d7e570b349d71bd3052cf subpackages: - pkg/api/equality - pkg/api/meta @@ -62,9 +62,6 @@ imports: - pkg/api/testing - pkg/api/testing/fuzzer - pkg/api/testing/roundtrip - - pkg/apimachinery - - pkg/apimachinery/announced - - pkg/apimachinery/registered - pkg/apis/meta/fuzzer - pkg/apis/meta/v1 - pkg/apis/meta/v1/unstructured @@ -97,7 +94,7 @@ imports: - pkg/watch - third_party/forked/golang/reflect - name: k8s.io/code-generator - version: 37148bd476363b6cfdc14aa7a0ab9e8011a396f3 + version: a8dc310c260365c47d38b035b24454e623ed72cf repo: git@github.com:openshift/kubernetes-code-generator - name: k8s.io/gengo version: 01a732e01d00cb9a81bb0ca050d3e6d2b947927b diff --git a/vendor/github.com/openshift/api/glide.yaml b/vendor/github.com/openshift/api/glide.yaml index 1c75a1c4f810..54280732a3ca 100644 --- a/vendor/github.com/openshift/api/glide.yaml +++ b/vendor/github.com/openshift/api/glide.yaml @@ -2,11 +2,11 @@ package: github.com/openshift/api import: - package: k8s.io/gengo repo: git@github.com:openshift/kubernetes-gengo - version: openshift-3.10 + version: origin-3.11-kubernetes-v1.11.0-beta.2 - package: k8s.io/code-generator repo: git@github.com:openshift/kubernetes-code-generator - version: origin-3.10-kubernetes-1.10.0 + version: origin-3.11-kubernetes-v1.11.0-beta.2 - package: k8s.io/apimachinery - version: kubernetes-1.10.2 + version: kubernetes-1.11.0-beta.2 - package: k8s.io/api - version: kubernetes-1.10.2 + version: kubernetes-1.11.0-beta.2 diff --git a/vendor/github.com/openshift/api/image/v1/types.go b/vendor/github.com/openshift/api/image/v1/types.go index 88e2fa0a6c30..2d268174e723 100644 --- a/vendor/github.com/openshift/api/image/v1/types.go +++ b/vendor/github.com/openshift/api/image/v1/types.go @@ -158,7 +158,7 @@ type ImageStreamList struct { } // +genclient -// +genclient:method=Secrets,verb=list,subresource=secrets,result=k8s.io/api/core/v1.Secret +// +genclient:method=Secrets,verb=get,subresource=secrets,result=k8s.io/api/core/v1.SecretList // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // ImageStream stores a mapping of tags to images, metadata overrides that are applied