Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,18 @@ mocks: $(MOCKGEN)
@$(MOCKGEN) -destination ./pkg/mock/iaas/iaas.go -package iaas github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api DefaultAPI

# client mocks
# TODO: delete later for cleanup old stackit client PR
@$(MOCKGEN) -destination ./pkg/stackit/iaas_mock.go -package stackit ./pkg/stackit IaasClient
@$(MOCKGEN) -destination ./pkg/stackit/loadbalancer_mock.go -package stackit ./pkg/stackit LoadbalancerClient
@$(MOCKGEN) -destination ./pkg/stackit/server_mock.go -package stackit ./pkg/stackit NodeClient

@$(MOCKGEN) -destination ./pkg/stackit/metadata/metadata_mock.go -package metadata ./pkg/stackit/metadata IMetadata
@$(MOCKGEN) -destination ./pkg/csi/util/mount/mount_mock.go -package mount ./pkg/csi/util/mount IMount

@$(MOCKGEN) -destination ./pkg/stackit/client/mock/iaas_mock.go -typed -package client ./pkg/stackit/client IaaSClient
@$(MOCKGEN) -destination ./pkg/stackit/client/mock/loadbalancer_mock.go -typed -package client ./pkg/stackit/client LoadBalancingClient
@$(MOCKGEN) -destination ./pkg/stackit/client/mock/mock.go -package client ./pkg/stackit/client Factory

.PHONY: generate
generate: mocks
go generate ./...
20 changes: 9 additions & 11 deletions pkg/ccm/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import (
"strings"

"github.com/stackitcloud/cloud-provider-stackit/pkg/labels"
"github.com/stackitcloud/cloud-provider-stackit/pkg/stackit"
stackitclient "github.com/stackitcloud/cloud-provider-stackit/pkg/stackit/client"
"github.com/stackitcloud/cloud-provider-stackit/pkg/stackit/stackiterrors"
iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api"

corev1 "k8s.io/api/core/v1"
cloudprovider "k8s.io/cloud-provider"
"k8s.io/klog/v2"
Expand All @@ -47,15 +47,13 @@ var oldProviderIDRegexp = regexp.MustCompile(`^` + oldProviderName + `://([^/]*)
// Instances encapsulates an implementation of Instances for OpenStack.
type Instances struct {
regionProviderID bool
iaasClient stackit.NodeClient
projectID string
iaasClient stackitclient.IaaSClient
region string
}

func NewInstance(client stackit.NodeClient, projectID, region string) (*Instances, error) {
func NewInstance(client stackitclient.IaaSClient, region string) (*Instances, error) {
return &Instances{
iaasClient: client,
projectID: projectID,
region: region,
regionProviderID: false,
}, nil
Expand Down Expand Up @@ -203,8 +201,8 @@ func instanceIDFromProviderID(providerID string) (instanceID, region string, err
}
}

func getServerByName(ctx context.Context, client stackit.NodeClient, name, projectID, region string) (*iaas.Server, error) {
servers, err := client.ListServers(ctx, projectID, region)
func getServerByName(ctx context.Context, client stackitclient.IaaSClient, name string) (*iaas.Server, error) {
servers, err := client.ListServers(ctx)
if err != nil {
return nil, fmt.Errorf("failed to list servers: %w", err)
}
Expand All @@ -227,7 +225,7 @@ func getServerByName(ctx context.Context, client stackit.NodeClient, name, proje

func (i *Instances) getInstance(ctx context.Context, node *corev1.Node) (*iaas.Server, error) {
if node.Spec.ProviderID == "" {
return getServerByName(ctx, i.iaasClient, node.Name, i.projectID, i.region)
return getServerByName(ctx, i.iaasClient, node.Name)
}

instanceID, instanceRegion, err := instanceIDFromProviderID(node.Spec.ProviderID)
Expand All @@ -239,8 +237,8 @@ func (i *Instances) getInstance(ctx context.Context, node *corev1.Node) (*iaas.S
return nil, fmt.Errorf("ProviderID \"%s\" didn't match supported region \"%s\"", node.Spec.ProviderID, i.region)
}

server, err := i.iaasClient.GetServer(ctx, i.projectID, i.region, instanceID)
if stackit.IsNotFound(err) {
server, err := i.iaasClient.GetServer(ctx, instanceID)
if stackiterrors.IsNotFound(err) {
return nil, cloudprovider.InstanceNotFound
}
if err != nil {
Expand Down
43 changes: 21 additions & 22 deletions pkg/ccm/instances_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,38 +19,37 @@ package ccm
import (
"context"
"fmt"
"net/http"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
oapiError "github.com/stackitcloud/stackit-sdk-go/core/oapierror"

"github.com/stackitcloud/cloud-provider-stackit/pkg/stackit"
stackitclientmock "github.com/stackitcloud/cloud-provider-stackit/pkg/stackit/client/mock"
iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api"

"go.uber.org/mock/gomock"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var _ = Describe("Node Controller", func() {
var (
nodeMockClient *stackit.MockNodeClient
nodeMockClient *stackitclientmock.MockIaaSClient
instance *Instances

projectID string
region string
serverID string
region string
serverID string
)

BeforeEach(func() {
projectID = "my-project"
region = "eu01"
serverID = "my-server"

ctrl := gomock.NewController(GinkgoT())
nodeMockClient = stackit.NewMockNodeClient(ctrl)
nodeMockClient = stackitclientmock.NewMockIaaSClient(ctrl)

var err error
instance, err = NewInstance(nodeMockClient, projectID, "eu01")
instance, err = NewInstance(nodeMockClient, "eu01")
Expect(err).NotTo(HaveOccurred())
})

Expand All @@ -68,7 +67,7 @@ var _ = Describe("Node Controller", func() {

Describe("InstanceExists", func() {
It("does not error if instance not found", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(&[]iaas.Server{}, nil)
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(&[]iaas.Server{}, nil)

node := &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Expand All @@ -80,7 +79,7 @@ var _ = Describe("Node Controller", func() {
})

It("successfully get the instance when provider ID not there", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(&[]iaas.Server{
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(&[]iaas.Server{
{
Name: "foo",
},
Expand All @@ -96,7 +95,7 @@ var _ = Describe("Node Controller", func() {
})

It("successfully get the instance when provider ID is there", func() {
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(&iaas.Server{
nodeMockClient.EXPECT().GetServer(gomock.Any(), serverID).Return(&iaas.Server{
Name: "foo",
}, nil)

Expand All @@ -113,7 +112,7 @@ var _ = Describe("Node Controller", func() {
})

It("successfully get the instance when old provider ID is there", func() {
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(&iaas.Server{
nodeMockClient.EXPECT().GetServer(gomock.Any(), serverID).Return(&iaas.Server{
Name: "foo",
}, nil)

Expand All @@ -130,7 +129,7 @@ var _ = Describe("Node Controller", func() {
})

It("successfully get the instance when old regional provider ID is there", func() {
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(&iaas.Server{
nodeMockClient.EXPECT().GetServer(gomock.Any(), serverID).Return(&iaas.Server{
Name: "foo",
}, nil)

Expand All @@ -147,7 +146,7 @@ var _ = Describe("Node Controller", func() {
})

It("error when list server fails", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(nil, fmt.Errorf("failed due to some reason"))
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(nil, fmt.Errorf("failed due to some reason"))

node := &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Expand All @@ -158,7 +157,7 @@ var _ = Describe("Node Controller", func() {
})

It("does not error when get server instance not found", func() {
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(nil, stackit.ErrorNotFound)
nodeMockClient.EXPECT().GetServer(gomock.Any(), serverID).Return(nil, &oapiError.GenericOpenAPIError{StatusCode: http.StatusNotFound})

node := &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Expand All @@ -175,7 +174,7 @@ var _ = Describe("Node Controller", func() {

Describe("InstanceShutdown", func() {
It("successfully gets the instance status with provider ID", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(&[]iaas.Server{
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(&[]iaas.Server{
{
Name: "foo",
Status: new(instanceStopping),
Expand All @@ -192,7 +191,7 @@ var _ = Describe("Node Controller", func() {
})

It("successfully gets the instance status without provider ID", func() {
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(&iaas.Server{
nodeMockClient.EXPECT().GetServer(gomock.Any(), serverID).Return(&iaas.Server{
Name: "foo",
Status: new("ACTIVE"),
}, nil)
Expand All @@ -210,7 +209,7 @@ var _ = Describe("Node Controller", func() {
})

It("fails if server not found", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(nil, stackit.ErrorNotFound)
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(nil, &oapiError.GenericOpenAPIError{StatusCode: http.StatusNotFound})

node := &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Expand All @@ -224,7 +223,7 @@ var _ = Describe("Node Controller", func() {

Describe("InstanceMetadata", func() {
It("does not error if instance not found", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(&[]iaas.Server{}, nil)
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(&[]iaas.Server{}, nil)

node := &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Expand All @@ -236,7 +235,7 @@ var _ = Describe("Node Controller", func() {
})

It("successfully get all the metadata values", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(&[]iaas.Server{
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(&[]iaas.Server{
{
Name: "foo",
Id: new(serverID),
Expand Down Expand Up @@ -271,7 +270,7 @@ var _ = Describe("Node Controller", func() {
})

It("errors when list server fails", func() {
nodeMockClient.EXPECT().ListServers(gomock.Any(), projectID, region).Return(nil, fmt.Errorf("failed due to some reason"))
nodeMockClient.EXPECT().ListServers(gomock.Any()).Return(nil, fmt.Errorf("failed due to some reason"))

node := &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Expand Down
Loading