Search in sources :

Example 21 with Topics

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()));
            }
        });
    }
}
Also used : Topics(com.aws.greengrass.config.Topics) Node(com.aws.greengrass.config.Node) Topic(com.aws.greengrass.config.Topic)

Example 22 with Topics

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;
}
Also used : Path(java.nio.file.Path) Arrays(java.util.Arrays) Deployment(com.aws.greengrass.deployment.model.Deployment) SERVICE_LIFECYCLE_NAMESPACE_TOPIC(com.aws.greengrass.lifecyclemanager.GreengrassService.SERVICE_LIFECYCLE_NAMESPACE_TOPIC) BootstrapManager(com.aws.greengrass.deployment.bootstrap.BootstrapManager) YAMLMapper(com.fasterxml.jackson.dataformat.yaml.YAMLMapper) Map(java.util.Map) LogManager(com.aws.greengrass.logging.impl.LogManager) DeploymentCapability(com.amazon.aws.iot.greengrass.configuration.common.DeploymentCapability) Path(java.nio.file.Path) Configuration(com.aws.greengrass.config.Configuration) Node(com.aws.greengrass.config.Node) Collection(java.util.Collection) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ScheduledThreadPoolExecutor(java.util.concurrent.ScheduledThreadPoolExecutor) Pair(com.aws.greengrass.util.Pair) Executors(java.util.concurrent.Executors) SERVICES_NAMESPACE_TOPIC(com.aws.greengrass.lifecyclemanager.GreengrassService.SERVICES_NAMESPACE_TOPIC) Topics(com.aws.greengrass.config.Topics) CrashableFunction(com.aws.greengrass.util.CrashableFunction) NucleusPaths(com.aws.greengrass.util.NucleusPaths) List(java.util.List) Writer(java.io.Writer) ImplementsService(com.aws.greengrass.dependency.ImplementsService) CommitableWriter(com.aws.greengrass.util.CommitableWriter) ComponentStore(com.aws.greengrass.componentmanager.ComponentStore) ComponentIdentifier(com.aws.greengrass.componentmanager.models.ComponentIdentifier) ProxyUtils(com.aws.greengrass.util.ProxyUtils) DependencyOrder(com.aws.greengrass.util.DependencyOrder) Setter(lombok.Setter) DeploymentDirectoryManager(com.aws.greengrass.deployment.DeploymentDirectoryManager) VERSION_CONFIG_KEY(com.aws.greengrass.componentmanager.KernelConfigResolver.VERSION_CONFIG_KEY) Getter(lombok.Getter) InputValidationException(com.aws.greengrass.lifecyclemanager.exceptions.InputValidationException) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) JsonGenerator(com.fasterxml.jackson.core.JsonGenerator) EZPlugins(com.aws.greengrass.dependency.EZPlugins) DeploymentQueue(com.aws.greengrass.deployment.DeploymentQueue) HashMap(java.util.HashMap) Singleton(javax.inject.Singleton) DeviceConfiguration(com.aws.greengrass.deployment.DeviceConfiguration) Coerce(com.aws.greengrass.util.Coerce) Constructor(java.lang.reflect.Constructor) AtomicReference(java.util.concurrent.atomic.AtomicReference) Platform(com.aws.greengrass.util.platforms.Platform) HashSet(java.util.HashSet) MAIN_SERVICE_NAME(com.aws.greengrass.lifecyclemanager.KernelCommandLine.MAIN_SERVICE_NAME) AccessLevel(lombok.AccessLevel) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) JAR_FILE_EXTENSION(com.aws.greengrass.dependency.EZPlugins.JAR_FILE_EXTENSION) Context(com.aws.greengrass.dependency.Context) REQUEST_REBOOT(com.aws.greengrass.deployment.bootstrap.BootstrapSuccessCode.REQUEST_REBOOT) REQUEST_RESTART(com.aws.greengrass.deployment.bootstrap.BootstrapSuccessCode.REQUEST_RESTART) SERVICE_DEPENDENCIES_NAMESPACE_TOPIC(com.aws.greengrass.lifecyclemanager.GreengrassService.SERVICE_DEPENDENCIES_NAMESPACE_TOPIC) LinkedHashSet(java.util.LinkedHashSet) ExecutorService(java.util.concurrent.ExecutorService) Nullable(javax.annotation.Nullable) DeploymentStage(com.aws.greengrass.deployment.model.Deployment.DeploymentStage) ServiceLoadException(com.aws.greengrass.lifecyclemanager.exceptions.ServiceLoadException) Files(java.nio.file.Files) Executor(java.util.concurrent.Executor) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) ConfigurationWriter(com.aws.greengrass.config.ConfigurationWriter) IOException(java.io.IOException) DependencyType(com.amazon.aws.iot.greengrass.component.common.DependencyType) Topic(com.aws.greengrass.config.Topic) Utils(com.aws.greengrass.util.Utils) DeploymentActivatorFactory(com.aws.greengrass.deployment.activator.DeploymentActivatorFactory) ServiceUpdateException(com.aws.greengrass.deployment.exceptions.ServiceUpdateException) DeviceConfigurationException(com.aws.greengrass.deployment.exceptions.DeviceConfigurationException) Clock(java.time.Clock) Collections(java.util.Collections) Logger(com.aws.greengrass.logging.api.Logger) DEFAULT_VALUE_TIMESTAMP(com.aws.greengrass.config.Topic.DEFAULT_VALUE_TIMESTAMP) ComponentIdentifier(com.aws.greengrass.componentmanager.models.ComponentIdentifier) AtomicReference(java.util.concurrent.atomic.AtomicReference) IOException(java.io.IOException) ComponentStore(com.aws.greengrass.componentmanager.ComponentStore) EZPlugins(com.aws.greengrass.dependency.EZPlugins) ImplementsService(com.aws.greengrass.dependency.ImplementsService) Topic(com.aws.greengrass.config.Topic) ServiceLoadException(com.aws.greengrass.lifecyclemanager.exceptions.ServiceLoadException)

Example 23 with Topics

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);
    }
}
Also used : Topics(com.aws.greengrass.config.Topics) Topic(com.aws.greengrass.config.Topic)

Example 24 with Topics

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);
    }
}
Also used : Topics(com.aws.greengrass.config.Topics) Topic(com.aws.greengrass.config.Topic)

Example 25 with Topics

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"));
}
Also used : Topics(com.aws.greengrass.config.Topics) InputStreamReader(java.io.InputStreamReader) BufferedReader(java.io.BufferedReader) Deployment(com.aws.greengrass.deployment.model.Deployment) CaseInsensitiveString(com.aws.greengrass.config.CaseInsensitiveString) DeploymentResult(com.aws.greengrass.deployment.model.DeploymentResult) Map(java.util.Map) HashMap(java.util.HashMap) Collections.emptyMap(java.util.Collections.emptyMap) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Aggregations

Topics (com.aws.greengrass.config.Topics)151 Test (org.junit.jupiter.api.Test)104 Topic (com.aws.greengrass.config.Topic)65 HashMap (java.util.HashMap)50 Map (java.util.Map)29 GreengrassService (com.aws.greengrass.lifecyclemanager.GreengrassService)28 Context (com.aws.greengrass.dependency.Context)24 CountDownLatch (java.util.concurrent.CountDownLatch)24 IOException (java.io.IOException)23 ExecutionException (java.util.concurrent.ExecutionException)22 CaseInsensitiveString (com.aws.greengrass.config.CaseInsensitiveString)21 HashSet (java.util.HashSet)19 BeforeEach (org.junit.jupiter.api.BeforeEach)18 ComponentIdentifier (com.aws.greengrass.componentmanager.models.ComponentIdentifier)17 DeviceConfiguration (com.aws.greengrass.deployment.DeviceConfiguration)17 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)16 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)15 ArrayList (java.util.ArrayList)15 Path (java.nio.file.Path)13 ComponentRecipe (com.aws.greengrass.componentmanager.models.ComponentRecipe)12