Skip to content
This repository was archived by the owner on Dec 16, 2025. It is now read-only.

Commit 1087623

Browse files
chess-knightmichal-gubrickymatofeder
authored
✨ Add unit tests for the openstackclusterstackrelease controller (#54)
* Add unit tests for the openstackclusterstackrelease controller Signed-off-by: Roman Hros <[email protected]> * Apply suggestions from code review Co-authored-by: Michal Gubricky <[email protected]> Signed-off-by: Roman Hros <[email protected]> --------- Signed-off-by: Roman Hros <[email protected]> Co-authored-by: Michal Gubricky <[email protected]> Co-authored-by: Matej Feder <[email protected]>
1 parent 4781e6a commit 1087623

File tree

5 files changed

+217
-1
lines changed

5 files changed

+217
-1
lines changed

internal/controller/openstackclusterstackrelease_controller_test.go

Lines changed: 192 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,211 @@ limitations under the License.
1717
package controller
1818

1919
import (
20+
"context"
21+
"fmt"
2022
"testing"
23+
"time"
2124

25+
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
26+
. "github.com/onsi/ginkgo/v2"
27+
. "github.com/onsi/gomega"
28+
apiv1alpha1 "github.com/sovereignCloudStack/cluster-stack-provider-openstack/api/v1alpha1"
2229
"github.com/stretchr/testify/assert"
30+
corev1 "k8s.io/api/core/v1"
31+
apierrors "k8s.io/apimachinery/pkg/api/errors"
32+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
33+
"k8s.io/apimachinery/pkg/types"
34+
capoapiv1alpha7 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
35+
)
36+
37+
const (
38+
timeout = time.Second * 2
39+
interval = 100 * time.Millisecond
2340
)
2441

2542
func TestCutOpenStackClusterStackReleaseVersionFromReleaseTag(t *testing.T) {
43+
// correct release tag
2644
releaseTag := "openstack-ferrol-1-27-v2"
2745
nameWithoutVersion, err := cutOpenStackClusterStackReleaseVersionFromReleaseTag(releaseTag)
2846

2947
assert.NoError(t, err)
3048
assert.Equal(t, nameWithoutVersion, "openstack-ferrol-1-27")
3149

50+
// incorrect release tag
3251
releaseTag = "openstack-ferrol-1-27"
33-
_, err = cutOpenStackClusterStackReleaseVersionFromReleaseTag(releaseTag)
52+
nameWithoutVersion, err = cutOpenStackClusterStackReleaseVersionFromReleaseTag(releaseTag)
53+
54+
assert.Error(t, err)
55+
assert.EqualError(t, err, fmt.Sprintf("invalid release tag %s", releaseTag))
56+
assert.Empty(t, nameWithoutVersion)
57+
}
58+
59+
func TestGenerateOwnerReference(t *testing.T) {
60+
oscsr := &apiv1alpha1.OpenStackClusterStackRelease{
61+
TypeMeta: metav1.TypeMeta{
62+
APIVersion: apiv1alpha1.GroupVersion.String(),
63+
Kind: "OpenStackClusterStackRelease",
64+
},
65+
ObjectMeta: metav1.ObjectMeta{
66+
Name: "openstack-ferrol-1-27-v1",
67+
Namespace: "cluster",
68+
UID: "fb686e33-01a6-42c9-a210-2c26ec8cb331",
69+
},
70+
Spec: apiv1alpha1.OpenStackClusterStackReleaseSpec{
71+
CloudName: "openstack",
72+
IdentityRef: &capoapiv1alpha7.OpenStackIdentityReference{
73+
Kind: "Secret",
74+
Name: "supersecret",
75+
},
76+
},
77+
}
78+
79+
ownerRef := generateOwnerReference(oscsr)
80+
81+
assert.Equal(t, ownerRef, &metav1.OwnerReference{
82+
APIVersion: oscsr.APIVersion,
83+
Kind: oscsr.Kind,
84+
Name: oscsr.Name,
85+
UID: oscsr.UID,
86+
})
87+
}
88+
89+
func TestMatchOwnerReference(t *testing.T) {
90+
// wrong APIVersion
91+
oscsr1 := &apiv1alpha1.OpenStackClusterStackRelease{
92+
TypeMeta: metav1.TypeMeta{
93+
APIVersion: apiv1alpha1.GroupVersion.String() + "/" + apiv1alpha1.GroupVersion.Version,
94+
Kind: "OpenStackClusterStackRelease",
95+
},
96+
ObjectMeta: metav1.ObjectMeta{
97+
Name: "openstack-ferrol-1-27-v1",
98+
},
99+
Spec: apiv1alpha1.OpenStackClusterStackReleaseSpec{
100+
CloudName: "openstack",
101+
IdentityRef: &capoapiv1alpha7.OpenStackIdentityReference{
102+
Kind: "Secret",
103+
Name: "supersecret1",
104+
},
105+
},
106+
}
107+
assert.False(t, matchOwnerReference(generateOwnerReference(oscsr1), oscsr1))
108+
109+
// match owner reference
110+
oscsr2 := &apiv1alpha1.OpenStackClusterStackRelease{
111+
TypeMeta: metav1.TypeMeta{
112+
APIVersion: apiv1alpha1.GroupVersion.String(),
113+
Kind: "OpenStackClusterStackRelease",
114+
},
115+
ObjectMeta: metav1.ObjectMeta{
116+
Name: "openstack-ferrol-1-27-v2",
117+
},
118+
Spec: apiv1alpha1.OpenStackClusterStackReleaseSpec{
119+
CloudName: "openstack",
120+
IdentityRef: &capoapiv1alpha7.OpenStackIdentityReference{
121+
Kind: "Secret",
122+
Name: "supersecret2",
123+
},
124+
},
125+
}
126+
assert.True(t, matchOwnerReference(generateOwnerReference(oscsr2), oscsr2))
127+
128+
// name is different
129+
ownerRef := &metav1.OwnerReference{
130+
APIVersion: oscsr2.APIVersion,
131+
Kind: oscsr2.Kind,
132+
Name: "openstack-ferrol-1-27-v3",
133+
UID: oscsr2.UID,
134+
}
135+
assert.False(t, matchOwnerReference(ownerRef, oscsr2))
136+
}
34137

138+
func TestGetNodeImagesFromLocal(t *testing.T) {
139+
// wrong path
140+
wrongPath := "../../test/releases/cluster-stacks/openstack-ferrol-1-27-4v"
141+
nodeImages, err := getNodeImagesFromLocal(wrongPath)
35142
assert.Error(t, err)
143+
assert.ErrorContains(t, err, fmt.Sprintf("failed to read node-images file %s/node-images.yaml", wrongPath))
144+
assert.Nil(t, nodeImages)
145+
146+
// wrong node-images file
147+
nodeImages, err = getNodeImagesFromLocal("../../test/releases/cluster-stacks/openstack-ferrol-1-27-v4-wrong-node-images")
148+
assert.Error(t, err)
149+
assert.ErrorContains(t, err, "failed to unmarshal node-images")
150+
assert.Nil(t, nodeImages)
151+
152+
// correct node-images file
153+
nodeImages, err = getNodeImagesFromLocal("../../test/releases/cluster-stacks/openstack-ferrol-1-27-v4")
154+
var visibility images.ImageVisibility = "shared"
155+
assert.NoError(t, err)
156+
assert.Equal(t, nodeImages, &NodeImages{
157+
[]*apiv1alpha1.OpenStackNodeImage{
158+
{
159+
URL: "https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube-v1.27/ubuntu-2204-kube-v1.27.8.qcow2",
160+
CreateOpts: &apiv1alpha1.CreateOpts{
161+
Name: "ubuntu-capi-image-v1.27.8",
162+
DiskFormat: "qcow2",
163+
ContainerFormat: "bare",
164+
Visibility: &visibility,
165+
},
166+
},
167+
},
168+
})
36169
}
170+
171+
var _ = Describe("OpenStackClusterStackRelease controller", func() {
172+
Context("OpenStackClusterStackRelease controller test", func() {
173+
const openstackclusterstackreleasename = "test-ocsr"
174+
175+
ctx := context.Background()
176+
177+
namespace := &corev1.Namespace{
178+
ObjectMeta: metav1.ObjectMeta{
179+
Name: openstackclusterstackreleasename,
180+
Namespace: openstackclusterstackreleasename,
181+
},
182+
}
183+
184+
typeNamespaceName := types.NamespacedName{Name: openstackclusterstackreleasename, Namespace: openstackclusterstackreleasename}
185+
186+
BeforeEach(func() {
187+
By("Creating the Namespace to perform the tests")
188+
err := k8sClient.Create(ctx, namespace)
189+
Expect(err).To(Not(HaveOccurred()))
190+
})
191+
192+
AfterEach(func() {
193+
By("Deleting the Namespace to perform the tests")
194+
_ = k8sClient.Delete(ctx, namespace)
195+
})
196+
197+
It("should successfully create the OpenStackClusterStackRelease custom resource", func() {
198+
By("Creating the custom resource for the Kind OpenStackClusterStackRelease")
199+
openstackclusterstackrelease := &apiv1alpha1.OpenStackClusterStackRelease{}
200+
err := k8sClient.Get(ctx, typeNamespaceName, openstackclusterstackrelease)
201+
if err != nil && apierrors.IsNotFound(err) {
202+
openstackclusterstackrelease := &apiv1alpha1.OpenStackClusterStackRelease{
203+
ObjectMeta: metav1.ObjectMeta{
204+
Name: openstackclusterstackreleasename,
205+
Namespace: namespace.Name,
206+
},
207+
Spec: apiv1alpha1.OpenStackClusterStackReleaseSpec{
208+
CloudName: "openstack",
209+
IdentityRef: &capoapiv1alpha7.OpenStackIdentityReference{
210+
Kind: "Secret",
211+
Name: "supersecret",
212+
},
213+
},
214+
}
215+
216+
err = k8sClient.Create(ctx, openstackclusterstackrelease)
217+
Expect(err).To(Not(HaveOccurred()))
218+
}
219+
220+
By("Checking if the custom resource was successfully created")
221+
Eventually(func() error {
222+
found := &apiv1alpha1.OpenStackClusterStackRelease{}
223+
return k8sClient.Get(ctx, typeNamespaceName, found)
224+
}, timeout, interval).Should(Succeed())
225+
})
226+
})
227+
})
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: metadata.clusterstack.x-k8s.io/v1alpha1
2+
versions:
3+
clusterStack: v4
4+
kubernetes: v1.27.8
5+
components:
6+
clusterAddon: v2
7+
nodeImage: v2
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
apiVersion: openstack.infrastructure.clusterstack.x-k8s.io/v1alpha1
2+
openStackNodeImages:
3+
- https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube-v1.27/ubuntu-2204-kube-v1.27.8.qcow2
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: metadata.clusterstack.x-k8s.io/v1alpha1
2+
versions:
3+
clusterStack: v4
4+
kubernetes: v1.27.8
5+
components:
6+
clusterAddon: v2
7+
nodeImage: v2
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: openstack.infrastructure.clusterstack.x-k8s.io/v1alpha1
2+
openStackNodeImages:
3+
- url: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube-v1.27/ubuntu-2204-kube-v1.27.8.qcow2
4+
createOpts:
5+
name: ubuntu-capi-image-v1.27.8
6+
disk_format: qcow2
7+
container_format: bare
8+
visibility: shared

0 commit comments

Comments
 (0)