@@ -43,7 +43,7 @@ type ImageOptions struct {
4343	DiskFormatOptions  string  `yaml:"diskFormatOptions,omitempty"` 
4444	// Bootloader is the bootloader to use for the disk image. 
4545	// If not set, it defaults to dual-boot. 
46- 	Bootloader  DiskImageBootloader  `yaml:"bootloader"` 
46+ 	Bootloader  BootloaderKind  `yaml:"bootloader,omitempty "` 
4747}
4848
4949// ISOOptions describes options for the 'iso' output. 
@@ -52,6 +52,9 @@ type ISOOptions struct {
5252	// 
5353	// If not set, it defaults to if-safe. 
5454	SDBootEnrollKeys  SDBootEnrollKeys  `yaml:"sdBootEnrollKeys"` 
55+ 	// Bootloader is the bootloader to use for the iso image. 
56+ 	// If not set, it defaults to dual-boot. 
57+ 	Bootloader  BootloaderKind  `yaml:"bootloader,omitempty"` 
5558}
5659
5760// OutputKind is output specification. 
@@ -105,53 +108,73 @@ const (
105108	SDBootEnrollKeysOff                             // off 
106109)
107110
108- // DiskImageBootloader  is a bootloader for the disk image. 
109- type  DiskImageBootloader  int 
111+ // BootloaderKind  is a bootloader for the disk image. 
112+ type  BootloaderKind  int 
110113
111114const  (
112- 	// DiskImageBootloaderDualBoot is the dual-boot bootloader 
115+ 	// BootLoaderKindNone is the zero value. 
116+ 	BootLoaderKindNone  BootloaderKind  =  iota  // none 
117+ 	// BootLoaderKindDualBoot is the dual-boot bootloader. 
113118	// using sd-boot for UEFI and GRUB for BIOS. 
114- 	DiskImageBootloaderDualBoot   DiskImageBootloader   =   iota  // dual-boot 
115- 	// DiskImageBootloaderSDBoot  is the sd-boot bootloader. 
116- 	DiskImageBootloaderSDBoot  // sd-boot 
117- 	// DiskImageBootloaderGrub  is the GRUB bootloader. 
118- 	DiskImageBootloaderGrub  // grub 
119+ 	BootLoaderKindDualBoot  // dual-boot 
120+ 	// BootLoaderKindSDBoot  is the sd-boot bootloader. 
121+ 	BootLoaderKindSDBoot  // sd-boot 
122+ 	// BootLoaderKindGrub  is the GRUB bootloader. 
123+ 	BootLoaderKindGrub  // grub 
119124)
120125
121126// FillDefaults fills default values for the output. 
122127func  (o  * Output ) FillDefaults (arch , version  string , secureboot  bool ) {
123- 	if  o .Kind  ==  OutKindImage  {
128+ 	switch  o .Kind  { //nolint:exhaustive 
129+ 	case  OutKindImage :
124130		if  o .ImageOptions  ==  nil  {
125131			o .ImageOptions  =  & ImageOptions {}
126132		}
127133
128- 		useSDBoot  :=  quirks .New (version ).UseSDBootForUEFI ()
129- 
130- 		switch  {
131- 		case  o .ImageOptions .Bootloader  !=  DiskImageBootloaderDualBoot :
132- 			// allow user to override bootloader 
133- 		case  secureboot :
134- 			// secureboot is always using sd-boot 
135- 			o .ImageOptions .Bootloader  =  DiskImageBootloaderSDBoot 
136- 		case  arch  ==  "arm64"  &&  useSDBoot :
137- 			// arm64 always uses sd-boot for Talos >= 1.10 
138- 			o .ImageOptions .Bootloader  =  DiskImageBootloaderSDBoot 
139- 		case  ! useSDBoot :
140- 			// legacy versions of Talos use GRUB for BIOS/UEFI 
141- 			o .ImageOptions .Bootloader  =  DiskImageBootloaderGrub 
142- 		default :
143- 			// Default to dual-boot. 
144- 			o .ImageOptions .Bootloader  =  DiskImageBootloaderDualBoot 
145- 		}
134+ 		o .ImageOptions .Bootloader  =  o .selectBootloader (o .ImageOptions .Bootloader , arch , version , secureboot )
146135
147136		ps  :=  quirks .New (version ).PartitionSizes ()
148137
149138		// bump default image size for expanded boot 
150139		o .ImageOptions .DiskSize  +=  int64 (ps .GrubBootSize ()) -  1000 * 1024 * 1024  // 1000 MiB 
151140
152- 		if  o .ImageOptions .Bootloader  ==  DiskImageBootloaderDualBoot  {
141+ 		if  o .ImageOptions .Bootloader  ==  BootLoaderKindDualBoot  {
153142			// add extra space for BIOS and BOOT partitions 
154143			o .ImageOptions .DiskSize  +=  int64 (ps .GrubBIOSSize ()) +  int64 (ps .GrubBootSize ())
155144		}
145+ 
146+ 	case  OutKindISO :
147+ 		if  ! quirks .New (version ).ISOSupportsSettingBootloader () {
148+ 			return 
149+ 		}
150+ 
151+ 		if  o .ISOOptions  ==  nil  {
152+ 			o .ISOOptions  =  & ISOOptions {}
153+ 		}
154+ 
155+ 		o .ISOOptions .Bootloader  =  o .selectBootloader (o .ISOOptions .Bootloader , arch , version , secureboot )
156+ 	}
157+ }
158+ 
159+ func  (o  * Output ) selectBootloader (current  BootloaderKind , arch , version  string , secureboot  bool ) BootloaderKind  {
160+ 	useSDBoot  :=  quirks .New (version ).UseSDBootForUEFI ()
161+ 
162+ 	switch  {
163+ 	case  secureboot :
164+ 		// secureboot is always using sd-boot 
165+ 		return  BootLoaderKindSDBoot 
166+ 	case  arch  ==  "arm64"  &&  useSDBoot :
167+ 		// arm64 always uses sd-boot for Talos >= 1.10 
168+ 		return  BootLoaderKindSDBoot 
169+ 	case  ! useSDBoot :
170+ 		// legacy versions of Talos use GRUB for BIOS/UEFI 
171+ 		return  BootLoaderKindGrub 
172+ 	default :
173+ 		// Default to dual-boot if not overridden. 
174+ 		if  current  ==  BootLoaderKindNone  {
175+ 			return  BootLoaderKindDualBoot 
176+ 		}
177+ 
178+ 		return  current 
156179	}
157180}
0 commit comments