in projects/aws/image-builder/cmd/build.go [71:322]
func ValidateInputs(bo *builder.BuildOptions) error {
if bo.Os != builder.Ubuntu && bo.Os != builder.RedHat {
log.Fatalf("Invalid OS type. Please choose ubuntu or redhat")
}
if err = validateSupportedHypervisors(bo.Hypervisor); err != nil {
log.Fatal(err.Error())
}
if err = validateOSHypervisorCombinations(bo.Os, bo.Hypervisor); err != nil {
log.Fatal(err.Error())
}
if bo.AnsibleVerbosity < 0 || bo.AnsibleVerbosity > 6 {
log.Fatalf("Invalid Ansible verbosity level. Please provide a value in the range 0 to 6")
}
if bo.Os == builder.Ubuntu && bo.OsVersion == "" {
// maintain previous default
bo.OsVersion = "20.04"
}
if bo.Os == builder.RedHat && bo.OsVersion == "" {
// maintain previous default
bo.OsVersion = "8"
}
if bo.Hypervisor != builder.Nutanix && bo.Hypervisor != builder.CloudStack && bo.Hypervisor != builder.Baremetal && bo.Os == builder.RedHat && bo.OsVersion != "8" && bo.OsVersion != "9" {
log.Fatalf("Invalid OS version for RedHat. Please choose 8 or 9")
}
if err = validateOSVersion(bo.Os, bo.OsVersion); err != nil {
log.Fatal(err.Error())
}
if err = validateFirmware(bo.Firmware, bo.Os, bo.OsVersion, bo.Hypervisor); err != nil {
log.Fatal(err.Error())
}
// Setting default to bios for everything but ubuntu/rhel 9 raw since that defaults to efi
if bo.Firmware == "" {
if bo.Hypervisor == builder.Baremetal && (bo.Os == builder.Ubuntu ||
(bo.Os == builder.RedHat && builder.SliceContains(builder.SupportedRedHatEfiVersions, bo.OsVersion))) {
bo.Firmware = builder.EFI
} else {
bo.Firmware = builder.BIOS
}
}
// Airgapped
if bo.AirGapped {
if bo.ManifestTarball == "" {
log.Fatalf("Please provide --manifest-tarball when running air-gapped builds")
}
if bo.Os != builder.Ubuntu {
log.Fatalf("Only Ubuntu os is supported for air-gapped builds")
}
if bo.Hypervisor == builder.AMI {
log.Fatalf("AMI hypervisor not supported for air-gapped builds")
}
}
configPath := ""
switch bo.Hypervisor {
case builder.VSphere:
configPath = vSphereConfigFile
case builder.Baremetal:
configPath = baremetalConfigFile
case builder.Nutanix:
configPath = nutanixConfigFile
case builder.CloudStack:
configPath = cloudstackConfigFile
case builder.AMI:
configPath = amiConfigFile
}
bo.Os = strings.ToLower(bo.Os)
bo.Hypervisor = strings.ToLower(bo.Hypervisor)
if bo.OsVersion != "" {
// From this point forward use 2004 instead of 20.04 for Ubuntu versions to upstream image-builder
bo.OsVersion = strings.ReplaceAll(bo.OsVersion, ".", "")
}
if configPath == "" {
if bo.Hypervisor == builder.VSphere ||
(bo.Hypervisor == builder.Baremetal && bo.Os == builder.RedHat) ||
(bo.Hypervisor == builder.Nutanix) ||
(bo.Hypervisor == builder.CloudStack) {
return fmt.Errorf("%s-config is a required flag for %s hypervisor or when os is redhat", bo.Hypervisor, bo.Hypervisor)
}
} else {
configPath, err = filepath.Abs(configPath)
if err != nil {
return fmt.Errorf("Error converting %s config file path to absolute path: %v", bo.Hypervisor, err)
}
config, err := os.ReadFile(configPath)
if err != nil {
return fmt.Errorf("Error reading %s config file: %v", bo.Hypervisor, err)
}
switch bo.Hypervisor {
case builder.VSphere:
if err = json.Unmarshal(config, &bo.VsphereConfig); err != nil {
return err
}
if bo.Os == builder.RedHat {
if err = validateRedhat(&bo.VsphereConfig.RhelConfig, bo.VsphereConfig.IsoUrl); err != nil {
return err
}
}
if bo.VsphereConfig.IsoUrl != "" {
if err = validateCustomIso(bo.VsphereConfig.IsoChecksum, bo.VsphereConfig.IsoChecksumType); err != nil {
return err
}
}
if err = validateRHSM(bo.Os, &bo.VsphereConfig.RhsmConfig); err != nil {
return err
}
if bo.AirGapped {
if err = validateAirGapped(&bo.VsphereConfig.AirGappedConfig,
bo.VsphereConfig.ExtraRepos, bo.VsphereConfig.IsoUrl); err != nil {
return err
}
}
case builder.Baremetal:
if err = json.Unmarshal(config, &bo.BaremetalConfig); err != nil {
return err
}
if bo.Os == builder.RedHat {
if err = validateRedhat(&bo.BaremetalConfig.RhelConfig, bo.BaremetalConfig.IsoUrl); err != nil {
return err
}
}
if bo.BaremetalConfig != nil && bo.BaremetalConfig.IsoUrl != "" {
if err = validateCustomIso(bo.BaremetalConfig.IsoChecksum, bo.BaremetalConfig.IsoChecksumType); err != nil {
return err
}
}
if err = validateRHSM(bo.Os, &bo.BaremetalConfig.RhsmConfig); err != nil {
return err
}
if bo.AirGapped {
if err = validateAirGapped(&bo.BaremetalConfig.AirGappedConfig,
bo.BaremetalConfig.ExtraRepos, bo.BaremetalConfig.IsoUrl); err != nil {
return err
}
}
case builder.Nutanix:
if err = json.Unmarshal(config, &bo.NutanixConfig); err != nil {
return err
}
if bo.Os == builder.RedHat {
if err = validateRedhat(&bo.NutanixConfig.RhelConfig, "Don't check IsoUrl Param"); err != nil {
return err
}
}
if bo.NutanixConfig.NutanixUserName == "" || bo.NutanixConfig.NutanixPassword == "" {
log.Fatalf("\"nutanix_username\" and \"nutanix_password\" are required fields in nutanix-config")
}
if bo.AirGapped {
if err = validateAirGapped(&bo.NutanixConfig.AirGappedConfig,
bo.NutanixConfig.ExtraRepos, bo.NutanixConfig.ImageName); err != nil {
return err
}
}
if bo.NutanixConfig.ImageSizeGb != "" {
imageSizeGb, err := strconv.Atoi(bo.NutanixConfig.ImageSizeGb)
if err != nil {
return fmt.Errorf("invalid image size: %v", err)
}
if imageSizeGb < 0 {
return fmt.Errorf("image size must be a positive integer")
}
}
// TODO Validate other fields as well
case builder.CloudStack:
if err = json.Unmarshal(config, &bo.CloudstackConfig); err != nil {
return err
}
if bo.Os == builder.RedHat {
if err = validateRedhat(&bo.CloudstackConfig.RhelConfig, bo.CloudstackConfig.IsoUrl); err != nil {
return err
}
}
if bo.CloudstackConfig.IsoUrl != "" {
if err = validateCustomIso(bo.CloudstackConfig.IsoChecksum, bo.CloudstackConfig.IsoChecksumType); err != nil {
return err
}
}
if err = validateRHSM(bo.Os, &bo.CloudstackConfig.RhsmConfig); err != nil {
return err
}
if bo.AirGapped {
if err = validateAirGapped(&bo.CloudstackConfig.AirGappedConfig,
bo.CloudstackConfig.ExtraRepos, bo.CloudstackConfig.IsoUrl); err != nil {
return err
}
}
case builder.AMI:
// Default configuration for AMI builds
amiFilter := builder.DefaultUbuntu2004AMIFilterName
if bo.OsVersion == "2204" {
amiFilter = builder.DefaultUbuntu2204AMIFilterName
}
amiConfig := &builder.AMIConfig{
AMIFilterName: amiFilter,
AMIFilterOwners: builder.DefaultUbuntuAMIFilterOwners,
AMIRegions: builder.DefaultAMIBuildRegion,
AWSRegion: builder.DefaultAMIBuildRegion,
BuilderInstanceType: builder.DefaultAMIBuilderInstanceType,
ManifestOutput: builder.DefaultAMIManifestOutput,
RootDeviceName: builder.DefaultAMIRootDeviceName,
VolumeSize: builder.DefaultAMIVolumeSize,
VolumeType: builder.DefaultAMIVolumeType,
}
if err = json.Unmarshal(config, amiConfig); err != nil {
return err
}
bo.AMIConfig = amiConfig
bo.FilesConfig = &builder.AdditionalFilesConfig{
FileVars: builder.FileVars{
AdditionalFiles: "true",
AdditionalFilesList: builder.DefaultAMIAdditionalFiles,
},
}
}
}
if additionalFilesConfigFile != "" {
filesConfig, err := os.ReadFile(additionalFilesConfigFile)
if err != nil {
return fmt.Errorf("Error reading additional files config path: %v", err)
}
if err = json.Unmarshal(filesConfig, &bo.FilesConfig); err != nil {
return err
}
bo.FilesConfig.ProcessAdditionalFiles()
if bo.AMIConfig != nil && !builder.SameFilesProvided(bo.FilesConfig.AdditionalFilesList, builder.DefaultAMIAdditionalFiles) {
bo.FilesConfig.AdditionalFilesList = append(bo.FilesConfig.AdditionalFilesList, builder.DefaultAMIAdditionalFiles...)
}
}
return nil
}