Skip to content

Commit 669766b

Browse files
author
Per G. da Silva
committed
Update reg+v1 renderer default targetNamespace behavior and add tests
Signed-off-by: Per G. da Silva <[email protected]>
1 parent 7205c85 commit 669766b

File tree

2 files changed

+112
-8
lines changed

2 files changed

+112
-8
lines changed

internal/operator-controller/rukpak/render/render.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (r BundleRenderer) Render(rv1 bundle.RegistryV1, installNamespace string, o
124124
genOpts, errs := (&Options{
125125
// default options
126126
InstallNamespace: installNamespace,
127-
TargetNamespaces: defaultTargetNamespacesForBundle(&rv1, installNamespace),
127+
TargetNamespaces: defaultTargetNamespacesForBundle(&rv1),
128128
UniqueNameGenerator: DefaultUniqueNameGenerator,
129129
CertificateProvider: nil,
130130
}).apply(opts...).validate(&rv1)
@@ -160,10 +160,11 @@ func validateTargetNamespaces(rv1 *bundle.RegistryV1, installNamespace string, t
160160
// in case only the MultiNamespace install mode is supported by the bundle.
161161
// If AllNamespaces mode is supported, the default will be [""] -> watch all namespaces
162162
// If only OwnNamespace is supported, the default will be [install-namespace] -> only watch the install/own namespace
163-
if supportedInstallModes.Len() == 1 && supportedInstallModes.Has(v1alpha1.InstallModeTypeSingleNamespace) {
163+
if supportedInstallModes.Has(v1alpha1.InstallModeTypeMultiNamespace) {
164+
return errors.New("at least one target namespace must be specified")
165+
} else {
164166
return errors.New("exactly one target namespace must be specified")
165167
}
166-
return errors.New("at least one target namespace must be specified")
167168
case set.Len() == 1 && set.Has(""):
168169
if supportedInstallModes.Has(v1alpha1.InstallModeTypeAllNamespaces) {
169170
return nil
@@ -190,17 +191,13 @@ func validateTargetNamespaces(rv1 *bundle.RegistryV1, installNamespace string, t
190191
return fmt.Errorf("supported install modes %v do not support target namespaces %v", sets.List[v1alpha1.InstallModeType](supportedInstallModes), targetNamespaces)
191192
}
192193

193-
func defaultTargetNamespacesForBundle(rv1 *bundle.RegistryV1, installNamespace string) []string {
194+
func defaultTargetNamespacesForBundle(rv1 *bundle.RegistryV1) []string {
194195
supportedInstallModes := supportedBundleInstallModes(rv1)
195196

196197
if supportedInstallModes.Has(v1alpha1.InstallModeTypeAllNamespaces) {
197198
return []string{corev1.NamespaceAll}
198199
}
199200

200-
if supportedInstallModes.Has(v1alpha1.InstallModeTypeOwnNamespace) {
201-
return []string{installNamespace}
202-
}
203-
204201
return nil
205202
}
206203

internal/operator-controller/rukpak/render/render_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,113 @@ func Test_BundleRenderer_CreatesCorrectDefaultOptions(t *testing.T) {
6262
_, _ = renderer.Render(bundle.RegistryV1{}, expectedInstallNamespace)
6363
}
6464

65+
func Test_BundleRenderer_DefaultTargetNamespaces(t *testing.T) {
66+
for _, tc := range []struct {
67+
name string
68+
supportedInstallModes []v1alpha1.InstallModeType
69+
expectedTargetNamespaces []string
70+
expectedErrMsg string
71+
}{
72+
{
73+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces}",
74+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces},
75+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
76+
},
77+
{
78+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, OwnNamespace}",
79+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeOwnNamespace},
80+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
81+
},
82+
{
83+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, SingleNamespace}",
84+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeSingleNamespace},
85+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
86+
},
87+
{
88+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, MultiNamespace}",
89+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeMultiNamespace},
90+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
91+
},
92+
{
93+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, OwnNamespace, SingleNamespace}",
94+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeOwnNamespace, v1alpha1.InstallModeTypeSingleNamespace},
95+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
96+
},
97+
{
98+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, OwnNamespace, MultiNamespace}",
99+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeOwnNamespace, v1alpha1.InstallModeTypeMultiNamespace},
100+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
101+
},
102+
{
103+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, SingleNamespace, MultiNamespace}",
104+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeSingleNamespace, v1alpha1.InstallModeTypeMultiNamespace},
105+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
106+
},
107+
{
108+
name: "Default to AllNamespaces when bundle install modes are {AllNamespaces, SingleNamespace, OwnNamespace, MultiNamespace}",
109+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeAllNamespaces, v1alpha1.InstallModeTypeSingleNamespace, v1alpha1.InstallModeTypeOwnNamespace, v1alpha1.InstallModeTypeMultiNamespace},
110+
expectedTargetNamespaces: []string{corev1.NamespaceAll},
111+
},
112+
{
113+
name: "No default when bundle install modes are {SingleNamespace}",
114+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeSingleNamespace},
115+
expectedErrMsg: "exactly one target namespace must be specified",
116+
},
117+
{
118+
name: "No default when bundle install modes are {OwnNamespace}",
119+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeOwnNamespace},
120+
expectedErrMsg: "exactly one target namespace must be specified",
121+
},
122+
{
123+
name: "No default when bundle install modes are {MultiNamespace}",
124+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeMultiNamespace},
125+
expectedErrMsg: "at least one target namespace must be specified",
126+
},
127+
{
128+
name: "No default when bundle install modes are {SingleNamespace, OwnNamespace}",
129+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeSingleNamespace, v1alpha1.InstallModeTypeOwnNamespace},
130+
expectedErrMsg: "exactly one target namespace must be specified",
131+
},
132+
{
133+
name: "No default when bundle install modes are {SingleNamespace, MultiNamespace}",
134+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeSingleNamespace, v1alpha1.InstallModeTypeMultiNamespace},
135+
expectedErrMsg: "at least one target namespace must be specified",
136+
},
137+
{
138+
name: "No default when bundle install modes are {OwnNamespace, MultiNamespace}",
139+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeOwnNamespace, v1alpha1.InstallModeTypeMultiNamespace},
140+
expectedErrMsg: "at least one target namespace must be specified",
141+
},
142+
{
143+
name: "No default when bundle install modes are {SingleNamespace, OwnNamespace, MultiNamespace}",
144+
supportedInstallModes: []v1alpha1.InstallModeType{v1alpha1.InstallModeTypeSingleNamespace, v1alpha1.InstallModeTypeOwnNamespace, v1alpha1.InstallModeTypeMultiNamespace},
145+
expectedErrMsg: "at least one target namespace must be specified",
146+
},
147+
} {
148+
t.Run(tc.name, func(t *testing.T) {
149+
renderer := render.BundleRenderer{
150+
ResourceGenerators: []render.ResourceGenerator{
151+
func(rv1 *bundle.RegistryV1, opts render.Options) ([]client.Object, error) {
152+
require.Equal(t, tc.expectedTargetNamespaces, opts.TargetNamespaces)
153+
return nil, nil
154+
},
155+
},
156+
}
157+
_, err := renderer.Render(bundle.RegistryV1{
158+
CSV: clusterserviceversion.Builder().
159+
WithName("test").
160+
WithInstallModeSupportFor(tc.supportedInstallModes...).Build(),
161+
}, "some-namespace")
162+
if tc.expectedErrMsg != "" {
163+
require.Error(t, err)
164+
require.Contains(t, err.Error(), tc.expectedErrMsg)
165+
} else {
166+
require.NoError(t, err)
167+
}
168+
})
169+
}
170+
}
171+
65172
func Test_BundleRenderer_ValidatesRenderOptions(t *testing.T) {
66173
for _, tc := range []struct {
67174
name string

0 commit comments

Comments
 (0)