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);
}