diff --git a/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto b/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto index a237e7f43fdb..db80c3b5d575 100644 --- a/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto +++ b/api/protobuf-spec/github_com_openshift_origin_pkg_build_api_v1.proto @@ -403,6 +403,27 @@ message BuildStatus { // config is an ObjectReference to the BuildConfig this Build is based on. optional k8s.io.kubernetes.pkg.api.v1.ObjectReference config = 9; + + // output describes the Docker image the build has produced. + optional BuildStatusOutput output = 10; +} + +// BuildStatusOutput contains the status of the built image. +message BuildStatusOutput { + // to describes the status of the built image being pushed to a registry. + optional BuildStatusOutputTo to = 1; +} + +// BuildStatusOutputTo describes the status of the built image with regards to +// image registry to which it was supposed to be pushed. +message BuildStatusOutputTo { + // imageDigest is the digest of the built Docker image. The digest uniquely + // identifies the image in the registry to which it was pushed. + // + // Please note that this field may not always be set even if the push + // completes successfully - e.g. when the registry returns no digest or + // returns it in a format that the builder doesn't understand. + optional string imageDigest = 1; } // BuildStrategy contains the details of how to perform a build. diff --git a/api/swagger-spec/oapi-v1.json b/api/swagger-spec/oapi-v1.json index 6dd85ecd8f0f..092989ca7dc8 100644 --- a/api/swagger-spec/oapi-v1.json +++ b/api/swagger-spec/oapi-v1.json @@ -23995,6 +23995,30 @@ "config": { "$ref": "v1.ObjectReference", "description": "config is an ObjectReference to the BuildConfig this Build is based on." + }, + "output": { + "$ref": "v1.BuildStatusOutput", + "description": "output describes the Docker image the build has produced." + } + } + }, + "v1.BuildStatusOutput": { + "id": "v1.BuildStatusOutput", + "description": "BuildStatusOutput contains the status of the built image.", + "properties": { + "to": { + "$ref": "v1.BuildStatusOutputTo", + "description": "to describes the status of the built image being pushed to a registry." + } + } + }, + "v1.BuildStatusOutputTo": { + "id": "v1.BuildStatusOutputTo", + "description": "BuildStatusOutputTo describes the status of the built image with regards to image registry to which it was supposed to be pushed.", + "properties": { + "imageDigest": { + "type": "string", + "description": "imageDigest is the digest of the built Docker image. The digest uniquely identifies the image in the registry to which it was pushed. Please note that this field may not always set even if the push completes successfully." } } }, diff --git a/api/swagger-spec/openshift-openapi-spec.json b/api/swagger-spec/openshift-openapi-spec.json index 46c179f0d7d0..483c5644edc4 100644 --- a/api/swagger-spec/openshift-openapi-spec.json +++ b/api/swagger-spec/openshift-openapi-spec.json @@ -48179,6 +48179,10 @@ "description": "message is a human-readable message indicating details about why the build has this status.", "type": "string" }, + "output": { + "description": "output describes the Docker image the build has produced.", + "$ref": "#/definitions/v1.BuildStatusOutput" + }, "outputDockerImageReference": { "description": "outputDockerImageReference contains a reference to the Docker image that will be built by this build. Its value is computed from Build.Spec.Output.To, and should include the registry address, so that it can be used to push and pull the image.", "type": "string" @@ -48197,6 +48201,24 @@ } } }, + "v1.BuildStatusOutput": { + "description": "BuildStatusOutput contains the status of the built image.", + "properties": { + "to": { + "description": "to describes the status of the built image being pushed to a registry.", + "$ref": "#/definitions/v1.BuildStatusOutputTo" + } + } + }, + "v1.BuildStatusOutputTo": { + "description": "BuildStatusOutputTo describes the status of the built image with regards to image registry to which it was supposed to be pushed.", + "properties": { + "imageDigest": { + "description": "imageDigest is the digest of the built Docker image. The digest uniquely identifies the image in the registry to which it was pushed.\n\nPlease note that this field may not always be set even if the push completes successfully - e.g. when the registry returns no digest or returns it in a format that the builder doesn't understand.", + "type": "string" + } + } + }, "v1.BuildStrategy": { "description": "BuildStrategy contains the details of how to perform a build.", "required": [ diff --git a/pkg/build/api/types.go b/pkg/build/api/types.go index aeb0870bcf79..f2bac1c8c79e 100644 --- a/pkg/build/api/types.go +++ b/pkg/build/api/types.go @@ -220,6 +220,9 @@ type BuildStatus struct { // Config is an ObjectReference to the BuildConfig this Build is based on. Config *kapi.ObjectReference + + // Output describes the Docker image the build has produced. + Output BuildStatusOutput } // BuildPhase represents the status of a build at a point in time. @@ -335,6 +338,24 @@ const ( StatusMessageBuildPodExists = "The pod for this build already exists and is older than the build." ) +// BuildStatusOutput contains the status of the built image. +type BuildStatusOutput struct { + // To describes the status of the built image being pushed to a registry. + To *BuildStatusOutputTo +} + +// BuildStatusOutputTo describes the status of the built image with regards to +// image registry to which it was supposed to be pushed. +type BuildStatusOutputTo struct { + // ImageDigest is the digest of the built Docker image. The digest uniquely + // identifies the image in the registry to which it was pushed. + // + // Please note that this field may not always be set even if the push + // completes successfully - e.g. when the registry returns no digest or + // returns it in a format that the builder doesn't understand. + ImageDigest string +} + // BuildSource is the input used for the build. type BuildSource struct { // Binary builds accept a binary as their input. The binary is generally assumed to be a tar, diff --git a/pkg/build/api/v1/generated.pb.go b/pkg/build/api/v1/generated.pb.go index df4bb6316588..73edaef2ba81 100644 --- a/pkg/build/api/v1/generated.pb.go +++ b/pkg/build/api/v1/generated.pb.go @@ -25,6 +25,8 @@ BuildSource BuildSpec BuildStatus + BuildStatusOutput + BuildStatusOutputTo BuildStrategy BuildTriggerCause BuildTriggerPolicy @@ -143,111 +145,119 @@ func (m *BuildStatus) Reset() { *m = BuildStatus{} } func (*BuildStatus) ProtoMessage() {} func (*BuildStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (m *BuildStatusOutput) Reset() { *m = BuildStatusOutput{} } +func (*BuildStatusOutput) ProtoMessage() {} +func (*BuildStatusOutput) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } + +func (m *BuildStatusOutputTo) Reset() { *m = BuildStatusOutputTo{} } +func (*BuildStatusOutputTo) ProtoMessage() {} +func (*BuildStatusOutputTo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } + func (m *BuildStrategy) Reset() { *m = BuildStrategy{} } func (*BuildStrategy) ProtoMessage() {} -func (*BuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*BuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *BuildTriggerCause) Reset() { *m = BuildTriggerCause{} } func (*BuildTriggerCause) ProtoMessage() {} -func (*BuildTriggerCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*BuildTriggerCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *BuildTriggerPolicy) Reset() { *m = BuildTriggerPolicy{} } func (*BuildTriggerPolicy) ProtoMessage() {} -func (*BuildTriggerPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*BuildTriggerPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *CommonSpec) Reset() { *m = CommonSpec{} } func (*CommonSpec) ProtoMessage() {} -func (*CommonSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*CommonSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *CustomBuildStrategy) Reset() { *m = CustomBuildStrategy{} } func (*CustomBuildStrategy) ProtoMessage() {} -func (*CustomBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*CustomBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *DockerBuildStrategy) Reset() { *m = DockerBuildStrategy{} } func (*DockerBuildStrategy) ProtoMessage() {} -func (*DockerBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*DockerBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *GenericWebHookCause) Reset() { *m = GenericWebHookCause{} } func (*GenericWebHookCause) ProtoMessage() {} -func (*GenericWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*GenericWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *GenericWebHookEvent) Reset() { *m = GenericWebHookEvent{} } func (*GenericWebHookEvent) ProtoMessage() {} -func (*GenericWebHookEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*GenericWebHookEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *GitBuildSource) Reset() { *m = GitBuildSource{} } func (*GitBuildSource) ProtoMessage() {} -func (*GitBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*GitBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *GitHubWebHookCause) Reset() { *m = GitHubWebHookCause{} } func (*GitHubWebHookCause) ProtoMessage() {} -func (*GitHubWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*GitHubWebHookCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *GitInfo) Reset() { *m = GitInfo{} } func (*GitInfo) ProtoMessage() {} -func (*GitInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*GitInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *GitSourceRevision) Reset() { *m = GitSourceRevision{} } func (*GitSourceRevision) ProtoMessage() {} -func (*GitSourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*GitSourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *ImageChangeCause) Reset() { *m = ImageChangeCause{} } func (*ImageChangeCause) ProtoMessage() {} -func (*ImageChangeCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*ImageChangeCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *ImageChangeTrigger) Reset() { *m = ImageChangeTrigger{} } func (*ImageChangeTrigger) ProtoMessage() {} -func (*ImageChangeTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*ImageChangeTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *ImageLabel) Reset() { *m = ImageLabel{} } func (*ImageLabel) ProtoMessage() {} -func (*ImageLabel) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*ImageLabel) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *ImageSource) Reset() { *m = ImageSource{} } func (*ImageSource) ProtoMessage() {} -func (*ImageSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*ImageSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *ImageSourcePath) Reset() { *m = ImageSourcePath{} } func (*ImageSourcePath) ProtoMessage() {} -func (*ImageSourcePath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*ImageSourcePath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *JenkinsPipelineBuildStrategy) Reset() { *m = JenkinsPipelineBuildStrategy{} } func (*JenkinsPipelineBuildStrategy) ProtoMessage() {} func (*JenkinsPipelineBuildStrategy) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{33} + return fileDescriptorGenerated, []int{35} } func (m *OptionalNodeSelector) Reset() { *m = OptionalNodeSelector{} } func (*OptionalNodeSelector) ProtoMessage() {} -func (*OptionalNodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*OptionalNodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *ProxyConfig) Reset() { *m = ProxyConfig{} } func (*ProxyConfig) ProtoMessage() {} -func (*ProxyConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*ProxyConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *SecretBuildSource) Reset() { *m = SecretBuildSource{} } func (*SecretBuildSource) ProtoMessage() {} -func (*SecretBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*SecretBuildSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *SecretSpec) Reset() { *m = SecretSpec{} } func (*SecretSpec) ProtoMessage() {} -func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *SourceBuildStrategy) Reset() { *m = SourceBuildStrategy{} } func (*SourceBuildStrategy) ProtoMessage() {} -func (*SourceBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*SourceBuildStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *SourceControlUser) Reset() { *m = SourceControlUser{} } func (*SourceControlUser) ProtoMessage() {} -func (*SourceControlUser) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*SourceControlUser) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *SourceRevision) Reset() { *m = SourceRevision{} } func (*SourceRevision) ProtoMessage() {} -func (*SourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*SourceRevision) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *WebHookTrigger) Reset() { *m = WebHookTrigger{} } func (*WebHookTrigger) ProtoMessage() {} -func (*WebHookTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*WebHookTrigger) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func init() { proto.RegisterType((*BinaryBuildRequestOptions)(nil), "github.com.openshift.origin.pkg.build.api.v1.BinaryBuildRequestOptions") @@ -266,6 +276,8 @@ func init() { proto.RegisterType((*BuildSource)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildSource") proto.RegisterType((*BuildSpec)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildSpec") proto.RegisterType((*BuildStatus)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildStatus") + proto.RegisterType((*BuildStatusOutput)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildStatusOutput") + proto.RegisterType((*BuildStatusOutputTo)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildStatusOutputTo") proto.RegisterType((*BuildStrategy)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildStrategy") proto.RegisterType((*BuildTriggerCause)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildTriggerCause") proto.RegisterType((*BuildTriggerPolicy)(nil), "github.com.openshift.origin.pkg.build.api.v1.BuildTriggerPolicy") @@ -1087,6 +1099,64 @@ func (m *BuildStatus) MarshalTo(data []byte) (int, error) { } i += n25 } + data[i] = 0x52 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Output.Size())) + n26, err := m.Output.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n26 + return i, nil +} + +func (m *BuildStatusOutput) 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 *BuildStatusOutput) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.To != nil { + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(m.To.Size())) + n27, err := m.To.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n27 + } + return i, nil +} + +func (m *BuildStatusOutputTo) 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 *BuildStatusOutputTo) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(len(m.ImageDigest))) + i += copy(data[i:], m.ImageDigest) return i, nil } @@ -1113,41 +1183,41 @@ func (m *BuildStrategy) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.DockerStrategy.Size())) - n26, err := m.DockerStrategy.MarshalTo(data[i:]) + n28, err := m.DockerStrategy.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n26 + i += n28 } if m.SourceStrategy != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.SourceStrategy.Size())) - n27, err := m.SourceStrategy.MarshalTo(data[i:]) + n29, err := m.SourceStrategy.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n27 + i += n29 } if m.CustomStrategy != nil { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.CustomStrategy.Size())) - n28, err := m.CustomStrategy.MarshalTo(data[i:]) + n30, err := m.CustomStrategy.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n28 + i += n30 } if m.JenkinsPipelineStrategy != nil { data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.JenkinsPipelineStrategy.Size())) - n29, err := m.JenkinsPipelineStrategy.MarshalTo(data[i:]) + n31, err := m.JenkinsPipelineStrategy.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n29 + i += n31 } return i, nil } @@ -1175,31 +1245,31 @@ func (m *BuildTriggerCause) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.GenericWebHook.Size())) - n30, err := m.GenericWebHook.MarshalTo(data[i:]) + n32, err := m.GenericWebHook.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n30 + i += n32 } if m.GitHubWebHook != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.GitHubWebHook.Size())) - n31, err := m.GitHubWebHook.MarshalTo(data[i:]) + n33, err := m.GitHubWebHook.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n31 + i += n33 } if m.ImageChangeBuild != nil { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.ImageChangeBuild.Size())) - n32, err := m.ImageChangeBuild.MarshalTo(data[i:]) + n34, err := m.ImageChangeBuild.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n32 + i += n34 } return i, nil } @@ -1227,31 +1297,31 @@ func (m *BuildTriggerPolicy) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.GitHubWebHook.Size())) - n33, err := m.GitHubWebHook.MarshalTo(data[i:]) + n35, err := m.GitHubWebHook.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n33 + i += n35 } if m.GenericWebHook != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.GenericWebHook.Size())) - n34, err := m.GenericWebHook.MarshalTo(data[i:]) + n36, err := m.GenericWebHook.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n34 + i += n36 } if m.ImageChange != nil { data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.ImageChange.Size())) - n35, err := m.ImageChange.MarshalTo(data[i:]) + n37, err := m.ImageChange.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n35 + i += n37 } return i, nil } @@ -1278,53 +1348,53 @@ func (m *CommonSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Source.Size())) - n36, err := m.Source.MarshalTo(data[i:]) + n38, err := m.Source.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n36 + i += n38 if m.Revision != nil { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Revision.Size())) - n37, err := m.Revision.MarshalTo(data[i:]) + n39, err := m.Revision.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n37 + i += n39 } data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(m.Strategy.Size())) - n38, err := m.Strategy.MarshalTo(data[i:]) + n40, err := m.Strategy.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n38 + i += n40 data[i] = 0x2a i++ i = encodeVarintGenerated(data, i, uint64(m.Output.Size())) - n39, err := m.Output.MarshalTo(data[i:]) + n41, err := m.Output.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n39 + i += n41 data[i] = 0x32 i++ i = encodeVarintGenerated(data, i, uint64(m.Resources.Size())) - n40, err := m.Resources.MarshalTo(data[i:]) + n42, err := m.Resources.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n40 + i += n42 data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.PostCommit.Size())) - n41, err := m.PostCommit.MarshalTo(data[i:]) + n43, err := m.PostCommit.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n41 + i += n43 if m.CompletionDeadlineSeconds != nil { data[i] = 0x40 i++ @@ -1334,11 +1404,11 @@ func (m *CommonSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x4a i++ i = encodeVarintGenerated(data, i, uint64(m.NodeSelector.Size())) - n42, err := m.NodeSelector.MarshalTo(data[i:]) + n44, err := m.NodeSelector.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n42 + i += n44 } return i, nil } @@ -1361,20 +1431,20 @@ func (m *CustomBuildStrategy) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.From.Size())) - n43, err := m.From.MarshalTo(data[i:]) + n45, err := m.From.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n43 + i += n45 if m.PullSecret != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PullSecret.Size())) - n44, err := m.PullSecret.MarshalTo(data[i:]) + n46, err := m.PullSecret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n44 + i += n46 } if len(m.Env) > 0 { for _, msg := range m.Env { @@ -1442,21 +1512,21 @@ func (m *DockerBuildStrategy) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.From.Size())) - n45, err := m.From.MarshalTo(data[i:]) + n47, err := m.From.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n45 + i += n47 } if m.PullSecret != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PullSecret.Size())) - n46, err := m.PullSecret.MarshalTo(data[i:]) + n48, err := m.PullSecret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n46 + i += n48 } data[i] = 0x18 i++ @@ -1512,11 +1582,11 @@ func (m *GenericWebHookCause) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Revision.Size())) - n47, err := m.Revision.MarshalTo(data[i:]) + n49, err := m.Revision.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n47 + i += n49 } data[i] = 0x12 i++ @@ -1548,11 +1618,11 @@ func (m *GenericWebHookEvent) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Git.Size())) - n48, err := m.Git.MarshalTo(data[i:]) + n50, err := m.Git.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n48 + i += n50 } if len(m.Env) > 0 { for _, msg := range m.Env { @@ -1595,11 +1665,11 @@ func (m *GitBuildSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.ProxyConfig.Size())) - n49, err := m.ProxyConfig.MarshalTo(data[i:]) + n51, err := m.ProxyConfig.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n49 + i += n51 return i, nil } @@ -1622,11 +1692,11 @@ func (m *GitHubWebHookCause) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Revision.Size())) - n50, err := m.Revision.MarshalTo(data[i:]) + n52, err := m.Revision.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n50 + i += n52 } data[i] = 0x12 i++ @@ -1653,19 +1723,19 @@ func (m *GitInfo) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.GitBuildSource.Size())) - n51, err := m.GitBuildSource.MarshalTo(data[i:]) + n53, err := m.GitBuildSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n51 + i += n53 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.GitSourceRevision.Size())) - n52, err := m.GitSourceRevision.MarshalTo(data[i:]) + n54, err := m.GitSourceRevision.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n52 + i += n54 return i, nil } @@ -1691,19 +1761,19 @@ func (m *GitSourceRevision) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Author.Size())) - n53, err := m.Author.MarshalTo(data[i:]) + n55, err := m.Author.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n53 + i += n55 data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.Committer.Size())) - n54, err := m.Committer.MarshalTo(data[i:]) + n56, err := m.Committer.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n54 + i += n56 data[i] = 0x22 i++ i = encodeVarintGenerated(data, i, uint64(len(m.Message))) @@ -1734,11 +1804,11 @@ func (m *ImageChangeCause) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.FromRef.Size())) - n55, err := m.FromRef.MarshalTo(data[i:]) + n57, err := m.FromRef.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n55 + i += n57 } return i, nil } @@ -1766,11 +1836,11 @@ func (m *ImageChangeTrigger) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.From.Size())) - n56, err := m.From.MarshalTo(data[i:]) + n58, err := m.From.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n56 + i += n58 } return i, nil } @@ -1819,11 +1889,11 @@ func (m *ImageSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.From.Size())) - n57, err := m.From.MarshalTo(data[i:]) + n59, err := m.From.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n57 + i += n59 if len(m.Paths) > 0 { for _, msg := range m.Paths { data[i] = 0x12 @@ -1840,11 +1910,11 @@ func (m *ImageSource) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintGenerated(data, i, uint64(m.PullSecret.Size())) - n58, err := m.PullSecret.MarshalTo(data[i:]) + n60, err := m.PullSecret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n58 + i += n60 } return i, nil } @@ -1990,11 +2060,11 @@ func (m *SecretBuildSource) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.Secret.Size())) - n59, err := m.Secret.MarshalTo(data[i:]) + n61, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n59 + i += n61 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.DestinationDir))) @@ -2020,11 +2090,11 @@ func (m *SecretSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.SecretSource.Size())) - n60, err := m.SecretSource.MarshalTo(data[i:]) + n62, err := m.SecretSource.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n60 + i += n62 data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(len(m.MountPath))) @@ -2050,20 +2120,20 @@ func (m *SourceBuildStrategy) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.From.Size())) - n61, err := m.From.MarshalTo(data[i:]) + n63, err := m.From.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n61 + i += n63 if m.PullSecret != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.PullSecret.Size())) - n62, err := m.PullSecret.MarshalTo(data[i:]) + n64, err := m.PullSecret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n62 + i += n64 } if len(m.Env) > 0 { for _, msg := range m.Env { @@ -2103,11 +2173,11 @@ func (m *SourceBuildStrategy) MarshalTo(data []byte) (int, error) { data[i] = 0x3a i++ i = encodeVarintGenerated(data, i, uint64(m.RuntimeImage.Size())) - n63, err := m.RuntimeImage.MarshalTo(data[i:]) + n65, err := m.RuntimeImage.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n63 + i += n65 } if len(m.RuntimeArtifacts) > 0 { for _, msg := range m.RuntimeArtifacts { @@ -2173,11 +2243,11 @@ func (m *SourceRevision) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Git.Size())) - n64, err := m.Git.MarshalTo(data[i:]) + n66, err := m.Git.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n64 + i += n66 } return i, nil } @@ -2534,6 +2604,26 @@ func (m *BuildStatus) Size() (n int) { l = m.Config.Size() n += 1 + l + sovGenerated(uint64(l)) } + l = m.Output.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *BuildStatusOutput) Size() (n int) { + var l int + _ = l + if m.To != nil { + l = m.To.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *BuildStatusOutputTo) Size() (n int) { + var l int + _ = l + l = len(m.ImageDigest) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -3168,6 +3258,27 @@ func (this *BuildStatus) String() string { `Duration:` + fmt.Sprintf("%v", this.Duration) + `,`, `OutputDockerImageReference:` + fmt.Sprintf("%v", this.OutputDockerImageReference) + `,`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "ObjectReference", "k8s_io_kubernetes_pkg_api_v1.ObjectReference", 1) + `,`, + `Output:` + strings.Replace(strings.Replace(this.Output.String(), "BuildStatusOutput", "BuildStatusOutput", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *BuildStatusOutput) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BuildStatusOutput{`, + `To:` + strings.Replace(fmt.Sprintf("%v", this.To), "BuildStatusOutputTo", "BuildStatusOutputTo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *BuildStatusOutputTo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BuildStatusOutputTo{`, + `ImageDigest:` + fmt.Sprintf("%v", this.ImageDigest) + `,`, `}`, }, "") return s @@ -6156,6 +6267,198 @@ func (m *BuildStatus) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Output", 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.Output.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + 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 *BuildStatusOutput) 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: BuildStatusOutput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BuildStatusOutput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field To", 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 m.To == nil { + m.To = &BuildStatusOutputTo{} + } + if err := m.To.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + 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 *BuildStatusOutputTo) 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: BuildStatusOutputTo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BuildStatusOutputTo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ImageDigest", 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.ImageDigest = string(data[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -10216,210 +10519,213 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 3272 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x6c, 0x1b, 0xc7, - 0xf9, 0xf7, 0x92, 0x92, 0x48, 0x7d, 0x94, 0x29, 0x69, 0xe4, 0xc4, 0xb4, 0x92, 0x88, 0xce, 0xe6, - 0x81, 0x04, 0x71, 0x28, 0xd8, 0x89, 0xf3, 0x77, 0xde, 0x11, 0x29, 0xd9, 0x91, 0x23, 0xdb, 0xfa, - 0x8f, 0x94, 0xc7, 0xdf, 0x7f, 0xb4, 0xc5, 0x6a, 0x35, 0xa4, 0x36, 0x5a, 0xee, 0x32, 0x3b, 0x43, - 0xc6, 0x02, 0x1a, 0x20, 0x68, 0x51, 0x20, 0xbd, 0xf5, 0x75, 0xc8, 0xa5, 0x68, 0x03, 0xf4, 0x81, - 0x22, 0x87, 0xa2, 0x8f, 0x43, 0x81, 0x5e, 0x5a, 0xa0, 0x87, 0x9c, 0x8a, 0x1c, 0x7b, 0x28, 0x88, - 0x5a, 0x39, 0xf4, 0xdc, 0xab, 0x4f, 0xc5, 0x3c, 0x76, 0x77, 0x76, 0x49, 0x29, 0xe6, 0xca, 0x0a, - 0x0a, 0xf4, 0x62, 0x88, 0xdf, 0xf7, 0xcd, 0xef, 0x9b, 0xf9, 0xe6, 0x9b, 0xf9, 0x1e, 0x3b, 0x86, - 0x97, 0x5a, 0x0e, 0xdb, 0xe9, 0x6e, 0xd5, 0x6c, 0xbf, 0xbd, 0xe8, 0x77, 0x88, 0x47, 0x77, 0x9c, - 0x26, 0x5b, 0xf4, 0x03, 0xa7, 0xe5, 0x78, 0x8b, 0x9d, 0xdd, 0xd6, 0xe2, 0x56, 0xd7, 0x71, 0xb7, - 0x17, 0xad, 0x8e, 0xb3, 0xd8, 0x3b, 0xbf, 0xd8, 0x22, 0x1e, 0x09, 0x2c, 0x46, 0xb6, 0x6b, 0x9d, - 0xc0, 0x67, 0x3e, 0x3a, 0x17, 0x8f, 0xae, 0x45, 0xa3, 0x6b, 0x72, 0x74, 0xad, 0xb3, 0xdb, 0xaa, - 0x89, 0xd1, 0x35, 0xab, 0xe3, 0xd4, 0x7a, 0xe7, 0xe7, 0x9f, 0xd6, 0x74, 0xb5, 0xfc, 0x96, 0xbf, - 0x28, 0x40, 0xb6, 0xba, 0x4d, 0xf1, 0x4b, 0xfc, 0x10, 0x7f, 0x49, 0xf0, 0xf9, 0x8b, 0xbb, 0x97, - 0x68, 0xcd, 0xf1, 0x17, 0x77, 0xbb, 0x5b, 0x24, 0xf0, 0x08, 0x23, 0x54, 0x4c, 0x88, 0x4f, 0xa5, - 0xeb, 0xf5, 0x48, 0x40, 0x1d, 0xdf, 0x23, 0xdb, 0xe9, 0x39, 0xcd, 0x9f, 0x3b, 0x78, 0xd8, 0xe0, - 0x0a, 0xe6, 0x9f, 0x1e, 0x2e, 0x1d, 0x74, 0x3d, 0xe6, 0xb4, 0xc9, 0x80, 0xf8, 0xf9, 0xe1, 0xe2, - 0x5d, 0xe6, 0xb8, 0x8b, 0x8e, 0xc7, 0x28, 0x0b, 0xd2, 0x43, 0xcc, 0x3f, 0x8c, 0xc1, 0x99, 0xba, - 0xe3, 0x59, 0xc1, 0x5e, 0x9d, 0x1b, 0x03, 0x93, 0xf7, 0xba, 0x84, 0xb2, 0x1b, 0x1d, 0xe6, 0xf8, - 0x1e, 0x45, 0xef, 0x40, 0xb1, 0x4d, 0x98, 0xb5, 0x6d, 0x31, 0xab, 0x62, 0x9c, 0x35, 0x9e, 0x28, - 0x5d, 0x78, 0xa2, 0x26, 0x75, 0xd4, 0x62, 0x1d, 0xc2, 0x94, 0xd2, 0x88, 0xb5, 0x1b, 0x5b, 0xef, - 0x12, 0x9b, 0x5d, 0x23, 0xcc, 0xaa, 0xa3, 0xcf, 0xfa, 0xd5, 0x13, 0xfb, 0xfd, 0x2a, 0xc4, 0x34, - 0x1c, 0xa1, 0xa1, 0xc7, 0x61, 0xc2, 0xa2, 0x97, 0x1d, 0x97, 0x54, 0x72, 0x67, 0x8d, 0x27, 0x26, - 0xeb, 0x65, 0x25, 0x3d, 0xb1, 0x24, 0xa8, 0x58, 0x71, 0xd1, 0x73, 0x50, 0x0e, 0x48, 0xcf, 0xe1, - 0xd6, 0x6c, 0xf8, 0xed, 0xb6, 0xc3, 0x2a, 0xf9, 0xa4, 0xbc, 0xa4, 0xe2, 0x94, 0x14, 0x7a, 0x1e, - 0xa6, 0x43, 0xca, 0x35, 0x42, 0xa9, 0xd5, 0x22, 0x95, 0x31, 0x31, 0x70, 0x5a, 0x0d, 0x2c, 0x28, - 0x32, 0x4e, 0xcb, 0xa1, 0x3a, 0xa0, 0x90, 0xb4, 0xd4, 0x65, 0x3b, 0x7e, 0x70, 0xdd, 0x6a, 0x93, - 0xca, 0xb8, 0x18, 0x1d, 0x2d, 0x2a, 0xe6, 0xe0, 0x21, 0xd2, 0x68, 0x05, 0xe6, 0x92, 0xd4, 0x95, - 0xb6, 0xe5, 0xb8, 0x95, 0x09, 0x01, 0x32, 0xa7, 0x40, 0x4a, 0x1a, 0x0b, 0x0f, 0x93, 0x47, 0x6f, - 0xc0, 0x7d, 0xc9, 0x75, 0x31, 0x22, 0x67, 0x53, 0x10, 0x40, 0xf7, 0x29, 0xa0, 0x93, 0x09, 0x26, - 0x1e, 0x3e, 0x06, 0x5d, 0x87, 0xfb, 0x07, 0x18, 0x72, 0x5a, 0x45, 0x81, 0x76, 0xbf, 0x42, 0x2b, - 0x27, 0xb9, 0xf8, 0x80, 0x51, 0xe6, 0x8b, 0x30, 0xab, 0x79, 0xce, 0x86, 0xdf, 0x0d, 0x6c, 0xa2, - 0xed, 0xab, 0x71, 0xd8, 0xbe, 0x9a, 0x3f, 0xc9, 0xc1, 0xb8, 0x18, 0x77, 0x8c, 0x3e, 0xf6, 0x7f, - 0x30, 0x46, 0x3b, 0xc4, 0x16, 0x1e, 0x56, 0xba, 0xf0, 0x3f, 0xb5, 0x51, 0xae, 0x83, 0x9a, 0x5c, - 0x54, 0x87, 0xd8, 0xf5, 0x29, 0xa5, 0x64, 0x8c, 0xff, 0xc2, 0x02, 0x12, 0x59, 0x30, 0x41, 0x99, - 0xc5, 0xba, 0x54, 0xb8, 0x63, 0xe9, 0xc2, 0xf3, 0x59, 0xc0, 0x05, 0x40, 0x6c, 0x21, 0xf9, 0x1b, - 0x2b, 0x60, 0xf3, 0x37, 0x39, 0x28, 0x09, 0xb9, 0x86, 0xef, 0x35, 0x9d, 0xd6, 0x31, 0xda, 0xe9, - 0x1b, 0x09, 0x3b, 0xbd, 0x9c, 0x61, 0x29, 0x72, 0x8a, 0x07, 0x5a, 0xab, 0x95, 0xb2, 0xd6, 0xab, - 0xd9, 0x55, 0x1c, 0x6e, 0xb3, 0xcf, 0x0d, 0x98, 0xd6, 0xa4, 0xd7, 0x1c, 0xca, 0xd0, 0xd7, 0x06, - 0xec, 0xb6, 0x78, 0x88, 0xdd, 0xb4, 0xbb, 0xbb, 0xc6, 0x87, 0x0b, 0xf3, 0xcd, 0x28, 0x75, 0xc5, - 0x90, 0xa2, 0x19, 0xef, 0xeb, 0x30, 0xee, 0x30, 0xd2, 0xa6, 0x95, 0xdc, 0xd9, 0x7c, 0x46, 0x47, - 0x90, 0x93, 0xad, 0x9f, 0x54, 0x5a, 0xc6, 0x57, 0x39, 0x1e, 0x96, 0xb0, 0xe6, 0x6f, 0x73, 0x89, - 0x25, 0x71, 0xab, 0x22, 0x0f, 0x8a, 0x2c, 0x70, 0x5a, 0x2d, 0x12, 0xd0, 0x8a, 0x21, 0xd4, 0xbe, - 0x96, 0x41, 0xed, 0xa6, 0x84, 0x58, 0xf7, 0x5d, 0xc7, 0xde, 0x8b, 0xd7, 0xa8, 0xc8, 0x14, 0x47, - 0x3a, 0xd0, 0x12, 0x4c, 0x06, 0x5d, 0x4f, 0x0a, 0xaa, 0xfb, 0xfa, 0x11, 0x25, 0x3e, 0x89, 0x43, - 0xc6, 0x9d, 0x7e, 0xb5, 0x2c, 0x63, 0x48, 0x48, 0xc1, 0xf1, 0x28, 0xe4, 0x02, 0xd8, 0x7e, 0xbb, - 0xed, 0x7b, 0x7c, 0x01, 0xca, 0x0d, 0x2e, 0x8d, 0x36, 0xe9, 0x46, 0x34, 0x3e, 0xf6, 0xe7, 0x98, - 0x86, 0x35, 0x7c, 0xf3, 0x2a, 0xcc, 0x0e, 0x38, 0x0d, 0xba, 0x08, 0x25, 0xd7, 0xa2, 0xec, 0x2d, - 0xb9, 0xbf, 0xc2, 0x17, 0xf2, 0xf1, 0x5d, 0xbc, 0x16, 0xb3, 0xb0, 0x2e, 0x67, 0xfe, 0xc5, 0x80, - 0x49, 0x01, 0xf6, 0x55, 0x78, 0xd3, 0x3b, 0x49, 0x6f, 0x7a, 0x26, 0xc3, 0xb6, 0x1e, 0xe0, 0x47, - 0x00, 0x45, 0xb9, 0x0a, 0xbf, 0x65, 0x7e, 0x34, 0xa6, 0x7c, 0x6a, 0xcd, 0x6f, 0x85, 0xa1, 0x7e, - 0x11, 0x26, 0x6d, 0xdf, 0x63, 0x96, 0xe3, 0x91, 0x40, 0xdd, 0xdd, 0xb3, 0xe1, 0x1e, 0x37, 0x42, - 0x06, 0x8e, 0x65, 0xf8, 0x4d, 0xdf, 0xf4, 0x5d, 0xd7, 0x7f, 0x5f, 0x78, 0x44, 0x31, 0x3e, 0x93, - 0x97, 0x05, 0x15, 0x2b, 0x2e, 0x3a, 0x07, 0xc5, 0x0e, 0x8f, 0x20, 0xbe, 0x3a, 0xfe, 0xc5, 0xd8, - 0x00, 0xeb, 0x8a, 0x8e, 0x23, 0x09, 0xf4, 0x2c, 0x4c, 0x51, 0xc7, 0xb3, 0xc9, 0x06, 0xb1, 0x7d, - 0x6f, 0x9b, 0x8a, 0xa0, 0x9d, 0xaf, 0xcf, 0xec, 0xf7, 0xab, 0x53, 0x1b, 0x1a, 0x1d, 0x27, 0xa4, - 0xd0, 0x3b, 0x30, 0x29, 0x7e, 0x6f, 0x3a, 0x2a, 0x52, 0x97, 0x2e, 0x3c, 0x75, 0x97, 0xdb, 0xc2, - 0x87, 0xd4, 0x4f, 0xf2, 0x55, 0x6e, 0x84, 0x08, 0x38, 0x06, 0x43, 0x17, 0x00, 0x78, 0xaa, 0x45, - 0x99, 0xd5, 0xee, 0x50, 0x11, 0xbf, 0x8b, 0xb1, 0xf7, 0x6d, 0x46, 0x1c, 0xac, 0x49, 0xa1, 0xa7, - 0x60, 0x92, 0x59, 0x8e, 0xbb, 0xe6, 0x78, 0x84, 0x8a, 0x48, 0x9d, 0x97, 0x0a, 0x36, 0x43, 0x22, - 0x8e, 0xf9, 0xa8, 0x06, 0xe0, 0x3a, 0x6d, 0x87, 0xd5, 0xf7, 0x18, 0xa1, 0x22, 0x12, 0xe7, 0xeb, - 0x65, 0x0e, 0xbe, 0x16, 0x51, 0xb1, 0x26, 0xc1, 0xcd, 0xee, 0xf9, 0xef, 0x5b, 0x0e, 0xab, 0x4c, - 0x26, 0xcd, 0x7e, 0xdd, 0x7f, 0xdb, 0x72, 0x18, 0x56, 0x5c, 0xf4, 0x18, 0x14, 0xd4, 0x22, 0x2b, - 0x20, 0x40, 0x4b, 0x3c, 0xe9, 0x09, 0x3d, 0x3c, 0xe4, 0x99, 0xbf, 0x0a, 0xa3, 0xcc, 0x8d, 0x2e, - 0xeb, 0x74, 0x19, 0x5a, 0x81, 0x1c, 0xf3, 0x95, 0x67, 0x3f, 0x7d, 0x37, 0xf1, 0x05, 0x93, 0x26, - 0x09, 0x88, 0x67, 0x93, 0xfa, 0xc4, 0x7e, 0xbf, 0x9a, 0xdb, 0xf4, 0x71, 0x8e, 0xf9, 0x68, 0x0b, - 0xa0, 0xd3, 0xa5, 0x3b, 0x1b, 0xc4, 0x0e, 0x08, 0x53, 0x81, 0xe5, 0xc2, 0xe1, 0x70, 0x6b, 0xbe, - 0x6d, 0xb9, 0x69, 0x4c, 0x61, 0x89, 0xf5, 0x08, 0x09, 0x6b, 0xa8, 0xc8, 0x87, 0x92, 0xd3, 0xb6, - 0x5a, 0x64, 0xcd, 0xda, 0x22, 0x2e, 0xf7, 0xad, 0xfc, 0xe8, 0x77, 0xca, 0x6a, 0x04, 0x10, 0xdf, - 0x04, 0x31, 0x8d, 0x62, 0x5d, 0x83, 0xf9, 0x2d, 0x03, 0xe6, 0x84, 0xad, 0xd6, 0x7d, 0xca, 0x64, - 0x32, 0x24, 0xae, 0xe3, 0xc7, 0xa0, 0xc0, 0xef, 0x1e, 0xcb, 0xdb, 0x16, 0xb7, 0xf1, 0xa4, 0x34, - 0x75, 0x43, 0x92, 0x70, 0xc8, 0x43, 0x0f, 0xc2, 0x98, 0x15, 0xb4, 0xe4, 0xd1, 0x9e, 0xac, 0x17, - 0x79, 0x8c, 0x5c, 0x0a, 0x5a, 0x14, 0x0b, 0x2a, 0xdf, 0x57, 0x6a, 0x07, 0x4e, 0x67, 0x20, 0xc1, - 0xdd, 0x10, 0x54, 0xac, 0xb8, 0xe6, 0x17, 0xe3, 0x30, 0xa5, 0xa7, 0xea, 0xc7, 0x98, 0x17, 0x34, - 0xa1, 0x18, 0xa6, 0x7e, 0x6a, 0x0b, 0x5f, 0x1a, 0xcd, 0xba, 0x32, 0x27, 0xc4, 0x0a, 0xa3, 0x3e, - 0xc5, 0xcf, 0x7c, 0xf8, 0x0b, 0x47, 0xd8, 0xc8, 0x87, 0x19, 0x15, 0x6a, 0xc8, 0x76, 0x7d, 0x4f, - 0x98, 0x5f, 0x45, 0x88, 0x11, 0x3d, 0xf0, 0xd4, 0x7e, 0xbf, 0x3a, 0xb3, 0x99, 0x82, 0xc2, 0x03, - 0xe0, 0xe8, 0x0d, 0x18, 0x6b, 0x06, 0x7e, 0x5b, 0x5c, 0x2e, 0x23, 0x2b, 0x11, 0x1b, 0x77, 0x39, - 0xf0, 0xdb, 0x58, 0x80, 0x20, 0x1b, 0x26, 0xb6, 0x44, 0x1a, 0xac, 0x2e, 0x9e, 0x51, 0x93, 0x9b, - 0x74, 0x0a, 0x5d, 0x07, 0xbe, 0xeb, 0x92, 0x8c, 0x15, 0x34, 0x3a, 0x9f, 0x8c, 0x5d, 0x13, 0xe2, - 0x44, 0x4f, 0x1f, 0x16, 0xb7, 0x50, 0x03, 0xf2, 0xc4, 0xeb, 0x55, 0x0a, 0xe2, 0x58, 0x3c, 0x7a, - 0xf8, 0x1a, 0x57, 0xbc, 0xde, 0x5b, 0x56, 0x50, 0x2f, 0x29, 0x77, 0xc8, 0xaf, 0x78, 0x3d, 0xcc, - 0x47, 0xa3, 0x1e, 0x94, 0x34, 0xeb, 0x55, 0x8a, 0x02, 0xec, 0xd5, 0xec, 0xc9, 0x46, 0xc3, 0xea, - 0x52, 0x12, 0x1f, 0x35, 0x6d, 0xaf, 0xb0, 0xae, 0xc8, 0xfc, 0xf1, 0xb8, 0xba, 0x96, 0x54, 0x59, - 0xf1, 0x0c, 0x8c, 0xb1, 0xbd, 0x4e, 0x58, 0x54, 0x54, 0xc3, 0x1c, 0x73, 0x73, 0xaf, 0x43, 0xee, - 0xf4, 0xab, 0xd3, 0x9a, 0x28, 0x27, 0x61, 0x21, 0xac, 0xed, 0x4c, 0xee, 0xf8, 0x76, 0xa6, 0x06, - 0xb0, 0xed, 0xdb, 0xbb, 0x24, 0x68, 0xf2, 0xa2, 0x47, 0x9d, 0x5d, 0x7e, 0xa4, 0x96, 0x23, 0x2a, - 0xd6, 0x24, 0xd0, 0xdb, 0x90, 0x6f, 0x39, 0x4c, 0xb9, 0xde, 0x88, 0xe7, 0xe9, 0x8a, 0xc3, 0xf4, - 0xe9, 0x14, 0xf8, 0x56, 0x5d, 0x71, 0x18, 0xe6, 0x88, 0xbc, 0x24, 0x11, 0x97, 0x15, 0xad, 0x8c, - 0x67, 0xc9, 0x44, 0xc5, 0xc9, 0x50, 0xc0, 0xd1, 0xdd, 0x23, 0x88, 0x14, 0x2b, 0x60, 0x1e, 0x0c, - 0x79, 0xfc, 0x27, 0xb7, 0xd8, 0xb2, 0x13, 0xa8, 0x62, 0x56, 0x4b, 0xc5, 0x42, 0x0e, 0xd6, 0xa4, - 0xd0, 0x0e, 0x4c, 0x51, 0x81, 0xaa, 0x62, 0x41, 0x21, 0x73, 0x2c, 0x90, 0x49, 0x80, 0x86, 0x85, - 0x13, 0xc8, 0xe8, 0x5d, 0x28, 0x50, 0xf1, 0x17, 0xcd, 0xe6, 0xa7, 0x12, 0x46, 0x37, 0x70, 0xd4, - 0x2b, 0x90, 0x2c, 0x8a, 0x43, 0x05, 0xe6, 0xbf, 0xc2, 0xa4, 0x50, 0x04, 0x80, 0x64, 0x72, 0x6b, - 0x1c, 0x6f, 0x72, 0x9b, 0x3e, 0x93, 0xb9, 0xaf, 0xea, 0x4c, 0x7e, 0x1a, 0x9d, 0x49, 0x99, 0x4f, - 0x9f, 0x87, 0xf1, 0xce, 0x8e, 0x45, 0xc3, 0x43, 0xf9, 0x40, 0x98, 0x76, 0xae, 0x73, 0xe2, 0x9d, - 0x7e, 0x15, 0x64, 0xac, 0xe4, 0xbf, 0xb0, 0x94, 0x14, 0x49, 0xa6, 0xe5, 0xd9, 0xc4, 0x75, 0xc9, - 0xb6, 0x4a, 0x1b, 0xe3, 0x24, 0x33, 0x64, 0xe0, 0x58, 0x06, 0x3d, 0x07, 0x13, 0x01, 0xb1, 0xa8, - 0xef, 0xa9, 0x93, 0xb5, 0x10, 0x7a, 0x26, 0x16, 0xd4, 0x3b, 0xdc, 0x23, 0x64, 0x09, 0x28, 0x7e, - 0x63, 0x25, 0x8d, 0x9e, 0x84, 0x42, 0xfb, 0xf0, 0xb6, 0x4f, 0xc8, 0x47, 0x2d, 0x28, 0x53, 0x66, - 0x05, 0x2c, 0x4a, 0xe6, 0xb2, 0x24, 0x90, 0x68, 0xbf, 0x5f, 0x2d, 0x6f, 0x24, 0x60, 0x70, 0x0a, - 0x16, 0xf5, 0x60, 0xce, 0xf6, 0xdb, 0x1d, 0x97, 0xf0, 0x84, 0x3b, 0xd6, 0x36, 0x31, 0xba, 0xb6, - 0xd3, 0xfb, 0xfd, 0xea, 0x5c, 0x63, 0x10, 0x0b, 0x0f, 0x53, 0x80, 0x5e, 0x86, 0xe2, 0x76, 0x37, - 0xb0, 0x38, 0x51, 0x65, 0xa3, 0x0f, 0x87, 0x09, 0xf8, 0xb2, 0xa2, 0xdf, 0xe9, 0x57, 0x4f, 0xf2, - 0x04, 0xb6, 0x16, 0x12, 0x70, 0x34, 0x04, 0x6d, 0xc1, 0xbc, 0x2f, 0x72, 0x43, 0x79, 0xa1, 0xc9, - 0x98, 0x1a, 0x1e, 0x4a, 0xd5, 0x3a, 0x32, 0x15, 0xe0, 0xfc, 0x8d, 0x03, 0x25, 0xf1, 0x21, 0x28, - 0xe8, 0x7f, 0x61, 0xc2, 0x16, 0xa5, 0x9a, 0x48, 0x6a, 0x47, 0x0e, 0xc9, 0x20, 0x1b, 0x81, 0x1c, - 0x00, 0x2b, 0x20, 0xf3, 0x9f, 0x63, 0x70, 0x52, 0x79, 0x6b, 0x60, 0x31, 0xd2, 0xda, 0x43, 0x17, - 0x13, 0x31, 0xe4, 0xe1, 0x54, 0x0c, 0x99, 0x4d, 0x08, 0x6b, 0x51, 0xe4, 0x03, 0x28, 0xcb, 0xeb, - 0x3b, 0xe4, 0xa9, 0x68, 0xb2, 0x34, 0xda, 0x89, 0x93, 0xeb, 0x4e, 0x28, 0x91, 0x5e, 0xb3, 0x9c, - 0x00, 0xc7, 0x29, 0x65, 0x5c, 0xbd, 0xba, 0xe5, 0x42, 0xf5, 0xf9, 0x2c, 0xea, 0xd5, 0x8d, 0x36, - 0xa8, 0x7e, 0x23, 0x01, 0x8e, 0x53, 0xca, 0xb8, 0x7a, 0xbb, 0x4b, 0x99, 0xdf, 0x8e, 0xd4, 0x8f, - 0x65, 0x51, 0xdf, 0x10, 0x18, 0x43, 0xd4, 0x37, 0x12, 0xe0, 0x38, 0xa5, 0x0c, 0x7d, 0x62, 0xc0, - 0xe9, 0x77, 0x89, 0xb7, 0xeb, 0x78, 0x74, 0xdd, 0xe9, 0x10, 0xd7, 0xf1, 0x62, 0x3b, 0xc8, 0x63, - 0x7a, 0x75, 0xb4, 0x89, 0x5c, 0x4d, 0x82, 0x25, 0x67, 0xf4, 0xc0, 0x7e, 0xbf, 0x7a, 0xfa, 0xea, - 0x70, 0x75, 0xf8, 0xa0, 0x79, 0x98, 0x7f, 0xcc, 0xab, 0x6e, 0x83, 0x7e, 0x9f, 0xea, 0x37, 0x90, - 0xf1, 0x25, 0x37, 0xd0, 0x07, 0x50, 0x16, 0x6d, 0x79, 0xc7, 0x7e, 0x9b, 0x6c, 0xbd, 0xee, 0xfb, - 0xbb, 0xd9, 0x3c, 0xec, 0x4a, 0x02, 0x43, 0xde, 0xea, 0xc2, 0xc6, 0x49, 0x06, 0x4e, 0x29, 0x43, - 0x7b, 0x70, 0x52, 0xea, 0x09, 0xb5, 0x4b, 0x07, 0x7b, 0x6d, 0xe4, 0xdc, 0xe4, 0xf5, 0x08, 0x42, - 0x2a, 0x9f, 0xdd, 0xef, 0x57, 0x4f, 0x26, 0xe8, 0x38, 0xa9, 0x09, 0x7d, 0x68, 0xc0, 0x8c, 0xc8, - 0x2d, 0x1a, 0x3b, 0x96, 0xd7, 0x92, 0xbb, 0xa1, 0x1c, 0xec, 0x95, 0x0c, 0xe9, 0x8b, 0x44, 0x91, - 0xca, 0x45, 0x2d, 0xb0, 0x9a, 0xc2, 0xc6, 0x03, 0xda, 0xcc, 0x1f, 0xe5, 0x01, 0x0d, 0xb6, 0xc3, - 0xd0, 0xb3, 0x89, 0xcb, 0xe2, 0x6c, 0xea, 0xb2, 0x98, 0xd1, 0x47, 0x68, 0x77, 0x45, 0x0b, 0x26, - 0xe4, 0xac, 0xb3, 0xd5, 0x4b, 0xca, 0x2c, 0x0a, 0x77, 0x98, 0xfd, 0x14, 0x3c, 0xcf, 0x75, 0xd4, - 0x2e, 0xaa, 0xdd, 0x3a, 0x9a, 0xa6, 0x61, 0x6e, 0x12, 0x2a, 0x40, 0x54, 0xd5, 0xd9, 0xd2, 0x6a, - 0x6a, 0x7b, 0x5e, 0xcb, 0xbc, 0x3d, 0xa1, 0xce, 0xe9, 0xa8, 0xd6, 0x96, 0x74, 0xac, 0x6b, 0x31, - 0x3f, 0x2e, 0x80, 0x96, 0xff, 0xa0, 0x57, 0xa0, 0x4c, 0x49, 0xd0, 0x73, 0x6c, 0xb2, 0x64, 0xdb, - 0x7e, 0xd7, 0x63, 0x6a, 0x63, 0xa2, 0x6f, 0x16, 0x1b, 0x09, 0x2e, 0x4e, 0x49, 0x8b, 0x7e, 0xbd, - 0xb8, 0xd8, 0xd4, 0xc6, 0x64, 0xea, 0xd7, 0xa7, 0x92, 0x63, 0x55, 0xdd, 0x2a, 0xe0, 0x44, 0xb5, - 0x9c, 0x3f, 0xc6, 0x6a, 0xd9, 0x81, 0x22, 0x4d, 0xde, 0xc5, 0x2f, 0x66, 0xfa, 0xf8, 0xa0, 0xee, - 0xbc, 0xa8, 0x19, 0x17, 0x5d, 0x74, 0x11, 0x3c, 0xb7, 0x9a, 0x0c, 0xda, 0xea, 0xae, 0xcd, 0x62, - 0x35, 0x99, 0x11, 0xc4, 0x56, 0x93, 0xbf, 0xb1, 0x02, 0x46, 0x36, 0x4c, 0x06, 0x44, 0x5a, 0x90, - 0xaa, 0x54, 0xe8, 0x4b, 0x6a, 0x03, 0xac, 0xc4, 0x31, 0x79, 0xaf, 0xeb, 0x04, 0xa4, 0x4d, 0x3c, - 0x46, 0xe3, 0x2c, 0x32, 0xe4, 0x52, 0x1c, 0xe3, 0xa2, 0x2e, 0x40, 0x27, 0x6a, 0xd9, 0xa8, 0x0a, - 0x64, 0x29, 0xc3, 0x5a, 0x92, 0x7d, 0x9f, 0x38, 0x51, 0x8f, 0xe9, 0x58, 0x53, 0x84, 0xfe, 0x1f, - 0xce, 0xc4, 0xf9, 0xd8, 0x32, 0xb1, 0xb6, 0x45, 0xd8, 0x50, 0x8d, 0x4d, 0xd9, 0xe9, 0x7b, 0x68, - 0xbf, 0x5f, 0x3d, 0xd3, 0x38, 0x48, 0x08, 0x1f, 0x3c, 0x1e, 0xdd, 0x82, 0x29, 0xcf, 0xdf, 0x26, - 0x1b, 0xc4, 0x25, 0x36, 0xf3, 0x03, 0x95, 0x38, 0xd5, 0x47, 0x5b, 0x95, 0x6c, 0xfe, 0x5a, 0xee, - 0x75, 0x0d, 0x49, 0xd6, 0x59, 0x3a, 0x05, 0x27, 0x34, 0x99, 0xbf, 0x1f, 0x83, 0xb9, 0x21, 0xf1, - 0x1c, 0xdd, 0x50, 0x5d, 0x95, 0x4c, 0xcd, 0xc3, 0xe8, 0xb3, 0x91, 0xd6, 0x59, 0x11, 0x4d, 0x44, - 0xd7, 0xbd, 0x57, 0x4d, 0xc4, 0x10, 0x09, 0x6b, 0xa8, 0x61, 0x97, 0x24, 0x7f, 0xa4, 0x2e, 0xc9, - 0x55, 0x40, 0xe4, 0x56, 0xc7, 0xa7, 0x44, 0xe5, 0x72, 0xfc, 0x5f, 0x59, 0xe2, 0x17, 0xeb, 0xf3, - 0x4a, 0x1a, 0xad, 0x0c, 0x48, 0xe0, 0x21, 0xa3, 0x78, 0x89, 0xd4, 0xf4, 0x03, 0x9b, 0xf0, 0xf9, - 0x8a, 0x63, 0xa7, 0x95, 0x48, 0x97, 0x43, 0x06, 0x8e, 0x65, 0x90, 0x1d, 0x97, 0xbd, 0x13, 0x59, - 0x5a, 0xa0, 0xd2, 0x10, 0xc2, 0xa1, 0x0f, 0xac, 0x77, 0xd1, 0x12, 0x4c, 0x8b, 0x41, 0x4b, 0xeb, - 0xab, 0x61, 0x0f, 0x4a, 0x7e, 0x82, 0x3e, 0xad, 0x86, 0xc8, 0x16, 0x4c, 0xcc, 0xc6, 0x69, 0x79, - 0xf3, 0x97, 0x79, 0x98, 0x1b, 0x92, 0x04, 0x47, 0xcd, 0x38, 0xe3, 0x5e, 0x34, 0xe3, 0xbe, 0x0a, - 0x97, 0x79, 0x12, 0x0a, 0x9e, 0xdf, 0xb0, 0xec, 0x1d, 0xa2, 0xbe, 0x67, 0x44, 0x66, 0xbb, 0x2e, - 0xc9, 0x38, 0xe4, 0x87, 0xde, 0x35, 0x76, 0x24, 0xef, 0x1a, 0xd9, 0x23, 0x5e, 0x09, 0x2b, 0x96, - 0xa6, 0xe3, 0x92, 0x75, 0x8b, 0xed, 0xa8, 0x56, 0x4d, 0x14, 0x2c, 0x97, 0x13, 0x5c, 0x9c, 0x92, - 0x36, 0x7f, 0x6e, 0xc0, 0xdc, 0x90, 0x64, 0x32, 0x11, 0xe1, 0x8c, 0x63, 0x8c, 0x70, 0x8f, 0xc3, - 0x04, 0x8d, 0x37, 0x50, 0x6f, 0x85, 0xcb, 0xcd, 0x50, 0x5c, 0xf3, 0xf6, 0xc0, 0x3c, 0x57, 0x7a, - 0xc4, 0x63, 0xd9, 0x9a, 0x85, 0xeb, 0xb2, 0x2f, 0x27, 0x5d, 0xe6, 0xe2, 0xc8, 0xb9, 0xef, 0xaa, - 0xd7, 0xf4, 0x53, 0x0d, 0xb9, 0x7b, 0x71, 0xb5, 0x98, 0x7f, 0x32, 0xa0, 0x9c, 0x6c, 0xfb, 0xa1, - 0x87, 0x20, 0xdf, 0x0d, 0x1c, 0xb5, 0xba, 0x68, 0xc4, 0x9b, 0x78, 0x15, 0x73, 0x3a, 0x67, 0x07, - 0xa4, 0xa9, 0x4c, 0x17, 0xb1, 0x31, 0x69, 0x62, 0x4e, 0x47, 0x1d, 0x28, 0x75, 0x02, 0xff, 0xd6, - 0x9e, 0x2c, 0x97, 0xb3, 0x3d, 0x5f, 0x58, 0x8f, 0x01, 0xe2, 0xbe, 0x91, 0x46, 0xc4, 0xba, 0x0a, - 0xf3, 0x67, 0x06, 0xa0, 0xc1, 0xea, 0xe0, 0x3f, 0xce, 0x9b, 0x7e, 0x90, 0x83, 0x82, 0xda, 0x48, - 0xf4, 0x4d, 0x28, 0xb7, 0x12, 0x46, 0xcf, 0x36, 0xc3, 0x54, 0xbf, 0x36, 0x3a, 0x7f, 0x49, 0x3a, - 0x4e, 0xe9, 0x42, 0x1f, 0x19, 0x30, 0xdb, 0x72, 0x58, 0x72, 0x7d, 0xd9, 0x7a, 0xd8, 0x57, 0xd2, - 0x30, 0xf5, 0x33, 0x6a, 0x12, 0xb3, 0x03, 0x2c, 0x3c, 0xa8, 0xd4, 0xfc, 0x73, 0x0e, 0x06, 0x05, - 0xb9, 0x49, 0x6d, 0x99, 0x4b, 0x19, 0x43, 0x1f, 0x63, 0x29, 0x2e, 0x2f, 0x87, 0x2c, 0xf1, 0x9a, - 0x29, 0xdb, 0xe4, 0xa5, 0xd6, 0x86, 0xef, 0xb1, 0xc0, 0x77, 0xdf, 0xa4, 0x24, 0xd0, 0x5e, 0x13, - 0x09, 0x58, 0xac, 0xe0, 0x51, 0x07, 0x26, 0xed, 0xf0, 0x71, 0x52, 0xb6, 0x37, 0x26, 0x83, 0xba, - 0xb4, 0xaf, 0xdf, 0x0a, 0x19, 0xc7, 0x4a, 0x46, 0x68, 0x30, 0x9a, 0x3f, 0x34, 0x60, 0x26, 0x5d, - 0x9e, 0xf2, 0xf1, 0xa2, 0xdc, 0x59, 0x5d, 0x4e, 0xb7, 0x07, 0x56, 0x25, 0x19, 0x87, 0x7c, 0xb4, - 0x09, 0x05, 0x1e, 0xdb, 0xb0, 0x3a, 0xd4, 0x23, 0xc7, 0x48, 0xf1, 0x35, 0xf2, 0xb2, 0x44, 0xc0, - 0x21, 0x94, 0xf9, 0x3b, 0x03, 0xd0, 0x60, 0x55, 0x86, 0xd6, 0xe1, 0x94, 0x6b, 0x51, 0x16, 0x35, - 0x81, 0x57, 0x13, 0x93, 0x7c, 0x50, 0x4d, 0xf2, 0xd4, 0xda, 0x10, 0x19, 0x3c, 0x74, 0x64, 0x14, - 0xdf, 0x73, 0xf7, 0x20, 0xbe, 0x9b, 0x1b, 0x00, 0xf1, 0xe7, 0x59, 0x74, 0x16, 0xc6, 0x3c, 0xab, - 0x1d, 0x5e, 0xf4, 0x51, 0x0a, 0x29, 0x1e, 0xc1, 0x09, 0x0e, 0x7a, 0x04, 0xc6, 0x7b, 0x96, 0xdb, - 0x0d, 0x5f, 0x19, 0x46, 0x4f, 0x23, 0xde, 0xe2, 0x44, 0x2c, 0x79, 0xe6, 0x2f, 0x72, 0x50, 0xd2, - 0x3e, 0x7f, 0x1c, 0x47, 0x22, 0x3b, 0xde, 0xb1, 0xd8, 0x4e, 0xf8, 0xaa, 0xe3, 0xe5, 0xcc, 0x5f, - 0x66, 0x78, 0x78, 0x8e, 0x17, 0xc1, 0x7f, 0x51, 0x2c, 0xa1, 0x53, 0x99, 0x4f, 0xfe, 0x38, 0x32, - 0x1f, 0xf3, 0x3b, 0x06, 0x4c, 0xa7, 0x66, 0x83, 0x2e, 0x00, 0xd0, 0xe8, 0x97, 0xda, 0x89, 0xa8, - 0x30, 0x8a, 0xe5, 0xb0, 0x26, 0x25, 0x12, 0x14, 0x42, 0x99, 0xe3, 0x89, 0x0e, 0xf3, 0xb2, 0x13, - 0xa8, 0xed, 0x89, 0x13, 0x94, 0x04, 0x17, 0xa7, 0xa4, 0xcd, 0x8f, 0x0d, 0x78, 0xf0, 0xb0, 0x46, - 0x1e, 0x4f, 0x57, 0x55, 0xb7, 0x2e, 0x4a, 0x81, 0x8c, 0x64, 0xba, 0x7a, 0x35, 0xc9, 0xc6, 0x69, - 0x79, 0x74, 0x11, 0x4a, 0x1a, 0x49, 0x4d, 0x30, 0x0a, 0x76, 0xda, 0x70, 0xac, 0xcb, 0x99, 0x7f, - 0x35, 0xe0, 0xd4, 0xb0, 0xaa, 0x0a, 0x05, 0xe1, 0xcb, 0x1e, 0xf9, 0x60, 0xeb, 0xda, 0xd1, 0x0b, - 0xb5, 0x9a, 0x78, 0xdf, 0xb3, 0xe2, 0xb1, 0x60, 0x6f, 0xf8, 0x9b, 0x9f, 0xf9, 0x4b, 0x00, 0xb1, - 0x0c, 0x9a, 0x81, 0xfc, 0x2e, 0xd9, 0x93, 0x86, 0xc0, 0xfc, 0x4f, 0x74, 0x2a, 0x71, 0x3a, 0xd4, - 0x71, 0x78, 0x21, 0x77, 0xc9, 0x78, 0xa1, 0xf8, 0xf1, 0x4f, 0xab, 0x27, 0x3e, 0xfc, 0xfb, 0xd9, - 0x13, 0xe6, 0xf7, 0x0d, 0xd0, 0x43, 0x3b, 0x7a, 0x0a, 0x26, 0x77, 0x18, 0xeb, 0x08, 0x92, 0xfa, - 0x28, 0x23, 0x1e, 0xb7, 0xbc, 0xbe, 0xb9, 0xb9, 0x2e, 0x88, 0x38, 0xe6, 0xa3, 0x1a, 0x00, 0xff, - 0x41, 0xa5, 0xf4, 0x58, 0xfc, 0x71, 0x94, 0x4b, 0x6f, 0x48, 0x71, 0x4d, 0x02, 0x3d, 0xc6, 0x53, - 0x6b, 0x29, 0x2c, 0xdf, 0xdb, 0x96, 0x64, 0x5a, 0x2d, 0x25, 0x43, 0x9e, 0xf9, 0x6b, 0x03, 0x66, - 0x07, 0xbe, 0xd6, 0xa1, 0x9b, 0x51, 0xa0, 0x37, 0xb2, 0x7b, 0xff, 0xf0, 0xe4, 0xe0, 0xc8, 0x1e, - 0xfb, 0xa9, 0x01, 0x10, 0x17, 0x5a, 0xc8, 0x85, 0x29, 0x09, 0x9c, 0xc8, 0x2e, 0xb2, 0x4c, 0xf8, - 0x94, 0x9a, 0xc0, 0xd4, 0x86, 0x86, 0x87, 0x13, 0xe8, 0xbc, 0x80, 0x68, 0xfb, 0x5d, 0x8f, 0x89, - 0x73, 0x90, 0x4b, 0x3e, 0xed, 0xba, 0x16, 0x32, 0x70, 0x2c, 0x63, 0x7e, 0x77, 0x1c, 0xe6, 0x86, - 0x7c, 0x30, 0xf8, 0x2f, 0xae, 0xf0, 0x9f, 0x84, 0x82, 0x7c, 0x7f, 0x43, 0xd3, 0xe1, 0x5e, 0x3e, - 0xcf, 0xe1, 0xa5, 0xb2, 0xfc, 0x03, 0x9d, 0x87, 0x92, 0xe3, 0xd9, 0xb2, 0x31, 0x65, 0x85, 0x05, - 0x9b, 0x6c, 0x76, 0xc6, 0x64, 0xac, 0xcb, 0x24, 0x2b, 0xbc, 0x89, 0xbb, 0xaa, 0xf9, 0xa7, 0xd4, - 0xff, 0x01, 0x90, 0xaf, 0x65, 0x0a, 0x59, 0x36, 0x44, 0xf4, 0x79, 0xb0, 0x06, 0x83, 0x13, 0xa0, - 0xe8, 0xdb, 0x06, 0xcc, 0x28, 0xc2, 0x52, 0xc0, 0x9c, 0xa6, 0x65, 0x47, 0x5f, 0xd6, 0x8f, 0x18, - 0xc1, 0x2a, 0x6a, 0x71, 0x33, 0x38, 0x05, 0x8f, 0x07, 0x14, 0x9a, 0x37, 0x61, 0x76, 0x20, 0x37, - 0xbb, 0xbb, 0xc0, 0x4f, 0xc4, 0xdb, 0xf6, 0x54, 0xe0, 0x97, 0x4f, 0xda, 0x25, 0xcf, 0xfc, 0xc4, - 0x80, 0x72, 0x2a, 0xb5, 0xcd, 0x54, 0x3b, 0xde, 0xd4, 0x6b, 0xc7, 0x23, 0x67, 0xe8, 0x89, 0x2a, - 0xd2, 0x6c, 0x42, 0x39, 0xd9, 0xac, 0xd7, 0x0a, 0x1a, 0xe3, 0xb0, 0x82, 0x06, 0x9d, 0x83, 0xa2, - 0xe5, 0xba, 0xfe, 0xfb, 0x2b, 0x5e, 0x4f, 0x7d, 0x6b, 0x8f, 0x7a, 0xbd, 0x4b, 0x8a, 0x8e, 0x23, - 0x89, 0xfa, 0xa3, 0x9f, 0xdd, 0x5e, 0x38, 0xf1, 0xf9, 0xed, 0x85, 0x13, 0x7f, 0xbb, 0xbd, 0x70, - 0xe2, 0xc3, 0xfd, 0x05, 0xe3, 0xb3, 0xfd, 0x05, 0xe3, 0xf3, 0xfd, 0x05, 0xe3, 0x1f, 0xfb, 0x0b, - 0xc6, 0xf7, 0xbe, 0x58, 0x38, 0x71, 0x33, 0xd7, 0x3b, 0xff, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xee, 0x17, 0x05, 0xb7, 0x91, 0x33, 0x00, 0x00, + // 3327 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe4, 0x5b, 0x49, 0x6c, 0x1c, 0xc7, + 0xd5, 0x56, 0xcf, 0x90, 0x33, 0xc3, 0x37, 0x14, 0x97, 0xa2, 0x6c, 0x8d, 0x68, 0x9b, 0x23, 0xb7, + 0x17, 0xd8, 0xb0, 0x3c, 0x84, 0x64, 0xcb, 0xbf, 0xbc, 0x9b, 0x33, 0xa4, 0x64, 0xca, 0x94, 0xc4, + 0xbf, 0x48, 0x6f, 0xfa, 0xf1, 0xff, 0x3f, 0x9a, 0xcd, 0x9a, 0x61, 0x9b, 0x3d, 0xdd, 0xe3, 0xae, + 0x9a, 0xb1, 0x08, 0xc4, 0x80, 0x91, 0x20, 0x80, 0x73, 0xcb, 0xe2, 0x83, 0x2f, 0x41, 0x62, 0x20, + 0x0b, 0x82, 0x1c, 0x82, 0x2c, 0x87, 0x00, 0xb9, 0x24, 0x40, 0x0e, 0x3e, 0x05, 0x3e, 0xe6, 0x10, + 0x0c, 0x22, 0xfa, 0x90, 0x73, 0xae, 0x3a, 0x05, 0xb5, 0x74, 0x77, 0x75, 0xcf, 0x90, 0xd6, 0x34, + 0x45, 0x23, 0x40, 0x2e, 0x02, 0xe7, 0xbd, 0x57, 0xdf, 0xab, 0x7a, 0xf5, 0xaa, 0xde, 0xd2, 0x25, + 0x78, 0xa9, 0xe5, 0xb0, 0x9d, 0xee, 0x56, 0xcd, 0xf6, 0xdb, 0x8b, 0x7e, 0x87, 0x78, 0x74, 0xc7, + 0x69, 0xb2, 0x45, 0x3f, 0x70, 0x5a, 0x8e, 0xb7, 0xd8, 0xd9, 0x6d, 0x2d, 0x6e, 0x75, 0x1d, 0x77, + 0x7b, 0xd1, 0xea, 0x38, 0x8b, 0xbd, 0xf3, 0x8b, 0x2d, 0xe2, 0x91, 0xc0, 0x62, 0x64, 0xbb, 0xd6, + 0x09, 0x7c, 0xe6, 0xa3, 0x73, 0xf1, 0xe8, 0x5a, 0x34, 0xba, 0x26, 0x47, 0xd7, 0x3a, 0xbb, 0xad, + 0x9a, 0x18, 0x5d, 0xb3, 0x3a, 0x4e, 0xad, 0x77, 0x7e, 0xfe, 0x69, 0x4d, 0x57, 0xcb, 0x6f, 0xf9, + 0x8b, 0x02, 0x64, 0xab, 0xdb, 0x14, 0xbf, 0xc4, 0x0f, 0xf1, 0x97, 0x04, 0x9f, 0xbf, 0xb8, 0x7b, + 0x89, 0xd6, 0x1c, 0x7f, 0x71, 0xb7, 0xbb, 0x45, 0x02, 0x8f, 0x30, 0x42, 0xc5, 0x84, 0xf8, 0x54, + 0xba, 0x5e, 0x8f, 0x04, 0xd4, 0xf1, 0x3d, 0xb2, 0x9d, 0x9e, 0xd3, 0xfc, 0xb9, 0x83, 0x87, 0x0d, + 0xae, 0x60, 0xfe, 0xe9, 0xe1, 0xd2, 0x41, 0xd7, 0x63, 0x4e, 0x9b, 0x0c, 0x88, 0x9f, 0x1f, 0x2e, + 0xde, 0x65, 0x8e, 0xbb, 0xe8, 0x78, 0x8c, 0xb2, 0x20, 0x3d, 0xc4, 0xfc, 0xfd, 0x18, 0x9c, 0xa9, + 0x3b, 0x9e, 0x15, 0xec, 0xd5, 0xb9, 0x31, 0x30, 0x79, 0xbf, 0x4b, 0x28, 0xbb, 0xd1, 0x61, 0x8e, + 0xef, 0x51, 0xf4, 0x0e, 0x94, 0xda, 0x84, 0x59, 0xdb, 0x16, 0xb3, 0x2a, 0xc6, 0x59, 0xe3, 0x89, + 0xf2, 0x85, 0x27, 0x6a, 0x52, 0x47, 0x2d, 0xd6, 0x21, 0x4c, 0x29, 0x8d, 0x58, 0xbb, 0xb1, 0xf5, + 0x1e, 0xb1, 0xd9, 0x35, 0xc2, 0xac, 0x3a, 0xfa, 0xbc, 0x5f, 0x3d, 0xb1, 0xdf, 0xaf, 0x42, 0x4c, + 0xc3, 0x11, 0x1a, 0x7a, 0x1c, 0x0a, 0x16, 0xbd, 0xec, 0xb8, 0xa4, 0x92, 0x3b, 0x6b, 0x3c, 0x31, + 0x51, 0x9f, 0x52, 0xd2, 0x85, 0x25, 0x41, 0xc5, 0x8a, 0x8b, 0x9e, 0x83, 0xa9, 0x80, 0xf4, 0x1c, + 0x6e, 0xcd, 0x86, 0xdf, 0x6e, 0x3b, 0xac, 0x92, 0x4f, 0xca, 0x4b, 0x2a, 0x4e, 0x49, 0xa1, 0xe7, + 0x61, 0x3a, 0xa4, 0x5c, 0x23, 0x94, 0x5a, 0x2d, 0x52, 0x19, 0x13, 0x03, 0xa7, 0xd5, 0xc0, 0xa2, + 0x22, 0xe3, 0xb4, 0x1c, 0xaa, 0x03, 0x0a, 0x49, 0x4b, 0x5d, 0xb6, 0xe3, 0x07, 0xd7, 0xad, 0x36, + 0xa9, 0x8c, 0x8b, 0xd1, 0xd1, 0xa2, 0x62, 0x0e, 0x1e, 0x22, 0x8d, 0x56, 0x60, 0x2e, 0x49, 0x5d, + 0x69, 0x5b, 0x8e, 0x5b, 0x29, 0x08, 0x90, 0x39, 0x05, 0x52, 0xd6, 0x58, 0x78, 0x98, 0x3c, 0x7a, + 0x03, 0xee, 0x4b, 0xae, 0x8b, 0x11, 0x39, 0x9b, 0xa2, 0x00, 0xba, 0x4f, 0x01, 0x9d, 0x4c, 0x30, + 0xf1, 0xf0, 0x31, 0xe8, 0x3a, 0xdc, 0x3f, 0xc0, 0x90, 0xd3, 0x2a, 0x09, 0xb4, 0xfb, 0x15, 0xda, + 0x54, 0x92, 0x8b, 0x0f, 0x18, 0x65, 0xbe, 0x08, 0xb3, 0x9a, 0xe7, 0x6c, 0xf8, 0xdd, 0xc0, 0x26, + 0xda, 0xbe, 0x1a, 0x87, 0xed, 0xab, 0xf9, 0xa3, 0x1c, 0x8c, 0x8b, 0x71, 0xc7, 0xe8, 0x63, 0xef, + 0xc2, 0x18, 0xed, 0x10, 0x5b, 0x78, 0x58, 0xf9, 0xc2, 0x7f, 0xd5, 0x46, 0xb9, 0x0e, 0x6a, 0x72, + 0x51, 0x1d, 0x62, 0xd7, 0x27, 0x95, 0x92, 0x31, 0xfe, 0x0b, 0x0b, 0x48, 0x64, 0x41, 0x81, 0x32, + 0x8b, 0x75, 0xa9, 0x70, 0xc7, 0xf2, 0x85, 0xe7, 0xb3, 0x80, 0x0b, 0x80, 0xd8, 0x42, 0xf2, 0x37, + 0x56, 0xc0, 0xe6, 0xaf, 0x73, 0x50, 0x16, 0x72, 0x0d, 0xdf, 0x6b, 0x3a, 0xad, 0x63, 0xb4, 0xd3, + 0xff, 0x27, 0xec, 0xf4, 0x72, 0x86, 0xa5, 0xc8, 0x29, 0x1e, 0x68, 0xad, 0x56, 0xca, 0x5a, 0xaf, + 0x66, 0x57, 0x71, 0xb8, 0xcd, 0xbe, 0x30, 0x60, 0x5a, 0x93, 0x5e, 0x73, 0x28, 0x43, 0xff, 0x3b, + 0x60, 0xb7, 0xc5, 0x43, 0xec, 0xa6, 0xdd, 0xdd, 0x35, 0x3e, 0x5c, 0x98, 0x6f, 0x46, 0xa9, 0x2b, + 0x85, 0x14, 0xcd, 0x78, 0xff, 0x07, 0xe3, 0x0e, 0x23, 0x6d, 0x5a, 0xc9, 0x9d, 0xcd, 0x67, 0x74, + 0x04, 0x39, 0xd9, 0xfa, 0x49, 0xa5, 0x65, 0x7c, 0x95, 0xe3, 0x61, 0x09, 0x6b, 0xfe, 0x26, 0x97, + 0x58, 0x12, 0xb7, 0x2a, 0xf2, 0xa0, 0xc4, 0x02, 0xa7, 0xd5, 0x22, 0x01, 0xad, 0x18, 0x42, 0xed, + 0x6b, 0x19, 0xd4, 0x6e, 0x4a, 0x88, 0x75, 0xdf, 0x75, 0xec, 0xbd, 0x78, 0x8d, 0x8a, 0x4c, 0x71, + 0xa4, 0x03, 0x2d, 0xc1, 0x44, 0xd0, 0xf5, 0xa4, 0xa0, 0xba, 0xaf, 0x1f, 0x51, 0xe2, 0x13, 0x38, + 0x64, 0xdc, 0xe9, 0x57, 0xa7, 0x64, 0x0c, 0x09, 0x29, 0x38, 0x1e, 0x85, 0x5c, 0x00, 0xdb, 0x6f, + 0xb7, 0x7d, 0x8f, 0x2f, 0x40, 0xb9, 0xc1, 0xa5, 0xd1, 0x26, 0xdd, 0x88, 0xc6, 0xc7, 0xfe, 0x1c, + 0xd3, 0xb0, 0x86, 0x6f, 0x5e, 0x85, 0xd9, 0x01, 0xa7, 0x41, 0x17, 0xa1, 0xec, 0x5a, 0x94, 0xbd, + 0x25, 0xf7, 0x57, 0xf8, 0x42, 0x3e, 0xbe, 0x8b, 0xd7, 0x62, 0x16, 0xd6, 0xe5, 0xcc, 0x3f, 0x1b, + 0x30, 0x21, 0xc0, 0xbe, 0x0e, 0x6f, 0x7a, 0x27, 0xe9, 0x4d, 0xcf, 0x64, 0xd8, 0xd6, 0x03, 0xfc, + 0x08, 0xa0, 0x24, 0x57, 0xe1, 0xb7, 0xcc, 0x8f, 0xc7, 0x94, 0x4f, 0xad, 0xf9, 0xad, 0x30, 0xd4, + 0x2f, 0xc2, 0x84, 0xed, 0x7b, 0xcc, 0x72, 0x3c, 0x12, 0xa8, 0xbb, 0x7b, 0x36, 0xdc, 0xe3, 0x46, + 0xc8, 0xc0, 0xb1, 0x0c, 0xbf, 0xe9, 0x9b, 0xbe, 0xeb, 0xfa, 0x1f, 0x08, 0x8f, 0x28, 0xc5, 0x67, + 0xf2, 0xb2, 0xa0, 0x62, 0xc5, 0x45, 0xe7, 0xa0, 0xd4, 0xe1, 0x11, 0xc4, 0x57, 0xc7, 0xbf, 0x14, + 0x1b, 0x60, 0x5d, 0xd1, 0x71, 0x24, 0x81, 0x9e, 0x85, 0x49, 0xea, 0x78, 0x36, 0xd9, 0x20, 0xb6, + 0xef, 0x6d, 0x53, 0x11, 0xb4, 0xf3, 0xf5, 0x99, 0xfd, 0x7e, 0x75, 0x72, 0x43, 0xa3, 0xe3, 0x84, + 0x14, 0x7a, 0x07, 0x26, 0xc4, 0xef, 0x4d, 0x47, 0x45, 0xea, 0xf2, 0x85, 0xa7, 0xee, 0x72, 0x5b, + 0xf8, 0x90, 0xfa, 0x49, 0xbe, 0xca, 0x8d, 0x10, 0x01, 0xc7, 0x60, 0xe8, 0x02, 0x00, 0x4f, 0xb5, + 0x28, 0xb3, 0xda, 0x1d, 0x2a, 0xe2, 0x77, 0x29, 0xf6, 0xbe, 0xcd, 0x88, 0x83, 0x35, 0x29, 0xf4, + 0x14, 0x4c, 0x30, 0xcb, 0x71, 0xd7, 0x1c, 0x8f, 0x50, 0x11, 0xa9, 0xf3, 0x52, 0xc1, 0x66, 0x48, + 0xc4, 0x31, 0x1f, 0xd5, 0x00, 0x5c, 0xa7, 0xed, 0xb0, 0xfa, 0x1e, 0x23, 0x54, 0x44, 0xe2, 0x7c, + 0x7d, 0x8a, 0x83, 0xaf, 0x45, 0x54, 0xac, 0x49, 0x70, 0xb3, 0x7b, 0xfe, 0x07, 0x96, 0xc3, 0x2a, + 0x13, 0x49, 0xb3, 0x5f, 0xf7, 0xdf, 0xb6, 0x1c, 0x86, 0x15, 0x17, 0x3d, 0x06, 0x45, 0xb5, 0xc8, + 0x0a, 0x08, 0xd0, 0x32, 0x4f, 0x7a, 0x42, 0x0f, 0x0f, 0x79, 0xe6, 0x2f, 0xc2, 0x28, 0x73, 0xa3, + 0xcb, 0x3a, 0x5d, 0x86, 0x56, 0x20, 0xc7, 0x7c, 0xe5, 0xd9, 0x4f, 0xdf, 0x4d, 0x7c, 0xc1, 0xa4, + 0x49, 0x02, 0xe2, 0xd9, 0xa4, 0x5e, 0xd8, 0xef, 0x57, 0x73, 0x9b, 0x3e, 0xce, 0x31, 0x1f, 0x6d, + 0x01, 0x74, 0xba, 0x74, 0x67, 0x83, 0xd8, 0x01, 0x61, 0x2a, 0xb0, 0x5c, 0x38, 0x1c, 0x6e, 0xcd, + 0xb7, 0x2d, 0x37, 0x8d, 0x29, 0x2c, 0xb1, 0x1e, 0x21, 0x61, 0x0d, 0x15, 0xf9, 0x50, 0x76, 0xda, + 0x56, 0x8b, 0xac, 0x59, 0x5b, 0xc4, 0xe5, 0xbe, 0x95, 0x1f, 0xfd, 0x4e, 0x59, 0x8d, 0x00, 0xe2, + 0x9b, 0x20, 0xa6, 0x51, 0xac, 0x6b, 0x30, 0xbf, 0x69, 0xc0, 0x9c, 0xb0, 0xd5, 0xba, 0x4f, 0x99, + 0x4c, 0x86, 0xc4, 0x75, 0xfc, 0x18, 0x14, 0xf9, 0xdd, 0x63, 0x79, 0xdb, 0xe2, 0x36, 0x9e, 0x90, + 0xa6, 0x6e, 0x48, 0x12, 0x0e, 0x79, 0xe8, 0x41, 0x18, 0xb3, 0x82, 0x96, 0x3c, 0xda, 0x13, 0xf5, + 0x12, 0x8f, 0x91, 0x4b, 0x41, 0x8b, 0x62, 0x41, 0xe5, 0xfb, 0x4a, 0xed, 0xc0, 0xe9, 0x0c, 0x24, + 0xb8, 0x1b, 0x82, 0x8a, 0x15, 0xd7, 0xfc, 0x72, 0x1c, 0x26, 0xf5, 0x54, 0xfd, 0x18, 0xf3, 0x82, + 0x26, 0x94, 0xc2, 0xd4, 0x4f, 0x6d, 0xe1, 0x4b, 0xa3, 0x59, 0x57, 0xe6, 0x84, 0x58, 0x61, 0xd4, + 0x27, 0xf9, 0x99, 0x0f, 0x7f, 0xe1, 0x08, 0x1b, 0xf9, 0x30, 0xa3, 0x42, 0x0d, 0xd9, 0xae, 0xef, + 0x09, 0xf3, 0xab, 0x08, 0x31, 0xa2, 0x07, 0x9e, 0xda, 0xef, 0x57, 0x67, 0x36, 0x53, 0x50, 0x78, + 0x00, 0x1c, 0xbd, 0x01, 0x63, 0xcd, 0xc0, 0x6f, 0x8b, 0xcb, 0x65, 0x64, 0x25, 0x62, 0xe3, 0x2e, + 0x07, 0x7e, 0x1b, 0x0b, 0x10, 0x64, 0x43, 0x61, 0x4b, 0xa4, 0xc1, 0xea, 0xe2, 0x19, 0x35, 0xb9, + 0x49, 0xa7, 0xd0, 0x75, 0xe0, 0xbb, 0x2e, 0xc9, 0x58, 0x41, 0xa3, 0xf3, 0xc9, 0xd8, 0x55, 0x10, + 0x27, 0x7a, 0xfa, 0xb0, 0xb8, 0x85, 0x1a, 0x90, 0x27, 0x5e, 0xaf, 0x52, 0x14, 0xc7, 0xe2, 0xd1, + 0xc3, 0xd7, 0xb8, 0xe2, 0xf5, 0xde, 0xb2, 0x82, 0x7a, 0x59, 0xb9, 0x43, 0x7e, 0xc5, 0xeb, 0x61, + 0x3e, 0x1a, 0xf5, 0xa0, 0xac, 0x59, 0xaf, 0x52, 0x12, 0x60, 0xaf, 0x66, 0x4f, 0x36, 0x1a, 0x56, + 0x97, 0x92, 0xf8, 0xa8, 0x69, 0x7b, 0x85, 0x75, 0x45, 0xe6, 0x0f, 0xc7, 0xd5, 0xb5, 0xa4, 0xca, + 0x8a, 0x67, 0x60, 0x8c, 0xed, 0x75, 0xc2, 0xa2, 0xa2, 0x1a, 0xe6, 0x98, 0x9b, 0x7b, 0x1d, 0x72, + 0xa7, 0x5f, 0x9d, 0xd6, 0x44, 0x39, 0x09, 0x0b, 0x61, 0x6d, 0x67, 0x72, 0xc7, 0xb7, 0x33, 0x35, + 0x80, 0x6d, 0xdf, 0xde, 0x25, 0x41, 0x93, 0x17, 0x3d, 0xea, 0xec, 0xf2, 0x23, 0xb5, 0x1c, 0x51, + 0xb1, 0x26, 0x81, 0xde, 0x86, 0x7c, 0xcb, 0x61, 0xca, 0xf5, 0x46, 0x3c, 0x4f, 0x57, 0x1c, 0xa6, + 0x4f, 0xa7, 0xc8, 0xb7, 0xea, 0x8a, 0xc3, 0x30, 0x47, 0xe4, 0x25, 0x89, 0xb8, 0xac, 0x68, 0x65, + 0x3c, 0x4b, 0x26, 0x2a, 0x4e, 0x86, 0x02, 0x8e, 0xee, 0x1e, 0x41, 0xa4, 0x58, 0x01, 0xf3, 0x60, + 0xc8, 0xe3, 0x3f, 0xb9, 0xc5, 0x96, 0x9d, 0x40, 0x15, 0xb3, 0x5a, 0x2a, 0x16, 0x72, 0xb0, 0x26, + 0x85, 0x76, 0x60, 0x92, 0x0a, 0x54, 0x15, 0x0b, 0x8a, 0x99, 0x63, 0x81, 0x4c, 0x02, 0x34, 0x2c, + 0x9c, 0x40, 0x46, 0xef, 0x41, 0x91, 0x8a, 0xbf, 0x68, 0x36, 0x3f, 0x95, 0x30, 0xba, 0x81, 0xa3, + 0x5e, 0x81, 0x64, 0x51, 0x1c, 0x2a, 0x30, 0xff, 0x19, 0x26, 0x85, 0x22, 0x00, 0x24, 0x93, 0x5b, + 0xe3, 0x78, 0x93, 0xdb, 0xf4, 0x99, 0xcc, 0x7d, 0x5d, 0x67, 0xf2, 0x93, 0x42, 0x78, 0x26, 0x65, + 0x3e, 0x7d, 0x1e, 0xc6, 0x3b, 0x3b, 0x16, 0x0d, 0x0f, 0xe5, 0x03, 0x61, 0xda, 0xb9, 0xce, 0x89, + 0x77, 0xfa, 0x55, 0x90, 0xb1, 0x92, 0xff, 0xc2, 0x52, 0x52, 0x24, 0x99, 0x96, 0x67, 0x13, 0xd7, + 0x25, 0xdb, 0x2a, 0x6d, 0x8c, 0x93, 0xcc, 0x90, 0x81, 0x63, 0x19, 0xf4, 0x1c, 0x14, 0x02, 0x62, + 0x51, 0xdf, 0x53, 0x27, 0x6b, 0x21, 0xf4, 0x4c, 0x2c, 0xa8, 0x77, 0xb8, 0x47, 0xc8, 0x12, 0x50, + 0xfc, 0xc6, 0x4a, 0x1a, 0x3d, 0x09, 0xc5, 0xf6, 0xe1, 0x6d, 0x9f, 0x90, 0x8f, 0x5a, 0x30, 0x45, + 0x99, 0x15, 0xb0, 0x28, 0x99, 0xcb, 0x92, 0x40, 0xa2, 0xfd, 0x7e, 0x75, 0x6a, 0x23, 0x01, 0x83, + 0x53, 0xb0, 0xa8, 0x07, 0x73, 0xb6, 0xdf, 0xee, 0xb8, 0x84, 0x27, 0xdc, 0xb1, 0xb6, 0xc2, 0xe8, + 0xda, 0x4e, 0xef, 0xf7, 0xab, 0x73, 0x8d, 0x41, 0x2c, 0x3c, 0x4c, 0x01, 0x7a, 0x19, 0x4a, 0xdb, + 0xdd, 0xc0, 0xe2, 0x44, 0x95, 0x8d, 0x3e, 0x1c, 0x26, 0xe0, 0xcb, 0x8a, 0x7e, 0xa7, 0x5f, 0x3d, + 0xc9, 0x13, 0xd8, 0x5a, 0x48, 0xc0, 0xd1, 0x10, 0xb4, 0x05, 0xf3, 0xbe, 0xc8, 0x0d, 0xe5, 0x85, + 0x26, 0x63, 0x6a, 0x78, 0x28, 0x55, 0xeb, 0xc8, 0x54, 0x80, 0xf3, 0x37, 0x0e, 0x94, 0xc4, 0x87, + 0xa0, 0xa0, 0xff, 0x86, 0x82, 0x2d, 0x4a, 0x35, 0x91, 0xd4, 0x8e, 0x1c, 0x92, 0x41, 0x36, 0x02, + 0x39, 0x00, 0x56, 0x40, 0xa8, 0x05, 0x05, 0xa9, 0x50, 0xa4, 0xbf, 0xd9, 0x0e, 0x88, 0x74, 0x2d, + 0xb9, 0xa6, 0xf8, 0x52, 0x94, 0xbf, 0xb1, 0x82, 0x37, 0x3d, 0x55, 0x6b, 0xea, 0xc2, 0xe8, 0x5d, + 0x2d, 0x8d, 0x5e, 0x3a, 0xa2, 0xe6, 0x4d, 0x5f, 0x4f, 0xad, 0xcd, 0x35, 0x95, 0x84, 0x26, 0x45, + 0x78, 0x75, 0x2b, 0x6e, 0xe9, 0x65, 0xa7, 0x45, 0x28, 0x53, 0x67, 0x32, 0x99, 0xd3, 0x4a, 0x16, + 0xd6, 0xe5, 0xcc, 0x7f, 0x8c, 0xc1, 0x49, 0x05, 0x17, 0x58, 0x8c, 0xb4, 0xf6, 0xd0, 0xc5, 0x44, + 0xa8, 0x7d, 0x38, 0x15, 0x6a, 0x67, 0x13, 0xc2, 0x5a, 0xb0, 0xfd, 0x10, 0xa6, 0x64, 0x94, 0x0b, + 0x79, 0x2a, 0xe8, 0x8e, 0xb8, 0x7a, 0xe9, 0x1e, 0x09, 0x25, 0xf2, 0x70, 0x2d, 0x27, 0xc0, 0x71, + 0x4a, 0x19, 0x57, 0xaf, 0x82, 0x41, 0xa8, 0x3e, 0x9f, 0x45, 0xbd, 0xba, 0xf8, 0x07, 0xd5, 0x6f, + 0x24, 0xc0, 0x71, 0x4a, 0x19, 0x57, 0x6f, 0x77, 0x29, 0xf3, 0xdb, 0x91, 0xfa, 0xb1, 0x2c, 0xea, + 0x1b, 0x02, 0x63, 0x88, 0xfa, 0x46, 0x02, 0x1c, 0xa7, 0x94, 0xa1, 0xcf, 0x0c, 0x38, 0xfd, 0x1e, + 0xf1, 0x76, 0x1d, 0x8f, 0xae, 0x3b, 0x1d, 0xe2, 0x3a, 0x5e, 0x6c, 0x07, 0x79, 0x9b, 0x5d, 0x1d, + 0x6d, 0x22, 0x57, 0x93, 0x60, 0xc9, 0x19, 0x3d, 0xb0, 0xdf, 0xaf, 0x9e, 0xbe, 0x3a, 0x5c, 0x1d, + 0x3e, 0x68, 0x1e, 0xe6, 0x1f, 0xf2, 0xea, 0xa0, 0xe8, 0x61, 0x47, 0xbf, 0xa8, 0x8d, 0xaf, 0xb8, + 0xa8, 0x3f, 0x84, 0x29, 0xf1, 0xf5, 0xc2, 0xb1, 0xdf, 0x26, 0x5b, 0xaf, 0xfb, 0xfe, 0x6e, 0x36, + 0x0f, 0xbb, 0x92, 0xc0, 0x90, 0xc1, 0x4f, 0xd8, 0x38, 0xc9, 0xc0, 0x29, 0x65, 0x68, 0x0f, 0x4e, + 0x4a, 0x3d, 0xa1, 0x76, 0xe9, 0x60, 0xaf, 0x8d, 0x9c, 0xc2, 0xbd, 0x1e, 0x41, 0x48, 0xe5, 0xb3, + 0xfb, 0xfd, 0xea, 0xc9, 0x04, 0x1d, 0x27, 0x35, 0xa1, 0x8f, 0x0c, 0x98, 0x11, 0x87, 0xb6, 0xb1, + 0x63, 0x79, 0x2d, 0xb9, 0x1b, 0xca, 0xc1, 0x5e, 0xc9, 0x90, 0xe5, 0x49, 0x14, 0xa9, 0x5c, 0x94, + 0x4c, 0xab, 0x29, 0x6c, 0x3c, 0xa0, 0xcd, 0xfc, 0x24, 0x0f, 0x68, 0xb0, 0x6b, 0x88, 0x9e, 0x4d, + 0x5c, 0x16, 0x67, 0x53, 0x97, 0xc5, 0x8c, 0x3e, 0x42, 0xbb, 0x2b, 0x5a, 0x50, 0x90, 0xb3, 0xce, + 0x56, 0x56, 0x2a, 0xb3, 0x28, 0xdc, 0x61, 0xf6, 0x53, 0xf0, 0x3c, 0x25, 0x54, 0xbb, 0xa8, 0x76, + 0xeb, 0x68, 0x9a, 0x86, 0xb9, 0x49, 0xa8, 0x00, 0x51, 0x75, 0x01, 0x4b, 0xab, 0xa9, 0xed, 0x79, + 0x2d, 0xf3, 0xf6, 0x84, 0x3a, 0xa7, 0xa3, 0xeb, 0x5b, 0xd2, 0xb1, 0xae, 0xc5, 0xfc, 0xb4, 0x08, + 0x5a, 0x9a, 0x88, 0x5e, 0x81, 0x29, 0x4a, 0x82, 0x9e, 0x63, 0x93, 0x25, 0xdb, 0xf6, 0xbb, 0x5e, + 0x18, 0x07, 0xa2, 0x4f, 0x3b, 0x1b, 0x09, 0x2e, 0x4e, 0x49, 0x8b, 0xcf, 0x1a, 0xe2, 0x62, 0x53, + 0x1b, 0x93, 0xe9, 0xb3, 0x46, 0xaa, 0x86, 0x50, 0x4d, 0x00, 0x05, 0x9c, 0x68, 0x2a, 0xe4, 0x8f, + 0xb1, 0xa9, 0xe0, 0x40, 0x89, 0x26, 0xef, 0xe2, 0x17, 0x33, 0xc5, 0x61, 0x75, 0xe7, 0x45, 0x3d, + 0xcb, 0xe8, 0xa2, 0x8b, 0xe0, 0xb9, 0xd5, 0x54, 0xaa, 0x31, 0x9e, 0xd9, 0x6a, 0x87, 0x27, 0x19, + 0xc8, 0x86, 0x89, 0x80, 0x48, 0x0b, 0x52, 0x95, 0x31, 0x7e, 0x45, 0x09, 0x85, 0x95, 0x38, 0x26, + 0xef, 0x77, 0x9d, 0x80, 0xb4, 0x89, 0xc7, 0x68, 0x9c, 0x6c, 0x87, 0x5c, 0x8a, 0x63, 0x5c, 0xd4, + 0x05, 0xe8, 0x44, 0x9d, 0x2d, 0x55, 0xa8, 0x65, 0x49, 0x5e, 0x92, 0xed, 0xb1, 0xb8, 0x9e, 0x89, + 0xe9, 0x58, 0x53, 0x84, 0xfe, 0x07, 0xce, 0xc4, 0x69, 0xeb, 0x32, 0xb1, 0xb6, 0x45, 0xd8, 0x50, + 0xfd, 0x5f, 0xd9, 0x10, 0x7d, 0x68, 0xbf, 0x5f, 0x3d, 0xd3, 0x38, 0x48, 0x08, 0x1f, 0x3c, 0x1e, + 0xdd, 0x82, 0x49, 0xcf, 0xdf, 0x26, 0x1b, 0xc4, 0x25, 0x36, 0xf3, 0x03, 0x95, 0x5f, 0xd6, 0x47, + 0x5b, 0x95, 0xec, 0x91, 0x5b, 0xee, 0x75, 0x0d, 0x49, 0x96, 0xa3, 0x3a, 0x05, 0x27, 0x34, 0x99, + 0xbf, 0x1b, 0x83, 0xb9, 0x21, 0xf1, 0x1c, 0xdd, 0x50, 0xcd, 0xa7, 0x4c, 0x3d, 0xd6, 0xe8, 0xeb, + 0x9a, 0xd6, 0x80, 0x12, 0xbd, 0x56, 0xd7, 0xbd, 0x57, 0xbd, 0xd6, 0x10, 0x09, 0x6b, 0xa8, 0x61, + 0x33, 0x29, 0x7f, 0xa4, 0x66, 0xd2, 0x55, 0x40, 0xe4, 0x56, 0xc7, 0xa7, 0x44, 0xe5, 0x72, 0xfc, + 0x5f, 0xd9, 0x09, 0x29, 0xd5, 0xe7, 0x95, 0x34, 0x5a, 0x19, 0x90, 0xc0, 0x43, 0x46, 0xf1, 0x4a, + 0xb2, 0xe9, 0x07, 0x36, 0xe1, 0xf3, 0x15, 0xc7, 0x4e, 0xab, 0x24, 0x2f, 0x87, 0x0c, 0x1c, 0xcb, + 0x20, 0x3b, 0xee, 0x0e, 0x14, 0xb2, 0x74, 0x8a, 0xa5, 0x21, 0x84, 0x43, 0x1f, 0xd8, 0x16, 0x40, + 0x4b, 0x30, 0x2d, 0x06, 0x2d, 0xad, 0xaf, 0x86, 0xad, 0x3a, 0xf9, 0xa5, 0xfe, 0xb4, 0x1a, 0x22, + 0x3b, 0x55, 0x31, 0x1b, 0xa7, 0xe5, 0xcd, 0x9f, 0xe7, 0x61, 0x6e, 0x48, 0x12, 0x1c, 0xf5, 0x2c, + 0x8d, 0x7b, 0xd1, 0xb3, 0xfc, 0x3a, 0x5c, 0xe6, 0x49, 0x28, 0x7a, 0x7e, 0xc3, 0xb2, 0x77, 0x88, + 0xfa, 0xec, 0x13, 0x99, 0xed, 0xba, 0x24, 0xe3, 0x90, 0x1f, 0x7a, 0xd7, 0xd8, 0x91, 0xbc, 0x6b, + 0x64, 0x8f, 0x78, 0x25, 0xac, 0x58, 0x9a, 0x8e, 0x4b, 0xd6, 0x2d, 0xb6, 0xa3, 0x3a, 0x5a, 0x51, + 0xb0, 0x5c, 0x4e, 0x70, 0x71, 0x4a, 0xda, 0xfc, 0xa9, 0x01, 0x73, 0x43, 0x92, 0xc9, 0x44, 0x84, + 0x33, 0x8e, 0x31, 0xc2, 0x3d, 0x0e, 0x05, 0x1a, 0x6f, 0xa0, 0xfe, 0xc5, 0x40, 0x6e, 0x86, 0xe2, + 0x9a, 0xb7, 0x07, 0xe6, 0xb9, 0xd2, 0x23, 0x1e, 0xcb, 0xd6, 0x53, 0x5d, 0x97, 0xed, 0x4b, 0xe9, + 0x32, 0x17, 0x47, 0xce, 0x7d, 0x57, 0xbd, 0xa6, 0x9f, 0xea, 0x5b, 0xde, 0x8b, 0xab, 0xc5, 0xfc, + 0xa3, 0x01, 0x53, 0xc9, 0xee, 0x28, 0x7a, 0x08, 0xf2, 0xdd, 0xc0, 0x51, 0xab, 0x8b, 0x46, 0xbc, + 0x89, 0x57, 0x31, 0xa7, 0x73, 0x76, 0x40, 0x9a, 0xca, 0x74, 0x11, 0x1b, 0x93, 0x26, 0xe6, 0x74, + 0xd4, 0x81, 0x72, 0x27, 0xf0, 0x6f, 0xed, 0xc9, 0xae, 0x42, 0xb6, 0x57, 0x1e, 0xeb, 0x31, 0x40, + 0x5c, 0x89, 0x6b, 0x44, 0xac, 0xab, 0x30, 0x7f, 0x62, 0x00, 0x1a, 0xac, 0x0e, 0xfe, 0xed, 0xbc, + 0xe9, 0xfb, 0x39, 0x28, 0xaa, 0x8d, 0x44, 0xdf, 0x80, 0xa9, 0x56, 0xc2, 0xe8, 0xd9, 0x66, 0x98, + 0x6a, 0x6b, 0x47, 0xe7, 0x2f, 0x49, 0xc7, 0x29, 0x5d, 0xe8, 0x63, 0x03, 0x66, 0x5b, 0x0e, 0x4b, + 0xae, 0x2f, 0x5b, 0xab, 0xff, 0x4a, 0x1a, 0xa6, 0x7e, 0x46, 0x4d, 0x62, 0x76, 0x80, 0x85, 0x07, + 0x95, 0x9a, 0x7f, 0xca, 0xc1, 0xa0, 0x20, 0x37, 0xa9, 0x2d, 0x73, 0x29, 0x63, 0xe8, 0x9b, 0x35, + 0xc5, 0xe5, 0xe5, 0x90, 0x25, 0x1e, 0x7d, 0x65, 0x9b, 0xbc, 0xd4, 0xda, 0xf0, 0x3d, 0x16, 0xf8, + 0xee, 0x9b, 0x94, 0x04, 0xda, 0xa3, 0x2b, 0x01, 0x8b, 0x15, 0x3c, 0xea, 0xc0, 0x84, 0x1d, 0xbe, + 0xe1, 0xca, 0xf6, 0x14, 0x67, 0x50, 0x97, 0xf6, 0x48, 0x40, 0x21, 0xe3, 0x58, 0xc9, 0x08, 0x7d, + 0x58, 0xf3, 0x07, 0x06, 0xcc, 0xa4, 0xcb, 0x53, 0x3e, 0x5e, 0x94, 0x3b, 0xab, 0xcb, 0xe9, 0xf6, + 0xc0, 0xaa, 0x24, 0xe3, 0x90, 0x8f, 0x36, 0xa1, 0xc8, 0x63, 0x1b, 0x56, 0x87, 0x7a, 0xe4, 0x18, + 0x29, 0x3e, 0xda, 0x5e, 0x96, 0x08, 0x38, 0x84, 0x32, 0x7f, 0x6b, 0x00, 0x1a, 0xac, 0xca, 0xd0, + 0x3a, 0x9c, 0x72, 0x2d, 0xca, 0xa2, 0x5e, 0xf9, 0x6a, 0x62, 0x92, 0x0f, 0xaa, 0x49, 0x9e, 0x5a, + 0x1b, 0x22, 0x83, 0x87, 0x8e, 0x8c, 0xe2, 0x7b, 0xee, 0x1e, 0xc4, 0x77, 0x73, 0x03, 0x20, 0xfe, + 0x8a, 0x8d, 0xce, 0xc2, 0x98, 0x67, 0xb5, 0xc3, 0x8b, 0x3e, 0x4a, 0x21, 0xc5, 0x5b, 0x41, 0xc1, + 0x41, 0x8f, 0xc0, 0x78, 0xcf, 0x72, 0xbb, 0xe1, 0x63, 0xcc, 0xe8, 0x05, 0xc9, 0x5b, 0x9c, 0x88, + 0x25, 0xcf, 0xfc, 0x59, 0x0e, 0xca, 0xda, 0x57, 0xa2, 0xe3, 0x48, 0x64, 0xc7, 0x3b, 0x16, 0xdb, + 0x09, 0x1f, 0xbf, 0xbc, 0x9c, 0xf9, 0x03, 0x16, 0x0f, 0xcf, 0xf1, 0x22, 0xf8, 0x2f, 0x8a, 0x25, + 0x74, 0x2a, 0xf3, 0xc9, 0x1f, 0x47, 0xe6, 0x63, 0x7e, 0xdb, 0x80, 0xe9, 0xd4, 0x6c, 0xd0, 0x05, + 0x00, 0x1a, 0xfd, 0x52, 0x3b, 0x11, 0x15, 0x46, 0xb1, 0x1c, 0xd6, 0xa4, 0x44, 0x82, 0x42, 0x28, + 0x73, 0x3c, 0xd1, 0x88, 0x5f, 0x76, 0x02, 0xb5, 0x3d, 0x71, 0x82, 0x92, 0xe0, 0xe2, 0x94, 0xb4, + 0xf9, 0xa9, 0x01, 0x0f, 0x1e, 0xd6, 0xc8, 0xe3, 0xe9, 0xaa, 0xea, 0xd6, 0x45, 0x29, 0x90, 0x91, + 0x4c, 0x57, 0xaf, 0x26, 0xd9, 0x38, 0x2d, 0x8f, 0x2e, 0x42, 0x59, 0x23, 0xa9, 0x09, 0x46, 0xc1, + 0x4e, 0x1b, 0x8e, 0x75, 0x39, 0xf3, 0x2f, 0x06, 0x9c, 0x1a, 0x56, 0x55, 0xa1, 0x20, 0x7c, 0x00, + 0x25, 0xdf, 0xb5, 0x5d, 0x3b, 0x7a, 0xa1, 0x56, 0x13, 0xcf, 0xa0, 0x56, 0x3c, 0x16, 0xec, 0x0d, + 0x7f, 0x1a, 0x35, 0x7f, 0x09, 0x20, 0x96, 0x41, 0x33, 0x90, 0xdf, 0x25, 0x7b, 0xd2, 0x10, 0x98, + 0xff, 0x89, 0x4e, 0x25, 0x4e, 0x87, 0x3a, 0x0e, 0x2f, 0xe4, 0x2e, 0x19, 0x2f, 0x94, 0x3e, 0xfd, + 0x71, 0xf5, 0xc4, 0x47, 0x7f, 0x3b, 0x7b, 0xc2, 0xfc, 0x9e, 0x01, 0x7a, 0x68, 0x47, 0x4f, 0xc1, + 0xc4, 0x0e, 0x63, 0x1d, 0x41, 0x52, 0xdf, 0xae, 0xc4, 0x1b, 0xa0, 0xd7, 0x37, 0x37, 0xd7, 0x05, + 0x11, 0xc7, 0x7c, 0x54, 0x03, 0xe0, 0x3f, 0xa8, 0x94, 0x1e, 0x8b, 0xbf, 0x21, 0x73, 0xe9, 0x0d, + 0x29, 0xae, 0x49, 0xa0, 0xc7, 0x78, 0x6a, 0x2d, 0x85, 0xe5, 0xb3, 0xe4, 0xb2, 0x4c, 0xab, 0xa5, + 0x64, 0xc8, 0x33, 0x7f, 0x65, 0xc0, 0xec, 0xc0, 0x47, 0x4d, 0x74, 0x33, 0x0a, 0xf4, 0x46, 0x76, + 0xef, 0x1f, 0x9e, 0x1c, 0x1c, 0xd9, 0x63, 0x7f, 0x69, 0x00, 0xc4, 0x85, 0x16, 0x72, 0x61, 0x52, + 0x02, 0x27, 0xb2, 0x8b, 0x2c, 0x13, 0x3e, 0xa5, 0x26, 0x30, 0xb9, 0xa1, 0xe1, 0xe1, 0x04, 0x3a, + 0x2f, 0x20, 0xda, 0x7e, 0xd7, 0x63, 0xe2, 0x1c, 0xe4, 0x92, 0x2f, 0xe0, 0xae, 0x85, 0x0c, 0x1c, + 0xcb, 0x98, 0xdf, 0x19, 0x87, 0xb9, 0x21, 0x1f, 0x0c, 0xfe, 0x83, 0x2b, 0xfc, 0x27, 0xa1, 0x28, + 0x9f, 0x29, 0xd1, 0x74, 0xb8, 0x97, 0xaf, 0x98, 0x78, 0xa9, 0x2c, 0xff, 0x40, 0xe7, 0xa1, 0xec, + 0x78, 0xb6, 0x6c, 0x4c, 0x59, 0x61, 0xc1, 0x26, 0x9b, 0x9d, 0x31, 0x19, 0xeb, 0x32, 0xc9, 0x0a, + 0xaf, 0x70, 0x57, 0x35, 0xff, 0xa4, 0xfa, 0xaf, 0x12, 0xf2, 0x51, 0x51, 0x31, 0xcb, 0x86, 0x88, + 0x3e, 0x0f, 0xd6, 0x60, 0x70, 0x02, 0x14, 0x7d, 0xcb, 0x80, 0x19, 0x45, 0x58, 0x0a, 0x98, 0xd3, + 0xb4, 0xec, 0xe8, 0x01, 0xc2, 0x11, 0x23, 0x58, 0x45, 0x2d, 0x6e, 0x06, 0xa7, 0xe0, 0xf1, 0x80, + 0x42, 0xf3, 0x26, 0xcc, 0x0e, 0xe4, 0x66, 0x77, 0x17, 0xf8, 0x89, 0xf8, 0x2f, 0x00, 0xa9, 0xc0, + 0x2f, 0x5f, 0xfe, 0x4b, 0x9e, 0xf9, 0x99, 0x01, 0x53, 0xa9, 0xd4, 0x36, 0x53, 0xed, 0x78, 0x53, + 0xaf, 0x1d, 0x8f, 0x9c, 0xa1, 0x27, 0xaa, 0x48, 0xb3, 0x09, 0x53, 0xc9, 0x66, 0xbd, 0x56, 0xd0, + 0x18, 0x87, 0x15, 0x34, 0xe8, 0x1c, 0x94, 0x2c, 0xd7, 0xf5, 0x3f, 0x58, 0xf1, 0x7a, 0xea, 0x49, + 0x42, 0xd4, 0xeb, 0x5d, 0x52, 0x74, 0x1c, 0x49, 0xd4, 0x1f, 0xfd, 0xfc, 0xf6, 0xc2, 0x89, 0x2f, + 0x6e, 0x2f, 0x9c, 0xf8, 0xeb, 0xed, 0x85, 0x13, 0x1f, 0xed, 0x2f, 0x18, 0x9f, 0xef, 0x2f, 0x18, + 0x5f, 0xec, 0x2f, 0x18, 0x7f, 0xdf, 0x5f, 0x30, 0xbe, 0xfb, 0xe5, 0xc2, 0x89, 0x9b, 0xb9, 0xde, + 0xf9, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x09, 0x07, 0xcc, 0x40, 0xb8, 0x34, 0x00, 0x00, } diff --git a/pkg/build/api/v1/generated.proto b/pkg/build/api/v1/generated.proto index a237e7f43fdb..db80c3b5d575 100644 --- a/pkg/build/api/v1/generated.proto +++ b/pkg/build/api/v1/generated.proto @@ -403,6 +403,27 @@ message BuildStatus { // config is an ObjectReference to the BuildConfig this Build is based on. optional k8s.io.kubernetes.pkg.api.v1.ObjectReference config = 9; + + // output describes the Docker image the build has produced. + optional BuildStatusOutput output = 10; +} + +// BuildStatusOutput contains the status of the built image. +message BuildStatusOutput { + // to describes the status of the built image being pushed to a registry. + optional BuildStatusOutputTo to = 1; +} + +// BuildStatusOutputTo describes the status of the built image with regards to +// image registry to which it was supposed to be pushed. +message BuildStatusOutputTo { + // imageDigest is the digest of the built Docker image. The digest uniquely + // identifies the image in the registry to which it was pushed. + // + // Please note that this field may not always be set even if the push + // completes successfully - e.g. when the registry returns no digest or + // returns it in a format that the builder doesn't understand. + optional string imageDigest = 1; } // BuildStrategy contains the details of how to perform a build. diff --git a/pkg/build/api/v1/swagger_doc.go b/pkg/build/api/v1/swagger_doc.go index b1fef1ac2d70..a44326fe9528 100644 --- a/pkg/build/api/v1/swagger_doc.go +++ b/pkg/build/api/v1/swagger_doc.go @@ -191,12 +191,31 @@ var map_BuildStatus = map[string]string{ "duration": "duration contains time.Duration object describing build time.", "outputDockerImageReference": "outputDockerImageReference contains a reference to the Docker image that will be built by this build. Its value is computed from Build.Spec.Output.To, and should include the registry address, so that it can be used to push and pull the image.", "config": "config is an ObjectReference to the BuildConfig this Build is based on.", + "output": "output describes the Docker image the build has produced.", } func (BuildStatus) SwaggerDoc() map[string]string { return map_BuildStatus } +var map_BuildStatusOutput = map[string]string{ + "": "BuildStatusOutput contains the status of the built image.", + "to": "to describes the status of the built image being pushed to a registry.", +} + +func (BuildStatusOutput) SwaggerDoc() map[string]string { + return map_BuildStatusOutput +} + +var map_BuildStatusOutputTo = map[string]string{ + "": "BuildStatusOutputTo describes the status of the built image with regards to image registry to which it was supposed to be pushed.", + "imageDigest": "imageDigest is the digest of the built Docker image. The digest uniquely identifies the image in the registry to which it was pushed.\n\nPlease note that this field may not always be set even if the push completes successfully - e.g. when the registry returns no digest or returns it in a format that the builder doesn't understand.", +} + +func (BuildStatusOutputTo) SwaggerDoc() map[string]string { + return map_BuildStatusOutputTo +} + var map_BuildStrategy = map[string]string{ "": "BuildStrategy contains the details of how to perform a build.", "type": "type is the kind of build strategy.", diff --git a/pkg/build/api/v1/types.go b/pkg/build/api/v1/types.go index 798218e95d13..508e310b511f 100644 --- a/pkg/build/api/v1/types.go +++ b/pkg/build/api/v1/types.go @@ -173,6 +173,9 @@ type BuildStatus struct { // config is an ObjectReference to the BuildConfig this Build is based on. Config *kapi.ObjectReference `json:"config,omitempty" protobuf:"bytes,9,opt,name=config"` + + // output describes the Docker image the build has produced. + Output BuildStatusOutput `json:"output,omitempty" protobuf:"bytes,10,opt,name=output"` } // BuildPhase represents the status of a build at a point in time. @@ -208,6 +211,24 @@ const ( // in the CLI. type StatusReason string +// BuildStatusOutput contains the status of the built image. +type BuildStatusOutput struct { + // to describes the status of the built image being pushed to a registry. + To *BuildStatusOutputTo `json:"to,omitempty" protobuf:"bytes,1,opt,name=to"` +} + +// BuildStatusOutputTo describes the status of the built image with regards to +// image registry to which it was supposed to be pushed. +type BuildStatusOutputTo struct { + // imageDigest is the digest of the built Docker image. The digest uniquely + // identifies the image in the registry to which it was pushed. + // + // Please note that this field may not always be set even if the push + // completes successfully - e.g. when the registry returns no digest or + // returns it in a format that the builder doesn't understand. + ImageDigest string `json:"imageDigest,omitempty" protobuf:"bytes,1,opt,name=imageDigest"` +} + // BuildSourceType is the type of SCM used. type BuildSourceType string diff --git a/pkg/build/api/v1/zz_generated.conversion.go b/pkg/build/api/v1/zz_generated.conversion.go index ed3e12eda290..972bd2bbca51 100644 --- a/pkg/build/api/v1/zz_generated.conversion.go +++ b/pkg/build/api/v1/zz_generated.conversion.go @@ -55,6 +55,10 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_BuildSpec_To_v1_BuildSpec, Convert_v1_BuildStatus_To_api_BuildStatus, Convert_api_BuildStatus_To_v1_BuildStatus, + Convert_v1_BuildStatusOutput_To_api_BuildStatusOutput, + Convert_api_BuildStatusOutput_To_v1_BuildStatusOutput, + Convert_v1_BuildStatusOutputTo_To_api_BuildStatusOutputTo, + Convert_api_BuildStatusOutputTo_To_v1_BuildStatusOutputTo, Convert_v1_BuildStrategy_To_api_BuildStrategy, Convert_api_BuildStrategy_To_v1_BuildStrategy, Convert_v1_BuildTriggerCause_To_api_BuildTriggerCause, @@ -763,6 +767,9 @@ func autoConvert_v1_BuildStatus_To_api_BuildStatus(in *BuildStatus, out *api.Bui } else { out.Config = nil } + if err := Convert_v1_BuildStatusOutput_To_api_BuildStatusOutput(&in.Output, &out.Output, s); err != nil { + return err + } return nil } @@ -788,6 +795,9 @@ func autoConvert_api_BuildStatus_To_v1_BuildStatus(in *api.BuildStatus, out *Bui } else { out.Config = nil } + if err := Convert_api_BuildStatusOutput_To_v1_BuildStatusOutput(&in.Output, &out.Output, s); err != nil { + return err + } return nil } @@ -795,6 +805,42 @@ func Convert_api_BuildStatus_To_v1_BuildStatus(in *api.BuildStatus, out *BuildSt return autoConvert_api_BuildStatus_To_v1_BuildStatus(in, out, s) } +func autoConvert_v1_BuildStatusOutput_To_api_BuildStatusOutput(in *BuildStatusOutput, out *api.BuildStatusOutput, s conversion.Scope) error { + out.To = (*api.BuildStatusOutputTo)(unsafe.Pointer(in.To)) + return nil +} + +func Convert_v1_BuildStatusOutput_To_api_BuildStatusOutput(in *BuildStatusOutput, out *api.BuildStatusOutput, s conversion.Scope) error { + return autoConvert_v1_BuildStatusOutput_To_api_BuildStatusOutput(in, out, s) +} + +func autoConvert_api_BuildStatusOutput_To_v1_BuildStatusOutput(in *api.BuildStatusOutput, out *BuildStatusOutput, s conversion.Scope) error { + out.To = (*BuildStatusOutputTo)(unsafe.Pointer(in.To)) + return nil +} + +func Convert_api_BuildStatusOutput_To_v1_BuildStatusOutput(in *api.BuildStatusOutput, out *BuildStatusOutput, s conversion.Scope) error { + return autoConvert_api_BuildStatusOutput_To_v1_BuildStatusOutput(in, out, s) +} + +func autoConvert_v1_BuildStatusOutputTo_To_api_BuildStatusOutputTo(in *BuildStatusOutputTo, out *api.BuildStatusOutputTo, s conversion.Scope) error { + out.ImageDigest = in.ImageDigest + return nil +} + +func Convert_v1_BuildStatusOutputTo_To_api_BuildStatusOutputTo(in *BuildStatusOutputTo, out *api.BuildStatusOutputTo, s conversion.Scope) error { + return autoConvert_v1_BuildStatusOutputTo_To_api_BuildStatusOutputTo(in, out, s) +} + +func autoConvert_api_BuildStatusOutputTo_To_v1_BuildStatusOutputTo(in *api.BuildStatusOutputTo, out *BuildStatusOutputTo, s conversion.Scope) error { + out.ImageDigest = in.ImageDigest + return nil +} + +func Convert_api_BuildStatusOutputTo_To_v1_BuildStatusOutputTo(in *api.BuildStatusOutputTo, out *BuildStatusOutputTo, s conversion.Scope) error { + return autoConvert_api_BuildStatusOutputTo_To_v1_BuildStatusOutputTo(in, out, s) +} + func autoConvert_v1_BuildStrategy_To_api_BuildStrategy(in *BuildStrategy, out *api.BuildStrategy, s conversion.Scope) error { // INFO: in.Type opted out of conversion generation if in.DockerStrategy != nil { diff --git a/pkg/build/api/v1/zz_generated.deepcopy.go b/pkg/build/api/v1/zz_generated.deepcopy.go index 8182d98912e0..b529c0245925 100644 --- a/pkg/build/api/v1/zz_generated.deepcopy.go +++ b/pkg/build/api/v1/zz_generated.deepcopy.go @@ -36,6 +36,8 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildSource, InType: reflect.TypeOf(&BuildSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildSpec, InType: reflect.TypeOf(&BuildSpec{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildStatus, InType: reflect.TypeOf(&BuildStatus{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildStatusOutput, InType: reflect.TypeOf(&BuildStatusOutput{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildStatusOutputTo, InType: reflect.TypeOf(&BuildStatusOutputTo{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildStrategy, InType: reflect.TypeOf(&BuildStrategy{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildTriggerCause, InType: reflect.TypeOf(&BuildTriggerCause{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1_BuildTriggerPolicy, InType: reflect.TypeOf(&BuildTriggerPolicy{})}, @@ -496,6 +498,33 @@ func DeepCopy_v1_BuildStatus(in interface{}, out interface{}, c *conversion.Clon } else { out.Config = nil } + if err := DeepCopy_v1_BuildStatusOutput(&in.Output, &out.Output, c); err != nil { + return err + } + return nil + } +} + +func DeepCopy_v1_BuildStatusOutput(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*BuildStatusOutput) + out := out.(*BuildStatusOutput) + if in.To != nil { + in, out := &in.To, &out.To + *out = new(BuildStatusOutputTo) + **out = **in + } else { + out.To = nil + } + return nil + } +} + +func DeepCopy_v1_BuildStatusOutputTo(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*BuildStatusOutputTo) + out := out.(*BuildStatusOutputTo) + out.ImageDigest = in.ImageDigest return nil } } diff --git a/pkg/build/api/zz_generated.deepcopy.go b/pkg/build/api/zz_generated.deepcopy.go index c472d5766ab0..cf7f213513e8 100644 --- a/pkg/build/api/zz_generated.deepcopy.go +++ b/pkg/build/api/zz_generated.deepcopy.go @@ -36,6 +36,8 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildSource, InType: reflect.TypeOf(&BuildSource{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildSpec, InType: reflect.TypeOf(&BuildSpec{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildStatus, InType: reflect.TypeOf(&BuildStatus{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildStatusOutput, InType: reflect.TypeOf(&BuildStatusOutput{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildStatusOutputTo, InType: reflect.TypeOf(&BuildStatusOutputTo{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildStrategy, InType: reflect.TypeOf(&BuildStrategy{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildTriggerCause, InType: reflect.TypeOf(&BuildTriggerCause{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_api_BuildTriggerPolicy, InType: reflect.TypeOf(&BuildTriggerPolicy{})}, @@ -496,6 +498,33 @@ func DeepCopy_api_BuildStatus(in interface{}, out interface{}, c *conversion.Clo } else { out.Config = nil } + if err := DeepCopy_api_BuildStatusOutput(&in.Output, &out.Output, c); err != nil { + return err + } + return nil + } +} + +func DeepCopy_api_BuildStatusOutput(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*BuildStatusOutput) + out := out.(*BuildStatusOutput) + if in.To != nil { + in, out := &in.To, &out.To + *out = new(BuildStatusOutputTo) + **out = **in + } else { + out.To = nil + } + return nil + } +} + +func DeepCopy_api_BuildStatusOutputTo(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*BuildStatusOutputTo) + out := out.(*BuildStatusOutputTo) + out.ImageDigest = in.ImageDigest return nil } } diff --git a/pkg/build/builder/common.go b/pkg/build/builder/common.go index 014e4d2b61d3..fe6df0ec2ade 100644 --- a/pkg/build/builder/common.go +++ b/pkg/build/builder/common.go @@ -8,6 +8,7 @@ import ( "time" "k8s.io/kubernetes/pkg/client/retry" + utilruntime "k8s.io/kubernetes/pkg/util/runtime" "github.com/docker/distribution/reference" "github.com/fsouza/go-dockerclient" @@ -195,6 +196,7 @@ func retryBuildStatusUpdate(build *api.Build, client client.BuildInterface, sour latestBuild.Status.Reason = build.Status.Reason latestBuild.Status.Message = build.Status.Message + latestBuild.Status.Output.To = build.Status.Output.To if _, err := client.UpdateDetails(latestBuild); err != nil { return err @@ -202,3 +204,9 @@ func retryBuildStatusUpdate(build *api.Build, client client.BuildInterface, sour return nil }) } + +func handleBuildStatusUpdate(build *api.Build, client client.BuildInterface, sourceRev *api.SourceRevision) { + if updateErr := retryBuildStatusUpdate(build, client, sourceRev); updateErr != nil { + utilruntime.HandleError(fmt.Errorf("error occurred while updating the build status: %v", updateErr)) + } +} diff --git a/pkg/build/builder/docker.go b/pkg/build/builder/docker.go index fca86043a9d0..d8b29098ea54 100644 --- a/pkg/build/builder/docker.go +++ b/pkg/build/builder/docker.go @@ -13,7 +13,6 @@ import ( docker "github.com/fsouza/go-dockerclient" kapi "k8s.io/kubernetes/pkg/api" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" s2iapi "github.com/openshift/source-to-image/pkg/api" "github.com/openshift/source-to-image/pkg/tar" @@ -71,18 +70,14 @@ func (d *DockerBuilder) Build() error { if err != nil { d.build.Status.Reason = api.StatusReasonFetchSourceFailed d.build.Status.Message = api.StatusMessageFetchSourceFailed - if updateErr := retryBuildStatusUpdate(d.build, d.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(d.build, d.client, nil) return err } if sourceInfo != nil { glog.V(4).Infof("Setting build revision with details %#v", sourceInfo) revision := updateBuildRevision(d.build, sourceInfo) - if updateErr := retryBuildStatusUpdate(d.build, d.client, revision); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(d.build, d.client, revision) } if err = d.addBuildParameters(buildDir, sourceInfo); err != nil { return err @@ -126,9 +121,7 @@ func (d *DockerBuilder) Build() error { if err = pullImage(d.dockerClient, imageName, pullAuthConfig); err != nil { d.build.Status.Reason = api.StatusReasonPullBuilderImageFailed d.build.Status.Message = api.StatusMessagePullBuilderImageFailed - if updateErr := retryBuildStatusUpdate(d.build, d.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(d.build, d.client, nil) return fmt.Errorf("failed to pull image: %v", err) } } @@ -137,9 +130,7 @@ func (d *DockerBuilder) Build() error { if err = d.dockerBuild(buildDir, buildTag, d.build.Spec.Source.Secrets); err != nil { d.build.Status.Reason = api.StatusReasonDockerBuildFailed d.build.Status.Message = api.StatusMessageDockerBuildFailed - if updateErr := retryBuildStatusUpdate(d.build, d.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(d.build, d.client, nil) return err } @@ -147,9 +138,7 @@ func (d *DockerBuilder) Build() error { if err := execPostCommitHook(d.dockerClient, d.build.Spec.PostCommit, buildTag, cname); err != nil { d.build.Status.Reason = api.StatusReasonPostCommitHookFailed d.build.Status.Message = api.StatusMessagePostCommitHookFailed - if updateErr := retryBuildStatusUpdate(d.build, d.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(d.build, d.client, nil) return err } @@ -173,14 +162,19 @@ func (d *DockerBuilder) Build() error { glog.V(4).Infof("Authenticating Docker push with user %q", pushAuthConfig.Username) } glog.V(0).Infof("\nPushing image %s ...", pushTag) - if err := pushImage(d.dockerClient, pushTag, pushAuthConfig); err != nil { + digest, err := pushImage(d.dockerClient, pushTag, pushAuthConfig) + if err != nil { d.build.Status.Reason = api.StatusReasonPushImageToRegistryFailed d.build.Status.Message = api.StatusMessagePushImageToRegistryFailed - if updateErr := retryBuildStatusUpdate(d.build, d.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error: An error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(d.build, d.client, nil) return reportPushFailure(err, authPresent, pushAuthConfig) } + if digest != "" { + d.build.Status.Output.To = &api.BuildStatusOutputTo{ + ImageDigest: digest, + } + handleBuildStatusUpdate(d.build, d.client, nil) + } glog.V(0).Infof("Push successful") } return nil diff --git a/pkg/build/builder/dockerutil.go b/pkg/build/builder/dockerutil.go index d4c931c38022..aeb6300c087b 100644 --- a/pkg/build/builder/dockerutil.go +++ b/pkg/build/builder/dockerutil.go @@ -1,8 +1,12 @@ package builder import ( + "bytes" + "encoding/json" + "errors" "fmt" "io" + "io/ioutil" "os" "strings" "time" @@ -73,28 +77,36 @@ func pullImage(client DockerClient, name string, authConfig docker.AuthConfigura // - Docker registry is down temporarily or permanently // - other image is being pushed to the registry // If any other scenario the push will fail, without retries. -func pushImage(client DockerClient, name string, authConfig docker.AuthConfiguration) error { +// +// Returns the digest of the docker image in the registry, or empty string in +// case registry didn't send it or we failed to extract it. +func pushImage(client DockerClient, name string, authConfig docker.AuthConfiguration) (string, error) { repository, tag := docker.ParseRepositoryTag(name) - logProgress := func(s string) { - glog.V(0).Infof("%s", s) + + var progressWriter io.Writer + if glog.Is(5) { + progressWriter = newSimpleWriter(os.Stderr) + } else { + logProgress := func(s string) { + glog.V(0).Infof("%s", s) + } + progressWriter = imageprogress.NewPushWriter(logProgress) } + digestWriter := newDigestWriter() + opts := docker.PushImageOptions{ Name: repository, Tag: tag, - OutputStream: imageprogress.NewPushWriter(logProgress), + OutputStream: io.MultiWriter(progressWriter, digestWriter), RawJSONStream: true, } - if glog.Is(5) { - opts.OutputStream = os.Stderr - opts.RawJSONStream = false - } var err error var retriableError = false for retries := 0; retries <= DefaultPushRetryCount; retries++ { err = client.PushImage(opts, authConfig) if err == nil { - return nil + return digestWriter.Digest, nil } errMsg := fmt.Sprintf("%s", err) @@ -105,13 +117,13 @@ func pushImage(client DockerClient, name string, authConfig docker.AuthConfigura } } if !retriableError { - return err + return "", err } utilruntime.HandleError(fmt.Errorf("push for image %s failed, will retry in %s ...", name, DefaultPushRetryDelay)) time.Sleep(DefaultPushRetryDelay) } - return err + return "", err } func removeImage(client DockerClient, name string) error { @@ -210,3 +222,117 @@ func getContainerNameOrID(c *docker.Container) string { } return c.ID } + +type progressLine struct { + Status string `json:"status,omitempty"` + Progress string `json:"progress,omitempty"` + Error string `json:"error,omitempty"` + Stream string `json:"stream,omitempty"` + Aux progressAux `json:"aux,omitempty"` +} + +type progressAux struct { + Tag string `json:"Tag"` + Digest string `json:"Digest"` + Size int64 `json:"Size"` +} + +type pushWriterCallback func(progressLine) error + +// pushWriter is an io.Writer which consumes a stream of json messages returned +// by docker client when it pushes image to registry. It calls the provided +// callback for each decoded JSON object. +type pushWriter struct { + buf *bytes.Buffer + callback pushWriterCallback +} + +func newPushWriter(cb pushWriterCallback) *pushWriter { + return &pushWriter{ + buf: &bytes.Buffer{}, + callback: cb, + } +} + +func (t *pushWriter) Write(data []byte) (int, error) { + n, err := t.buf.Write(data) + if err != nil { + return n, err + } + dec := json.NewDecoder(t.buf) + + for { + // save the not yet parsed input so we can restore it in case it + // contains part of valid JSON + savedBuf, err := ioutil.ReadAll(dec.Buffered()) + if err != nil { + return n, err + } + savedBuf = append(savedBuf, t.buf.Bytes()...) + + // try decoding a value + line := &progressLine{} + err = dec.Decode(line) + + switch err { + // decoded a value, pass it to callback + case nil: + if callbackErr := t.callback(*line); callbackErr != nil { + return n, callbackErr + } + // no more values + case io.EOF: + return n, nil + // there's no whole JSON but we consumed bytes that might be part of + // one - restore the saved buffer + case io.ErrUnexpectedEOF: + t.buf = bytes.NewBuffer(savedBuf) + return n, nil + // actual error happened + default: + return n, err + } + } +} + +// newSimpleWriter creates an io.Writer which consumes a stream of json +// messages returned by docker client when it pushes image to registry. It +// writes simple human-readable indication of the push progress to the output +// io.Writer. The output format mimics what go-dockerclient writes when called +// with RawJSONStream=false. +func newSimpleWriter(output io.Writer) io.Writer { + return newPushWriter(func(line progressLine) error { + if len(line.Stream) > 0 { + fmt.Fprint(output, line.Stream) + } else if len(line.Progress) > 0 { + fmt.Fprintf(output, "%s %s\r", line.Status, line.Progress) + } else if len(line.Error) > 0 { + return errors.New(line.Error) + } + if len(line.Status) > 0 { + fmt.Fprintln(output, line.Status) + } + return nil + }) +} + +// digestWriter consumes stream of json messages from docker client push +// operation and looks for digest of the pushed image. +type digestWriter struct { + *pushWriter + Digest string +} + +func newDigestWriter() *digestWriter { + dw := digestWriter{} + dw.pushWriter = newPushWriter(func(line progressLine) error { + if len(line.Error) > 0 { + return errors.New(line.Error) + } + if len(dw.Digest) == 0 && len(line.Aux.Digest) > 0 { + dw.Digest = line.Aux.Digest + } + return nil + }) + return &dw +} diff --git a/pkg/build/builder/dockerutil_test.go b/pkg/build/builder/dockerutil_test.go index 52862decaeac..76efb0473b50 100644 --- a/pkg/build/builder/dockerutil_test.go +++ b/pkg/build/builder/dockerutil_test.go @@ -1,8 +1,15 @@ package builder import ( + "bytes" "errors" + "fmt" + "io" + "os" + "path/filepath" "reflect" + "regexp" + "strings" "testing" "github.com/fsouza/go-dockerclient" @@ -151,13 +158,13 @@ func TestPushImage(t *testing.T) { //expect succ testImageName = "repo_foo_bar:tag_test_succ_foo_bar" - if err := pushImage(fakeDocker, testImageName, testAuth); err != nil { + if _, err := pushImage(fakeDocker, testImageName, testAuth); err != nil { t.Errorf("Unexpect push image : %v, want succ", err) } //expect fail testImageName = "repo_foo_bar:tag_test_err_exist_foo_bar" - err := pushImage(fakeDocker, testImageName, testAuth) + _, err := pushImage(fakeDocker, testImageName, testAuth) if err == nil { t.Errorf("Unexpect push image : %v, want error", err) } @@ -168,8 +175,267 @@ func TestPushImage(t *testing.T) { //expect fail testImageName = "repo_foo_bar:tag_test_err_no_exist_foo_bar" - if err := pushImage(fakeDocker, testImageName, testAuth); err == nil { + if _, err := pushImage(fakeDocker, testImageName, testAuth); err == nil { t.Errorf("Unexpect push image : %v, want error", err) } defer func() { fooBarRunTimes = 0 }() } + +func TestPushWriter(t *testing.T) { + tests := []struct { + Writes []string + Expected []progressLine + ExpectErr string + }{ + { + Writes: []string{"", "\n"}, + Expected: []progressLine{}, + }, + { + // The writer doesn't know if another write is coming or not so + // this is not an error. + Writes: []string{"{"}, + Expected: []progressLine{}, + }, + { + Writes: []string{"{}"}, + Expected: []progressLine{{}}, + }, + { + Writes: []string{"{", "}{", "}"}, + Expected: []progressLine{{}, {}}, + }, + { + Writes: []string{" ", "{", " ", "}{}{", "}"}, + Expected: []progressLine{{}, {}, {}}, + }, + { + Writes: []string{"{}\r\n{}\r\n{}\r\n"}, + Expected: []progressLine{{}, {}, {}}, + }, + { + Writes: []string{"{\"progress\": \"1\"}\r\n{\"progress\": \"2\"}\r\n{\"progress\": \"3\"}\r\n"}, + Expected: []progressLine{ + {Progress: "1"}, + {Progress: "2"}, + {Progress: "3"}, + }, + }, + { + Writes: []string{"}"}, + ExpectErr: "invalid character", + }, + { + Writes: []string{`{"error": "happened"}`}, + ExpectErr: "happened", + }, + { + Writes: []string{`{"status": "good!"}{"`, `error": "front fell off"}`}, + ExpectErr: "front fell off", + }, + { + Writes: []string{`{"status": "good!"}{"st`, `atus": `, `"even better"}`}, + Expected: []progressLine{ + {Status: "good!"}, + {Status: "even better"}, + }, + }, + } + +main: + for i, tc := range tests { + decoded := []progressLine{} + w := newPushWriter(func(line progressLine) error { + decoded = append(decoded, line) + if len(line.Error) > 0 { + return errors.New(line.Error) + } else { + return nil + } + }) + + for _, part := range tc.Writes { + n, err := w.Write([]byte(part)) + + partLen := len([]byte(part)) + if n != partLen { + t.Errorf("[%d] Wrote %d bytes but Write() returned %d", i, partLen, n) + continue main + } + + if err != nil { + if len(tc.ExpectErr) > 0 && !strings.Contains(err.Error(), tc.ExpectErr) { + t.Errorf("[%d] Expected error: %s, got: %s", i, tc.ExpectErr, err) + } + if len(tc.ExpectErr) == 0 { + t.Errorf("[%d] Unexpected error: %s", i, err) + } + continue main + } + } + + if len(tc.ExpectErr) > 0 { + t.Errorf("[%d] Expected error %q, got none", i, tc.ExpectErr) + continue main + } + + if !reflect.DeepEqual(tc.Expected, decoded) { + t.Errorf("[%d] Expected: %#v\nGot: %#v\n", i, tc.Expected, decoded) + continue main + } + } +} + +func TestPushImageDigests(t *testing.T) { + tests := []struct { + Filename string + Expected string + ExpectErr bool + }{ + { + Filename: "docker-push-1.10.txt", + Expected: "sha256:adc72a07c3a96ffc2201b1d9bf84b8f2416932a8e39000f61d0cda10761f2658", + }, + { + Filename: "docker-push-1.12.txt", + Expected: "sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912", + }, + { + Filename: "docker-push-exists.txt", + Expected: "sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912", + }, + { + Filename: "docker-push-0digests.txt", + Expected: "", + }, + { + Filename: "docker-push-2digests.txt", + Expected: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + { + Filename: "docker-push-malformed1.txt", + ExpectErr: true, + }, + { + Filename: "docker-push-malformed2.txt", + ExpectErr: true, + }, + { + Filename: "docker-push-malformed3.txt", + ExpectErr: true, + }, + { + Filename: "empty.txt", + Expected: "", + }, + } + + for _, tc := range tests { + fakeDocker := NewFakeDockerClient() + fakeDocker.pushImageFunc = func(opts docker.PushImageOptions, auth docker.AuthConfiguration) error { + if opts.OutputStream == nil { + return fmt.Errorf("Expected OutputStream != nil") + } + + fh, err := os.Open(filepath.Join("testdata", tc.Filename)) + if err != nil { + return fmt.Errorf("Cannot open %q: %s", tc.Filename, err) + } + + _, err = io.Copy(opts.OutputStream, fh) + if err != nil { + return fmt.Errorf("[%s] Failed to process output stream for: %s", tc.Filename, err) + } + + return nil + } + testAuth := docker.AuthConfiguration{} + + digest, err := pushImage(fakeDocker, "testimage/"+tc.Filename, testAuth) + if err != nil && !tc.ExpectErr { + t.Errorf("[%s] Unexpected error: %v", tc.Filename, err) + continue + } else if err == nil && tc.ExpectErr { + t.Errorf("[%s] Expected error, got success", tc.Filename) + continue + } + + if digest != tc.Expected { + t.Errorf("[%s] Digest mismatch: expected %q, got %q", tc.Filename, tc.Expected, digest) + continue + } + } + +} + +func TestSimpleProgress(t *testing.T) { + tests := []struct { + Filename string + Expected string + ExpectErr bool + }{ + { + Filename: "docker-push-1.10.txt", + Expected: "(?ms)The push.*Preparing.*Waiting.*Layer.*Pushing.*Pushed.*digest", + }, + { + Filename: "docker-push-1.12.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed.*digest", + }, + { + Filename: "docker-push-exists.txt", + Expected: "(?ms)The push.*Preparing.*Layer.*digest", + }, + { + Filename: "docker-push-0digests.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed", + }, + { + Filename: "docker-push-2digests.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed.*digest", + }, + { + Filename: "docker-push-malformed1.txt", + Expected: "(?ms)The push", + ExpectErr: true, + }, + { + Filename: "docker-push-malformed2.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed.*digest", + ExpectErr: true, + }, + { + Filename: "docker-push-malformed3.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed.*digest", + ExpectErr: true, + }, + { + Filename: "empty.txt", + Expected: "^$", + }, + } + + for _, tc := range tests { + fh, err := os.Open(filepath.Join("testdata", tc.Filename)) + if err != nil { + t.Errorf("Cannot open %q: %s", tc.Filename, err) + continue + } + + output := &bytes.Buffer{} + writer := newSimpleWriter(output) + + _, err = io.Copy(writer, fh) + if err != nil && !tc.ExpectErr { + t.Errorf("Failed to process %q: %s", tc.Filename, err) + continue + } else if err == nil && tc.ExpectErr { + t.Errorf("Expected error for %q, got success", tc.Filename) + } + + if outputStr := output.String(); !regexp.MustCompile(tc.Expected).MatchString(outputStr) { + t.Errorf("%s: expected %q, got:\n%s\n", tc.Filename, tc.Expected, outputStr) + continue + } + } +} diff --git a/pkg/build/builder/sti.go b/pkg/build/builder/sti.go index def3f4391bf5..e730d2d6ac95 100644 --- a/pkg/build/builder/sti.go +++ b/pkg/build/builder/sti.go @@ -10,8 +10,6 @@ import ( "path/filepath" "strings" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - s2iapi "github.com/openshift/source-to-image/pkg/api" "github.com/openshift/source-to-image/pkg/api/describe" "github.com/openshift/source-to-image/pkg/api/validation" @@ -120,9 +118,7 @@ func (s *S2IBuilder) Build() error { if err != nil { s.build.Status.Reason = api.StatusReasonFetchSourceFailed s.build.Status.Message = api.StatusMessageFetchSourceFailed - if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(s.build, s.client, nil) return err } if len(s.build.Spec.Source.ContextDir) > 0 { @@ -139,9 +135,7 @@ func (s *S2IBuilder) Build() error { if sourceInfo != nil { download.sourceInfo = &sourceInfo.SourceInfo revision := updateBuildRevision(s.build, sourceInfo) - if updateErr := retryBuildStatusUpdate(s.build, s.client, revision); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(s.build, s.client, revision) } injections := s2iapi.VolumeList{} @@ -253,9 +247,7 @@ func (s *S2IBuilder) Build() error { buildInfo.FailureReason.Reason, buildInfo.FailureReason.Message, ) - if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(s.build, s.client, nil) return err } @@ -267,9 +259,7 @@ func (s *S2IBuilder) Build() error { result.BuildInfo.FailureReason.Message, ) - if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(s.build, s.client, nil) return err } @@ -277,9 +267,7 @@ func (s *S2IBuilder) Build() error { if err = execPostCommitHook(s.dockerClient, s.build.Spec.PostCommit, buildTag, cName); err != nil { s.build.Status.Reason = api.StatusReasonPostCommitHookFailed s.build.Status.Message = api.StatusMessagePostCommitHookFailed - if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(s.build, s.client, nil) return err } @@ -305,14 +293,19 @@ func (s *S2IBuilder) Build() error { glog.V(3).Infof("No push secret provided") } glog.V(0).Infof("\nPushing image %s ...", pushTag) - if err = pushImage(s.dockerClient, pushTag, pushAuthConfig); err != nil { + digest, err := pushImage(s.dockerClient, pushTag, pushAuthConfig) + if err != nil { s.build.Status.Reason = api.StatusReasonPushImageToRegistryFailed s.build.Status.Message = api.StatusMessagePushImageToRegistryFailed - if updateErr := retryBuildStatusUpdate(s.build, s.client, nil); updateErr != nil { - utilruntime.HandleError(fmt.Errorf("error occured while updating the build status: %v", updateErr)) - } + handleBuildStatusUpdate(s.build, s.client, nil) return reportPushFailure(err, authPresent, pushAuthConfig) } + if digest != "" { + s.build.Status.Output.To = &api.BuildStatusOutputTo{ + ImageDigest: digest, + } + handleBuildStatusUpdate(s.build, s.client, nil) + } glog.V(0).Infof("Push successful") } return nil diff --git a/pkg/build/builder/testdata/docker-push-0digests.txt b/pkg/build/builder/testdata/docker-push-0digests.txt new file mode 100644 index 000000000000..d7e692442b90 --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-0digests.txt @@ -0,0 +1,36 @@ +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progressDetail":{},"id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":33792,"total":1093484},"progress":"[=\u003e ] 33.79 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":66560,"total":1093484},"progress":"[===\u003e ] 66.56 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":132096,"total":1093484},"progress":"[======\u003e ] 132.1 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":197632,"total":1093484},"progress":"[=========\u003e ] 197.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":263168,"total":1093484},"progress":"[============\u003e ] 263.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":361472,"total":1093484},"progress":"[================\u003e ] 361.5 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":459776,"total":1093484},"progress":"[=====================\u003e ] 459.8 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":525312,"total":1093484},"progress":"[========================\u003e ] 525.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":623616,"total":1093484},"progress":"[============================\u003e ] 623.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":721920,"total":1093484},"progress":"[=================================\u003e ] 721.9 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":820224,"total":1093484},"progress":"[=====================================\u003e ] 820.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":852992,"total":1093484},"progress":"[=======================================\u003e ] 853 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":951296,"total":1093484},"progress":"[===========================================\u003e ] 951.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1012880,"total":1093484},"progress":"[==============================================\u003e ] 1.013 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1024000,"total":1093484},"progress":"[==============================================\u003e ] 1.024 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1035264,"total":1093484},"progress":"[===============================================\u003e ] 1.035 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1046528,"total":1093484},"progress":"[===============================================\u003e ] 1.047 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1057792,"total":1093484},"progress":"[================================================\u003e ] 1.058 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1146101,"total":1093484},"progress":"[==================================================\u003e] 1.146 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1157120,"total":1093484},"progress":"[==================================================\u003e] 1.157 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1168384,"total":1093484},"progress":"[==================================================\u003e] 1.168 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1179648,"total":1093484},"progress":"[==================================================\u003e] 1.18 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1190912,"total":1093484},"progress":"[==================================================\u003e] 1.191 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1202176,"total":1093484},"progress":"[==================================================\u003e] 1.202 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1213440,"total":1093484},"progress":"[==================================================\u003e] 1.213 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1224704,"total":1093484},"progress":"[==================================================\u003e] 1.225 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1235968,"total":1093484},"progress":"[==================================================\u003e] 1.236 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1247232,"total":1093484},"progress":"[==================================================\u003e] 1.247 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1258496,"total":1093484},"progress":"[==================================================\u003e] 1.258 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1269760,"total":1093484},"progress":"[==================================================\u003e] 1.27 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1281024,"total":1093484},"progress":"[==================================================\u003e] 1.281 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1292288,"total":1093484},"progress":"[==================================================\u003e] 1.292 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1293824,"total":1093484},"progress":"[==================================================\u003e] 1.294 MB","id":"e88b3f82283b"} +{"status":"Pushed","progressDetail":{},"id":"e88b3f82283b"} diff --git a/pkg/build/builder/testdata/docker-push-1.10.txt b/pkg/build/builder/testdata/docker-push-1.10.txt new file mode 100644 index 000000000000..f483c92a151f --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-1.10.txt @@ -0,0 +1,139 @@ +{"status":"The push refers to a repository [172.30.152.180:5000/asdf/simple-build]"} +{"status":"Preparing","progressDetail":{},"id":"d588cdd3c503"} +{"status":"Preparing","progressDetail":{},"id":"54aee1b80d2a"} +{"status":"Preparing","progressDetail":{},"id":"080b4b66c36c"} +{"status":"Preparing","progressDetail":{},"id":"ebd0a23ed009"} +{"status":"Preparing","progressDetail":{},"id":"ffe475a38232"} +{"status":"Preparing","progressDetail":{},"id":"8435a2367216"} +{"status":"Preparing","progressDetail":{},"id":"de493216effd"} +{"status":"Preparing","progressDetail":{},"id":"c425a7d563ee"} +{"status":"Preparing","progressDetail":{},"id":"97ca462ad9ee"} +{"status":"Waiting","progressDetail":{},"id":"8435a2367216"} +{"status":"Waiting","progressDetail":{},"id":"de493216effd"} +{"status":"Waiting","progressDetail":{},"id":"c425a7d563ee"} +{"status":"Waiting","progressDetail":{},"id":"97ca462ad9ee"} +{"status":"Layer already exists","progressDetail":{},"id":"080b4b66c36c"} +{"status":"Layer already exists","progressDetail":{},"id":"080b4b66c36c"} +{"status":"Layer already exists","progressDetail":{},"id":"ebd0a23ed009"} +{"status":"Layer already exists","progressDetail":{},"id":"ebd0a23ed009"} +{"status":"Layer already exists","progressDetail":{},"id":"54aee1b80d2a"} +{"status":"Layer already exists","progressDetail":{},"id":"54aee1b80d2a"} +{"status":"Layer already exists","progressDetail":{},"id":"c425a7d563ee"} +{"status":"Layer already exists","progressDetail":{},"id":"c425a7d563ee"} +{"status":"Layer already exists","progressDetail":{},"id":"ffe475a38232"} +{"status":"Layer already exists","progressDetail":{},"id":"ffe475a38232"} +{"status":"Layer already exists","progressDetail":{},"id":"8435a2367216"} +{"status":"Layer already exists","progressDetail":{},"id":"8435a2367216"} +{"status":"Layer already exists","progressDetail":{},"id":"97ca462ad9ee"} +{"status":"Layer already exists","progressDetail":{},"id":"97ca462ad9ee"} +{"status":"Layer already exists","progressDetail":{},"id":"de493216effd"} +{"status":"Layer already exists","progressDetail":{},"id":"de493216effd"} +{"status":"Pushing","progressDetail":{"current":121856,"total":11954193},"progress":"[\u003e ] 121.9 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":265216,"total":11954193},"progress":"[=\u003e ] 265.2 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":396288,"total":11954193},"progress":"[=\u003e ] 396.3 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":547328,"total":11954193},"progress":"[==\u003e ] 547.3 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":678400,"total":11954193},"progress":"[==\u003e ] 678.4 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":798208,"total":11954193},"progress":"[===\u003e ] 798.2 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":945152,"total":11954193},"progress":"[===\u003e ] 945.2 kB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1064960,"total":11954193},"progress":"[====\u003e ] 1.065 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1214976,"total":11954193},"progress":"[=====\u003e ] 1.215 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1346048,"total":11954193},"progress":"[=====\u003e ] 1.346 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1483776,"total":11954193},"progress":"[======\u003e ] 1.484 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1616896,"total":11954193},"progress":"[======\u003e ] 1.617 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1747968,"total":11954193},"progress":"[=======\u003e ] 1.748 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":1879040,"total":11954193},"progress":"[=======\u003e ] 1.879 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2005504,"total":11954193},"progress":"[========\u003e ] 2.006 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2134016,"total":11954193},"progress":"[========\u003e ] 2.134 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2253824,"total":11954193},"progress":"[=========\u003e ] 2.254 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2381824,"total":11954193},"progress":"[=========\u003e ] 2.382 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2519552,"total":11954193},"progress":"[==========\u003e ] 2.52 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2640014,"total":11954193},"progress":"[===========\u003e ] 2.64 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2766002,"total":11954193},"progress":"[===========\u003e ] 2.766 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":2895872,"total":11954193},"progress":"[============\u003e ] 2.896 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3026041,"total":11954193},"progress":"[============\u003e ] 3.026 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3148386,"total":11954193},"progress":"[=============\u003e ] 3.148 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3282022,"total":11954193},"progress":"[=============\u003e ] 3.282 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3425280,"total":11954193},"progress":"[==============\u003e ] 3.425 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3552165,"total":11954193},"progress":"[==============\u003e ] 3.552 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3674216,"total":11954193},"progress":"[===============\u003e ] 3.674 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3799040,"total":11954193},"progress":"[===============\u003e ] 3.799 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":3933600,"total":11954193},"progress":"[================\u003e ] 3.934 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4053850,"total":11954193},"progress":"[================\u003e ] 4.054 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4173890,"total":11954193},"progress":"[=================\u003e ] 4.174 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4294905,"total":11954193},"progress":"[=================\u003e ] 4.295 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4417697,"total":11954193},"progress":"[==================\u003e ] 4.418 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4542333,"total":11954193},"progress":"[==================\u003e ] 4.542 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4662272,"total":11954193},"progress":"[===================\u003e ] 4.662 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4783839,"total":11954193},"progress":"[====================\u003e ] 4.784 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":4903485,"total":11954193},"progress":"[====================\u003e ] 4.903 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5053952,"total":11954193},"progress":"[=====================\u003e ] 5.054 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5185024,"total":11954193},"progress":"[=====================\u003e ] 5.185 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5316096,"total":11954193},"progress":"[======================\u003e ] 5.316 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5447168,"total":11954193},"progress":"[======================\u003e ] 5.447 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5578240,"total":11954193},"progress":"[=======================\u003e ] 5.578 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5709312,"total":11954193},"progress":"[=======================\u003e ] 5.709 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5840384,"total":11954193},"progress":"[========================\u003e ] 5.84 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":5960192,"total":11954193},"progress":"[========================\u003e ] 5.96 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6094830,"total":11954193},"progress":"[=========================\u003e ] 6.095 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6218822,"total":11954193},"progress":"[==========================\u003e ] 6.219 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6339924,"total":11954193},"progress":"[==========================\u003e ] 6.34 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6459974,"total":11954193},"progress":"[===========================\u003e ] 6.46 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6579889,"total":11954193},"progress":"[===========================\u003e ] 6.58 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6700032,"total":11954193},"progress":"[============================\u003e ] 6.7 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6838272,"total":11954193},"progress":"[============================\u003e ] 6.838 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":6990336,"total":11954193},"progress":"[=============================\u003e ] 6.99 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7114240,"total":11954193},"progress":"[=============================\u003e ] 7.114 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7240192,"total":11954193},"progress":"[==============================\u003e ] 7.24 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7379968,"total":11954193},"progress":"[==============================\u003e ] 7.38 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7530496,"total":11954193},"progress":"[===============================\u003e ] 7.53 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7650304,"total":11954193},"progress":"[===============================\u003e ] 7.65 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7776768,"total":11954193},"progress":"[================================\u003e ] 7.777 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":7913895,"total":11954193},"progress":"[=================================\u003e ] 7.914 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8056586,"total":11954193},"progress":"[=================================\u003e ] 8.057 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8176355,"total":11954193},"progress":"[==================================\u003e ] 8.176 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8303524,"total":11954193},"progress":"[==================================\u003e ] 8.304 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8445440,"total":11954193},"progress":"[===================================\u003e ] 8.445 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8571392,"total":11954193},"progress":"[===================================\u003e ] 8.571 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8702464,"total":11954193},"progress":"[====================================\u003e ] 8.702 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8823296,"total":11954193},"progress":"[====================================\u003e ] 8.823 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":8943182,"total":11954193},"progress":"[=====================================\u003e ] 8.943 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9065903,"total":11954193},"progress":"[=====================================\u003e ] 9.066 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9199313,"total":11954193},"progress":"[======================================\u003e ] 9.199 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9320031,"total":11954193},"progress":"[======================================\u003e ] 9.32 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9440594,"total":11954193},"progress":"[=======================================\u003e ] 9.441 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9561088,"total":11954193},"progress":"[=======================================\u003e ] 9.561 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9702912,"total":11954193},"progress":"[========================================\u003e ] 9.703 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9823232,"total":11954193},"progress":"[=========================================\u003e ] 9.823 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":9943067,"total":11954193},"progress":"[=========================================\u003e ] 9.943 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10065205,"total":11954193},"progress":"[==========================================\u003e ] 10.07 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10185701,"total":11954193},"progress":"[==========================================\u003e ] 10.19 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10305536,"total":11954193},"progress":"[===========================================\u003e ] 10.31 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10425966,"total":11954193},"progress":"[===========================================\u003e ] 10.43 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10548736,"total":11954193},"progress":"[============================================\u003e ] 10.55 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10681856,"total":11954193},"progress":"[============================================\u003e ] 10.68 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10818523,"total":11954193},"progress":"[=============================================\u003e ] 10.82 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":10945536,"total":11954193},"progress":"[=============================================\u003e ] 10.95 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11067168,"total":11954193},"progress":"[==============================================\u003e ] 11.07 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11207168,"total":11954193},"progress":"[==============================================\u003e ] 11.21 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11338240,"total":11954193},"progress":"[===============================================\u003e ] 11.34 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11460517,"total":11954193},"progress":"[===============================================\u003e ] 11.46 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11611648,"total":11954193},"progress":"[================================================\u003e ] 11.61 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11734587,"total":11954193},"progress":"[=================================================\u003e ] 11.73 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":11879936,"total":11954193},"progress":"[=================================================\u003e ] 11.88 MB/11.95 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12028928,"total":11954193},"progress":"[==================================================\u003e] 12.03 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12149248,"total":11954193},"progress":"[==================================================\u003e] 12.15 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12281005,"total":11954193},"progress":"[==================================================\u003e] 12.28 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12400640,"total":11954193},"progress":"[==================================================\u003e] 12.4 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12520960,"total":11954193},"progress":"[==================================================\u003e] 12.52 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12651982,"total":11954193},"progress":"[==================================================\u003e] 12.65 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12773115,"total":11954193},"progress":"[==================================================\u003e] 12.77 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":12895584,"total":11954193},"progress":"[==================================================\u003e] 12.9 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":13015552,"total":11954193},"progress":"[==================================================\u003e] 13.02 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":13139499,"total":11954193},"progress":"[==================================================\u003e] 13.14 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":13264393,"total":11954193},"progress":"[==================================================\u003e] 13.26 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":13384192,"total":11954193},"progress":"[==================================================\u003e] 13.38 MB","id":"d588cdd3c503"} +{"status":"Pushing","progressDetail":{"current":13455360,"total":11954193},"progress":"[==================================================\u003e] 13.46 MB","id":"d588cdd3c503"} +{"status":"Pushed","progressDetail":{},"id":"d588cdd3c503"} +{"status":"Pushed","progressDetail":{},"id":"d588cdd3c503"} +{"status":"latest: digest: sha256:adc72a07c3a96ffc2201b1d9bf84b8f2416932a8e39000f61d0cda10761f2658 size: 18973"} +{"progressDetail":{},"aux":{"Tag":"latest","Digest":"sha256:adc72a07c3a96ffc2201b1d9bf84b8f2416932a8e39000f61d0cda10761f2658","Size":18973}} diff --git a/pkg/build/builder/testdata/docker-push-1.12.txt b/pkg/build/builder/testdata/docker-push-1.12.txt new file mode 100644 index 000000000000..be65f946a8ef --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-1.12.txt @@ -0,0 +1,38 @@ +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progressDetail":{},"id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":33792,"total":1093484},"progress":"[=\u003e ] 33.79 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":66560,"total":1093484},"progress":"[===\u003e ] 66.56 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":132096,"total":1093484},"progress":"[======\u003e ] 132.1 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":197632,"total":1093484},"progress":"[=========\u003e ] 197.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":263168,"total":1093484},"progress":"[============\u003e ] 263.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":361472,"total":1093484},"progress":"[================\u003e ] 361.5 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":459776,"total":1093484},"progress":"[=====================\u003e ] 459.8 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":525312,"total":1093484},"progress":"[========================\u003e ] 525.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":623616,"total":1093484},"progress":"[============================\u003e ] 623.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":721920,"total":1093484},"progress":"[=================================\u003e ] 721.9 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":820224,"total":1093484},"progress":"[=====================================\u003e ] 820.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":852992,"total":1093484},"progress":"[=======================================\u003e ] 853 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":951296,"total":1093484},"progress":"[===========================================\u003e ] 951.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1012880,"total":1093484},"progress":"[==============================================\u003e ] 1.013 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1024000,"total":1093484},"progress":"[==============================================\u003e ] 1.024 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1035264,"total":1093484},"progress":"[===============================================\u003e ] 1.035 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1046528,"total":1093484},"progress":"[===============================================\u003e ] 1.047 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1057792,"total":1093484},"progress":"[================================================\u003e ] 1.058 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1146101,"total":1093484},"progress":"[==================================================\u003e] 1.146 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1157120,"total":1093484},"progress":"[==================================================\u003e] 1.157 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1168384,"total":1093484},"progress":"[==================================================\u003e] 1.168 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1179648,"total":1093484},"progress":"[==================================================\u003e] 1.18 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1190912,"total":1093484},"progress":"[==================================================\u003e] 1.191 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1202176,"total":1093484},"progress":"[==================================================\u003e] 1.202 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1213440,"total":1093484},"progress":"[==================================================\u003e] 1.213 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1224704,"total":1093484},"progress":"[==================================================\u003e] 1.225 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1235968,"total":1093484},"progress":"[==================================================\u003e] 1.236 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1247232,"total":1093484},"progress":"[==================================================\u003e] 1.247 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1258496,"total":1093484},"progress":"[==================================================\u003e] 1.258 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1269760,"total":1093484},"progress":"[==================================================\u003e] 1.27 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1281024,"total":1093484},"progress":"[==================================================\u003e] 1.281 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1292288,"total":1093484},"progress":"[==================================================\u003e] 1.292 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1293824,"total":1093484},"progress":"[==================================================\u003e] 1.294 MB","id":"e88b3f82283b"} +{"status":"Pushed","progressDetail":{},"id":"e88b3f82283b"} +{"status":"latest: digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 size: 527"} +{"progressDetail":{},"aux":{"Tag":"latest","Digest":"sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912","Size":527}} diff --git a/pkg/build/builder/testdata/docker-push-2digests.txt b/pkg/build/builder/testdata/docker-push-2digests.txt new file mode 100644 index 000000000000..8cb2b486e134 --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-2digests.txt @@ -0,0 +1,40 @@ +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progressDetail":{},"id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":33792,"total":1093484},"progress":"[=\u003e ] 33.79 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":66560,"total":1093484},"progress":"[===\u003e ] 66.56 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":132096,"total":1093484},"progress":"[======\u003e ] 132.1 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":197632,"total":1093484},"progress":"[=========\u003e ] 197.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":263168,"total":1093484},"progress":"[============\u003e ] 263.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":361472,"total":1093484},"progress":"[================\u003e ] 361.5 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":459776,"total":1093484},"progress":"[=====================\u003e ] 459.8 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":525312,"total":1093484},"progress":"[========================\u003e ] 525.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":623616,"total":1093484},"progress":"[============================\u003e ] 623.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":721920,"total":1093484},"progress":"[=================================\u003e ] 721.9 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":820224,"total":1093484},"progress":"[=====================================\u003e ] 820.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":852992,"total":1093484},"progress":"[=======================================\u003e ] 853 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":951296,"total":1093484},"progress":"[===========================================\u003e ] 951.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1012880,"total":1093484},"progress":"[==============================================\u003e ] 1.013 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1024000,"total":1093484},"progress":"[==============================================\u003e ] 1.024 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1035264,"total":1093484},"progress":"[===============================================\u003e ] 1.035 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1046528,"total":1093484},"progress":"[===============================================\u003e ] 1.047 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1057792,"total":1093484},"progress":"[================================================\u003e ] 1.058 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1146101,"total":1093484},"progress":"[==================================================\u003e] 1.146 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1157120,"total":1093484},"progress":"[==================================================\u003e] 1.157 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1168384,"total":1093484},"progress":"[==================================================\u003e] 1.168 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1179648,"total":1093484},"progress":"[==================================================\u003e] 1.18 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1190912,"total":1093484},"progress":"[==================================================\u003e] 1.191 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1202176,"total":1093484},"progress":"[==================================================\u003e] 1.202 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1213440,"total":1093484},"progress":"[==================================================\u003e] 1.213 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1224704,"total":1093484},"progress":"[==================================================\u003e] 1.225 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1235968,"total":1093484},"progress":"[==================================================\u003e] 1.236 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1247232,"total":1093484},"progress":"[==================================================\u003e] 1.247 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1258496,"total":1093484},"progress":"[==================================================\u003e] 1.258 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1269760,"total":1093484},"progress":"[==================================================\u003e] 1.27 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1281024,"total":1093484},"progress":"[==================================================\u003e] 1.281 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1292288,"total":1093484},"progress":"[==================================================\u003e] 1.292 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1293824,"total":1093484},"progress":"[==================================================\u003e] 1.294 MB","id":"e88b3f82283b"} +{"status":"Pushed","progressDetail":{},"id":"e88b3f82283b"} +{"status":"latest: digest: sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa size: 527"} +{"progressDetail":{},"aux":{"Tag":"latest","Digest":"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","Size":527}} +{"status":"latest: digest: sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb size: 527"} +{"progressDetail":{},"aux":{"Tag":"latest","Digest":"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","Size":527}} diff --git a/pkg/build/builder/testdata/docker-push-exists.txt b/pkg/build/builder/testdata/docker-push-exists.txt new file mode 100644 index 000000000000..789d56654821 --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-exists.txt @@ -0,0 +1,5 @@ +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progressDetail":{},"id":"e88b3f82283b"} +{"status":"Layer already exists","progressDetail":{},"id":"e88b3f82283b"} +{"status":"latest: digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 size: 527"} +{"progressDetail":{},"aux":{"Tag":"latest","Digest":"sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912","Size":527}} diff --git a/pkg/build/builder/testdata/docker-push-malformed1.txt b/pkg/build/builder/testdata/docker-push-malformed1.txt new file mode 100644 index 000000000000..e86dc2d79ae3 --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-malformed1.txt @@ -0,0 +1,2 @@ +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progress diff --git a/pkg/build/builder/testdata/docker-push-malformed2.txt b/pkg/build/builder/testdata/docker-push-malformed2.txt new file mode 100644 index 000000000000..75d3bbeb8f99 --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-malformed2.txt @@ -0,0 +1,38 @@ +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progressDetail":{},"id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":33792,"total":1093484},"progress":"[=\u003e ] 33.79 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":66560,"total":1093484},"progress":"[===\u003e ] 66.56 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":132096,"total":1093484},"progress":"[======\u003e ] 132.1 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":197632,"total":1093484},"progress":"[=========\u003e ] 197.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":263168,"total":1093484},"progress":"[============\u003e ] 263.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":361472,"total":1093484},"progress":"[================\u003e ] 361.5 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":459776,"total":1093484},"progress":"[=====================\u003e ] 459.8 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":525312,"total":1093484},"progress":"[========================\u003e ] 525.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":623616,"total":1093484},"progress":"[============================\u003e ] 623.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":721920,"total":1093484},"progress":"[=================================\u003e ] 721.9 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":820224,"total":1093484},"progress":"[=====================================\u003e ] 820.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":852992,"total":1093484},"progress":"[=======================================\u003e ] 853 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":951296,"total":1093484},"progress":"[===========================================\u003e ] 951.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1012880,"total":1093484},"progress":"[==============================================\u003e ] 1.013 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1024000,"total":1093484},"progress":"[==============================================\u003e ] 1.024 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1035264,"total":1093484},"progress":"[===============================================\u003e ] 1.035 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1046528,"total":1093484},"progress":"[===============================================\u003e ] 1.047 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1057792,"total":1093484},"progress":"[================================================\u003e ] 1.058 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1146101,"total":1093484},"progress":"[==================================================\u003e] 1.146 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1157120,"total":1093484},"progress":"[==================================================\u003e] 1.157 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1168384,"total":1093484},"progress":"[==================================================\u003e] 1.168 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1179648,"total":1093484},"progress":"[==================================================\u003e] 1.18 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1190912,"total":1093484},"progress":"[==================================================\u003e] 1.191 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1202176,"total":1093484},"progress":"[==================================================\u003e] 1.202 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1213440,"total":1093484},"progress":"[==================================================\u003e] 1.213 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1224704,"total":1093484},"progress":"[==================================================\u003e] 1.225 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1235968,"total":1093484},"progress":"[==================================================\u003e] 1.236 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1247232,"total":1093484},"progress":"[==================================================\u003e] 1.247 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1258496,"total":1093484},"progress":"[==================================================\u003e] 1.258 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1269760,"total":1093484},"progress":"[==================================================\u003e] 1.27 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1281024,"total":1093484},"progress":"[==================================================\u003e] 1.281 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1292288,"total":1093484},"progress":"[==================================================\u003e] 1.292 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1293824,"total":1093484},"progress":"[==================================================\u003e] 1.294 MB","id":"e88b3f82283b"} +{"status":"Pushed","progressDetail":{},"id":"e88b3f82283b"} +{"status":"latest: digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 size: 527"} +{"progressDetail":%%% diff --git a/pkg/build/builder/testdata/docker-push-malformed3.txt b/pkg/build/builder/testdata/docker-push-malformed3.txt new file mode 100644 index 000000000000..631817abf2ce --- /dev/null +++ b/pkg/build/builder/testdata/docker-push-malformed3.txt @@ -0,0 +1,41 @@ + +{"status":"The push refers to a repository [localhost:5000/busybox]"} +{"status":"Preparing","progressDetail":{},"id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":33792,"total":1093484},"progress":"[=\u003e ] 33.79 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":66560,"total":1093484},"progress":"[===\u003e ] 66.56 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":132096,"total":1093484},"progress":"[======\u003e ] 132.1 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":197632,"total":1093484},"progress":"[=========\u003e ] 197.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":263168,"total":1093484},"progress":"[============\u003e ] 263.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":361472,"total":1093484},"progress":"[================\u003e ] 361.5 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":459776,"total":1093484},"progress":"[=====================\u003e ] 459.8 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":525312,"total":1093484},"progress":"[========================\u003e ] 525.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":623616,"total":1093484},"progress":"[============================\u003e ] 623.6 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":721920,"total":1093484},"progress":"[=================================\u003e ] 721.9 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":820224,"total":1093484},"progress":"[=====================================\u003e ] 820.2 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":852992,"total":1093484},"progress":"[=======================================\u003e ] 853 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":951296,"total":1093484},"progress":"[===========================================\u003e ] 951.3 kB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1012880,"total":1093484},"progress":"[==============================================\u003e ] 1.013 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1024000,"total":1093484},"progress":"[==============================================\u003e ] 1.024 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1035264,"total":1093484},"progress":"[===============================================\u003e ] 1.035 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1046528,"total":1093484},"progress":"[===============================================\u003e ] 1.047 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1057792,"total":1093484},"progress":"[================================================\u003e ] 1.058 MB/1.093 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1146101,"total":1093484},"progress":"[==================================================\u003e] 1.146 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1157120,"total":1093484},"progress":"[==================================================\u003e] 1.157 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1168384,"total":1093484},"progress":"[==================================================\u003e] 1.168 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1179648,"total":1093484},"progress":"[==================================================\u003e] 1.18 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1190912,"total":1093484},"progress":"[==================================================\u003e] 1.191 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1202176,"total":1093484},"progress":"[==================================================\u003e] 1.202 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1213440,"total":1093484},"progress":"[==================================================\u003e] 1.213 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1224704,"total":1093484},"progress":"[==================================================\u003e] 1.225 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1235968,"total":1093484},"progress":"[==================================================\u003e] 1.236 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1247232,"total":1093484},"progress":"[==================================================\u003e] 1.247 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1258496,"total":1093484},"progress":"[==================================================\u003e] 1.258 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1269760,"total":1093484},"progress":"[==================================================\u003e] 1.27 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1281024,"total":1093484},"progress":"[==================================================\u003e] 1.281 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1292288,"total":1093484},"progress":"[==================================================\u003e] 1.292 MB","id":"e88b3f82283b"} +{"status":"Pushing","progressDetail":{"current":1293824,"total":1093484},"progress":"[==================================================\u003e] 1.294 MB","id":"e88b3f82283b"} +{"status":"Pushed","progressDetail":{},"id":"e88b3f82283b"} +{"status":"latest: digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 size: 527"} +{"progressDetail":{},"aux":{"Tag":"latest","Digest":"sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912","Size":527}} +some +garbage diff --git a/pkg/build/builder/testdata/empty.txt b/pkg/build/builder/testdata/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/pkg/build/registry/build/strategy.go b/pkg/build/registry/build/strategy.go index 205dd9445020..df7ac773dad7 100644 --- a/pkg/build/registry/build/strategy.go +++ b/pkg/build/registry/build/strategy.go @@ -127,10 +127,12 @@ func (detailsStrategy) PrepareForUpdate(ctx kapi.Context, obj, old runtime.Objec revision := newBuild.Spec.Revision message := newBuild.Status.Message reason := newBuild.Status.Reason + outputTo := newBuild.Status.Output.To *newBuild = *oldBuild newBuild.Spec.Revision = revision newBuild.Status.Reason = reason newBuild.Status.Message = message + newBuild.Status.Output.To = outputTo } // Validates that an update is valid by ensuring that no Revision exists and that it's not getting updated to blank diff --git a/pkg/cmd/cli/describe/describer.go b/pkg/cmd/cli/describe/describer.go index 6d0f61ee41b9..439fcd3248fc 100644 --- a/pkg/cmd/cli/describe/describer.go +++ b/pkg/cmd/cli/describe/describer.go @@ -139,6 +139,10 @@ func (d *BuildDescriber) Describe(namespace, name string, settings kctl.Describe } formatString(out, "Build Pod", buildapi.GetBuildPodName(build)) + if build.Status.Output.To != nil && build.Status.Output.To.ImageDigest != "" { + formatString(out, "Image Digest", build.Status.Output.To.ImageDigest) + } + describeCommonSpec(build.Spec.CommonSpec, out) describeBuildTriggerCauses(build.Spec.TriggeredBy, out) diff --git a/pkg/openapi/zz_generated.openapi.go b/pkg/openapi/zz_generated.openapi.go index 81ef9e6ad1d7..2839f56c9c35 100644 --- a/pkg/openapi/zz_generated.openapi.go +++ b/pkg/openapi/zz_generated.openapi.go @@ -8455,12 +8455,52 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{ Ref: spec.MustCreateRef("#/definitions/v1.ObjectReference"), }, }, + "output": { + SchemaProps: spec.SchemaProps{ + Description: "output describes the Docker image the build has produced.", + Ref: spec.MustCreateRef("#/definitions/v1.BuildStatusOutput"), + }, + }, }, Required: []string{"phase"}, }, }, Dependencies: []string{ - "unversioned.Time", "v1.ObjectReference"}, + "unversioned.Time", "v1.BuildStatusOutput", "v1.ObjectReference"}, + }, + "v1.BuildStatusOutput": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BuildStatusOutput contains the status of the built image.", + Properties: map[string]spec.Schema{ + "to": { + SchemaProps: spec.SchemaProps{ + Description: "to describes the status of the built image being pushed to a registry.", + Ref: spec.MustCreateRef("#/definitions/v1.BuildStatusOutputTo"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "v1.BuildStatusOutputTo"}, + }, + "v1.BuildStatusOutputTo": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BuildStatusOutputTo describes the status of the built image with regards to image registry to which it was supposed to be pushed.", + Properties: map[string]spec.Schema{ + "imageDigest": { + SchemaProps: spec.SchemaProps{ + Description: "imageDigest is the digest of the built Docker image. The digest uniquely identifies the image in the registry to which it was pushed.\n\nPlease note that this field may not always be set even if the push completes successfully - e.g. when the registry returns no digest or returns it in a format that the builder doesn't understand.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, }, "v1.BuildStrategy": { Schema: spec.Schema{ diff --git a/test/extended/builds/digest.go b/test/extended/builds/digest.go new file mode 100644 index 000000000000..0a9899b82977 --- /dev/null +++ b/test/extended/builds/digest.go @@ -0,0 +1,69 @@ +package builds + +import ( + "fmt" + + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + + exutil "github.com/openshift/origin/test/extended/util" +) + +var _ = g.Describe("[builds][Slow] completed builds should have digest of the image in their status", func() { + defer g.GinkgoRecover() + var ( + imageStreamFixture = exutil.FixturePath("..", "integration", "testdata", "test-image-stream.json") + stiBuildFixture = exutil.FixturePath("testdata", "test-s2i-build.json") + dockerBuildFixture = exutil.FixturePath("testdata", "test-docker-build.json") + oc = exutil.NewCLI("build-sti-labels", exutil.KubeConfigPath()) + ) + + g.BeforeEach(func() { + g.By("waiting for builder service account") + err := exutil.WaitForBuilderAccount(oc.AdminKubeClient().Core().ServiceAccounts(oc.Namespace())) + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("creating test imagestream") + err = oc.Run("create").Args("-f", imageStreamFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + }) + + g.Describe("S2I build", func() { + g.Describe("started with normal log level", func() { + testBuildDigest(oc, stiBuildFixture, 0) + }) + + g.Describe("started with log level >5", func() { + testBuildDigest(oc, stiBuildFixture, 7) + }) + }) + + g.Describe("Docker build", func() { + g.Describe("started with normal log level", func() { + testBuildDigest(oc, dockerBuildFixture, 0) + }) + + g.Describe("started with log level >5", func() { + testBuildDigest(oc, dockerBuildFixture, 7) + }) + }) +}) + +func testBuildDigest(oc *exutil.CLI, buildFixture string, buildLogLevel uint) { + g.It(fmt.Sprintf("should save the image digest when finished"), func() { + g.By("creating test build") + err := oc.Run("create").Args("-f", buildFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + logLevelArg := fmt.Sprintf("--build-loglevel=%d", buildLogLevel) + g.By("starting a test build") + br, err := exutil.StartBuildAndWait(oc, "test", logLevelArg) + + g.By("checking that the image digest has been saved to the build status") + o.Expect(br.Build.Status.Output.To).NotTo(o.BeNil()) + + ist, err := oc.Client().ImageStreamTags(oc.Namespace()).Get("test", "latest") + o.Expect(err).NotTo(o.HaveOccurred()) + o.Expect(br.Build.Status.Output.To.ImageDigest).To(o.Equal(ist.Image.Name)) + }) +}