@@ -17,20 +17,211 @@ limitations under the License.
1717package controller
1818
1919import (
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
2542func 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+ })
0 commit comments