public DeploymentArguments parseArguments()

in src/main/java/com/awslabs/aws/greengrass/provisioner/implementations/helpers/BasicDeploymentArgumentHelper.java [50:226]


    public DeploymentArguments parseArguments(String[] args) {
        DeploymentArguments deploymentArguments = new DeploymentArguments();

        JCommander.newBuilder()
                .addObject(deploymentArguments)
                .build()
                .parse(args);

        Optional<Config> defaults = globalDefaultHelper.getGlobalDefaults(ggConstants.getDefaultsConf());

        deploymentArguments.architectureString = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.architectureString, typeSafeConfigHelper.getStringDefault(defaults, "conf.architecture"));
        deploymentArguments.groupName = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.groupName, typeSafeConfigHelper.getStringDefault(defaults, "conf.groupName"));
        deploymentArguments.deploymentConfigFilename = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.deploymentConfigFilename, typeSafeConfigHelper.getStringDefault(defaults, "conf.deploymentConfig"));
        deploymentArguments.buildContainer = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.buildContainer, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.containerBuild"));
        deploymentArguments.pushContainer = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.pushContainer, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.containerPush"));
        deploymentArguments.scriptOutput = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.scriptOutput, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.scriptBuild"));
        deploymentArguments.oemOutput = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.oemOutput, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.oemBuild"));
        // deploymentArguments.dockerScriptOutput = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.dockerScriptOutput, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.dockerScriptBuild"));
        deploymentArguments.ecrRepositoryNameString = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.ecrRepositoryNameString, typeSafeConfigHelper.getStringDefault(defaults, "conf.ecrRepositoryName"));
        deploymentArguments.noSystemD = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.noSystemD, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.noSystemD"));
        deploymentArguments.ec2Launch = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.ec2Launch, typeSafeConfigHelper.getStringDefault(defaults, "conf.ec2Launch"));
        deploymentArguments.dockerLaunch = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.dockerLaunch, typeSafeConfigHelper.getBooleanDefault(defaults, "conf.dockerLaunch"));
        deploymentArguments.launch = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.launch, typeSafeConfigHelper.getStringDefault(defaults, "conf.launch"));
        deploymentArguments.s3Bucket = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.s3Bucket, typeSafeConfigHelper.getStringDefault(defaults, "conf.s3Bucket"));
        deploymentArguments.s3Directory = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.s3Directory, typeSafeConfigHelper.getStringDefault(defaults, "conf.s3Directory"));
        deploymentArguments.csr = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.csr, typeSafeConfigHelper.getStringDefault(defaults, "conf.csr"));
        deploymentArguments.certificateArn = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.certificateArn, typeSafeConfigHelper.getStringDefault(defaults, "conf.certificateArn"));
        deploymentArguments.mqttPort = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.mqttPort, typeSafeConfigHelper.getIntegerDefault(defaults, "conf.mqttPort"));

        if (deploymentArguments.pushContainer) {
            // If they want to push a container then we have to build it
            deploymentArguments.buildContainer = true;
        }

        if (deploymentArguments.ec2Launch != null) {
            deploymentArguments.ec2LinuxVersion = getEc2LinuxVersion(deploymentArguments.ec2Launch);
        }

        if ((deploymentArguments.ec2LinuxVersion != null) && deploymentArguments.dockerLaunch && (deploymentArguments.launch != null)) {
            throw new RuntimeException("The EC2 launch, Docker launch, and launch options are mutually exclusive.  Only specify one of them.");
        }

        if (deploymentArguments.ec2LinuxVersion != null) {
            // If we are launching an EC2 instance we need to build the scripts
            if (deploymentArguments.architectureString == null) {
                log.warn("No architecture specified for EC2, defaulting to X86-64");
                deploymentArguments.architectureString = Architecture.X86_64.toString();
            }

            deploymentArguments.scriptOutput = true;

            if (deploymentArguments.buildContainer) {
                throw new RuntimeException("Can't build a container for an EC2 launch");
            }
        }

        if ((deploymentArguments.hsiParameters != null) && deploymentArguments.dockerLaunch) {
            throw new RuntimeException("HSI is not supported in Docker yet");
        }

        if ((deploymentArguments.hsiParameters != null) && (deploymentArguments.certificateArn == null)) {
            throw new RuntimeException("Certificate ARN must be specified when using HSI");
        }

        if ((deploymentArguments.dockerLaunch) || (deploymentArguments.buildContainer)) {
            // Force OEM file output with Docker launch or container build
            deploymentArguments.oemOutput = true;
        }

        if ((deploymentArguments.buildContainer) && (ioHelper.isRunningInDocker())) {
            throw new RuntimeException("Can't build a container from inside of Docker yet");
        }

        if ((deploymentArguments.launch != null)) {
            // Force script file output with Docker launch
            deploymentArguments.scriptOutput = true;
        }

        if (deploymentArguments.groupName == null) {
            if ((deploymentArguments.ec2LinuxVersion != null) && !deploymentArguments.dockerLaunch && (deploymentArguments.launch != null)) {
                throw new RuntimeException("Group name is required for all operations");
            }

            deploymentArguments.groupName = ioHelper.getRandomName();
            // Filter out dot characters, sometimes the library uses the value "jr." which is not allowed in a group name
            deploymentArguments.groupName = deploymentArguments.groupName.replaceAll("\\.", "");
            // Filter out normal apostrophes, and special apostrophes (from "farfetch’d")
            deploymentArguments.groupName = deploymentArguments.groupName.replaceAll("'", "");
            deploymentArguments.groupName = deploymentArguments.groupName.replaceAll("’", "");
            log.info(String.join("", "No group name specified, group name auto-generated [", deploymentArguments.groupName, "]"));
        }

        // Depends on group name being set
        deploymentArguments.ecrImageNameString = typeSafeConfigHelper.getValueOrDefault(deploymentArguments.ecrImageNameString, Optional.of(deploymentArguments.groupName));

        if (deploymentArguments.architectureString != null) {
            deploymentArguments.architecture = getArchitecture(deploymentArguments.architectureString);

            if (deploymentArguments.architecture.equals(Architecture.ARM32)) {
                log.warn("Legacy ARM32 architecture value detected, switching to ARMV7L_RASPBIAN");
                deploymentArguments.architecture = Architecture.ARMV7L_RASPBIAN;
            } else if (deploymentArguments.architecture.equals(Architecture.ARM64)) {
                log.warn("Legacy ARM64 architecture value detected, switching to ARMV8");
                deploymentArguments.architecture = Architecture.ARMV8;
            }
        }

        if ((deploymentArguments.ec2LinuxVersion != null) &&
                (!deploymentArguments.architecture.equals(Architecture.ARMV8) && (!deploymentArguments.architecture.equals(Architecture.X86_64)))) {
            throw new RuntimeException("EC2 launch supports X86_64 and ARMV8 architectures only");
        }

        /*
        if (deploymentArguments.dockerScriptOutput == true) {
            // If they want Docker script output then we have to build a container
            deploymentArguments.buildContainer = true;
        }
        */

        if ((deploymentArguments.buildContainer || deploymentArguments.scriptOutput) && (deploymentArguments.architecture == null)) {
            throw new RuntimeException("Architecture must be specified when building a container or installation script");
        }

        if (deploymentArguments.deploymentConfigFilename == null) {
            throw new RuntimeException("A deployment configuration file name is required");
        }

        if (deploymentArguments.buildContainer) {
            if (!ecrDockerHelper.getDockerfileForArchitecture(deploymentArguments.architecture).exists()) {
                throw new RuntimeException(String.join("", "No dockerfile exists for architecture [", deploymentArguments.architecture.toString(), "]"));
            }
        }

        if (deploymentArguments.buildContainer || deploymentArguments.dockerLaunch) {
            if (!ecrDockerHelper.isDockerAvailable()) {
                throw new RuntimeException("Docker is not available, cannot continue");
            }
        }

        if (deploymentArguments.s3Bucket != null) {
            if (deploymentArguments.oemJsonOutput != null) {
                throw new RuntimeException("S3 output is not supported when using OEM JSON output mode");
            }

            if (deploymentArguments.s3Directory == null) {
                throw new RuntimeException("S3 bucket specified without S3 directory. S3 directory is required. Set S3 directory to '/' to store the output in the root of the bucket.");
            }

            // At this point the S3 options look good, make sure that the bucket exists
            if (!s3Helper.bucketExists(Bucket.builder().name(deploymentArguments.s3Bucket).build())) {
                throw new RuntimeException("Specified S3 bucket does not exist. The bucket must already exist before running the provisioner");
            }
        } else if (deploymentArguments.s3Directory != null) {
            throw new RuntimeException("S3 directory was specified with no S3 bucket. S3 bucket is required.");
        }

        if (deploymentArguments.launch != null) {
            String[] userAndHost = sshHelper.getUserAndHost("launch destination", deploymentArguments.launch);

            deploymentArguments.launchUser = userAndHost[0];
            deploymentArguments.launchHost = userAndHost[1];
        }

        if (deploymentArguments.mqttPort == 0) {
            // No value was set, use the default
            log.warn(String.join("", "No MQTT port value was set, using default [", String.valueOf(DEFAULT_MQTT_PORT), "]"));
            deploymentArguments.mqttPort = DEFAULT_MQTT_PORT;
        }

        if (((!deploymentArguments.scriptOutput) && (!deploymentArguments.oemOutput))
                && (deploymentArguments.mqttPort != DEFAULT_MQTT_PORT)) {
            // No script and OEM files are being generated but a non-default MQTT port was specified
            throw new RuntimeException(String.join("", "A non-default MQTT port was specified [", String.valueOf(deploymentArguments.mqttPort), "] but no output files are being generated. Can not continue. The MQTT port can only be set in the config.json. It cannot be changed from the cloud."));
        }

        return deploymentArguments;
    }