Skip to content

Commit c39857b

Browse files
authored
Modify provider id set logic to explicity return error (#2039)
1 parent 4de83a5 commit c39857b

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed

cloud/scope/powervs_machine.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -929,29 +929,45 @@ func (m *PowerVSMachineScope) GetZone() string {
929929
}
930930

931931
// GetServiceInstanceID returns the service instance id.
932-
func (m *PowerVSMachineScope) GetServiceInstanceID() string {
932+
func (m *PowerVSMachineScope) GetServiceInstanceID() (string, error) {
933933
if m.IBMPowerVSCluster.Status.ServiceInstance != nil && m.IBMPowerVSCluster.Status.ServiceInstance.ID != nil {
934-
return *m.IBMPowerVSCluster.Status.ServiceInstance.ID
934+
return *m.IBMPowerVSCluster.Status.ServiceInstance.ID, nil
935935
}
936936
if m.IBMPowerVSCluster.Spec.ServiceInstanceID != "" {
937-
return m.IBMPowerVSCluster.Spec.ServiceInstanceID
937+
return m.IBMPowerVSCluster.Spec.ServiceInstanceID, nil
938938
}
939939
if m.IBMPowerVSCluster.Spec.ServiceInstance != nil && m.IBMPowerVSCluster.Spec.ServiceInstance.ID != nil {
940-
return *m.IBMPowerVSCluster.Spec.ServiceInstance.ID
940+
return *m.IBMPowerVSCluster.Spec.ServiceInstance.ID, nil
941941
}
942-
return ""
942+
// If we are not able to find service instance id, derive it from name if defined.
943+
if m.IBMPowerVSCluster.Spec.ServiceInstance != nil && m.IBMPowerVSCluster.Spec.ServiceInstance.Name == nil {
944+
return "", fmt.Errorf("failed to find service instance id as both name and id are not set")
945+
}
946+
serviceInstance, err := m.ResourceClient.GetServiceInstance("", *m.IBMPowerVSCluster.Spec.ServiceInstance.Name, ptr.To(m.GetZone()))
947+
if err != nil {
948+
m.Error(err, "failed to get Power VS service instance id", "serviceInstanceName", *m.IBMPowerVSCluster.Spec.ServiceInstance.Name)
949+
return "", err
950+
}
951+
// It's safe to directly dereference GUID as its already done in NewPowerVSMachineScope
952+
return *serviceInstance.GUID, nil
943953
}
944954

945955
// SetProviderID will set the provider id for the machine.
946-
func (m *PowerVSMachineScope) SetProviderID(id *string) {
956+
func (m *PowerVSMachineScope) SetProviderID(instanceID string) error {
947957
// Based on the ProviderIDFormat version the providerID format will be decided.
948-
if options.ProviderIDFormatType(options.ProviderIDFormat) == options.ProviderIDFormatV2 {
949-
if id != nil {
950-
m.IBMPowerVSMachine.Spec.ProviderID = ptr.To(fmt.Sprintf("ibmpowervs://%s/%s/%s/%s", m.GetRegion(), m.GetZone(), m.GetServiceInstanceID(), *id))
951-
}
952-
} else {
958+
if options.ProviderIDFormatType(options.ProviderIDFormat) == options.ProviderIDFormatV1 {
953959
m.IBMPowerVSMachine.Spec.ProviderID = ptr.To(fmt.Sprintf("ibmpowervs://%s/%s", m.Machine.Spec.ClusterName, m.IBMPowerVSMachine.Name))
960+
return nil
961+
}
962+
m.V(3).Info("setting provider id in v2 format")
963+
964+
serviceInstanceID, err := m.GetServiceInstanceID()
965+
if err != nil {
966+
m.Error(err, "failed to get service instance ID")
967+
return err
954968
}
969+
m.IBMPowerVSMachine.Spec.ProviderID = ptr.To(fmt.Sprintf("ibmpowervs://%s/%s/%s/%s", m.GetRegion(), m.GetZone(), serviceInstanceID, instanceID))
970+
return nil
955971
}
956972

957973
// GetMachineInternalIP returns the machine's internal IP.

controllers/ibmpowervsmachine_controller.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ func (r *IBMPowerVSMachineReconciler) reconcileNormal(machineScope *scope.PowerV
248248
if err != nil {
249249
return ctrl.Result{}, err
250250
}
251-
machineScope.SetProviderID(instance.PvmInstanceID)
251+
if err := machineScope.SetProviderID(*ins.PvmInstanceID); err != nil {
252+
return ctrl.Result{}, errors.Wrapf(err, "failed to set provider id")
253+
}
252254
machineScope.SetInstanceID(instance.PvmInstanceID)
253255
machineScope.SetAddresses(instance)
254256
machineScope.SetHealth(instance.Health)

controllers/ibmpowervsmachine_controller_test.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,9 @@ func TestIBMPowerVSMachineReconciler_ReconcileOperations(t *testing.T) {
512512
},
513513
},
514514
Spec: infrav1beta2.IBMPowerVSClusterSpec{
515+
ServiceInstance: &infrav1beta2.IBMPowerVSResourceReference{
516+
ID: ptr.To("serviceInstanceID"),
517+
},
515518
VPC: &infrav1beta2.VPCResourceReference{
516519
Region: ptr.To("us-south"),
517520
},
@@ -606,6 +609,9 @@ func TestIBMPowerVSMachineReconciler_ReconcileOperations(t *testing.T) {
606609
},
607610
},
608611
Spec: infrav1beta2.IBMPowerVSClusterSpec{
612+
ServiceInstance: &infrav1beta2.IBMPowerVSResourceReference{
613+
ID: ptr.To("serviceInstanceID"),
614+
},
609615
VPC: &infrav1beta2.VPCResourceReference{
610616
Region: ptr.To("us-south"),
611617
},
@@ -708,9 +714,15 @@ func TestIBMPowerVSMachineReconciler_ReconcileOperations(t *testing.T) {
708714
Ready: true,
709715
},
710716
},
711-
IBMPowerVSClient: mockpowervs,
712-
DHCPIPCacheStore: cache.NewTTLStore(powervs.CacheKeyFunc, powervs.CacheTTL),
713-
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{},
717+
IBMPowerVSClient: mockpowervs,
718+
DHCPIPCacheStore: cache.NewTTLStore(powervs.CacheKeyFunc, powervs.CacheTTL),
719+
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
720+
Spec: infrav1beta2.IBMPowerVSClusterSpec{
721+
ServiceInstance: &infrav1beta2.IBMPowerVSResourceReference{
722+
ID: ptr.To("serviceInstanceID"),
723+
},
724+
},
725+
},
714726
}
715727

716728
instanceReferences := &models.PVMInstances{
@@ -822,6 +834,9 @@ func TestIBMPowerVSMachineReconciler_ReconcileOperations(t *testing.T) {
822834
},
823835
},
824836
Spec: infrav1beta2.IBMPowerVSClusterSpec{
837+
ServiceInstance: &infrav1beta2.IBMPowerVSResourceReference{
838+
ID: ptr.To("serviceInstanceID"),
839+
},
825840
LoadBalancers: []infrav1beta2.VPCLoadBalancerSpec{
826841
{
827842
Name: "capi-test-lb",

0 commit comments

Comments
 (0)