Skip to content

Commit bdcbc3d

Browse files
Integrate IBMPowerVSImage with MachineSpec (#552)
Signed-off-by: Prajyot-Parab <[email protected]>
1 parent 2c13255 commit bdcbc3d

11 files changed

+256
-45
lines changed

api/v1alpha4/ibmpowervs_conversion.go

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package v1alpha4
1919
import (
2020
apiconversion "k8s.io/apimachinery/pkg/conversion"
2121
"sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
22+
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
2223
"sigs.k8s.io/controller-runtime/pkg/conversion"
2324
)
2425

@@ -49,13 +50,36 @@ func (dst *IBMPowerVSClusterList) ConvertFrom(srcRaw conversion.Hub) error {
4950
func (src *IBMPowerVSMachine) ConvertTo(dstRaw conversion.Hub) error {
5051
dst := dstRaw.(*v1beta1.IBMPowerVSMachine)
5152

52-
return Convert_v1alpha4_IBMPowerVSMachine_To_v1beta1_IBMPowerVSMachine(src, dst, nil)
53+
if err := Convert_v1alpha4_IBMPowerVSMachine_To_v1beta1_IBMPowerVSMachine(src, dst, nil); err != nil {
54+
return err
55+
}
56+
57+
dst.Spec.Image = (*v1beta1.IBMPowerVSResourceReference)(&src.Spec.Image)
58+
59+
return nil
5360
}
5461

5562
func (dst *IBMPowerVSMachine) ConvertFrom(srcRaw conversion.Hub) error {
5663
src := srcRaw.(*v1beta1.IBMPowerVSMachine)
5764

58-
return Convert_v1beta1_IBMPowerVSMachine_To_v1alpha4_IBMPowerVSMachine(src, dst, nil)
65+
if err := Convert_v1beta1_IBMPowerVSMachine_To_v1alpha4_IBMPowerVSMachine(src, dst, nil); err != nil {
66+
return err
67+
}
68+
69+
// Preserve Hub data on down-conversion except for metadata
70+
if err := utilconversion.MarshalData(src, dst); err != nil {
71+
return err
72+
}
73+
74+
if src.Spec.Image == nil && src.Spec.ImageRef != nil {
75+
dst.Spec.Image.Name = &src.Spec.ImageRef.Name
76+
}
77+
78+
if src.Spec.Image != nil && src.Spec.ImageRef == nil {
79+
dst.Spec.Image = IBMPowerVSResourceReference(*src.Spec.Image)
80+
}
81+
82+
return nil
5983
}
6084

6185
func (src *IBMPowerVSMachineList) ConvertTo(dstRaw conversion.Hub) error {
@@ -73,13 +97,36 @@ func (dst *IBMPowerVSMachineList) ConvertFrom(srcRaw conversion.Hub) error {
7397
func (src *IBMPowerVSMachineTemplate) ConvertTo(dstRaw conversion.Hub) error {
7498
dst := dstRaw.(*v1beta1.IBMPowerVSMachineTemplate)
7599

76-
return Convert_v1alpha4_IBMPowerVSMachineTemplate_To_v1beta1_IBMPowerVSMachineTemplate(src, dst, nil)
100+
if err := Convert_v1alpha4_IBMPowerVSMachineTemplate_To_v1beta1_IBMPowerVSMachineTemplate(src, dst, nil); err != nil {
101+
return err
102+
}
103+
104+
dst.Spec.Template.Spec.Image = (*v1beta1.IBMPowerVSResourceReference)(&src.Spec.Template.Spec.Image)
105+
106+
return nil
77107
}
78108

79109
func (dst *IBMPowerVSMachineTemplate) ConvertFrom(srcRaw conversion.Hub) error {
80110
src := srcRaw.(*v1beta1.IBMPowerVSMachineTemplate)
81111

82-
return Convert_v1beta1_IBMPowerVSMachineTemplate_To_v1alpha4_IBMPowerVSMachineTemplate(src, dst, nil)
112+
if err := Convert_v1beta1_IBMPowerVSMachineTemplate_To_v1alpha4_IBMPowerVSMachineTemplate(src, dst, nil); err != nil {
113+
return err
114+
}
115+
116+
// Preserve Hub data on down-conversion except for metadata
117+
if err := utilconversion.MarshalData(src, dst); err != nil {
118+
return err
119+
}
120+
121+
if src.Spec.Template.Spec.Image == nil && src.Spec.Template.Spec.ImageRef != nil {
122+
dst.Spec.Template.Spec.Image.Name = &src.Spec.Template.Spec.ImageRef.Name
123+
}
124+
125+
if src.Spec.Template.Spec.Image != nil && src.Spec.Template.Spec.ImageRef == nil {
126+
dst.Spec.Template.Spec.Image = IBMPowerVSResourceReference(*src.Spec.Template.Spec.Image)
127+
}
128+
129+
return nil
83130
}
84131

85132
func (src *IBMPowerVSMachineTemplateList) ConvertTo(dstRaw conversion.Hub) error {
@@ -99,3 +146,13 @@ func (dst *IBMPowerVSMachineTemplateList) ConvertFrom(srcRaw conversion.Hub) err
99146
func Convert_v1beta1_IBMPowerVSMachineStatus_To_v1alpha4_IBMPowerVSMachineStatus(in *v1beta1.IBMPowerVSMachineStatus, out *IBMPowerVSMachineStatus, s apiconversion.Scope) error {
100147
return autoConvert_v1beta1_IBMPowerVSMachineStatus_To_v1alpha4_IBMPowerVSMachineStatus(in, out, s)
101148
}
149+
150+
// Convert_v1beta1_IBMPowerVSMachineSpec_To_v1alpha4_IBMPowerVSMachineSpec is an autogenerated conversion function.
151+
// Requires manual conversion as ImageRef does not exist in v1alpha4 version of IBMPowerVSMachineSpec.
152+
func Convert_v1beta1_IBMPowerVSMachineSpec_To_v1alpha4_IBMPowerVSMachineSpec(in *v1beta1.IBMPowerVSMachineSpec, out *IBMPowerVSMachineSpec, s apiconversion.Scope) error {
153+
return autoConvert_v1beta1_IBMPowerVSMachineSpec_To_v1alpha4_IBMPowerVSMachineSpec(in, out, s)
154+
}
155+
156+
func Convert_v1alpha4_IBMPowerVSMachineSpec_To_v1beta1_IBMPowerVSMachineSpec(in *IBMPowerVSMachineSpec, out *v1beta1.IBMPowerVSMachineSpec, s apiconversion.Scope) error {
157+
return autoConvert_v1alpha4_IBMPowerVSMachineSpec_To_v1beta1_IBMPowerVSMachineSpec(in, out, s)
158+
}

api/v1alpha4/zz_generated.conversion.go

Lines changed: 35 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/conditions_consts.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ const (
4242
InstanceReadyCondition clusterv1.ConditionType = "InstanceReady"
4343
)
4444

45+
const (
46+
// WaitingForIBMPowerVSImageReason used when machine is waiting for powervs image to be ready before proceeding.
47+
WaitingForIBMPowerVSImageReason = "WaitingForIBMPowerVSImage"
48+
)
49+
4550
const (
4651
// ImageNotReadyReason used when the image is in a queued state.
4752
ImageNotReadyReason = "ImageNotReady"

api/v1beta1/ibmpowervsmachine_types.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,13 @@ type IBMPowerVSMachineSpec struct {
4444
SSHKey string `json:"sshKey,omitempty"`
4545

4646
// Image is the reference to the Image from which to create the machine instance.
47-
Image IBMPowerVSResourceReference `json:"image"`
47+
// +optional
48+
Image *IBMPowerVSResourceReference `json:"image,omitempty"`
49+
50+
// ImageRef is an optional reference to a provider-specific resource that holds
51+
// the details for provisioning the Image for a Cluster.
52+
// +optional
53+
ImageRef *v1.ObjectReference `json:"imageRef,omitempty"`
4854

4955
// SysType is the System type used to host the vsi
5056
// +optional

api/v1beta1/ibmpowervsmachine_webhook.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,18 @@ func (r *IBMPowerVSMachine) validateIBMPowerVSMachineNetwork() *field.Error {
112112
}
113113

114114
func (r *IBMPowerVSMachine) validateIBMPowerVSMachineImage() *field.Error {
115-
if res, err := validateIBMPowerVSResourceReference(r.Spec.Image, "Image"); !res {
116-
return err
115+
if r.Spec.Image == nil && r.Spec.ImageRef == nil {
116+
return field.Invalid(field.NewPath(""), "", "One of - Image or ImageRef must be specified")
117+
}
118+
119+
if r.Spec.Image != nil && r.Spec.ImageRef != nil {
120+
return field.Invalid(field.NewPath(""), "", "Only one of - Image or ImageRef maybe be specified")
121+
}
122+
123+
if r.Spec.Image != nil {
124+
if res, err := validateIBMPowerVSResourceReference(*r.Spec.Image, "Image"); !res {
125+
return err
126+
}
117127
}
118128
return nil
119129
}

api/v1beta1/ibmpowervsmachinetemplate_webhook.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,21 @@ func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateNetwork() *
112112
}
113113

114114
func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateImage() *field.Error {
115-
if res, err := validateIBMPowerVSResourceReference(r.Spec.Template.Spec.Image, "Image"); !res {
116-
return err
115+
mt := r.Spec.Template
116+
117+
if mt.Spec.Image == nil && mt.Spec.ImageRef == nil {
118+
return field.Invalid(field.NewPath(""), "", "One of - Image or ImageRef must be specified")
119+
}
120+
121+
if mt.Spec.Image != nil && mt.Spec.ImageRef != nil {
122+
return field.Invalid(field.NewPath(""), "", "Only one of - Image or ImageRef maybe be specified")
117123
}
124+
125+
if mt.Spec.Image != nil {
126+
if res, err := validateIBMPowerVSResourceReference(*mt.Spec.Image, "Image"); !res {
127+
return err
128+
}
129+
}
130+
118131
return nil
119132
}

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloud/scope/powervs_machine.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type PowerVSMachineScopeParams struct {
5656
Machine *clusterv1.Machine
5757
IBMPowerVSCluster *v1beta1.IBMPowerVSCluster
5858
IBMPowerVSMachine *v1beta1.IBMPowerVSMachine
59+
IBMPowerVSImage *v1beta1.IBMPowerVSImage
5960
}
6061

6162
// PowerVSMachineScope defines a scope defined around a Power VS Machine.
@@ -69,6 +70,7 @@ type PowerVSMachineScope struct {
6970
Machine *clusterv1.Machine
7071
IBMPowerVSCluster *v1beta1.IBMPowerVSCluster
7172
IBMPowerVSMachine *v1beta1.IBMPowerVSMachine
73+
IBMPowerVSImage *v1beta1.IBMPowerVSImage
7274
}
7375

7476
// NewPowerVSMachineScope creates a new PowerVSMachineScope from the supplied parameters.
@@ -94,11 +96,12 @@ func NewPowerVSMachineScope(params PowerVSMachineScopeParams) (scope *PowerVSMac
9496
scope.Cluster = params.Cluster
9597

9698
if params.IBMPowerVSMachine == nil {
97-
err = errors.New("aws machine is required when creating a MachineScope")
99+
err = errors.New("PowerVS machine is required when creating a MachineScope")
98100
return
99101
}
100102
scope.IBMPowerVSMachine = params.IBMPowerVSMachine
101103
scope.IBMPowerVSCluster = params.IBMPowerVSCluster
104+
scope.IBMPowerVSImage = params.IBMPowerVSImage
102105

103106
if params.Logger == (logr.Logger{}) {
104107
params.Logger = klogr.New()
@@ -203,9 +206,14 @@ func (m *PowerVSMachineScope) CreateMachine() (*models.PVMInstanceReference, err
203206
return nil, fmt.Errorf("failed to convert Processors(%s) to float64", s.Processors)
204207
}
205208

206-
imageID, err := getImageID(s.Image, m)
207-
if err != nil {
208-
return nil, fmt.Errorf("error getting image ID: %v", err)
209+
var imageID *string
210+
if m.IBMPowerVSImage != nil {
211+
imageID = &m.IBMPowerVSImage.Status.ImageID
212+
} else {
213+
imageID, err = getImageID(s.Image, m)
214+
if err != nil {
215+
return nil, fmt.Errorf("error getting image ID: %v", err)
216+
}
209217
}
210218

211219
networkID, err := getNetworkID(s.Network, m)
@@ -273,7 +281,7 @@ func (m *PowerVSMachineScope) GetBootstrapData() (string, error) {
273281
return base64.StdEncoding.EncodeToString(value), nil
274282
}
275283

276-
func getImageID(image v1beta1.IBMPowerVSResourceReference, m *PowerVSMachineScope) (*string, error) {
284+
func getImageID(image *v1beta1.IBMPowerVSResourceReference, m *PowerVSMachineScope) (*string, error) {
277285
if image.ID != nil {
278286
return image.ID, nil
279287
} else if image.Name != nil {

0 commit comments

Comments
 (0)