Skip to content

Commit 6eeeddf

Browse files
Merge pull request #112 from Fedosin/validate_flavor
Bug 1820421: validate that flavor exists for machine
2 parents 04ecca4 + 528ff55 commit 6eeeddf

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

pkg/cloud/openstack/clients/machineservice.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,16 @@ func (is *InstanceService) GetInstanceList(opts *InstanceListOpts) ([]*Instance,
895895
return instanceList, nil
896896
}
897897

898+
// DoesFlavorExist return an error if flavor with given name doesn't exist, and nil otherwise
899+
func (is *InstanceService) DoesFlavorExist(flavorName string) error {
900+
_, err := flavors.IDFromName(is.computeClient, flavorName)
901+
if err != nil {
902+
return err
903+
}
904+
905+
return nil
906+
}
907+
898908
func (is *InstanceService) GetInstance(resourceId string) (instance *Instance, err error) {
899909
if resourceId == "" {
900910
return nil, fmt.Errorf("ResourceId should be specified to get detail.")

pkg/cloud/openstack/machine/actuator.go

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ func (oc *OpenstackClient) Create(ctx context.Context, machine *machinev1.Machin
137137
"Cannot unmarshal providerSpec field: %v", err), createEventAction)
138138
}
139139

140-
if verr := oc.validateMachine(machine, providerSpec); verr != nil {
140+
if err = oc.validateMachine(machine); err != nil {
141+
verr := &apierrors.MachineError{
142+
Reason: machinev1.CreateMachineError,
143+
Message: err.Error(),
144+
}
141145
return oc.handleMachineError(machine, verr, createEventAction)
142146
}
143147

@@ -321,6 +325,14 @@ func (oc *OpenstackClient) Delete(ctx context.Context, machine *machinev1.Machin
321325
}
322326

323327
func (oc *OpenstackClient) Update(ctx context.Context, machine *machinev1.Machine) error {
328+
if err := oc.validateMachine(machine); err != nil {
329+
verr := &apierrors.MachineError{
330+
Reason: machinev1.UpdateMachineError,
331+
Message: err.Error(),
332+
}
333+
return oc.handleMachineError(machine, verr, createEventAction)
334+
}
335+
324336
clusterInfra, err := oc.params.ConfigClient.Infrastructures().Get(context.TODO(), "cluster", metav1.GetOptions{})
325337
if err != nil {
326338
return fmt.Errorf("Failed to retrieve cluster Infrastructure object: %v", err)
@@ -619,7 +631,7 @@ func (oc *OpenstackClient) instanceExists(machine *machinev1.Machine) (instance
619631

620632
instanceList, err := machineService.GetInstanceList(opts)
621633
if err != nil {
622-
return nil, fmt.Errorf("\nError listing the instances (machine/actuator.go 472): %v", err)
634+
return nil, fmt.Errorf("\nError listing the instances: %v", err)
623635
}
624636
if len(instanceList) == 0 {
625637
return nil, nil
@@ -650,7 +662,24 @@ func (oc *OpenstackClient) createBootstrapToken() (string, error) {
650662
), nil
651663
}
652664

653-
func (oc *OpenstackClient) validateMachine(machine *machinev1.Machine, config *openstackconfigv1.OpenstackProviderSpec) *apierrors.MachineError {
654-
// TODO: other validate of openstackCloud
665+
func (oc *OpenstackClient) validateMachine(machine *machinev1.Machine) error {
666+
machineSpec, err := openstackconfigv1.MachineSpecFromProviderSpec(machine.Spec.ProviderSpec)
667+
if err != nil {
668+
return fmt.Errorf("\nError getting the machine spec from the provider spec: %v", err)
669+
}
670+
671+
machineService, err := clients.NewInstanceServiceFromMachine(oc.params.KubeClient, machine)
672+
if err != nil {
673+
return fmt.Errorf("\nError getting a new instance service from the machine: %v", err)
674+
}
675+
676+
// TODO(mfedosin): add more validations here
677+
678+
// Validate that flavor exists
679+
err = machineService.DoesFlavorExist(machineSpec.Flavor)
680+
if err != nil {
681+
return fmt.Errorf("Can't find a flavor with name %v: %v", machineSpec.Flavor, err)
682+
}
683+
655684
return nil
656685
}

0 commit comments

Comments
 (0)