@@ -79,7 +79,7 @@ func retryIfTransient(err error, logger logr.Logger) (ctrl.Result, error) {
7979 return ctrl.Result {RequeueAfter : reconciler .WithJitter (reconciler .DefaultMachineControllerRetryDelay )}, nil
8080}
8181
82- func fillCreateConfig (createConfig * linodego.InstanceCreateOptions , machineScope * scope.MachineScope ) {
82+ func fillCreateConfig (ctx context. Context , createConfig * linodego.InstanceCreateOptions , machineScope * scope.MachineScope ) error {
8383 // This will only be empty if no interfaces or linodeInterfaces were specified in the LinodeMachine spec.
8484 // In that case we default to legacy interfaces.
8585 switch createConfig .InterfaceGeneration {
@@ -115,9 +115,21 @@ func fillCreateConfig(createConfig *linodego.InstanceCreateOptions, machineScope
115115 if createConfig .Image == "" {
116116 createConfig .Image = reconciler .DefaultMachineControllerLinodeImage
117117 }
118- if createConfig .RootPass == "" {
118+
119+ // You can now omit the root pass entirely during instance creation
120+ // as long as you supply at least one SSH key.
121+ if createConfig .RootPass == "" && len (createConfig .AuthorizedKeys ) == 0 {
119122 createConfig .RootPass = uuid .NewString ()
120123 }
124+
125+ // dynamically calculate root disk size unless an explicit OS disk is being set
126+ diskSize , err := calculateRootDisk (ctx , machineScope )
127+ if err != nil {
128+ return err
129+ }
130+ createConfig .BootSize = ptr .To (diskSize )
131+
132+ return nil
121133}
122134
123135func newCreateConfig (ctx context.Context , machineScope * scope.MachineScope , gzipCompressionEnabled bool , logger logr.Logger ) (* linodego.InstanceCreateOptions , error ) {
@@ -135,7 +147,9 @@ func newCreateConfig(ctx context.Context, machineScope *scope.MachineScope, gzip
135147 return nil , err
136148 }
137149
138- fillCreateConfig (createConfig , machineScope )
150+ if err := fillCreateConfig (ctx , createConfig , machineScope ); err != nil {
151+ return nil , err
152+ }
139153
140154 // Configure VPC interface if needed
141155 if err := configureVPCInterface (ctx , machineScope , createConfig , logger ); err != nil {
@@ -989,7 +1003,7 @@ func constructLinodeInterfaceCreateOpts(createOpts []infrav1alpha2.LinodeInterfa
9891003 firewallID = iface .FirewallID
9901004 }
9911005 if firewallID != nil {
992- ifaceCreateOpts .FirewallID = ptr . To ( firewallID )
1006+ ifaceCreateOpts .FirewallID = firewallID
9931007 }
9941008 // createOpts is now fully populated with the interface options
9951009 linodeInterfaces [idx ] = ifaceCreateOpts
@@ -1290,9 +1304,6 @@ func configureDisks(ctx context.Context, logger logr.Logger, machineScope *scope
12901304 return nil
12911305 }
12921306
1293- if err := resizeRootDisk (ctx , logger , machineScope , linodeInstanceID ); err != nil {
1294- return err
1295- }
12961307 if ! reconciler .ConditionTrue (machineScope .LinodeMachine .GetCondition (ConditionPreflightAdditionalDisksCreated )) {
12971308 if err := createDisks (ctx , logger , machineScope , linodeInstanceID ); err != nil {
12981309 return err
@@ -1381,90 +1392,19 @@ func configureDisk(ctx context.Context, logger logr.Logger, machineScope *scope.
13811392 return nil
13821393}
13831394
1384- func resizeRootDisk (ctx context.Context , logger logr.Logger , machineScope * scope.MachineScope , linodeInstanceID int ) error {
1385- if reconciler .ConditionTrue (machineScope .LinodeMachine .GetCondition (ConditionPreflightRootDiskResized )) {
1386- return nil
1387- }
1388-
1389- instanceConfig , err := getDefaultInstanceConfig (ctx , machineScope , linodeInstanceID )
1390- if err != nil {
1391- logger .Error (err , "Failed to get default instance configuration" )
1392-
1393- machineScope .LinodeMachine .SetCondition (metav1.Condition {
1394- Type : ConditionPreflightRootDiskResized ,
1395- Status : metav1 .ConditionFalse ,
1396- Reason : util .CreateError ,
1397- Message : err .Error (),
1398- })
1399- return err
1400- }
1401-
1402- if instanceConfig .Devices .SDA == nil {
1403- machineScope .LinodeMachine .SetCondition (metav1.Condition {
1404- Type : ConditionPreflightRootDiskResized ,
1405- Status : metav1 .ConditionFalse ,
1406- Reason : util .CreateError ,
1407- Message : "root disk not yet ready" ,
1408- })
1409-
1410- return errors .New ("root disk not yet ready" )
1411- }
1412-
1413- rootDiskID := instanceConfig .Devices .SDA .DiskID
1414-
1415- // carve out space for the etcd disk
1416- if ! reconciler .ConditionTrue (machineScope .LinodeMachine .GetCondition (ConditionPreflightRootDiskResizing )) {
1417- rootDisk , err := machineScope .LinodeClient .GetInstanceDisk (ctx , linodeInstanceID , rootDiskID )
1418- if err != nil {
1419- logger .Error (err , "Failed to get root disk for instance" )
1420-
1421- machineScope .LinodeMachine .SetCondition (metav1.Condition {
1422- Type : ConditionPreflightRootDiskResizing ,
1423- Status : metav1 .ConditionFalse ,
1424- Reason : util .CreateError ,
1425- Message : err .Error (),
1426- })
1427-
1428- return err
1429- }
1430- // dynamically calculate root disk size unless an explicit OS disk is being set
1431- diskSize := calculateRootDisk (machineScope , rootDisk )
1432-
1433- if err := machineScope .LinodeClient .ResizeInstanceDisk (ctx , linodeInstanceID , rootDiskID , diskSize ); err != nil {
1434- machineScope .LinodeMachine .SetCondition (metav1.Condition {
1435- Type : ConditionPreflightRootDiskResizing ,
1436- Status : metav1 .ConditionFalse ,
1437- Reason : util .CreateError ,
1438- Message : err .Error (),
1439- })
1440- return err
1441- }
1442- machineScope .LinodeMachine .SetCondition (metav1.Condition {
1443- Type : ConditionPreflightRootDiskResizing ,
1444- Status : metav1 .ConditionTrue ,
1445- Reason : "RootDiskResizing" ,
1446- })
1447- }
1448-
1449- machineScope .LinodeMachine .DeleteCondition (ConditionPreflightRootDiskResizing )
1450- machineScope .LinodeMachine .SetCondition (metav1.Condition {
1451- Type : ConditionPreflightRootDiskResized ,
1452- Status : metav1 .ConditionTrue ,
1453- Reason : "RootDiskResized" ,
1454- })
1455-
1456- return nil
1457- }
1458-
1459- func calculateRootDisk (machineScope * scope.MachineScope , rootDisk * linodego.InstanceDisk ) int {
1395+ func calculateRootDisk (ctx context.Context , machineScope * scope.MachineScope ) (int , error ) {
14601396 additionalDiskSize := 0
1461- // If the user has specified an OS disk, use it's size.
1397+ // If the user has specified an OS disk, use its size.
14621398 if machineScope .LinodeMachine .Spec .OSDisk != nil {
1463- return int (machineScope .LinodeMachine .Spec .OSDisk .Size .ScaledValue (resource .Mega ))
1399+ return int (machineScope .LinodeMachine .Spec .OSDisk .Size .ScaledValue (resource .Mega )), nil
1400+ }
1401+ // If no DataDisks are specified, use the default root disk size for the selected plan type.
1402+ planType , err := machineScope .LinodeClient .GetType (ctx , machineScope .LinodeMachine .Spec .Type )
1403+ if err != nil {
1404+ return 0 , err
14641405 }
1465- // If no DataDisks are specified, use the default root disk size.
14661406 if machineScope .LinodeMachine .Spec .DataDisks == nil {
1467- return rootDisk . Size
1407+ return planType . Disk , nil
14681408 }
14691409 // If DataDisks are specified, calculate the size of the additional disk + root disk for resizing.
14701410 if machineScope .LinodeMachine .Spec .DataDisks .SDB != nil {
@@ -1488,8 +1428,9 @@ func calculateRootDisk(machineScope *scope.MachineScope, rootDisk *linodego.Inst
14881428 if machineScope .LinodeMachine .Spec .DataDisks .SDH != nil {
14891429 additionalDiskSize += int (machineScope .LinodeMachine .Spec .DataDisks .SDH .Size .ScaledValue (resource .Mega ))
14901430 }
1491- diskSize := rootDisk .Size - additionalDiskSize
1492- return diskSize
1431+ diskSize := planType .Disk - additionalDiskSize
1432+
1433+ return diskSize , nil
14931434}
14941435
14951436func updateInstanceConfigProfile (ctx context.Context , logger logr.Logger , machineScope * scope.MachineScope , linodeInstanceID int ) error {
@@ -1638,7 +1579,7 @@ func configureFirewall(ctx context.Context, machineScope *scope.MachineScope, cr
16381579
16391580 // If using LinodeInterfaces that needs to know about the firewall ID
16401581 for i := range createConfig .LinodeInterfaces {
1641- createConfig .LinodeInterfaces [i ].FirewallID = ptr .To (ptr . To ( fwID ) )
1582+ createConfig .LinodeInterfaces [i ].FirewallID = ptr .To (fwID )
16421583 }
16431584
16441585 return nil
0 commit comments