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  }