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

Commit f26b554

Browse files
committed
providerSpec with multiple versions
1 parent 9846fa2 commit f26b554

File tree

6 files changed

+81
-98
lines changed

6 files changed

+81
-98
lines changed

pkg/vsphere/apis/provider_spec.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ const (
3232
)
3333

3434
// VsphereProviderSpec is an interface to hide the concrete spec version
35-
type VsphereProviderSpec interface {
36-
SpecVersion() int
35+
type VsphereProviderSpec struct {
36+
V1 *VsphereProviderSpec1 `json:"v1,omitempty"`
37+
V2 *VsphereProviderSpec2 `json:"v2,omitempty"`
3738
}
3839

3940
// VsphereProviderSpec1 contains the fields of

pkg/vsphere/fake/plugin_spi_impl.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,26 @@ import (
3131
type PluginSPIImpl struct{}
3232

3333
// CreateMachine creates a VM by cloning from a template
34-
func (spi *PluginSPIImpl) CreateMachine(ctx context.Context, machineName string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
34+
func (spi *PluginSPIImpl) CreateMachine(ctx context.Context, machineName string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
3535
return "", fmt.Errorf("fake not implemented yet")
3636
}
3737

3838
// DeleteMachine deletes a VM by name
39-
func (spi *PluginSPIImpl) DeleteMachine(ctx context.Context, machineName string, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
39+
func (spi *PluginSPIImpl) DeleteMachine(ctx context.Context, machineName string, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
4040
return "", fmt.Errorf("fake not implemented yet")
4141
}
4242

4343
// ShutDownMachine shuts down a machine by name
44-
func (spi *PluginSPIImpl) ShutDownMachine(ctx context.Context, machineName string, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
44+
func (spi *PluginSPIImpl) ShutDownMachine(ctx context.Context, machineName string, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
4545
return "", fmt.Errorf("fake not implemented yet")
4646
}
4747

4848
// GetMachineStatus checks for existence of VM by name
49-
func (spi *PluginSPIImpl) GetMachineStatus(ctx context.Context, machineName string, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
49+
func (spi *PluginSPIImpl) GetMachineStatus(ctx context.Context, machineName string, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
5050
return "", fmt.Errorf("fake not implemented yet")
5151
}
5252

5353
// ListMachines lists all VMs in the DC or folder
54-
func (spi *PluginSPIImpl) ListMachines(ctx context.Context, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (map[string]string, error) {
54+
func (spi *PluginSPIImpl) ListMachines(ctx context.Context, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (map[string]string, error) {
5555
return nil, fmt.Errorf("fake not implemented yet")
5656
}

pkg/vsphere/integration/integration_test.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@ import (
3333
// TODO: Update secret field from api.Secrets to corev1.Secret in integration tests
3434

3535
type integrationConfig struct {
36-
MachineName string `json:"machineName"`
37-
ProviderSpec *api.VsphereProviderSpec1 `json:"providerSpec"`
38-
ProviderSpec2 *api.VsphereProviderSpec2 `json:"providerSpec2"`
39-
Secrets *corev1.Secret `json:"secrets"`
36+
MachineName string `json:"machineName"`
37+
ProviderSpec *api.VsphereProviderSpec `json:"providerSpec"`
38+
Secrets *corev1.Secret `json:"secrets"`
4039
}
4140

4241
// TestPluginSPIImpl tests creation and deleting of a VM via vSphere API.
@@ -61,13 +60,9 @@ func TestPluginSPIImpl(t *testing.T) {
6160
return
6261
}
6362

64-
var providerSpec api.VsphereProviderSpec
65-
if cfg.ProviderSpec != nil {
66-
providerSpec = cfg.ProviderSpec
67-
} else if cfg.ProviderSpec2 != nil {
68-
providerSpec = cfg.ProviderSpec2
69-
} else {
70-
t.Errorf("neither field 'providerSpec' nor 'providerSpec2' set in integrationConfig from %s", configPath)
63+
providerSpec := cfg.ProviderSpec
64+
if providerSpec.V1 == nil && providerSpec.V2 == nil {
65+
t.Errorf("neither field 'providerSpec.v1' nor 'providerSpec.v2' set in integrationConfig from %s", configPath)
7166
return
7267
}
7368

pkg/vsphere/internal/plugin_spi.go

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -43,61 +43,57 @@ func NewPluginSPISwitch() *PluginSPISwitch {
4343
}
4444

4545
// CreateMachine creates a VM by cloning from a template
46-
func (spi *PluginSPISwitch) CreateMachine(ctx context.Context, machineName string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
47-
switch providerSpec.SpecVersion() {
48-
case 1:
49-
return spi.spec1.CreateMachine(ctx, machineName, providerSpec.(*api.VsphereProviderSpec1), secrets)
50-
case 2:
51-
return spi.spec2.CreateMachine(ctx, machineName, providerSpec.(*api.VsphereProviderSpec2), secrets)
52-
default:
53-
return "", fmt.Errorf("invalid spec version")
46+
func (spi *PluginSPISwitch) CreateMachine(ctx context.Context, machineName string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
47+
if providerSpec.V1 != nil {
48+
return spi.spec1.CreateMachine(ctx, machineName, providerSpec.V1, secrets)
5449
}
50+
if providerSpec.V2 != nil {
51+
return spi.spec2.CreateMachine(ctx, machineName, providerSpec.V2, secrets)
52+
}
53+
return "", fmt.Errorf("invalid spec version")
5554
}
5655

5756
// DeleteMachine deletes a VM by name
58-
func (spi *PluginSPISwitch) DeleteMachine(ctx context.Context, machineName string, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
59-
switch providerSpec.SpecVersion() {
60-
case 1:
61-
return spi.spec1.DeleteMachine(ctx, machineName, providerID, providerSpec.(*api.VsphereProviderSpec1), secrets)
62-
case 2:
63-
return spi.spec2.DeleteMachine(ctx, machineName, providerID, providerSpec.(*api.VsphereProviderSpec2), secrets)
64-
default:
65-
return "", fmt.Errorf("invalid spec version")
57+
func (spi *PluginSPISwitch) DeleteMachine(ctx context.Context, machineName string, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
58+
if providerSpec.V1 != nil {
59+
return spi.spec1.DeleteMachine(ctx, machineName, providerID, providerSpec.V1, secrets)
60+
}
61+
if providerSpec.V2 != nil {
62+
return spi.spec2.DeleteMachine(ctx, machineName, providerID, providerSpec.V2, secrets)
6663
}
64+
return "", fmt.Errorf("invalid spec version")
6765
}
6866

6967
// ShutDownMachine shuts down a machine by name
70-
func (spi *PluginSPISwitch) ShutDownMachine(ctx context.Context, machineName string, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
71-
switch providerSpec.SpecVersion() {
72-
case 1:
73-
return spi.spec1.ShutDownMachine(ctx, machineName, providerID, providerSpec.(*api.VsphereProviderSpec1), secrets)
74-
case 2:
75-
return spi.spec2.ShutDownMachine(ctx, machineName, providerID, providerSpec.(*api.VsphereProviderSpec2), secrets)
76-
default:
77-
return "", fmt.Errorf("invalid spec version")
68+
func (spi *PluginSPISwitch) ShutDownMachine(ctx context.Context, machineName string, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
69+
if providerSpec.V1 != nil {
70+
return spi.spec1.ShutDownMachine(ctx, machineName, providerID, providerSpec.V1, secrets)
71+
}
72+
if providerSpec.V2 != nil {
73+
return spi.spec2.ShutDownMachine(ctx, machineName, providerID, providerSpec.V2, secrets)
7874
}
75+
return "", fmt.Errorf("invalid spec version")
7976
}
8077

8178
// GetMachineStatus checks for existence of VM by name
82-
func (spi *PluginSPISwitch) GetMachineStatus(ctx context.Context, machineName string, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
83-
switch providerSpec.SpecVersion() {
84-
case 1:
85-
return spi.spec1.GetMachineStatus(ctx, machineName, providerID, providerSpec.(*api.VsphereProviderSpec1), secrets)
86-
case 2:
87-
return spi.spec2.GetMachineStatus(ctx, machineName, providerID, providerSpec.(*api.VsphereProviderSpec2), secrets)
88-
default:
89-
return "", fmt.Errorf("invalid spec version")
79+
func (spi *PluginSPISwitch) GetMachineStatus(ctx context.Context, machineName string, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (string, error) {
80+
if providerSpec.V1 != nil {
81+
return spi.spec1.GetMachineStatus(ctx, machineName, providerID, providerSpec.V1, secrets)
9082
}
83+
if providerSpec.V2 != nil {
84+
return spi.spec2.GetMachineStatus(ctx, machineName, providerID, providerSpec.V2, secrets)
85+
}
86+
return "", fmt.Errorf("invalid spec version")
87+
9188
}
9289

9390
// ListMachines lists all VMs in the DC or folder
94-
func (spi *PluginSPISwitch) ListMachines(ctx context.Context, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (map[string]string, error) {
95-
switch providerSpec.SpecVersion() {
96-
case 1:
97-
return spi.spec1.ListMachines(ctx, providerSpec.(*api.VsphereProviderSpec1), secrets)
98-
case 2:
99-
return spi.spec2.ListMachines(ctx, providerSpec.(*api.VsphereProviderSpec2), secrets)
100-
default:
101-
return nil, fmt.Errorf("invalid spec version")
91+
func (spi *PluginSPISwitch) ListMachines(ctx context.Context, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (map[string]string, error) {
92+
if providerSpec.V1 != nil {
93+
return spi.spec1.ListMachines(ctx, providerSpec.V1, secrets)
94+
}
95+
if providerSpec.V2 != nil {
96+
return spi.spec2.ListMachines(ctx, providerSpec.V2, secrets)
10297
}
98+
return nil, fmt.Errorf("invalid spec version")
10399
}

pkg/vsphere/machine_server_util.go

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -33,57 +33,48 @@ import (
3333
)
3434

3535
// decodeProviderSpecAndSecret converts request parameters to api.VsphereProviderSpec
36-
func decodeProviderSpecAndSecret(machineClass *v1alpha1.MachineClass, secret *corev1.Secret) (api.VsphereProviderSpec, error) {
37-
if _, ok := secret.Data[api.VSphereKubeconfig]; ok {
38-
spec, err := decodeProviderSpec2AndSecret(machineClass, secret)
39-
return spec, err
40-
}
41-
spec, err := decodeProviderSpec1AndSecret(machineClass, secret)
42-
return spec, err
43-
}
44-
45-
// decodeProviderSpec1AndSecret converts request parameters to api.VsphereProviderSpec
46-
func decodeProviderSpec1AndSecret(machineClass *v1alpha1.MachineClass, secret *corev1.Secret) (*api.VsphereProviderSpec1, error) {
47-
var (
48-
providerSpec *api.VsphereProviderSpec1
49-
)
36+
func decodeProviderSpecAndSecret(machineClass *v1alpha1.MachineClass, secret *corev1.Secret) (*api.VsphereProviderSpec, error) {
37+
var providerSpec *api.VsphereProviderSpec
5038

5139
// Extract providerSpec
5240
err := json.Unmarshal(machineClass.ProviderSpec.Raw, &providerSpec)
5341
if err != nil {
5442
return nil, status.Error(codes.Internal, err.Error())
5543
}
5644

57-
//Validate the Spec and Secrets
58-
ValidationErr := validation.ValidateVsphereProviderSpec1(providerSpec, secret)
59-
if ValidationErr != nil {
60-
err = fmt.Errorf("Error while validating ProviderSpec %v", ValidationErr)
61-
return nil, status.Error(codes.Internal, err.Error())
45+
if providerSpec.V1 != nil {
46+
err := validateSpec1(providerSpec.V1, secret)
47+
return providerSpec, err
6248
}
6349

64-
return providerSpec, nil
65-
}
50+
if providerSpec.V2 != nil {
51+
err := validateSpec2(providerSpec.V2, secret)
52+
return providerSpec, err
53+
}
6654

67-
// decodeProviderSpec2AndSecret converts request parameters to api.VsphereProviderSpec2
68-
func decodeProviderSpec2AndSecret(machineClass *v1alpha1.MachineClass, secret *corev1.Secret) (*api.VsphereProviderSpec2, error) {
69-
var (
70-
providerSpec *api.VsphereProviderSpec2
71-
)
55+
return nil, fmt.Errorf("invalid providerSpec")
56+
}
7257

73-
// Extract providerSpec
74-
err := json.Unmarshal(machineClass.ProviderSpec.Raw, &providerSpec)
75-
if err != nil {
76-
return nil, status.Error(codes.Internal, err.Error())
58+
// validateSpec1 validates api.VsphereProviderSpec1
59+
func validateSpec1(spec1 *api.VsphereProviderSpec1, secret *corev1.Secret) error {
60+
//Validate the Spec and Secrets
61+
ValidationErr := validation.ValidateVsphereProviderSpec1(spec1, secret)
62+
if ValidationErr != nil {
63+
err := fmt.Errorf("Error while validating ProviderSpec V1 %v", ValidationErr)
64+
return status.Error(codes.Internal, err.Error())
7765
}
66+
return nil
67+
}
7868

69+
// validateSpec2 validates api.VsphereProviderSpec2
70+
func validateSpec2(spec2 *api.VsphereProviderSpec2, secret *corev1.Secret) error {
7971
//Validate the Spec and Secrets
80-
ValidationErr := validation.ValidateVsphereProviderSpec2(providerSpec, secret)
72+
ValidationErr := validation.ValidateVsphereProviderSpec2(spec2, secret)
8173
if ValidationErr != nil {
82-
err = fmt.Errorf("Error while validating ProviderSpec2 %v", ValidationErr)
83-
return nil, status.Error(codes.Internal, err.Error())
74+
err := fmt.Errorf("Error while validating ProviderSpec V2 %v", ValidationErr)
75+
return status.Error(codes.Internal, err.Error())
8476
}
85-
86-
return providerSpec, nil
77+
return nil
8778
}
8879

8980
func prepareErrorf(err error, format string, args ...interface{}) error {

pkg/vsphere/plugin.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ import (
3333
// You can optionally enhance this interface to add interface methods here
3434
// You can use it to mock cloud provider calls
3535
type PluginSPI interface {
36-
CreateMachine(ctx context.Context, machineName string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (providerID string, err error)
37-
DeleteMachine(ctx context.Context, machineName, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (foundProviderID string, err error)
38-
GetMachineStatus(ctx context.Context, machineName, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (foundProviderID string, err error)
39-
ListMachines(ctx context.Context, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (providerIDList map[string]string, err error)
40-
ShutDownMachine(ctx context.Context, machineName, providerID string, providerSpec api.VsphereProviderSpec, secrets *corev1.Secret) (foundProviderID string, err error)
36+
CreateMachine(ctx context.Context, machineName string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (providerID string, err error)
37+
DeleteMachine(ctx context.Context, machineName, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (foundProviderID string, err error)
38+
GetMachineStatus(ctx context.Context, machineName, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (foundProviderID string, err error)
39+
ListMachines(ctx context.Context, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (providerIDList map[string]string, err error)
40+
ShutDownMachine(ctx context.Context, machineName, providerID string, providerSpec *api.VsphereProviderSpec, secrets *corev1.Secret) (foundProviderID string, err error)
4141
}
4242

4343
// MachinePlugin implements the cmi.MachineServer

0 commit comments

Comments
 (0)