use of com.aws.greengrass.config.Topics in project aws-greengrass-nucleus by aws-greengrass.
the class GenericExternalService method addEnv.
protected void addEnv(Exec exec, Topics src) {
if (src == null) {
return;
}
// add parents contributions first
addEnv(exec, src.parent);
Node env = src.getChild(SETENV_CONFIG_NAMESPACE);
if (env instanceof Topics) {
((Topics) env).forEach(n -> {
if (n instanceof Topic) {
exec.setenv(n.getName(), Coerce.toString(((Topic) n).getOnce()));
}
});
}
}
use of com.aws.greengrass.config.Topics in project aws-greengrass-nucleus by aws-greengrass.
the class Kernel method locateExternalPlugin.
@SuppressWarnings({ "PMD.AvoidCatchingThrowable", "PMD.CloseResource" })
private Class<?> locateExternalPlugin(String name, Topics serviceRootTopics) throws ServiceLoadException {
ComponentIdentifier componentId = ComponentIdentifier.fromServiceTopics(serviceRootTopics);
Path pluginJar;
try {
pluginJar = nucleusPaths.artifactPath(componentId).resolve(componentId.getName() + JAR_FILE_EXTENSION);
} catch (IOException e) {
throw new ServiceLoadException(e);
}
if (!pluginJar.toFile().exists() || !pluginJar.toFile().isFile()) {
throw new ServiceLoadException(String.format("Unable to find %s because %s does not exist", name, pluginJar));
}
Topic storedDigest = config.find(SERVICES_NAMESPACE_TOPIC, MAIN_SERVICE_NAME, GreengrassService.RUNTIME_STORE_NAMESPACE_TOPIC, SERVICE_DIGEST_TOPIC_KEY, componentId.toString());
if (storedDigest == null || storedDigest.getOnce() == null) {
logger.atError("plugin-load-error").kv(GreengrassService.SERVICE_NAME_KEY, name).log("Local external plugin is not supported by this greengrass version");
throw new ServiceLoadException("Custom plugins is not supported by this greengrass version");
}
ComponentStore componentStore = context.get(ComponentStore.class);
if (!componentStore.validateComponentRecipeDigest(componentId, Coerce.toString(storedDigest))) {
logger.atError("plugin-load-error").kv(GreengrassService.SERVICE_NAME_KEY, name).log("Local plugin does not match the version in cloud!!");
throw new ServiceLoadException("Plugin has been modified after it was downloaded");
}
Class<?> clazz;
try {
AtomicReference<Class<?>> classReference = new AtomicReference<>();
EZPlugins ezPlugins = context.get(EZPlugins.class);
ezPlugins.loadPlugin(pluginJar, (sc) -> sc.matchClassesWithAnnotation(ImplementsService.class, (c) -> {
// Only use the class whose name matches what we want
ImplementsService serviceImplementation = c.getAnnotation(ImplementsService.class);
if (serviceImplementation.name().equals(name)) {
if (classReference.get() != null) {
logger.atWarn().log("Multiple classes implementing service found in {} " + "for component {}. Using the first one found: {}", pluginJar, name, classReference.get());
return;
}
classReference.set(c);
}
}));
clazz = classReference.get();
} catch (Throwable e) {
throw new ServiceLoadException(String.format("Unable to load %s as a plugin", name), e);
}
if (clazz == null) {
throw new ServiceLoadException(String.format("Unable to find %s. Could not find any ImplementsService annotation with the same name.", name));
}
return clazz;
}
use of com.aws.greengrass.config.Topics in project aws-greengrass-nucleus by aws-greengrass.
the class AuthenticationHandler method generateAuthenticationToken.
private String generateAuthenticationToken(String clientIdentifier) {
String authenticationToken = Utils.generateRandomString(16).toUpperCase();
Topics tokenTopics = config.lookupTopics(GreengrassService.SERVICES_NAMESPACE_TOPIC, AUTHENTICATION_TOKEN_LOOKUP_KEY);
tokenTopics.withParentNeedsToKnow(false);
Topic tokenTopic = tokenTopics.createLeafChild(authenticationToken);
// generating a new token in that case
if (tokenTopic.getOnce() == null) {
tokenTopic.withValue(clientIdentifier);
return authenticationToken;
} else {
return generateAuthenticationToken(clientIdentifier);
}
}
use of com.aws.greengrass.config.Topics in project aws-greengrass-nucleus by aws-greengrass.
the class AuthenticationHandler method registerAuthenticationToken.
/**
* Register an authentication token for the given service.
*
* @param s service to generate an authentication token for
*/
public static void registerAuthenticationToken(GreengrassService s) {
Topic uid = s.getPrivateConfig().createLeafChild(SERVICE_UNIQUE_ID_KEY).withParentNeedsToKnow(false);
String authenticationToken = Utils.generateRandomString(16).toUpperCase();
uid.withValue(authenticationToken);
Topics tokenTopics = s.getServiceConfig().parent.lookupTopics(AUTHENTICATION_TOKEN_LOOKUP_KEY);
tokenTopics.withParentNeedsToKnow(false);
Topic tokenTopic = tokenTopics.createLeafChild(authenticationToken);
// generating a new token in that case
if (tokenTopic.getOnce() == null) {
tokenTopic.withValue(s.getServiceName());
} else {
registerAuthenticationToken(s);
}
}
use of com.aws.greengrass.config.Topics in project aws-greengrass-nucleus by aws-greengrass.
the class DeploymentServiceTest method GIVEN_deployment_job_with_auto_rollback_not_requested_WHEN_deployment_process_fails_THEN_report_failed_job_status.
@Test
void GIVEN_deployment_job_with_auto_rollback_not_requested_WHEN_deployment_process_fails_THEN_report_failed_job_status() throws Exception {
String deploymentDocument = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("TestDeploymentDocument.json"), StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n"));
deploymentQueue.offer(new Deployment(deploymentDocument, Deployment.DeploymentType.IOT_JOBS, TEST_JOB_ID_1));
Topics allGroupTopics = mock(Topics.class);
Topics groupMembershipTopics = mock(Topics.class);
Topics deploymentGroupTopics = mock(Topics.class);
when(allGroupTopics.lookupTopics(EXPECTED_GROUP_NAME)).thenReturn(deploymentGroupTopics);
when(config.lookupTopics(GROUP_MEMBERSHIP_TOPICS)).thenReturn(groupMembershipTopics);
when(config.lookupTopics(GROUP_TO_ROOT_COMPONENTS_TOPICS)).thenReturn(allGroupTopics);
when(config.lookupTopics(COMPONENTS_TO_GROUPS_TOPICS)).thenReturn(mockComponentsToGroupPackages);
mockFuture.complete(new DeploymentResult(DeploymentStatus.FAILED_ROLLBACK_NOT_REQUESTED, null));
when(mockExecutorService.submit(any(DefaultDeploymentTask.class))).thenReturn(mockFuture);
startDeploymentServiceInAnotherThread();
verify(mockExecutorService, timeout(1000)).submit(any(DefaultDeploymentTask.class));
verify(deploymentStatusKeeper, timeout(2000)).persistAndPublishDeploymentStatus(eq(TEST_JOB_ID_1), eq(Deployment.DeploymentType.IOT_JOBS), eq(JobStatus.IN_PROGRESS.toString()), any());
verify(deploymentStatusKeeper, timeout(2000)).persistAndPublishDeploymentStatus(eq(TEST_JOB_ID_1), eq(Deployment.DeploymentType.IOT_JOBS), eq(JobStatus.FAILED.toString()), any());
ArgumentCaptor<Map<String, Object>> mapCaptor = ArgumentCaptor.forClass(Map.class);
verify(deploymentGroupTopics).replaceAndWait(mapCaptor.capture());
Map<String, Object> groupToRootPackages = mapCaptor.getValue();
assertThat(groupToRootPackages, is(IsNull.notNullValue()));
assertThat(groupToRootPackages.entrySet(), IsNot.not(IsEmptyCollection.empty()));
assertThat(groupToRootPackages, hasKey(EXPECTED_ROOT_PACKAGE_NAME));
Map<String, Object> rootComponentDetails = (Map<String, Object>) groupToRootPackages.get(EXPECTED_ROOT_PACKAGE_NAME);
assertThat(rootComponentDetails, hasEntry("groupConfigArn", "arn:aws:greengrass:us-east-1:12345678910:configuration:thinggroup/group1:1"));
assertThat(rootComponentDetails, hasEntry("groupConfigName", "thinggroup/group1"));
assertThat(rootComponentDetails, hasEntry("version", "1.0.0"));
}
Aggregations