func launchInteractive()

in cmd/launch.go [91:218]


func launchInteractive(h *ec2helper.EC2Helper) {
	var err error
	simpleConfig := config.NewSimpleInfo()
	// Override config with flags if applicable
	config.OverrideConfigWithFlags(simpleConfig, flagConfig)

	if simpleConfig.Region == "" {
		// Ask Region
		region, err := question.AskRegion(h)
		if cli.ShowError(err, "Asking region failed") {
			return
		}
		simpleConfig.Region = *region
	}

	h.ChangeRegion(simpleConfig.Region)

	// Ask Launch Template
	launchTemplateId := &simpleConfig.LaunchTemplateId
	if simpleConfig.LaunchTemplateId == "" {
		launchTemplateId = question.AskLaunchTemplate(h)
	}

	if *launchTemplateId != cli.ResponseNo {
		// Use a launch template in this case.
		simpleConfig.LaunchTemplateId = *launchTemplateId
		UseLaunchTemplate(h, simpleConfig)
		return
	}

	// Not using a launch template if the program is not terminated at the point
	if simpleConfig.InstanceType == "" && !ReadInstanceType(h, simpleConfig) {
		return
	}

	// Ask for image ID, auto-termination timer, and keeping EBS volumes after instance termination
	if simpleConfig.ImageId == "" && !ReadImageId(h, simpleConfig) {
		return
	}

	// Ask for network configuration
	if (simpleConfig.SubnetId == "" || simpleConfig.SecurityGroupIds == nil) &&
		!ReadNetworkConfiguration(h, simpleConfig) {
		return
	}

	// Ask for IAM profile
	if simpleConfig.IamInstanceProfile == "" && !ReadIamProfile(h, simpleConfig) {
		return
	}

	// Ask for user boot data
	if simpleConfig.BootScriptFilePath == "" && !ReadBootScript(h, simpleConfig) {
		return
	}

	// Ask for tags
	if len(simpleConfig.UserTags) == 0 && !ReadUserTags(h, simpleConfig) {
		return
	}

	// Ask for confirmation or modification. Keep asking until the config is confirmed or denied
	var detailedConfig *config.DetailedInfo
	var confirmation string
	for {
		// Parse config first
		detailedConfig, err = h.ParseConfig(simpleConfig)
		if cli.ShowError(err, "Parsing config failed") {
			return
		}

		// Ask for confirmation or modification
		confirmation = question.AskConfirmationWithInput(simpleConfig, detailedConfig, true)

		// The users have confirmed or denied the config
		if confirmation == cli.ResponseYes || confirmation == cli.ResponseNo {
			break
		}

		switch confirmation {
		// Ask questions to modify the config
		case cli.ResourceVpc:
			if !ReadNetworkConfiguration(h, simpleConfig) {
				return
			}
		case cli.ResourceSubnet:
			if !ReadSubnet(h, simpleConfig, *detailedConfig.Subnet.VpcId) {
				return
			}
		case cli.ResourceSubnetPlaceholder:
			if !ReadSubnetPlaceholder(h, simpleConfig) {
				return
			}
		case cli.ResourceSecurityGroup:
			if !ReadSecurityGroups(h, simpleConfig, *detailedConfig.Subnet.VpcId) {
				return
			}
		case cli.ResourceSecurityGroupPlaceholder:
			if !ReadSecurityGroupPlaceholder(h, simpleConfig) {
				return
			}
		case cli.ResourceInstanceType:
			if !ReadInstanceType(h, simpleConfig) {
				return
			}
			if !ReadImageId(h, simpleConfig) {
				return
			}
		case cli.ResourceImage:
			if !ReadImageId(h, simpleConfig) {
				return
			}
		case cli.ResourceKeepEbsVolume:
			ReadKeepEbsVolume(simpleConfig)
		case cli.ResourceAutoTerminationTimer:
			if !ReadAutoTerminationTimer(simpleConfig) {
				return
			}
		}
	}

	// Launch the instance.
	_, err = h.LaunchInstance(simpleConfig, detailedConfig, confirmation == cli.ResponseYes)
	if cli.ShowError(err, "Launching instance failed") {
		return
	}
	ReadSaveConfig(simpleConfig)
}