Skip to content

Commit 06f8d8f

Browse files
committed
fixup! feat: Nutanix VM image preflight check
Mock nutanix clients to allow unit tests
1 parent fb62223 commit 06f8d8f

File tree

4 files changed

+109
-14
lines changed

4 files changed

+109
-14
lines changed

pkg/webhook/preflight/nutanix/checker.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import (
1212
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
1313

1414
prismgoclient "github.com/nutanix-cloud-native/prism-go-client"
15-
prismv3 "github.com/nutanix-cloud-native/prism-go-client/v3"
16-
prismv4 "github.com/nutanix-cloud-native/prism-go-client/v4"
1715

1816
carenv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
1917
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/webhook/preflight"
@@ -23,6 +21,9 @@ func New(kclient ctrlclient.Client, cluster *clusterv1.Cluster) preflight.Checke
2321
return &nutanixChecker{
2422
kclient: kclient,
2523
cluster: cluster,
24+
25+
v3clientFactory: newV3Client,
26+
v4clientFactory: newV4Client,
2627
}
2728
}
2829

@@ -34,8 +35,12 @@ type nutanixChecker struct {
3435
nutanixWorkerNodeConfigSpecByMachineDeploymentName map[string]*carenv1.NutanixWorkerNodeConfigSpec
3536

3637
credentials prismgoclient.Credentials
37-
v3client *prismv3.Client
38-
v4client *prismv4.Client
38+
39+
v3client v3client
40+
v3clientFactory func(prismgoclient.Credentials) (v3client, error)
41+
42+
v4client v4client
43+
v4clientFactory func(prismgoclient.Credentials) (v4client, error)
3944

4045
log logr.Logger
4146
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package nutanix
2+
3+
import (
4+
"context"
5+
6+
vmmv4 "github.com/nutanix/ntnx-api-golang-clients/vmm-go-client/v4/models/vmm/v4/content"
7+
8+
prismgoclient "github.com/nutanix-cloud-native/prism-go-client"
9+
prismv3 "github.com/nutanix-cloud-native/prism-go-client/v3"
10+
prismv4 "github.com/nutanix-cloud-native/prism-go-client/v4"
11+
)
12+
13+
type v3client interface {
14+
GetCurrentLoggedInUser(ctx context.Context) (*prismv3.UserIntentResponse, error)
15+
}
16+
17+
type v3clientWrapper struct {
18+
prismv3.Service
19+
}
20+
21+
var _ = v3client(&v3clientWrapper{})
22+
23+
func newV3Client(
24+
credentials prismgoclient.Credentials, //nolint:gocritic // hugeParam is fine
25+
) (v3client, error) {
26+
client, err := prismv3.NewV3Client(credentials)
27+
if err != nil {
28+
return nil, err
29+
}
30+
return &v3clientWrapper{
31+
client.V3,
32+
}, nil
33+
}
34+
35+
type v4client interface {
36+
GetImageById(id *string) (*vmmv4.GetImageApiResponse, error)
37+
ListImages(page_ *int,
38+
limit_ *int,
39+
filter_ *string,
40+
orderby_ *string,
41+
select_ *string,
42+
args ...map[string]interface{},
43+
) (
44+
*vmmv4.ListImagesApiResponse,
45+
error,
46+
)
47+
}
48+
49+
type v4clientWrapper struct {
50+
client *prismv4.Client
51+
}
52+
53+
var _ = v4client(&v4clientWrapper{})
54+
55+
func (c *v4clientWrapper) GetImageById(id *string) (*vmmv4.GetImageApiResponse, error) {
56+
resp, err := c.client.ImagesApiInstance.GetImageById(id)
57+
if err != nil {
58+
return nil, err
59+
}
60+
return resp, nil
61+
}
62+
63+
func (c *v4clientWrapper) ListImages(page_ *int,
64+
limit_ *int,
65+
filter_ *string,
66+
orderby_ *string,
67+
select_ *string,
68+
args ...map[string]interface{},
69+
) (*vmmv4.ListImagesApiResponse, error) {
70+
resp, err := c.client.ImagesApiInstance.ListImages(
71+
page_,
72+
limit_,
73+
filter_,
74+
orderby_,
75+
select_,
76+
args...,
77+
)
78+
if err != nil {
79+
return nil, err
80+
}
81+
return resp, nil
82+
}
83+
84+
func newV4Client(
85+
credentials prismgoclient.Credentials, //nolint:gocritic // hugeParam is fine
86+
) (v4client, error) {
87+
client, err := prismv4.NewV4Client(credentials)
88+
if err != nil {
89+
return nil, err
90+
}
91+
return &v4clientWrapper{
92+
client: client,
93+
}, nil
94+
}

pkg/webhook/preflight/nutanix/credentials.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import (
1212

1313
prismgoclient "github.com/nutanix-cloud-native/prism-go-client"
1414
prismcredentials "github.com/nutanix-cloud-native/prism-go-client/environment/credentials"
15-
prismv3 "github.com/nutanix-cloud-native/prism-go-client/v3"
16-
prismv4 "github.com/nutanix-cloud-native/prism-go-client/v4"
1715

1816
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/webhook/preflight"
1917
)
@@ -164,7 +162,7 @@ func (n *nutanixChecker) initCredentialsCheck(ctx context.Context) preflight.Che
164162
}
165163

166164
// Initialize the clients.
167-
n.v4client, err = prismv4.NewV4Client(n.credentials)
165+
n.v4client, err = n.v4clientFactory(n.credentials)
168166
if err != nil {
169167
result.Allowed = false
170168
result.Error = true
@@ -176,7 +174,7 @@ func (n *nutanixChecker) initCredentialsCheck(ctx context.Context) preflight.Che
176174
)
177175
}
178176

179-
n.v3client, err = prismv3.NewV3Client(n.credentials)
177+
n.v3client, err = n.v3clientFactory(n.credentials)
180178
if err != nil {
181179
result.Allowed = false
182180
result.Error = true
@@ -187,7 +185,7 @@ func (n *nutanixChecker) initCredentialsCheck(ctx context.Context) preflight.Che
187185
},
188186
)
189187
}
190-
_, err = n.v3client.V3.GetCurrentLoggedInUser(ctx)
188+
_, err = n.v3client.GetCurrentLoggedInUser(ctx)
191189
if err != nil {
192190
result.Allowed = false
193191
result.Error = true

pkg/webhook/preflight/nutanix/image.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99

1010
vmmv4 "github.com/nutanix/ntnx-api-golang-clients/vmm-go-client/v4/models/vmm/v4/content"
1111

12-
prismv4 "github.com/nutanix-cloud-native/prism-go-client/v4"
13-
1412
capxv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1"
1513
carenv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
1614
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/webhook/preflight"
@@ -118,12 +116,12 @@ func (n *nutanixChecker) vmImageCheck(
118116
}
119117

120118
func getVMImages(
121-
client *prismv4.Client,
119+
client v4client,
122120
id *capxv1.NutanixResourceIdentifier,
123121
) ([]vmmv4.Image, error) {
124122
switch {
125123
case id.IsUUID():
126-
resp, err := client.ImagesApiInstance.GetImageById(id.UUID)
124+
resp, err := client.GetImageById(id.UUID)
127125
if err != nil {
128126
return nil, err
129127
}
@@ -134,7 +132,7 @@ func getVMImages(
134132
return []vmmv4.Image{image}, nil
135133
case id.IsName():
136134
filter_ := fmt.Sprintf("name eq '%s'", *id.Name)
137-
resp, err := client.ImagesApiInstance.ListImages(nil, nil, &filter_, nil, nil)
135+
resp, err := client.ListImages(nil, nil, &filter_, nil, nil)
138136
if err != nil {
139137
return nil, err
140138
}

0 commit comments

Comments
 (0)