1515package e2e
1616
1717import (
18+ "fmt"
19+
1820 porchapi "github.com/nephio-project/porch/api/porch/v1alpha1"
1921 "github.com/nephio-project/porch/pkg/repository"
2022 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23+ "k8s.io/apimachinery/pkg/fields"
2124 "sigs.k8s.io/controller-runtime/pkg/client"
2225)
2326
@@ -92,6 +95,7 @@ func (t *PorchSuite) TestPackageMetadataFromKptfile() {
9295 "config.kubernetes.io/local-config" : "true" , // from upstream
9396 "porch.dev/new-annotation" : "new-annotation-value" , // from PackageMetadata
9497 }
98+ t .Require ().NotNil (clonePr .Spec .PackageMetadata )
9599 t .Require ().Equal (expectedLabels , clonePr .Spec .PackageMetadata .Labels )
96100 for k , v := range expectedAnnotations {
97101 actual , ok := clonePr .Spec .PackageMetadata .Annotations [k ]
@@ -131,6 +135,7 @@ func (t *PorchSuite) TestPackageMetadataFromKptfile() {
131135 "porch.dev/test-annotation" : "e2e-test-annotation-value" ,
132136 }
133137
138+ t .Require ().NotNil (clonePr .Spec .PackageMetadata )
134139 t .Require ().Equal (expectedLabelsAfterManual , clonePr .Spec .PackageMetadata .Labels )
135140 for k , v := range expectedAnnotationsAfterManual {
136141 actual , ok := clonePr .Spec .PackageMetadata .Annotations [k ]
@@ -171,6 +176,7 @@ func (t *PorchSuite) TestPackageMetadataFromKptfile() {
171176 "porch.dev/added-annotation" : "added-annotation-value" ,
172177 }
173178
179+ t .Require ().NotNil (clonePr .Spec .PackageMetadata )
174180 t .Require ().Equal (expectedLabels , clonePr .Spec .PackageMetadata .Labels )
175181 for k , v := range expectedAnnotations {
176182 actual , ok := clonePr .Spec .PackageMetadata .Annotations [k ]
@@ -189,3 +195,77 @@ func (t *PorchSuite) TestPackageMetadataFromKptfile() {
189195 }
190196 })
191197}
198+
199+ func (t * PorchSuite ) TestPackageMetadataFieldSelectors () {
200+ const (
201+ repositoryName = "test-package-field-selector-repo"
202+ )
203+
204+ t .RegisterMainGitRepositoryF (repositoryName )
205+
206+ t .RegisterTestBlueprintRepository ("test-blueprints" , "" )
207+
208+ t .Run ("filter by existing label" , func () {
209+ var list porchapi.PackageRevisionList
210+
211+ t .ListE (& list , client .InNamespace (t .Namespace ))
212+
213+ simplePackage := t .MustFindPackageRevision (& list , repository.PackageRevisionKey {
214+ PkgKey : repository.PackageKey {
215+ RepoKey : repository.RepositoryKey {
216+ Name : "test-blueprints" ,
217+ },
218+ Package : "simple" ,
219+ },
220+ Revision : 1 ,
221+ })
222+
223+ t .Require ().NotNil (simplePackage .Spec .PackageMetadata )
224+ t .Require ().NotNil (simplePackage .Spec .PackageMetadata .Labels )
225+ t .Require ().NotEmpty (simplePackage .Spec .PackageMetadata .Labels )
226+
227+ var testLabelKey , testLabelValue string
228+ for key , value := range simplePackage .Spec .PackageMetadata .Labels {
229+ testLabelKey = key
230+ testLabelValue = value
231+ break
232+ }
233+
234+ fieldSelector := fmt .Sprintf ("spec.packageMetadata.labels[%s]=%s" , testLabelKey , testLabelValue )
235+ listOptions := & client.ListOptions {
236+ FieldSelector : fields .ParseSelectorOrDie (fieldSelector ),
237+ }
238+
239+ var filteredList porchapi.PackageRevisionList
240+ t .ListE (& filteredList , client .InNamespace (t .Namespace ), listOptions )
241+
242+ found := false
243+ for _ , item := range filteredList .Items {
244+ t .Require ().NotNil (item .Spec .PackageMetadata )
245+ t .Require ().NotNil (item .Spec .PackageMetadata .Labels )
246+
247+ actualValue , exists := item .Spec .PackageMetadata .Labels [testLabelKey ]
248+ t .Require ().True (exists , testLabelKey )
249+ t .Require ().Equal (testLabelValue , actualValue )
250+
251+ if item .Spec .PackageName == "simple" && item .Spec .RepositoryName == "test-blueprints" {
252+ found = true
253+ t .Logf ("Found expected simple package: %s" , item .Name )
254+ }
255+ }
256+
257+ t .Require ().True (found )
258+ })
259+
260+ t .Run ("filter by non-existing label" , func () {
261+ fieldSelector := "spec.packageMetadata.labels[non-existing-label-key]=non-existing-value"
262+ listOptions := & client.ListOptions {
263+ FieldSelector : fields .ParseSelectorOrDie (fieldSelector ),
264+ }
265+
266+ var filteredList porchapi.PackageRevisionList
267+ t .ListE (& filteredList , client .InNamespace (t .Namespace ), listOptions )
268+
269+ t .Require ().Empty (filteredList .Items , len (filteredList .Items ))
270+ })
271+ }
0 commit comments