Skip to content

Commit e003376

Browse files
refactor and add unit tests
1 parent 3c44b65 commit e003376

File tree

11 files changed

+456
-70
lines changed

11 files changed

+456
-70
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PREFIX?=$(shell pwd)
22

33
NAME := crusoe-cloud-controller-manager
4-
PKG := gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/cmd
4+
PKG := gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/cmd/crusoe-cloud-controller-manager
55

66
BUILDDIR := ${PREFIX}/dist
77
# Set any default go build tags
@@ -77,7 +77,7 @@ cross: ## Builds the cross compiled executable for use within a container
7777
.PHONY: build-linux
7878
build-linux:
7979
@echo " $(LDFLAGS_LINUX) "
80-
@CGO_ENABLED=0 GOOS=linux GOARCH=$(GOARCH) go build $(LDFLAGS_LINUX) -o ./bin/$(NAME) ./cmd/$(wildcard *.go)
80+
@CGO_ENABLED=0 GOOS=linux GOARCH=$(GOARCH) go build $(LDFLAGS_LINUX) -o ./bin/$(NAME) ./cmd/crusoe-cloud-controller-manager/$(wildcard *.go)
8181

8282
.PHONY: install
8383
install: ## Builds and installs the executable on PATH

cmd/main.go renamed to cmd/crusoe-cloud-controller-manager/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
_ "k8s.io/component-base/metrics/prometheus/version"
1616
"k8s.io/klog/v2"
1717

18-
cloudcontrollermanager "gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/internal/cloud-controller-manager"
18+
cloudcontrollermanager "gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/internal"
1919
)
2020

2121
const ProviderName = "crusoe"

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ go 1.22.0
55
require (
66
github.com/antihax/optional v1.0.0
77
github.com/crusoecloud/client-go v0.1.68
8+
github.com/golang/mock v1.6.0
9+
github.com/stretchr/testify v1.9.0
810
k8s.io/api v0.31.3
911
k8s.io/apimachinery v0.31.3
1012
k8s.io/client-go v0.31.3
@@ -57,6 +59,7 @@ require (
5759
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
5860
github.com/onsi/gomega v1.33.1 // indirect
5961
github.com/pkg/errors v0.9.1 // indirect
62+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
6063
github.com/prometheus/client_golang v1.16.0 // indirect
6164
github.com/prometheus/client_model v0.4.0 // indirect
6265
github.com/prometheus/common v0.44.0 // indirect

go.sum

+11
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
7373
github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
7474
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
7575
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
76+
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
77+
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
7678
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
7779
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
7880
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
@@ -174,6 +176,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5
174176
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
175177
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
176178
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
179+
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
177180
go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
178181
go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
179182
go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k=
@@ -223,10 +226,12 @@ golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfU
223226
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
224227
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
225228
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
229+
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
226230
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
227231
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
228232
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
229233
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
234+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
230235
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
231236
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
232237
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
@@ -235,14 +240,19 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
235240
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
236241
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
237242
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
243+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
238244
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
239245
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
240246
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
241247
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
242248
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
249+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
250+
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
251+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
243252
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
244253
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
245254
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
255+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
246256
golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
247257
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
248258
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -255,6 +265,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
255265
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
256266
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
257267
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
268+
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
258269
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
259270
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
260271
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/cloud-controller-manager/auth.go renamed to internal/auth/auth.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package crusoe
1+
package auth
22

33
import (
44
"crypto/hmac"

internal/cloud-controller-manager/util.go renamed to internal/client/client.go

+19-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package crusoe
1+
package client
22

33
import (
44
"context"
@@ -22,8 +22,17 @@ var (
2222
ErrProjectIDNotSet = errors.New("CRUSOE_PROJECT_ID environment variable is not set")
2323
)
2424

25-
// getInstancebyName retrieves an instance by its name from the Crusoe API.
26-
func getInstancebyName(ctx context.Context, client *crusoeapi.APIClient, nodeName string,
25+
type APIClientImpl struct {
26+
CrusoeAPIClient *crusoeapi.APIClient
27+
}
28+
29+
type APIClient interface {
30+
GetInstanceByName(ctx context.Context, nodeName string) (*crusoeapi.InstanceV1Alpha5, error)
31+
GetIBNetwork(ctx context.Context, projectID, ibPartitionID string) (*crusoeapi.IbPartition, error)
32+
GetInstanceByID(ctx context.Context, instanceID string) (*crusoeapi.InstanceV1Alpha5, *http.Response, error)
33+
}
34+
35+
func (a *APIClientImpl) GetInstanceByName(ctx context.Context, nodeName string,
2736
) (*crusoeapi.InstanceV1Alpha5, error) {
2837
projectID := os.Getenv(CrusoeProjectID)
2938
if projectID == "" {
@@ -34,7 +43,7 @@ func getInstancebyName(ctx context.Context, client *crusoeapi.APIClient, nodeNam
3443
listVMOpts := &crusoeapi.VMsApiListInstancesOpts{
3544
Names: optional.NewString(instanceName),
3645
}
37-
instances, instancesHTTPResp, instancesErr := client.VMsApi.ListInstances(ctx, projectID, listVMOpts)
46+
instances, instancesHTTPResp, instancesErr := a.CrusoeAPIClient.VMsApi.ListInstances(ctx, projectID, listVMOpts)
3847
if instancesHTTPResp != nil {
3948
defer instancesHTTPResp.Body.Close()
4049
}
@@ -50,10 +59,10 @@ func getInstancebyName(ctx context.Context, client *crusoeapi.APIClient, nodeNam
5059
return &instances.Items[0], nil
5160
}
5261

53-
func getIBNetwork(ctx context.Context, client *crusoeapi.APIClient,
62+
func (a *APIClientImpl) GetIBNetwork(ctx context.Context,
5463
projectID, ibPartitionID string,
5564
) (*crusoeapi.IbPartition, error) {
56-
ibPartition, response, err := client.IBPartitionsApi.GetIBPartition(ctx, projectID, ibPartitionID)
65+
ibPartition, response, err := a.CrusoeAPIClient.IBPartitionsApi.GetIBPartition(ctx, projectID, ibPartitionID)
5766
if err != nil {
5867
return nil, fmt.Errorf("failed to list instances: %w", err)
5968
}
@@ -65,16 +74,16 @@ func getIBNetwork(ctx context.Context, client *crusoeapi.APIClient,
6574
return &ibPartition, nil
6675
}
6776

68-
func getInstanceByID(ctx context.Context, client *crusoeapi.APIClient,
69-
providerID string,
77+
func (a *APIClientImpl) GetInstanceByID(ctx context.Context,
78+
instanceID string,
7079
) (*crusoeapi.InstanceV1Alpha5, *http.Response, error) {
7180
projectID := os.Getenv(CrusoeProjectID)
7281
if projectID == "" {
7382
return nil, nil, ErrProjectIDNotSet
7483
}
7584

76-
klog.Infof("getInstanceByID: %s", providerID)
77-
instance, response, err := client.VMsApi.GetInstance(ctx, projectID, providerID)
85+
klog.Infof("getInstanceByID: %s", instanceID)
86+
instance, response, err := a.CrusoeAPIClient.VMsApi.GetInstance(ctx, projectID, instanceID)
7887
if err != nil {
7988
return nil, response, fmt.Errorf("failed to list instances: %w", err)
8089
}

internal/client/mock/client.go

+83
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/cloud-controller-manager/cloud.go renamed to internal/cloud.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import (
66

77
"k8s.io/client-go/informers"
88
cloudprovider "k8s.io/cloud-provider"
9-
"k8s.io/klog/v2"
9+
10+
auth "gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/internal/auth"
11+
client "gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/internal/client"
12+
instances "gitlab.com/crusoeenergy/island/external/crusoe-cloud-controller-manager/internal/instances"
1013
)
1114

1215
const (
@@ -17,12 +20,11 @@ const (
1720
)
1821

1922
type Cloud struct {
20-
crusoeInstances *Instances
23+
crusoeInstances *instances.Instances
2124
}
2225

2326
// revive:disable:unused-parameter
2427
func (c *Cloud) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, stop <-chan struct{}) {
25-
klog.Info("Initialize()")
2628
clientset := clientBuilder.ClientOrDie("crusoe-shared-informers")
2729
sharedInformer := informers.NewSharedInformerFactory(clientset, 0)
2830
sharedInformer.Start(nil)
@@ -63,10 +65,13 @@ func newCloud() (cloudprovider.Interface, error) {
6365
apiEndPoint := os.Getenv(APIEndpoint)
6466
apiAccessKey := os.Getenv(AccessKey)
6567
apiSecretKey := os.Getenv(SecretKey)
66-
cc := NewCrusoeClient(apiEndPoint, apiAccessKey, apiSecretKey,
68+
cc := auth.NewCrusoeClient(apiEndPoint, apiAccessKey, apiSecretKey,
6769
"crusoe-cloud-controller-manager/0.0.1")
70+
apiClient := &client.APIClientImpl{
71+
CrusoeAPIClient: cc,
72+
}
6873

6974
return &Cloud{
70-
crusoeInstances: NewCrusoeInstances(cc),
75+
crusoeInstances: instances.NewCrusoeInstances(apiClient),
7176
}, nil
7277
}

0 commit comments

Comments
 (0)