private void addDevice()

in src/main/java/com/awslabs/aws/greengrass/provisioner/implementations/helpers/BasicGroupUpdateHelper.java [161:216]


    private void addDevice(UpdateArguments updateArguments, GroupInformation groupInformation) {
        GreengrassGroupName greengrassGroupName = ImmutableGreengrassGroupName.builder().groupName(updateArguments.groupName).build();
        String addDeviceString = updateArguments.addDevice;
        String groupId = groupInformation.id();
        GreengrassGroupId greengrassGroupId = ImmutableGreengrassGroupId.builder().groupId(groupId).build();
        ThingArn thingArn = null;
        ThingName thingName = null;

        boolean isThingArn = addDeviceString.contains("/");

        if (!isThingArn) {
            thingName = ImmutableThingName.builder().name(addDeviceString).build();
            log.info(String.join("", "No thing ARN specified for device [", thingName.getName(), "], will re-use keys if possible"));

            KeysAndCertificate deviceKeysAndCertificate = iotHelper.createKeysAndCertificate(greengrassGroupName, thingName.getName());

            ImmutablePolicyName ggdPolicyName = ImmutablePolicyName.builder().name(String.join("_", thingName.getName(), "Policy")).build();
            CertificateArn certificateArn = deviceKeysAndCertificate.getCertificateArn();
            thingArn = v2IotHelper.createThing(thingName);

            v2IotHelper.createPolicyIfNecessary(ggdPolicyName,
                    ImmutablePolicyDocument.builder().document(policyHelper.buildDevicePolicyDocument(thingArn)).build());
            v2IotHelper.attachPrincipalPolicy(ggdPolicyName, certificateArn);
            v2IotHelper.attachThingPrincipal(thingName, certificateArn);
        } else {
            // Device name looks like a thing ARN
            log.info(String.join("", "[", addDeviceString, "] looks like a thing ARN, attempting to use existing device"));
            thingArn = ImmutableThingArn.builder().arn(addDeviceString).build();
            thingName = ImmutableThingName.builder().name(thingArn.getArn().substring(thingArn.getArn().lastIndexOf('/') + 1)).build();
            log.info(String.join("", "Device name appears to be [", thingName.getName(), "]"));
        }

        Device newDevice = greengrassHelper.getDevice(thingName);

        List<Device> devices = v2GreengrassHelper.getDevices(groupInformation)
                .orElseThrow(() -> new RuntimeException("Group not found, can not continue"));

        ThingArn finalThingArn = thingArn;

        if (devices.stream()
                .anyMatch(device -> device.thingArn().equals(finalThingArn.getArn()))) {
            throw new RuntimeException(String.join("", "Device with thing ARN [", thingArn.getArn(), "] is already part of this Greengrass Group.  Nothing to do."));
        }

        devices.add(newDevice);

        String newDeviceDefinitionVersionArn = greengrassHelper.createDeviceDefinitionAndVersion(ggVariables.getDeviceDefinitionName(greengrassGroupName), devices);

        GroupVersion newGroupVersion = GroupVersion.builder()
                .deviceDefinitionVersionArn(newDeviceDefinitionVersionArn)
                .build();

        Consumer<? super Void> successHandler = (Consumer<Void>) aVoid -> log.info(String.join("", "Device added [", newDevice.thingArn(), ", ", newDevice.certificateArn(), "]"));

        createAndWaitForDeployment(greengrassGroupId, newGroupVersion, successHandler);
    }