diff --git a/pkg/reconciler/revision/revision.go b/pkg/reconciler/revision/revision.go index e165410d8ce7..caec982272e1 100644 --- a/pkg/reconciler/revision/revision.go +++ b/pkg/reconciler/revision/revision.go @@ -18,6 +18,7 @@ package revision import ( "context" + "errors" "fmt" "strings" @@ -97,54 +98,31 @@ func (c *Reconciler) reconcileDigest(ctx context.Context, rev *v1.Revision) erro } var digestGrp errgroup.Group - type digestData struct { - digestValue string - containerName string - isServingContainer bool - image string - digestError error - } - - digests := make(chan digestData, len(rev.Spec.Containers)) - for _, container := range rev.Spec.Containers { + containerStatuses := make([]v1.ContainerStatuses, len(rev.Spec.Containers)) + for i, container := range rev.Spec.Containers { container := container // Standard Go concurrency pattern. + i := i digestGrp.Go(func() error { digest, err := c.resolver.Resolve(container.Image, opt, cfgs.Deployment.RegistriesSkippingTagResolving) if err != nil { - err = fmt.Errorf("failed to resolve image to digest: %w", err) - digests <- digestData{ - image: container.Image, - digestError: err, - } - } else { - isServingContainer := len(rev.Spec.Containers) == 1 || len(container.Ports) != 0 - digests <- digestData{ - digestValue: digest, - containerName: container.Name, - isServingContainer: isServingContainer, - } + return errors.New(v1.RevisionContainerMissingMessage(container.Image, fmt.Sprintf("failed to resolve image to digest: %v", err))) + } + if len(rev.Spec.Containers) == 1 || len(container.Ports) != 0 { + rev.Status.DeprecatedImageDigest = digest + } + containerStatuses[i] = v1.ContainerStatuses{ + Name: container.Name, + ImageDigest: digest, } return nil }) } - digestGrp.Wait() - close(digests) - for v := range digests { - if v.digestError != nil { - rev.Status.MarkContainerHealthyFalse(v1.ReasonContainerMissing, - v1.RevisionContainerMissingMessage( - v.image, v.digestError.Error())) - return v.digestError - } - if v.isServingContainer { - rev.Status.DeprecatedImageDigest = v.digestValue - } - rev.Status.ContainerStatuses = append(rev.Status.ContainerStatuses, v1.ContainerStatuses{ - Name: v.containerName, - ImageDigest: v.digestValue, - }) + if err := digestGrp.Wait(); err != nil { + rev.Status.MarkContainerHealthyFalse(v1.ReasonContainerMissing, err.Error()) + return err } + rev.Status.ContainerStatuses = containerStatuses return nil } diff --git a/pkg/reconciler/revision/revision_test.go b/pkg/reconciler/revision/revision_test.go index 4e8925b5fb6c..68cbdc678249 100644 --- a/pkg/reconciler/revision/revision_test.go +++ b/pkg/reconciler/revision/revision_test.go @@ -346,12 +346,17 @@ func TestRevWithImageDigests(t *testing.T) { rev := testRevision(corev1.PodSpec{ Containers: []corev1.Container{{ + Name: "first", Image: "gcr.io/repo/image", Ports: []corev1.ContainerPort{{ ContainerPort: 8888, }}, }, { + Name: "second", Image: "docker.io/repo/image", + }, { + Name: "third", + Image: "docker.io/anotherrepo/image", }}, }) createRevision(t, ctx, controller, rev) @@ -369,6 +374,11 @@ func TestRevWithImageDigests(t *testing.T) { if len(rev.Spec.Containers) != len(rev.Status.ContainerStatuses) { t.Error("Image digests does not match with the provided containers") } + for i, c := range rev.Spec.Containers { + if c.Name != rev.Status.ContainerStatuses[i].Name { + t.Error("Container statuses do not match the order of containers in spec") + } + } rev.Status.ContainerStatuses = []v1.ContainerStatuses{} updateRevision(t, ctx, controller, rev) if len(rev.Status.ContainerStatuses) != 0 {