diff --git a/pkg/reconciler/build/build_test.go b/pkg/reconciler/build/build_test.go index 16893f5ff3..2ca1113a21 100644 --- a/pkg/reconciler/build/build_test.go +++ b/pkg/reconciler/build/build_test.go @@ -373,7 +373,9 @@ var _ = Describe("Reconcile Build", func() { // validate file protocol It("fails when source URL is invalid", func() { buildSample.Spec.Source.URL = "foobar" - + buildSample.SetAnnotations(map[string]string{ + build.AnnotationBuildVerifyRepository: "true", + }) statusCall := ctl.StubFunc(corev1.ConditionFalse, build.RemoteRepositoryUnreachable, "invalid source url") statusWriter.UpdateCalls(statusCall) @@ -385,6 +387,9 @@ var _ = Describe("Reconcile Build", func() { // validate https protocol It("fails when public source URL is unreachable", func() { buildSample.Spec.Source.URL = "https://github.com/shipwright-io/sample-go-fake" + buildSample.SetAnnotations(map[string]string{ + build.AnnotationBuildVerifyRepository: "true", + }) statusCall := ctl.StubFunc(corev1.ConditionFalse, build.RemoteRepositoryUnreachable, "remote repository unreachable") statusWriter.UpdateCalls(statusCall) @@ -394,6 +399,31 @@ var _ = Describe("Reconcile Build", func() { Expect(statusWriter.UpdateCallCount()).To(Equal(1)) }) + // skip validation because of empty sourceURL annotation + It("succeed when source URL is invalid because source annotation is empty", func() { + buildSample.Spec.Source.URL = "foobar" + + // Fake some client Get calls and ensure we populate all + // different resources we could get during reconciliation + client.GetCalls(func(context context.Context, nn types.NamespacedName, object runtime.Object) error { + switch object := object.(type) { + case *build.Build: + buildSample.DeepCopyInto(object) + case *build.ClusterBuildStrategy: + clusterBuildStrategySample.DeepCopyInto(object) + } + return nil + }) + + statusCall := ctl.StubFunc(corev1.ConditionTrue, build.SucceedStatus, build.AllValidationsSucceeded) + statusWriter.UpdateCalls(statusCall) + + result, err := reconciler.Reconcile(request) + Expect(err).ToNot(HaveOccurred()) + Expect(statusWriter.UpdateCallCount()).To(Equal(1)) + Expect(reconcile.Result{}).To(Equal(result)) + }) + // skip validation because of false sourceURL annotation It("succeed when source URL is invalid because source annotation is false", func() { buildSample = ctl.BuildWithClusterBuildStrategyAndFalseSourceAnnotation(buildName, namespace, buildStrategyName) diff --git a/pkg/validate/sourceurl.go b/pkg/validate/sourceurl.go index c651f83725..2335f7051d 100644 --- a/pkg/validate/sourceurl.go +++ b/pkg/validate/sourceurl.go @@ -27,13 +27,13 @@ type SourceURLRef struct { func (s SourceURLRef) ValidatePath(ctx context.Context) error { if s.Build.Spec.Source.SecretRef == nil { switch s.Build.GetAnnotations()[build.AnnotationBuildVerifyRepository] { - case "", "true": + case "true": err := git.ValidateGitURLExists(s.Build.Spec.Source.URL) if err != nil { s.MarkBuildStatus(s.Build, build.RemoteRepositoryUnreachable, err.Error()) } return err - case "false": + case "", "false": ctxlog.Info(ctx, fmt.Sprintf("the annotation %s is set to %s, nothing to do", build.AnnotationBuildVerifyRepository, s.Build.GetAnnotations()[build.AnnotationBuildVerifyRepository])) return nil default: diff --git a/test/build_samples.go b/test/build_samples.go index b86cdf8c52..080464bea9 100644 --- a/test/build_samples.go +++ b/test/build_samples.go @@ -218,6 +218,9 @@ spec: const BuildCBSWithWrongURL = ` apiVersion: shipwright.io/v1alpha1 kind: Build +metadata: + annotations: + build.shipwright.io/verify.repository: "true" spec: source: url: "https://github.foobar.com/sbose78/taxi" diff --git a/test/integration/build_to_git_test.go b/test/integration/build_to_git_test.go index 28074911d8..fca57f5822 100644 --- a/test/integration/build_to_git_test.go +++ b/test/integration/build_to_git_test.go @@ -60,7 +60,7 @@ var _ = Describe("Integration tests Build and referenced Source url", func() { }) Context("when the build source url protocol is a fake http without the verify annotation", func() { - It("should validate source url by default", func() { + It("should not validate source url by default", func() { // populate Build related vars buildName := BUILD + tb.Namespace @@ -75,11 +75,12 @@ var _ = Describe("Integration tests Build and referenced Source url", func() { Expect(tb.CreateBuild(buildObject)).To(BeNil()) // wait until the Build finish the validation - buildObject, err := tb.GetBuildTillRegistration(buildName, corev1.ConditionFalse) + buildObject, err := tb.GetBuildTillRegistration(buildName, corev1.ConditionTrue) Expect(err).To(BeNil()) - Expect(buildObject.Status.Registered).To(Equal(corev1.ConditionFalse)) - Expect(buildObject.Status.Reason).To(Equal(v1alpha1.RemoteRepositoryUnreachable)) - Expect(buildObject.Status.Message).To(Equal("remote repository unreachable")) + // skip validation due to empty annotation + Expect(buildObject.Status.Registered).To(Equal(corev1.ConditionTrue)) + Expect(buildObject.Status.Reason).To(Equal(v1alpha1.SucceedStatus)) + Expect(buildObject.Status.Message).To(Equal(v1alpha1.AllValidationsSucceeded)) }) }) @@ -110,7 +111,7 @@ var _ = Describe("Integration tests Build and referenced Source url", func() { }) Context("when the build source url protocol is a fake https without the verify annotation", func() { - It("should validate source url by default", func() { + It("should not validate source url by default", func() { // populate Build related vars buildName := BUILD + tb.Namespace @@ -125,11 +126,12 @@ var _ = Describe("Integration tests Build and referenced Source url", func() { Expect(tb.CreateBuild(buildObject)).To(BeNil()) // wait until the Build finish the validation - buildObject, err := tb.GetBuildTillRegistration(buildName, corev1.ConditionFalse) + buildObject, err := tb.GetBuildTillRegistration(buildName, corev1.ConditionTrue) Expect(err).To(BeNil()) - Expect(buildObject.Status.Registered).To(Equal(corev1.ConditionFalse)) - Expect(buildObject.Status.Reason).To(Equal(v1alpha1.RemoteRepositoryUnreachable)) - Expect(buildObject.Status.Message).To(Equal("remote repository unreachable")) + // skip validation due to empty annotation + Expect(buildObject.Status.Registered).To(Equal(corev1.ConditionTrue)) + Expect(buildObject.Status.Reason).To(Equal(v1alpha1.SucceedStatus)) + Expect(buildObject.Status.Message).To(Equal(v1alpha1.AllValidationsSucceeded)) }) })