@@ -1756,6 +1756,10 @@ func TestHelmRepositoryReconciler_ReconcileTypeUpdatePredicateFilter(t *testing.
17561756 ! intpredicates .HelmRepositoryOCIRequireMigration (obj )
17571757 }, timeout ).Should (BeTrue ())
17581758
1759+ g .Expect (obj .GetArtifact ()).To (BeNil ())
1760+ g .Expect (conditions .IsReady (obj )).To (BeTrue ())
1761+ g .Expect (conditions .Get (obj , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
1762+
17591763 g .Expect (testEnv .Delete (ctx , obj )).To (Succeed ())
17601764
17611765 // Wait for HelmRepository to be deleted
@@ -1963,6 +1967,9 @@ func TestHelmRepositoryReconciler_ociMigration(t *testing.T) {
19631967 _ = testEnv .Get (ctx , hrKey , hr )
19641968 return ! intpredicates .HelmRepositoryOCIRequireMigration (hr )
19651969 }, timeout , time .Second ).Should (BeTrue ())
1970+ g .Expect (conditions .IsReady (hr )).To (BeTrue ())
1971+ g .Expect (conditions .Get (hr , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
1972+ g .Expect (controllerutil .ContainsFinalizer (hr , sourcev1 .SourceFinalizer )).To (BeFalse ())
19661973
19671974 // Migrates updated object with finalizer.
19681975
@@ -1976,6 +1983,8 @@ func TestHelmRepositoryReconciler_ociMigration(t *testing.T) {
19761983 _ = testEnv .Get (ctx , hrKey , hr )
19771984 return ! intpredicates .HelmRepositoryOCIRequireMigration (hr )
19781985 }, timeout , time .Second ).Should (BeTrue ())
1986+ g .Expect (conditions .IsReady (hr )).To (BeTrue ())
1987+ g .Expect (conditions .Get (hr , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
19791988
19801989 // Migrates deleted object with finalizer.
19811990
@@ -2017,3 +2026,148 @@ func TestHelmRepositoryReconciler_ociMigration(t *testing.T) {
20172026 return false
20182027 }, timeout ).Should (BeTrue ())
20192028}
2029+
2030+ func TestHelmRepositoryReconciler_ociReadyCondition (t * testing.T ) {
2031+ g := NewWithT (t )
2032+
2033+ ns , err := testEnv .CreateNamespace (ctx , "hr-oci-ready-test" )
2034+ g .Expect (err ).ToNot (HaveOccurred ())
2035+ t .Cleanup (func () {
2036+ g .Expect (testEnv .Cleanup (ctx , ns )).ToNot (HaveOccurred ())
2037+ })
2038+
2039+ hr := & sourcev1.HelmRepository {
2040+ ObjectMeta : metav1.ObjectMeta {
2041+ GenerateName : "hr-oci-" ,
2042+ Namespace : ns .Name ,
2043+ },
2044+ Spec : sourcev1.HelmRepositorySpec {
2045+ Type : sourcev1 .HelmRepositoryTypeOCI ,
2046+ URL : "oci://ghcr.io/stefanprodan/charts" ,
2047+ Interval : metav1.Duration {Duration : interval },
2048+ },
2049+ }
2050+ g .Expect (testEnv .Create (ctx , hr )).ToNot (HaveOccurred ())
2051+
2052+ waitForSourceReady (ctx , g , hr , false )
2053+
2054+ g .Expect (hr .GetArtifact ()).To (BeNil ())
2055+ g .Expect (hr .Status .URL ).To (BeEmpty ())
2056+ g .Expect (controllerutil .ContainsFinalizer (hr , sourcev1 .SourceFinalizer )).To (BeFalse ())
2057+ g .Expect (conditions .Get (hr , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
2058+ g .Expect (conditions .Get (hr , meta .ReadyCondition ).Message ).To (ContainSubstring ("do not produce an index artifact" ))
2059+ g .Expect (intpredicates .HelmRepositoryOCIRequireMigration (hr )).To (BeFalse ())
2060+
2061+ // Spec updates on a static Ready object must not wipe the condition.
2062+ patchHelper , err := patch .NewHelper (hr , testEnv .Client )
2063+ g .Expect (err ).ToNot (HaveOccurred ())
2064+ hr .Spec .URL = "oci://ghcr.io/stefanprodan/charts/podinfo"
2065+ g .Expect (patchHelper .Patch (ctx , hr )).ToNot (HaveOccurred ())
2066+
2067+ g .Consistently (func () bool {
2068+ if err := testEnv .Get (ctx , client .ObjectKeyFromObject (hr ), hr ); err != nil {
2069+ return false
2070+ }
2071+ ready := conditions .Get (hr , meta .ReadyCondition )
2072+ return conditions .IsReady (hr ) && ready != nil && ready .Reason == sourcev1 .NoIndexReason && hr .GetArtifact () == nil
2073+ }, 2 * time .Second , 200 * time .Millisecond ).Should (BeTrue ())
2074+ }
2075+
2076+ func TestHelmRepositoryReconciler_migrationToStatic (t * testing.T ) {
2077+ g := NewWithT (t )
2078+
2079+ obj := & sourcev1.HelmRepository {
2080+ ObjectMeta : metav1.ObjectMeta {
2081+ Name : "oci-repo" ,
2082+ Namespace : "default" ,
2083+ Generation : 1 ,
2084+ Finalizers : []string {sourcev1 .SourceFinalizer },
2085+ },
2086+ Spec : sourcev1.HelmRepositorySpec {
2087+ Type : sourcev1 .HelmRepositoryTypeOCI ,
2088+ URL : "oci://example.com/charts" ,
2089+ Interval : metav1.Duration {Duration : interval },
2090+ },
2091+ Status : sourcev1.HelmRepositoryStatus {
2092+ ObservedGeneration : 1 ,
2093+ URL : "http://source-controller/index.yaml" ,
2094+ Artifact : & meta.Artifact {Path : "old-index.yaml" },
2095+ },
2096+ }
2097+ conditions .MarkTrue (obj , meta .ReadyCondition , meta .SucceededReason , "fetched index" )
2098+
2099+ r := & HelmRepositoryReconciler {
2100+ Client : fakeclient .NewClientBuilder ().
2101+ WithScheme (testEnv .GetScheme ()).
2102+ WithObjects (obj ).
2103+ WithStatusSubresource (& sourcev1.HelmRepository {}).
2104+ Build (),
2105+ EventRecorder : record .NewFakeRecorder (32 ),
2106+ Storage : testStorage ,
2107+ }
2108+
2109+ _ , err := r .Reconcile (context .TODO (), ctrl.Request {NamespacedName : client .ObjectKeyFromObject (obj )})
2110+ g .Expect (err ).ToNot (HaveOccurred ())
2111+
2112+ got := & sourcev1.HelmRepository {}
2113+ g .Expect (r .Client .Get (context .TODO (), client .ObjectKeyFromObject (obj ), got )).To (Succeed ())
2114+ g .Expect (controllerutil .ContainsFinalizer (got , sourcev1 .SourceFinalizer )).To (BeFalse ())
2115+ g .Expect (got .GetArtifact ()).To (BeNil ())
2116+ g .Expect (got .Status .URL ).To (BeEmpty ())
2117+ g .Expect (conditions .IsReady (got )).To (BeTrue ())
2118+ g .Expect (conditions .Get (got , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
2119+ g .Expect (got .Status .ObservedGeneration ).To (Equal (got .Generation ))
2120+ g .Expect (intpredicates .HelmRepositoryOCIRequireMigration (got )).To (BeFalse ())
2121+
2122+ // A second reconcile must not wipe Ready.
2123+ _ , err = r .Reconcile (context .TODO (), ctrl.Request {NamespacedName : client .ObjectKeyFromObject (obj )})
2124+ g .Expect (err ).ToNot (HaveOccurred ())
2125+ got2 := & sourcev1.HelmRepository {}
2126+ g .Expect (r .Client .Get (context .TODO (), client .ObjectKeyFromObject (obj ), got2 )).To (Succeed ())
2127+ g .Expect (conditions .IsReady (got2 )).To (BeTrue ())
2128+ g .Expect (conditions .Get (got2 , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
2129+ g .Expect (got2 .GetArtifact ()).To (BeNil ())
2130+ }
2131+
2132+ func TestHelmRepositoryReconciler_migrationToStatic_emptyStatus (t * testing.T ) {
2133+ g := NewWithT (t )
2134+
2135+ obj := & sourcev1.HelmRepository {
2136+ ObjectMeta : metav1.ObjectMeta {
2137+ Name : "oci-empty" ,
2138+ Namespace : "default" ,
2139+ Generation : 1 ,
2140+ },
2141+ Spec : sourcev1.HelmRepositorySpec {
2142+ Type : sourcev1 .HelmRepositoryTypeOCI ,
2143+ URL : "oci://example.com/charts" ,
2144+ Interval : metav1.Duration {Duration : interval },
2145+ },
2146+ }
2147+
2148+ r := & HelmRepositoryReconciler {
2149+ Client : fakeclient .NewClientBuilder ().
2150+ WithScheme (testEnv .GetScheme ()).
2151+ WithObjects (obj ).
2152+ WithStatusSubresource (& sourcev1.HelmRepository {}).
2153+ Build (),
2154+ EventRecorder : record .NewFakeRecorder (32 ),
2155+ Storage : testStorage ,
2156+ }
2157+
2158+ _ , err := r .Reconcile (context .TODO (), ctrl.Request {NamespacedName : client .ObjectKeyFromObject (obj )})
2159+ g .Expect (err ).ToNot (HaveOccurred ())
2160+
2161+ got := & sourcev1.HelmRepository {}
2162+ g .Expect (r .Client .Get (context .TODO (), client .ObjectKeyFromObject (obj ), got )).To (Succeed ())
2163+ g .Expect (conditions .IsReady (got )).To (BeTrue ())
2164+ g .Expect (conditions .Get (got , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
2165+ g .Expect (intpredicates .HelmRepositoryOCIRequireMigration (got )).To (BeFalse ())
2166+
2167+ _ , err = r .Reconcile (context .TODO (), ctrl.Request {NamespacedName : client .ObjectKeyFromObject (obj )})
2168+ g .Expect (err ).ToNot (HaveOccurred ())
2169+ got2 := & sourcev1.HelmRepository {}
2170+ g .Expect (r .Client .Get (context .TODO (), client .ObjectKeyFromObject (obj ), got2 )).To (Succeed ())
2171+ g .Expect (conditions .IsReady (got2 )).To (BeTrue ())
2172+ g .Expect (conditions .Get (got2 , meta .ReadyCondition ).Reason ).To (Equal (sourcev1 .NoIndexReason ))
2173+ }
0 commit comments