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..61aac32b7ca0 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,25 @@ 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 set even if the push completes + // successfully. + 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 ba0e6c2316a9..6991d7ba0b91 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 9dea5d251602..44699ed130fe 100644 --- a/api/swagger-spec/openshift-openapi-spec.json +++ b/api/swagger-spec/openshift-openapi-spec.json @@ -47817,6 +47817,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" @@ -47835,6 +47839,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. Please note that this field may not always set even if the push completes successfully.", + "type": "string" + } + } + }, "v1.BuildTriggerCause": { "description": "BuildTriggerCause holds information about a triggered build. It is used for displaying build trigger data for each build and build configuration in oc describe. It is also used to describe which triggers led to the most recent update in the build configuration.", "properties": { diff --git a/pkg/build/api/types.go b/pkg/build/api/types.go index aeb0870bcf79..cbfa98ff694f 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,22 @@ 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 `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 set even if the push completes + // successfully. + ImageDigest string `json:"imageDigest,omitempty" protobuf:"bytes,1,opt,name=imageDigest"` +} + // 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..61aac32b7ca0 100644 --- a/pkg/build/api/v1/generated.proto +++ b/pkg/build/api/v1/generated.proto @@ -403,6 +403,25 @@ 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 set even if the push completes + // successfully. + 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..e2ace55fc572 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. Please note that this field may not always set even if the push completes successfully.", +} + +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..bc114dd49203 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,22 @@ 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 set even if the push completes + // successfully. + 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..4e70f497a9c7 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,58 @@ 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 { + if in.To != nil { + in, out := &in.To, &out.To + *out = new(api.BuildStatusOutputTo) + if err := Convert_v1_BuildStatusOutputTo_To_api_BuildStatusOutputTo(*in, *out, s); err != nil { + return err + } + } else { + out.To = nil + } + 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 { + if in.To != nil { + in, out := &in.To, &out.To + *out = new(BuildStatusOutputTo) + if err := Convert_api_BuildStatusOutputTo_To_v1_BuildStatusOutputTo(*in, *out, s); err != nil { + return err + } + } else { + out.To = nil + } + 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..55bf7069bc4b 100644 --- a/pkg/build/builder/dockerutil.go +++ b/pkg/build/builder/dockerutil.go @@ -1,10 +1,13 @@ package builder import ( + "bytes" + "encoding/json" "fmt" "io" "os" "strings" + "sync" "time" docker "github.com/fsouza/go-dockerclient" @@ -73,28 +76,35 @@ 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 { +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) { + simpleWriter := newSimpleWriter(os.Stderr) + defer simpleWriter.Close() + progressWriter = simpleWriter + } else { + logProgress := func(s string) { + glog.V(0).Infof("%s", s) + } + progressWriter = imageprogress.NewPushWriter(logProgress) } + digestWriter := &digestWriter{} + 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 +115,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 +220,125 @@ 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"` +} + +// digestWriter consumes stream of json messages from docker client push +// operation and looks for digest of the pushed image. +type digestWriter struct { + bytes.Buffer + digest string +} + +// Digest returns the digest of the pushed image. Call this method after all +// jsons messages have been written to the digestWriter. +func (d *digestWriter) Digest() string { + if len(d.digest) > 0 { + return d.digest + } + + decoder := json.NewDecoder(d) + for decoder.More() { + line := &progressLine{} + err := decoder.Decode(line) + if err != nil { + break + } + + if len(line.Aux.Digest) > 0 { + d.digest = line.Aux.Digest + break + } + } + + return d.digest +} + +// simpleProgressWriter is 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. +type simpleProgressWriter struct { + mutex *sync.Mutex + internalWriter *io.PipeWriter + output io.Writer +} + +func newSimpleWriter(output io.Writer) *simpleProgressWriter { + writer := &simpleProgressWriter{ + mutex: &sync.Mutex{}, + output: output, + } + return writer +} + +func (w *simpleProgressWriter) Write(data []byte) (int, error) { + w.mutex.Lock() + defer w.mutex.Unlock() + if w.internalWriter == nil { + var pipeIn *io.PipeReader + pipeIn, w.internalWriter = io.Pipe() + decoder := json.NewDecoder(pipeIn) + go func() { + err := w.readProgress(decoder) + if err != nil { + pipeIn.CloseWithError(err) + } + }() + } + return w.internalWriter.Write(data) +} + +func (w *simpleProgressWriter) readProgress(decoder *json.Decoder) error { + for { + line := &progressLine{} + err := decoder.Decode(line) + if err == io.EOF { + break + } + if err != nil { + return err + } + err = w.processLine(line) + if err != nil { + return err + } + } + return nil +} + +func (w *simpleProgressWriter) processLine(line *progressLine) error { + if line.Stream != "" { + fmt.Fprint(w.output, line.Stream) + } else if line.Progress != "" { + fmt.Fprintf(w.output, "%s %s\r", line.Status, line.Progress) + } else if line.Error != "" { + fmt.Fprintf(w.output, "error: %s\r", line.Error) + } + if line.Status != "" { + fmt.Fprintln(w.output, line.Status) + } + return nil +} + +func (w *simpleProgressWriter) Close() error { + w.mutex.Lock() + defer w.mutex.Unlock() + if w.internalWriter != nil { + return w.internalWriter.Close() + } + return nil +} diff --git a/pkg/build/builder/dockerutil_test.go b/pkg/build/builder/dockerutil_test.go index 52862decaeac..1a40039aaf8e 100644 --- a/pkg/build/builder/dockerutil_test.go +++ b/pkg/build/builder/dockerutil_test.go @@ -1,8 +1,14 @@ package builder import ( + "bytes" "errors" + "fmt" + "io" + "os" + "path/filepath" "reflect" + "regexp" "testing" "github.com/fsouza/go-dockerclient" @@ -151,13 +157,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 +174,152 @@ 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 TestPushImageDigests(t *testing.T) { + tests := []struct { + Filename string + Expected string + }{ + { + 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", + Expected: "", + }, + { + Filename: "docker-push-malformed2.txt", + Expected: "", + }, + { + Filename: "docker-push-malformed3.txt", + Expected: "sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912", + }, + { + 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("Failed to process output stream: %s", err) + } + + return nil + } + testAuth := docker.AuthConfiguration{} + + digest, err := pushImage(fakeDocker, "testimage/"+tc.Filename, testAuth) + if err != nil { + t.Errorf("[%s] Unexpected error: %v", tc.Filename, err) + break + } + + if digest != tc.Expected { + t.Errorf("[%s] Digest mismatch: expected %q, got %q", tc.Filename, tc.Expected, digest) + break + } + } + +} + +func TestSimpleProgress(t *testing.T) { + tests := []struct { + Filename string + Expected string + }{ + { + 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", + }, + { + Filename: "docker-push-malformed2.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed.*digest", + }, + { + Filename: "docker-push-malformed3.txt", + Expected: "(?ms)The push.*Preparing.*Pushing.*Pushed.*digest", + }, + { + 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) + break + } + + output := &bytes.Buffer{} + writer := newSimpleWriter(output) + + _, err = io.Copy(writer, fh) + if err != nil { + t.Errorf("Failed to process %q: %s", tc.Filename, err) + break + } + + if outputStr := output.String(); !regexp.MustCompile(tc.Expected).MatchString(outputStr) { + t.Errorf("%s: expected %q, got:\n%s\n", tc.Filename, tc.Expected, outputStr) + break + } + } +} 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 d08b4b6aab4f..549c1ea38a24 100644 --- a/pkg/openapi/zz_generated.openapi.go +++ b/pkg/openapi/zz_generated.openapi.go @@ -7573,12 +7573,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. Please note that this field may not always set even if the push completes successfully.", + 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..759cb4f1c972 --- /dev/null +++ b/test/extended/builds/digest.go @@ -0,0 +1,106 @@ +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") //XXX + stiBuildFixture = exutil.FixturePath("testdata", "test-s2i-build.json") //XXX + dockerBuildFixture = exutil.FixturePath("testdata", "test-docker-build.json") //XXX + oc = exutil.NewCLI("build-sti-labels", exutil.KubeConfigPath()) + ) + + g.JustBeforeEach(func() { + g.By("waiting for builder service account") + err := exutil.WaitForBuilderAccount(oc.AdminKubeClient().Core().ServiceAccounts(oc.Namespace())) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + + g.Describe("S2I build", func() { + g.Describe("started with normal log level", func() { + g.It(fmt.Sprintf("should save the image digest when finished"), func() { + + g.By("creating test imagestream") + err := oc.Run("create").Args("-f", imageStreamFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("creating test build") + err = oc.Run("create").Args("-f", stiBuildFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("starting a test build") + br, err := exutil.StartBuildAndWait(oc, "test") + + g.By("checking that the resulting image has a digest") + o.Expect(br.Build.Status.Output.To.ImageDigest).To(o.HavePrefix("sha256:")) + }) + }) + + g.Describe("started with log level >5", func() { + g.It(fmt.Sprintf("should save the image digest when finished"), func() { + + g.By("creating test imagestream") + err := oc.Run("create").Args("-f", imageStreamFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("creating test build") + err = oc.Run("create").Args("-f", stiBuildFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("starting a test build") + br, err := exutil.StartBuildAndWait(oc, "test", "--build-loglevel=7") + + g.By("checking that the resulting image has a digest") + o.Expect(br.Build.Status.Output.To.ImageDigest).To(o.HavePrefix("sha256:")) + }) + }) + }) + + g.Describe("Docker build", func() { + g.Describe("started with normal log level", func() { + g.It(fmt.Sprintf("should save the image digest when finished"), func() { + + g.By("creating test imagestream") + err := oc.Run("create").Args("-f", imageStreamFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("creating test build") + err = oc.Run("create").Args("-f", dockerBuildFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("starting a test build") + br, err := exutil.StartBuildAndWait(oc, "test") + + g.By("checking that the resulting image has a digest") + o.Expect(br.Build.Status.Output.To.ImageDigest).To(o.HavePrefix("sha256:")) + }) + }) + + g.Describe("started with log level >5", func() { + g.It(fmt.Sprintf("should save the image digest when finished"), func() { + + g.By("creating test imagestream") + err := oc.Run("create").Args("-f", imageStreamFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("creating test build") + err = oc.Run("create").Args("-f", dockerBuildFixture).Execute() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("starting a test build") + br, err := exutil.StartBuildAndWait(oc, "test", "--build-loglevel=7") + + g.By("checking that the resulting image has a digest") + o.Expect(br.Build.Status.Output.To.ImageDigest).To(o.HavePrefix("sha256:")) + }) + }) + }) +})