sigs.k8s.io/cluster-api-provider-aws@v1.5.5/api/v1alpha3/awsmachine_conversion.go (about) 1 /* 2 Copyright 2021 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package v1alpha3 18 19 import ( 20 "unsafe" 21 22 apiconversion "k8s.io/apimachinery/pkg/conversion" 23 "k8s.io/utils/pointer" 24 infrav1 "sigs.k8s.io/cluster-api-provider-aws/api/v1beta1" 25 utilconversion "sigs.k8s.io/cluster-api/util/conversion" 26 "sigs.k8s.io/controller-runtime/pkg/conversion" 27 ) 28 29 // ConvertTo converts the v1alpha3 AWSMachine receiver to a v1beta1 AWSMachine. 30 func (r *AWSMachine) ConvertTo(dstRaw conversion.Hub) error { 31 dst := dstRaw.(*infrav1.AWSMachine) 32 if err := Convert_v1alpha3_AWSMachine_To_v1beta1_AWSMachine(r, dst, nil); err != nil { 33 return err 34 } 35 // Manually restore data. 36 restored := &infrav1.AWSMachine{} 37 if ok, err := utilconversion.UnmarshalData(r, restored); err != nil || !ok { 38 return err 39 } 40 41 restoreSpec(&restored.Spec, &dst.Spec) 42 43 dst.Spec.Ignition = restored.Spec.Ignition 44 45 return nil 46 } 47 48 func restoreSpec(restored, dst *infrav1.AWSMachineSpec) { 49 RestoreAMIReference(&restored.AMI, &dst.AMI) 50 if restored.RootVolume != nil { 51 if dst.RootVolume == nil { 52 dst.RootVolume = &infrav1.Volume{} 53 } 54 RestoreRootVolume(restored.RootVolume, dst.RootVolume) 55 } 56 if restored.NonRootVolumes != nil { 57 if dst.NonRootVolumes == nil { 58 dst.NonRootVolumes = []infrav1.Volume{} 59 } 60 restoreNonRootVolumes(restored.NonRootVolumes, dst.NonRootVolumes) 61 } 62 } 63 64 // ConvertFrom converts the v1beta1 AWSMachine receiver to a v1alpha3 AWSMachine. 65 func (r *AWSMachine) ConvertFrom(srcRaw conversion.Hub) error { 66 src := srcRaw.(*infrav1.AWSMachine) 67 68 if err := Convert_v1beta1_AWSMachine_To_v1alpha3_AWSMachine(src, r, nil); err != nil { 69 return err 70 } 71 // Preserve Hub data on down-conversion. 72 if err := utilconversion.MarshalData(src, r); err != nil { 73 return err 74 } 75 return nil 76 } 77 78 // ConvertTo converts the v1alpha3 AWSMachineList receiver to a v1beta1 AWSMachineList. 79 func (r *AWSMachineList) ConvertTo(dstRaw conversion.Hub) error { 80 dst := dstRaw.(*infrav1.AWSMachineList) 81 82 return Convert_v1alpha3_AWSMachineList_To_v1beta1_AWSMachineList(r, dst, nil) 83 } 84 85 // ConvertFrom converts the v1beta1 AWSMachineList receiver to a v1alpha3 AWSMachineList. 86 func (r *AWSMachineList) ConvertFrom(srcRaw conversion.Hub) error { 87 src := srcRaw.(*infrav1.AWSMachineList) 88 89 return Convert_v1beta1_AWSMachineList_To_v1alpha3_AWSMachineList(src, r, nil) 90 } 91 92 // ConvertTo converts the v1alpha3 AWSMachineTemplate receiver to a v1beta1 AWSMachineTemplate. 93 func (r *AWSMachineTemplate) ConvertTo(dstRaw conversion.Hub) error { 94 dst := dstRaw.(*infrav1.AWSMachineTemplate) 95 if err := Convert_v1alpha3_AWSMachineTemplate_To_v1beta1_AWSMachineTemplate(r, dst, nil); err != nil { 96 return err 97 } 98 // Manually restore data. 99 restored := &infrav1.AWSMachineTemplate{} 100 if ok, err := utilconversion.UnmarshalData(r, restored); err != nil || !ok { 101 return err 102 } 103 104 dst.Spec.Template.ObjectMeta = restored.Spec.Template.ObjectMeta 105 dst.Spec.Template.Spec.Ignition = restored.Spec.Template.Spec.Ignition 106 107 restoreSpec(&restored.Spec.Template.Spec, &dst.Spec.Template.Spec) 108 109 return nil 110 } 111 112 // ConvertFrom converts the v1beta1 AWSMachineTemplate receiver to a v1alpha3 AWSMachineTemplate. 113 func (r *AWSMachineTemplate) ConvertFrom(srcRaw conversion.Hub) error { 114 src := srcRaw.(*infrav1.AWSMachineTemplate) 115 116 if err := Convert_v1beta1_AWSMachineTemplate_To_v1alpha3_AWSMachineTemplate(src, r, nil); err != nil { 117 return err 118 } 119 // Preserve Hub data on down-conversion. 120 if err := utilconversion.MarshalData(src, r); err != nil { 121 return err 122 } 123 return nil 124 } 125 126 // ConvertTo converts the v1alpha3 AWSMachineTemplateList receiver to a v1beta1 AWSMachineTemplateList. 127 func (r *AWSMachineTemplateList) ConvertTo(dstRaw conversion.Hub) error { 128 dst := dstRaw.(*infrav1.AWSMachineTemplateList) 129 130 return Convert_v1alpha3_AWSMachineTemplateList_To_v1beta1_AWSMachineTemplateList(r, dst, nil) 131 } 132 133 // ConvertFrom converts the v1beta1 AWSMachineTemplateList receiver to a v1alpha3 AWSMachineTemplateList. 134 func (r *AWSMachineTemplateList) ConvertFrom(srcRaw conversion.Hub) error { 135 src := srcRaw.(*infrav1.AWSMachineTemplateList) 136 137 return Convert_v1beta1_AWSMachineTemplateList_To_v1alpha3_AWSMachineTemplateList(src, r, nil) 138 } 139 140 // Convert_v1beta1_Volume_To_v1alpha3_Volume . 141 func Convert_v1beta1_Volume_To_v1alpha3_Volume(in *infrav1.Volume, out *Volume, s apiconversion.Scope) error { 142 return autoConvert_v1beta1_Volume_To_v1alpha3_Volume(in, out, s) 143 } 144 145 // Convert_v1beta1_AWSMachineSpec_To_v1alpha3_AWSMachineSpec . 146 func Convert_v1beta1_AWSMachineSpec_To_v1alpha3_AWSMachineSpec(in *infrav1.AWSMachineSpec, out *AWSMachineSpec, s apiconversion.Scope) error { 147 return autoConvert_v1beta1_AWSMachineSpec_To_v1alpha3_AWSMachineSpec(in, out, s) 148 } 149 150 // Convert_v1beta1_Instance_To_v1alpha3_Instance . 151 func Convert_v1beta1_Instance_To_v1alpha3_Instance(in *infrav1.Instance, out *Instance, s apiconversion.Scope) error { 152 return autoConvert_v1beta1_Instance_To_v1alpha3_Instance(in, out, s) 153 } 154 155 // Manually restore the instance root device data. 156 // Assumes restored and dst are non-nil. 157 func restoreInstance(restored, dst *infrav1.Instance) { 158 dst.VolumeIDs = restored.VolumeIDs 159 160 if restored.RootVolume != nil { 161 if dst.RootVolume == nil { 162 dst.RootVolume = &infrav1.Volume{} 163 } 164 RestoreRootVolume(restored.RootVolume, dst.RootVolume) 165 } 166 167 if restored.NonRootVolumes != nil { 168 if dst.NonRootVolumes == nil { 169 dst.NonRootVolumes = []infrav1.Volume{} 170 } 171 restoreNonRootVolumes(restored.NonRootVolumes, dst.NonRootVolumes) 172 } 173 } 174 175 // Convert_v1alpha3_AWSResourceReference_To_v1beta1_AMIReference is a conversion function. 176 func Convert_v1alpha3_AWSResourceReference_To_v1beta1_AMIReference(in *AWSResourceReference, out *infrav1.AMIReference, s apiconversion.Scope) error { 177 out.ID = (*string)(unsafe.Pointer(in.ID)) 178 return nil 179 } 180 181 // Convert_v1beta1_AMIReference_To_v1alpha3_AWSResourceReference is a conversion function. 182 func Convert_v1beta1_AMIReference_To_v1alpha3_AWSResourceReference(in *infrav1.AMIReference, out *AWSResourceReference, s apiconversion.Scope) error { 183 out.ID = (*string)(unsafe.Pointer(in.ID)) 184 return nil 185 } 186 187 // RestoreAMIReference manually restore the EKSOptimizedLookupType for AWSMachine and AWSMachineTemplate 188 // Assumes both restored and dst are non-nil. 189 func RestoreAMIReference(restored, dst *infrav1.AMIReference) { 190 if restored.EKSOptimizedLookupType == nil { 191 return 192 } 193 dst.EKSOptimizedLookupType = restored.EKSOptimizedLookupType 194 } 195 196 // restoreNonRootVolumes manually restores the non-root volumes 197 // Assumes both restoredVolumes and dstVolumes are non-nil. 198 func restoreNonRootVolumes(restoredVolumes, dstVolumes []infrav1.Volume) { 199 // restoring the nonrootvolumes which are missing in dstVolumes 200 // restoring dstVolumes[i].Encrypted to nil in order to avoid v1beta1 --> v1alpha3 --> v1beta1 round trip errors 201 for i := range restoredVolumes { 202 if restoredVolumes[i].Encrypted == nil { 203 if len(dstVolumes) <= i { 204 dstVolumes = append(dstVolumes, restoredVolumes[i]) 205 } else { 206 dstVolumes[i].Encrypted = nil 207 } 208 } 209 dstVolumes[i].Throughput = restoredVolumes[i].Throughput 210 } 211 } 212 213 // RestoreRootVolume manually restores the root volumes. 214 // Assumes both restored and dst are non-nil. 215 // Volume.Encrypted type changed from bool in v1alpha3 to *bool in v1beta1 216 // Volume.Encrypted value as nil/&false in v1beta1 will convert to false in v1alpha3 by auto-conversion, so restoring it to nil in order to avoid v1beta1 --> v1alpha3 --> v1beta1 round trip errors 217 func RestoreRootVolume(restored, dst *infrav1.Volume) { 218 if dst.Encrypted == pointer.BoolPtr(true) { 219 return 220 } 221 if restored.Encrypted == nil { 222 dst.Encrypted = nil 223 } 224 dst.Throughput = restored.Throughput 225 } 226 227 func Convert_v1beta1_AWSMachineTemplateResource_To_v1alpha3_AWSMachineTemplateResource(in *infrav1.AWSMachineTemplateResource, out *AWSMachineTemplateResource, s apiconversion.Scope) error { 228 return autoConvert_v1beta1_AWSMachineTemplateResource_To_v1alpha3_AWSMachineTemplateResource(in, out, s) 229 }