func ValidateInputs()

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
}