diff --git a/pkg/controller/configuration/configuration.go b/pkg/controller/configuration/configuration.go index cc07cf63ba58..bf82830197b4 100644 --- a/pkg/controller/configuration/configuration.go +++ b/pkg/controller/configuration/configuration.go @@ -202,7 +202,6 @@ func (c *Controller) reconcile(ctx context.Context, config *v1alpha1.Configurati func (c *Controller) createRevision(config *v1alpha1.Configuration, revName string) (*v1alpha1.Revision, error) { logger := loggerWithConfigInfo(c.Logger, config.Namespace, config.Name) - buildName := "" if config.Spec.Build != nil { // TODO(mattmoor): Determine whether we reuse the previous build. build := resources.MakeBuild(config) @@ -212,10 +211,9 @@ func (c *Controller) createRevision(config *v1alpha1.Configuration, revName stri } logger.Infof("Created Build:\n%+v", created.Name) c.Recorder.Eventf(config, corev1.EventTypeNormal, "Created", "Created Build %q", created.Name) - buildName = created.Name } - rev := resources.MakeRevision(config, buildName) + rev := resources.MakeRevision(config) created, err := c.ServingClientSet.ServingV1alpha1().Revisions(config.Namespace).Create(rev) if err != nil { return nil, err diff --git a/pkg/controller/configuration/configuration_test.go b/pkg/controller/configuration/configuration_test.go index 2476c111538f..966d784b443d 100644 --- a/pkg/controller/configuration/configuration_test.go +++ b/pkg/controller/configuration/configuration_test.go @@ -22,7 +22,7 @@ import ( buildv1alpha1 "github.com/knative/build/pkg/apis/build/v1alpha1" "github.com/knative/serving/pkg/apis/serving/v1alpha1" "github.com/knative/serving/pkg/controller" - "github.com/knative/serving/pkg/controller/configuration/resources" + "github.com/knative/serving/pkg/controller/testing/builder" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -32,12 +32,7 @@ import ( ) var ( - boolTrue = true - revisionSpec = v1alpha1.RevisionSpec{ - Container: corev1.Container{ - Image: "busybox", - }, - } + boolTrue = true buildSpec = buildv1alpha1.BuildSpec{ Steps: []corev1.Container{{ Image: "build-step1", @@ -47,8 +42,6 @@ var ( } ) -const noBuildName = "" - // This is heavily based on the way the OpenShift Ingress controller tests its reconciliation method. func TestReconcile(t *testing.T) { table := TableTest{{ @@ -60,171 +53,163 @@ func TestReconcile(t *testing.T) { }, { Name: "create revision matching generation", Objects: []runtime.Object{ - cfg("no-revisions-yet", "foo", 1234), + builder.Config("no-revisions-yet", "foo", 1234), }, WantCreates: []metav1.Object{ - resources.MakeRevision(cfg("no-revisions-yet", "foo", 1234), noBuildName), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("no-revisions-yet", "foo", 1234, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "no-revisions-yet-01234", - ObservedGeneration: 1234, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionUnknown, - }}, - }), - }}, + builder.Config("no-revisions-yet", "foo", 1234). + ToRevision(). + Build(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("no-revisions-yet", "foo", 1234). + WithLatestCreatedRevisionName("no-revisions-yet-01234"). + WithObservedGeneration(1234). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionUnknown, + }).AsUpdateAction(), + }, Key: "foo/no-revisions-yet", }, { Name: "webhook validation failure", // If we attempt to create a Revision with a bad ConcurrencyModel set, we fail. WantErr: true, Objects: []runtime.Object{ - setConcurrencyModel(cfg("validation-failure", "foo", 1234), "Bogus"), + builder.Config("validation-failure", "foo", 1234).WithConcurrencyModel("Bogus"), }, WantCreates: []metav1.Object{ - setRevConcurrencyModel(resources.MakeRevision(cfg("validation-failure", "foo", 1234), noBuildName), "Bogus"), + builder.Config("validation-failure", "foo", 1234). + ToRevision(). + WithConcurrencyModel("Bogus"). + Build(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("validation-failure", "foo", 1234). + WithConcurrencyModel("Bogus"). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionFalse, + Reason: "RevisionFailed", + Message: `Revision creation failed with message: "invalid value \"Bogus\": spec.concurrencyModel".`, + }).AsUpdateAction(), }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: setConcurrencyModel(cfgWithStatus("validation-failure", "foo", 1234, - v1alpha1.ConfigurationStatus{ - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionFalse, - Reason: "RevisionFailed", - Message: `Revision creation failed with message: "invalid value \"Bogus\": spec.concurrencyModel".`, - }}, - }), "Bogus"), - }}, Key: "foo/validation-failure", }, { Name: "create revision matching generation with build", Objects: []runtime.Object{ - cfgWithBuild("need-rev-and-build", "foo", 99998, &buildSpec), + builder.Config("need-rev-and-build", "foo", 99998).WithBuild(buildSpec), }, WantCreates: []metav1.Object{ - resources.MakeBuild(cfgWithBuild("need-rev-and-build", "foo", 99998, &buildSpec)), - resources.MakeRevision(cfgWithBuild("need-rev-and-build", "foo", 99998, &buildSpec), - resources.MakeBuild(cfgWithBuild("need-rev-and-build", "foo", 99998, &buildSpec)).Name), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithBuildAndStatus("need-rev-and-build", "foo", 99998, &buildSpec, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "need-rev-and-build-99998", - ObservedGeneration: 99998, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionUnknown, - }}, - }, - ), - }}, + builder.Config("need-rev-and-build", "foo", 99998).WithBuild(buildSpec). + ToBuild(), + builder.Config("need-rev-and-build", "foo", 99998).WithBuild(buildSpec). + ToRevision(). + Build(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("need-rev-and-build", "foo", 99998). + WithBuild(buildSpec). + WithLatestCreatedRevisionName("need-rev-and-build-99998"). + WithObservedGeneration(99998). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionUnknown, + }).AsUpdateAction(), + }, Key: "foo/need-rev-and-build", }, { Name: "reconcile revision matching generation (ready: unknown)", Objects: []runtime.Object{ - cfg("matching-revision-not-done", "foo", 5432), - resources.MakeRevision(cfg("matching-revision-not-done", "foo", 5432), noBuildName), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("matching-revision-not-done", "foo", 5432, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "matching-revision-not-done-05432", - ObservedGeneration: 5432, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionUnknown, - }}, - }, - ), - }}, + builder.Config("matching-revision-not-done", "foo", 5432), + builder.Config("matching-revision-not-done", "foo", 5432). + ToRevision(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("matching-revision-not-done", "foo", 5432). + WithLatestCreatedRevisionName("matching-revision-not-done-05432"). + WithObservedGeneration(5432). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionUnknown, + }).AsUpdateAction(), + }, Key: "foo/matching-revision-not-done", }, { Name: "reconcile revision matching generation (ready: true)", Objects: []runtime.Object{ - cfg("matching-revision-done", "foo", 5555), - makeRevReady(t, resources.MakeRevision(cfg("matching-revision-done", "foo", 5555), noBuildName)), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("matching-revision-done", "foo", 5555, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "matching-revision-done-05555", - LatestReadyRevisionName: "matching-revision-done-05555", - ObservedGeneration: 5555, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionTrue, - }}, - }, - ), - }}, + builder.Config("matching-revision-done", "foo", 5555), + builder.Config("matching-revision-done", "foo", 5555). + ToRevision(). + WithReadyStatus(t), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("matching-revision-done", "foo", 5555). + WithLatestCreatedRevisionName("matching-revision-done-05555"). + WithLatestReadyRevisionName("matching-revision-done-05555"). + WithObservedGeneration(5555). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionTrue, + }).AsUpdateAction(), + }, Key: "foo/matching-revision-done", }, { Name: "reconcile revision matching generation (ready: true, idempotent)", Objects: []runtime.Object{ - cfgWithStatus("matching-revision-done-idempotent", "foo", 5566, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "matching-revision-done-idempotent-05566", - LatestReadyRevisionName: "matching-revision-done-idempotent-05566", - ObservedGeneration: 5566, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionTrue, - }}, - }, - ), - makeRevReady(t, resources.MakeRevision(cfg("matching-revision-done-idempotent", "foo", 5566), noBuildName)), + builder.Config("matching-revision-done-idempotent", "foo", 5566). + WithLatestCreatedRevisionName("matching-revision-done-idempotent-05566"). + WithLatestReadyRevisionName("matching-revision-done-idempotent-05566"). + WithObservedGeneration(5566). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionTrue, + }), + builder.Config("matching-revision-done-idempotent", "foo", 5566). + ToRevision(). + WithReadyStatus(t), }, Key: "foo/matching-revision-done-idempotent", }, { Name: "reconcile revision matching generation (ready: false)", Objects: []runtime.Object{ - cfg("matching-revision-failed", "foo", 5555), - makeRevFailed(resources.MakeRevision(cfg("matching-revision-failed", "foo", 5555), noBuildName)), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("matching-revision-failed", "foo", 5555, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "matching-revision-failed-05555", - ObservedGeneration: 5555, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionFalse, - Reason: "RevisionFailed", - Message: `Revision "matching-revision-failed-05555" failed with message: "It's the end of the world as we know it".`, - }}, - }, - ), - }}, + builder.Config("matching-revision-failed", "foo", 5555), + builder.Config("matching-revision-failed", "foo", 5555). + ToRevision(). + WithFailedStatus(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("matching-revision-failed", "foo", 5555). + WithLatestCreatedRevisionName("matching-revision-failed-05555"). + WithObservedGeneration(5555). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionFalse, + Reason: "RevisionFailed", + Message: `Revision "matching-revision-failed-05555" failed with message: "It's the end of the world as we know it".`, + }).AsUpdateAction(), + }, Key: "foo/matching-revision-failed", }, { Name: "reconcile revision matching generation (ready: bad)", Objects: []runtime.Object{ - cfg("bad-condition", "foo", 5555), - makeRevStatus(resources.MakeRevision(cfg("bad-condition", "foo", 5555), noBuildName), - v1alpha1.RevisionStatus{ - Conditions: []v1alpha1.RevisionCondition{{ - Type: v1alpha1.RevisionConditionReady, - Status: "Bad", - }}, - }, - ), + builder.Config("bad-condition", "foo", 5555), + builder.Config("bad-condition", "foo", 5555). + ToRevision(). + WithCondition(v1alpha1.RevisionCondition{ + Type: v1alpha1.RevisionConditionReady, + Status: "Bad", + }), }, WantErr: true, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("bad-condition", "foo", 5555, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "bad-condition-05555", - ObservedGeneration: 5555, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionUnknown, - }}, - }, - ), - }}, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("bad-condition", "foo", 5555). + WithLatestCreatedRevisionName("bad-condition-05555"). + WithObservedGeneration(5555). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionUnknown, + }).AsUpdateAction(), + }, Key: "foo/bad-condition", }, { Name: "failure creating build", @@ -234,24 +219,24 @@ func TestReconcile(t *testing.T) { InduceFailure("create", "builds"), }, Objects: []runtime.Object{ - cfgWithBuild("create-build-failure", "foo", 99998, &buildSpec), + builder.Config("create-build-failure", "foo", 99998).WithBuild(buildSpec), }, WantCreates: []metav1.Object{ - resources.MakeBuild(cfgWithBuild("create-build-failure", "foo", 99998, &buildSpec)), + builder.Config("create-build-failure", "foo", 99998). + WithBuild(buildSpec). + ToBuild(), // No Revision gets created. }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithBuildAndStatus("create-build-failure", "foo", 99998, &buildSpec, - v1alpha1.ConfigurationStatus{ - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionFalse, - Reason: "RevisionFailed", - Message: `Revision creation failed with message: "inducing failure for create builds".`, - }}, - }, - ), - }}, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("create-build-failure", "foo", 99998). + WithBuild(buildSpec). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionFalse, + Reason: "RevisionFailed", + Message: `Revision creation failed with message: "inducing failure for create builds".`, + }).AsUpdateAction(), + }, Key: "foo/create-build-failure", }, { Name: "failure creating revision", @@ -261,23 +246,22 @@ func TestReconcile(t *testing.T) { InduceFailure("create", "revisions"), }, Objects: []runtime.Object{ - cfg("create-revision-failure", "foo", 99998), + builder.Config("create-revision-failure", "foo", 99998), }, WantCreates: []metav1.Object{ - resources.MakeRevision(cfg("create-revision-failure", "foo", 99998), noBuildName), + builder.Config("create-revision-failure", "foo", 99998). + ToRevision(). + Build(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("create-revision-failure", "foo", 99998). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionFalse, + Reason: "RevisionFailed", + Message: `Revision creation failed with message: "inducing failure for create revisions".`, + }).AsUpdateAction(), }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("create-revision-failure", "foo", 99998, - v1alpha1.ConfigurationStatus{ - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionFalse, - Reason: "RevisionFailed", - Message: `Revision creation failed with message: "inducing failure for create revisions".`, - }}, - }, - ), - }}, Key: "foo/create-revision-failure", }, { Name: "failure updating configuration status", @@ -287,54 +271,50 @@ func TestReconcile(t *testing.T) { InduceFailure("update", "configurations"), }, Objects: []runtime.Object{ - cfg("update-config-failure", "foo", 1234), + builder.Config("update-config-failure", "foo", 1234), }, WantCreates: []metav1.Object{ - resources.MakeRevision(cfg("update-config-failure", "foo", 1234), noBuildName), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("update-config-failure", "foo", 1234, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "update-config-failure-01234", - ObservedGeneration: 1234, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionUnknown, - }}, - }, - ), - }}, + builder.Config("update-config-failure", "foo", 1234). + ToRevision(). + Build(), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("update-config-failure", "foo", 1234). + WithLatestCreatedRevisionName("update-config-failure-01234"). + WithObservedGeneration(1234). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionUnknown, + }).AsUpdateAction(), + }, Key: "foo/update-config-failure", }, { Name: "failed revision recovers", Objects: []runtime.Object{ - cfgWithStatus("revision-recovers", "foo", 1337, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "revision-recovers-01337", - LatestReadyRevisionName: "revision-recovers-01337", - Conditions: []v1alpha1.ConfigurationCondition{{ + builder.Config("revision-recovers", "foo", 1337). + WithLatestCreatedRevisionName("revision-recovers-01337"). + WithLatestReadyRevisionName("revision-recovers-01337"). + WithCondition( + v1alpha1.ConfigurationCondition{ Type: v1alpha1.ConfigurationConditionReady, Status: corev1.ConditionFalse, Reason: "RevisionFailed", Message: `Revision "revision-recovers-01337" failed with message: "Weebles wobble, but they don't fall down".`, - }}, - }, - ), - makeRevReady(t, resources.MakeRevision(cfg("revision-recovers", "foo", 1337), noBuildName)), - }, - WantUpdates: []clientgotesting.UpdateActionImpl{{ - Object: cfgWithStatus("revision-recovers", "foo", 1337, - v1alpha1.ConfigurationStatus{ - LatestCreatedRevisionName: "revision-recovers-01337", - LatestReadyRevisionName: "revision-recovers-01337", - ObservedGeneration: 1337, - Conditions: []v1alpha1.ConfigurationCondition{{ - Type: v1alpha1.ConfigurationConditionReady, - Status: corev1.ConditionTrue, - }}, - }, - ), - }}, + }), + builder.Config("revision-recovers", "foo", 1337). + ToRevision(). + WithReadyStatus(t), + }, + WantUpdates: []clientgotesting.UpdateActionImpl{ + builder.Config("revision-recovers", "foo", 1337). + WithLatestCreatedRevisionName("revision-recovers-01337"). + WithLatestReadyRevisionName("revision-recovers-01337"). + WithObservedGeneration(1337). + WithCondition(v1alpha1.ConfigurationCondition{ + Type: v1alpha1.ConfigurationConditionReady, + Status: corev1.ConditionTrue, + }).AsUpdateAction(), + }, Key: "foo/revision-recovers", }} @@ -346,63 +326,3 @@ func TestReconcile(t *testing.T) { } }) } - -func cfgWithBuildAndStatus(name, namespace string, generation int64, build *buildv1alpha1.BuildSpec, status v1alpha1.ConfigurationStatus) *v1alpha1.Configuration { - return &v1alpha1.Configuration{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: v1alpha1.ConfigurationSpec{ - Generation: generation, - Build: build, - RevisionTemplate: v1alpha1.RevisionTemplateSpec{ - Spec: revisionSpec, - }, - }, - Status: status, - } -} - -func cfgWithStatus(name, namespace string, generation int64, status v1alpha1.ConfigurationStatus) *v1alpha1.Configuration { - return cfgWithBuildAndStatus(name, namespace, generation, nil, status) -} - -func cfgWithBuild(name, namespace string, generation int64, build *buildv1alpha1.BuildSpec) *v1alpha1.Configuration { - return cfgWithBuildAndStatus(name, namespace, generation, build, v1alpha1.ConfigurationStatus{}) -} - -func cfg(name, namespace string, generation int64) *v1alpha1.Configuration { - return cfgWithStatus(name, namespace, generation, v1alpha1.ConfigurationStatus{}) -} - -func setConcurrencyModel(cfg *v1alpha1.Configuration, ss v1alpha1.RevisionRequestConcurrencyModelType) *v1alpha1.Configuration { - cfg.Spec.RevisionTemplate.Spec.ConcurrencyModel = ss - return cfg -} - -func setRevConcurrencyModel(rev *v1alpha1.Revision, ss v1alpha1.RevisionRequestConcurrencyModelType) *v1alpha1.Revision { - rev.Spec.ConcurrencyModel = ss - return rev -} - -func makeRevReady(t *testing.T, rev *v1alpha1.Revision) *v1alpha1.Revision { - rev.Status.InitializeConditions() - rev.Status.MarkContainerHealthy() - rev.Status.MarkResourcesAvailable() - if !rev.Status.IsReady() { - t.Fatalf("Wanted ready revision: %v", rev) - } - return rev -} - -func makeRevFailed(rev *v1alpha1.Revision) *v1alpha1.Revision { - rev.Status.InitializeConditions() - rev.Status.MarkContainerMissing("It's the end of the world as we know it") - return rev -} - -func makeRevStatus(rev *v1alpha1.Revision, status v1alpha1.RevisionStatus) *v1alpha1.Revision { - rev.Status = status - return rev -} diff --git a/pkg/controller/configuration/resources/revision.go b/pkg/controller/configuration/resources/revision.go index 61d84b0e0d22..fd0ad7fc8dd7 100644 --- a/pkg/controller/configuration/resources/revision.go +++ b/pkg/controller/configuration/resources/revision.go @@ -25,7 +25,7 @@ import ( "github.com/knative/serving/pkg/controller/configuration/resources/names" ) -func MakeRevision(config *v1alpha1.Configuration, buildName string) *v1alpha1.Revision { +func MakeRevision(config *v1alpha1.Configuration) *v1alpha1.Revision { // Start from the ObjectMeta/Spec inlined in the Configuration resources. rev := &v1alpha1.Revision{ ObjectMeta: config.Spec.RevisionTemplate.ObjectMeta, @@ -51,7 +51,7 @@ func MakeRevision(config *v1alpha1.Configuration, buildName string) *v1alpha1.Re rev.OwnerReferences = append(rev.OwnerReferences, *controller.NewControllerRef(config)) // Fill in the build name, if specified. - rev.Spec.BuildName = buildName + rev.Spec.BuildName = names.Build(config) return rev } diff --git a/pkg/controller/configuration/resources/revision_test.go b/pkg/controller/configuration/resources/revision_test.go index 1716c8bf74f0..c60b251e8820 100644 --- a/pkg/controller/configuration/resources/revision_test.go +++ b/pkg/controller/configuration/resources/revision_test.go @@ -25,7 +25,6 @@ import ( buildv1alpha1 "github.com/knative/build/pkg/apis/build/v1alpha1" "github.com/knative/serving/pkg/apis/serving" "github.com/knative/serving/pkg/apis/serving/v1alpha1" - "github.com/knative/serving/pkg/controller/configuration/resources/names" ) func TestRevisions(t *testing.T) { @@ -227,7 +226,7 @@ func TestRevisions(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got := MakeRevision(test.configuration, names.Build(test.configuration)) + got := MakeRevision(test.configuration) if diff := cmp.Diff(test.want, got); diff != "" { t.Errorf("MakeRevision (-want, +got) = %v", diff) } diff --git a/pkg/controller/testing/builder/configuration.go b/pkg/controller/testing/builder/configuration.go new file mode 100644 index 000000000000..b0509b2bc765 --- /dev/null +++ b/pkg/controller/testing/builder/configuration.go @@ -0,0 +1,94 @@ +package builder + +import ( + buildv1alpha1 "github.com/knative/build/pkg/apis/build/v1alpha1" + "github.com/knative/serving/pkg/apis/serving/v1alpha1" + "github.com/knative/serving/pkg/controller/configuration/resources" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientgotesting "k8s.io/client-go/testing" +) + +type ConfigBuilder struct { + *v1alpha1.Configuration +} + +func Config(name, namespace string, generation int64) ConfigBuilder { + return ConfigBuilder{ + Configuration: &v1alpha1.Configuration{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Spec: v1alpha1.ConfigurationSpec{ + Generation: generation, + RevisionTemplate: v1alpha1.RevisionTemplateSpec{ + Spec: v1alpha1.RevisionSpec{ + Container: corev1.Container{ + Image: "busybox", + }, + }, + }, + }, + Status: v1alpha1.ConfigurationStatus{ + Conditions: []v1alpha1.ConfigurationCondition{}, + }, + }, + } +} + +func (bldr ConfigBuilder) WithStatus(s v1alpha1.ConfigurationStatus) ConfigBuilder { + bldr.Configuration.Status = s + return bldr +} + +func (bldr ConfigBuilder) WithBuild(b buildv1alpha1.BuildSpec) ConfigBuilder { + bldr.Configuration.Spec.Build = &b + return bldr +} + +func (bldr ConfigBuilder) WithObservedGeneration(gen int64) ConfigBuilder { + bldr.Configuration.Status.ObservedGeneration = gen + return bldr +} + +func (bldr ConfigBuilder) WithLatestCreatedRevisionName(name string) ConfigBuilder { + bldr.Configuration.Status.LatestCreatedRevisionName = name + return bldr +} + +func (bldr ConfigBuilder) WithLatestReadyRevisionName(name string) ConfigBuilder { + bldr.Configuration.Status.LatestReadyRevisionName = name + return bldr +} + +func (bldr ConfigBuilder) WithCondition(c v1alpha1.ConfigurationCondition) ConfigBuilder { + bldr.Configuration.Status.Conditions = append(bldr.Configuration.Status.Conditions, c) + return bldr +} + +func (bldr ConfigBuilder) WithConcurrencyModel(cm v1alpha1.RevisionRequestConcurrencyModelType) ConfigBuilder { + bldr.Configuration.Spec.RevisionTemplate.Spec.ConcurrencyModel = cm + return bldr +} + +func (bldr ConfigBuilder) Build() *v1alpha1.Configuration { + return bldr.Configuration +} + +func (bldr ConfigBuilder) AsUpdateAction() clientgotesting.UpdateActionImpl { + action := clientgotesting.UpdateActionImpl{} + action.Verb = "update" + action.Object = bldr.Configuration + return action +} + +func (bldr ConfigBuilder) ToRevision() RevisionBuilder { + return RevisionBuilder{ + Revision: resources.MakeRevision(bldr.Configuration), + } +} + +func (bldr ConfigBuilder) ToBuild() *buildv1alpha1.Build { + return resources.MakeBuild(bldr.Configuration) +} diff --git a/pkg/controller/testing/builder/revision.go b/pkg/controller/testing/builder/revision.go new file mode 100644 index 000000000000..94d810287067 --- /dev/null +++ b/pkg/controller/testing/builder/revision.go @@ -0,0 +1,43 @@ +package builder + +import ( + "testing" + + "github.com/knative/serving/pkg/apis/serving/v1alpha1" +) + +type RevisionBuilder struct { + *v1alpha1.Revision +} + +func (bldr RevisionBuilder) WithConcurrencyModel(cm v1alpha1.RevisionRequestConcurrencyModelType) RevisionBuilder { + bldr.Revision.Spec.ConcurrencyModel = cm + return bldr +} + +func (bldr RevisionBuilder) WithReadyStatus(t *testing.T) RevisionBuilder { + bldr.Revision.Status.InitializeConditions() + bldr.Revision.Status.MarkContainerHealthy() + bldr.Revision.Status.MarkResourcesAvailable() + + if !bldr.Revision.Status.IsReady() { + t.Fatalf("Wanted ready revision: %v", bldr.Revision) + } + + return bldr +} + +func (bldr RevisionBuilder) WithFailedStatus() RevisionBuilder { + bldr.Revision.Status.InitializeConditions() + bldr.Revision.Status.MarkContainerMissing("It's the end of the world as we know it") + return bldr +} + +func (bldr RevisionBuilder) WithCondition(c v1alpha1.RevisionCondition) RevisionBuilder { + bldr.Revision.Status.Conditions = append(bldr.Revision.Status.Conditions, c) + return bldr +} + +func (bldr RevisionBuilder) Build() *v1alpha1.Revision { + return bldr.Revision +} diff --git a/pkg/controller/testing/table.go b/pkg/controller/testing/table.go index 3cc432f97feb..a063edc367e4 100644 --- a/pkg/controller/testing/table.go +++ b/pkg/controller/testing/table.go @@ -25,6 +25,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" fakebuildclientset "github.com/knative/build/pkg/client/clientset/versioned/fake" fakeclientset "github.com/knative/serving/pkg/client/clientset/versioned/fake" + "github.com/knative/serving/pkg/controller/testing/builder" "github.com/knative/serving/pkg/system" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -200,6 +201,10 @@ func NewListers(objs []runtime.Object) Listers { ls.Route.Items = append(ls.Route.Items, o) case *v1alpha1.Configuration: ls.Configuration.Items = append(ls.Configuration.Items, o) + case builder.ConfigBuilder: + ls.Configuration.Items = append(ls.Configuration.Items, o.Configuration) + case builder.RevisionBuilder: + ls.Revision.Items = append(ls.Revision.Items, o.Revision) case *v1alpha1.Revision: ls.Revision.Items = append(ls.Revision.Items, o) @@ -343,7 +348,7 @@ func (r *TableRow) Test(t *testing.T, ctor Ctor) { continue } got := deleteActions[i] - if got.GetName() != want.Name { + if got.GetName() != want.GetName() { t.Errorf("unexpected delete[%d]: %#v", i, got) } if got.GetNamespace() != expectedNamespace && got.GetNamespace() != system.Namespace { @@ -363,7 +368,7 @@ func (r *TableRow) Test(t *testing.T, ctor Ctor) { } got := patchActions[i] - if got.GetName() != want.Name { + if got.GetName() != want.GetName() { t.Errorf("unexpected patch[%d]: %#v", i, got) } if got.GetNamespace() != expectedNamespace && got.GetNamespace() != system.Namespace {