Search in sources :

Example 1 with DeploymentTaskFailureException

use of com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException in project aws-greengrass-nucleus by aws-greengrass.

the class DeploymentDocumentDownloaderTest method GIVEN_download_content_with_invalid_format_WHEN_download_THEN_throws_with_proper_message.

@Test
void GIVEN_download_content_with_invalid_format_WHEN_download_THEN_throws_with_proper_message() throws Exception {
    when(httpClientProvider.getSdkHttpClient()).thenReturn(httpClient);
    String inValidDoc = "I'm not even a JSON.";
    String expectedDigest = Digest.calculate(inValidDoc);
    String url = "https://www.presigned.com/a.json";
    // mock gg client
    when(greengrassV2DataClient.getDeploymentConfiguration(Mockito.any(GetDeploymentConfigurationRequest.class))).thenReturn(GetDeploymentConfigurationResponse.builder().preSignedUrl(url).integrityCheck(IntegrityCheck.builder().algorithm("SHA-256").digest(expectedDigest).build()).build());
    // mock http client to return the test file
    when(httpClient.prepareRequest(any())).thenReturn(request);
    when(request.call()).thenReturn(HttpExecuteResponse.builder().response(SdkHttpResponse.builder().statusCode(HTTP_OK).build()).responseBody(AbortableInputStream.create(IOUtils.toInputStream(inValidDoc))).build());
    DeploymentTaskFailureException exception = assertThrows(DeploymentTaskFailureException.class, () -> downloader.download(DEPLOYMENT_ID));
    assertThat(exception.getMessage(), containsString("Failed to deserialize deployment document."));
}
Also used : GetDeploymentConfigurationRequest(software.amazon.awssdk.services.greengrassv2data.model.GetDeploymentConfigurationRequest) StringContains.containsString(org.hamcrest.core.StringContains.containsString) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException) Test(org.junit.jupiter.api.Test)

Example 2 with DeploymentTaskFailureException

use of com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException in project aws-greengrass-nucleus by aws-greengrass.

the class DeploymentServiceTest method GIVEN_deployment_job_WHEN_deployment_completes_with_non_retryable_error_THEN_report_failed_job_status.

@Test
void GIVEN_deployment_job_WHEN_deployment_completes_with_non_retryable_error_THEN_report_failed_job_status(ExtensionContext context) 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));
    CompletableFuture<DeploymentResult> mockFutureWithException = new CompletableFuture<>();
    ignoreExceptionUltimateCauseOfType(context, DeploymentTaskFailureException.class);
    Throwable t = new DeploymentTaskFailureException("");
    mockFutureWithException.completeExceptionally(t);
    when(mockExecutorService.submit(any(DefaultDeploymentTask.class))).thenReturn(mockFutureWithException);
    startDeploymentServiceInAnotherThread();
    verify(mockExecutorService, WAIT_FOUR_SECONDS).submit(any(DefaultDeploymentTask.class));
    verify(deploymentStatusKeeper, WAIT_FOUR_SECONDS).persistAndPublishDeploymentStatus(eq(TEST_JOB_ID_1), eq(Deployment.DeploymentType.IOT_JOBS), eq(JobStatus.IN_PROGRESS.toString()), any());
    verify(deploymentStatusKeeper, WAIT_FOUR_SECONDS).persistAndPublishDeploymentStatus(eq(TEST_JOB_ID_1), eq(Deployment.DeploymentType.IOT_JOBS), eq(JobStatus.FAILED.toString()), any());
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) 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) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Example 3 with DeploymentTaskFailureException

use of com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException in project aws-greengrass-nucleus by aws-greengrass.

the class DefaultDeploymentTask method getNonTargetGroupToRootPackagesMap.

@SuppressWarnings("PMD.AvoidCatchingGenericException")
private Map<String, Set<ComponentRequirementIdentifier>> getNonTargetGroupToRootPackagesMap(DeploymentDocument deploymentDocument) throws DeploymentTaskFailureException, InterruptedException {
    // Don't block local deployments due to device being offline by using finite retries for getting the
    // hierarchy and fall back to hierarchy stored previously in worst case. For cloud deployment, use infinite
    // retries by default similar/to all other cloud interactions.
    boolean isLocalDeployment = Deployment.DeploymentType.LOCAL.equals(deployment.getDeploymentType());
    // SDK already retries with RetryMode.STANDARD. For local deployment we don't retry on top of that
    int retryCount = isLocalDeployment ? 1 : INFINITE_RETRY_COUNT;
    Optional<Set<String>> groupsForDeviceOpt;
    try {
        groupsForDeviceOpt = thingGroupHelper.listThingGroupsForDevice(retryCount);
    } catch (GreengrassV2DataException e) {
        if (e.statusCode() == HttpStatusCode.FORBIDDEN) {
            // Getting group hierarchy requires permission to call the ListThingGroupsForCoreDevice API which
            // may not be configured on existing IoT Thing policy in use for current device, log a warning in
            // that case and move on.
            logger.atWarn().setCause(e).log("Failed to get thing group hierarchy. Deployment will proceed. " + "To automatically clean up unused components, please add " + "greengrass:ListThingGroupsForCoreDevice permission to your IoT Thing policy.");
            groupsForDeviceOpt = getPersistedMembershipInfo();
        } else {
            throw new DeploymentTaskFailureException("Error fetching thing group information", e);
        }
    } catch (Exception e) {
        if (isLocalDeployment && ThingGroupHelper.DEVICE_OFFLINE_INDICATIVE_EXCEPTIONS.contains(e.getClass())) {
            logger.atWarn().setCause(e).log("Failed to get thing group hierarchy, local deployment will proceed");
            groupsForDeviceOpt = getPersistedMembershipInfo();
        } else {
            throw new DeploymentTaskFailureException("Error fetching thing group information", e);
        }
    }
    Set<String> groupsForDevice = groupsForDeviceOpt.isPresent() ? groupsForDeviceOpt.get() : Collections.emptySet();
    Map<String, Set<ComponentRequirementIdentifier>> nonTargetGroupsToRootPackagesMap = new HashMap<>();
    Topics groupsToRootPackages = deploymentServiceConfig.lookupTopics(DeploymentService.GROUP_TO_ROOT_COMPONENTS_TOPICS);
    groupsToRootPackages.iterator().forEachRemaining(node -> {
        Topics groupTopics = (Topics) node;
        // skip root packages if device does not belong to that group anymore
        if (!groupTopics.getName().equals(deploymentDocument.getGroupName()) && (groupTopics.getName().startsWith(DEVICE_DEPLOYMENT_GROUP_NAME_PREFIX) || groupTopics.getName().equals(LOCAL_DEPLOYMENT_GROUP_NAME) || groupsForDevice.contains(groupTopics.getName()))) {
            groupTopics.forEach(pkgNode -> {
                Topics pkgTopics = (Topics) pkgNode;
                Requirement versionReq = Requirement.buildNPM(Coerce.toString(pkgTopics.lookup(GROUP_TO_ROOT_COMPONENTS_VERSION_KEY)));
                nonTargetGroupsToRootPackagesMap.putIfAbsent(groupTopics.getName(), new HashSet<>());
                nonTargetGroupsToRootPackagesMap.get(groupTopics.getName()).add(new ComponentRequirementIdentifier(pkgTopics.getName(), versionReq));
            });
        }
    });
    deploymentServiceConfig.lookupTopics(DeploymentService.GROUP_MEMBERSHIP_TOPICS).remove();
    Topics groupMembership = deploymentServiceConfig.lookupTopics(DeploymentService.GROUP_MEMBERSHIP_TOPICS);
    groupsForDevice.forEach(groupMembership::createLeafChild);
    return nonTargetGroupsToRootPackagesMap;
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) Topics(com.aws.greengrass.config.Topics) HashMap(java.util.HashMap) ComponentRequirementIdentifier(com.aws.greengrass.componentmanager.models.ComponentRequirementIdentifier) GreengrassV2DataException(software.amazon.awssdk.services.greengrassv2data.model.GreengrassV2DataException) PackageLoadingException(com.aws.greengrass.componentmanager.exceptions.PackageLoadingException) GreengrassV2DataException(software.amazon.awssdk.services.greengrassv2data.model.GreengrassV2DataException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException) Requirement(com.vdurmont.semver4j.Requirement) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException)

Example 4 with DeploymentTaskFailureException

use of com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException in project aws-greengrass-nucleus by aws-greengrass.

the class DefaultDeploymentTask method call.

@Override
@SuppressWarnings({ "PMD.PreserveStackTrace", "PMD.PrematureDeclaration" })
public DeploymentResult call() throws InterruptedException {
    Future<List<ComponentIdentifier>> resolveDependenciesFuture = null;
    Future<Void> preparePackagesFuture = null;
    Future<DeploymentResult> deploymentMergeFuture = null;
    DeploymentDocument deploymentDocument = deployment.getDeploymentDocumentObj();
    try {
        logger.atInfo().setEventType(DEPLOYMENT_TASK_EVENT_TYPE).kv("Deployment service config", deploymentServiceConfig.toPOJO().toString()).log("Starting deployment task");
        Map<String, Set<ComponentRequirementIdentifier>> nonTargetGroupsToRootPackagesMap = getNonTargetGroupToRootPackagesMap(deploymentDocument);
        // Root packages for the target group is taken from deployment document.
        Set<String> rootPackages = new HashSet<>(deploymentDocument.getRootPackages());
        // Add root components from non-target groups.
        nonTargetGroupsToRootPackagesMap.values().forEach(packages -> {
            packages.forEach(p -> rootPackages.add(p.getName()));
        });
        resolveDependenciesFuture = executorService.submit(() -> dependencyResolver.resolveDependencies(deploymentDocument, nonTargetGroupsToRootPackagesMap));
        List<ComponentIdentifier> desiredPackages = resolveDependenciesFuture.get();
        // download configuration if large
        List<String> requiredCapabilities = deploymentDocument.getRequiredCapabilities();
        if (requiredCapabilities != null && requiredCapabilities.contains(DeploymentCapability.LARGE_CONFIGURATION.toString())) {
            DeploymentDocument downloadedDeploymentDocument = deploymentDocumentDownloader.download(deploymentDocument.getDeploymentId());
            deployment.getDeploymentDocumentObj().setDeploymentPackageConfigurationList(downloadedDeploymentDocument.getDeploymentPackageConfigurationList());
        }
        // Check that all prerequisites for preparing components are met
        componentManager.checkPreparePackagesPrerequisites(desiredPackages);
        // Block this without timeout because a device can be offline and it can take quite a long time
        // to download a package.
        preparePackagesFuture = componentManager.preparePackages(desiredPackages);
        preparePackagesFuture.get();
        Map<String, Object> newConfig = kernelConfigResolver.resolve(desiredPackages, deploymentDocument, new ArrayList<>(rootPackages));
        if (Thread.currentThread().isInterrupted()) {
            throw new InterruptedException("Deployment task is interrupted");
        }
        deploymentMergeFuture = deploymentConfigMerger.mergeInNewConfig(deployment, newConfig);
        // Block this without timeout because it can take a long time for the device to update the config
        // (if it's not in a safe window).
        DeploymentResult result = deploymentMergeFuture.get();
        logger.atInfo(DEPLOYMENT_TASK_EVENT_TYPE).setEventType(DEPLOYMENT_TASK_EVENT_TYPE).log("Finished deployment task");
        componentManager.cleanupStaleVersions();
        return result;
    } catch (PackageLoadingException | DeploymentTaskFailureException | IOException e) {
        logger.atError().setCause(e).log("Error occurred while processing deployment");
        return new DeploymentResult(DeploymentResult.DeploymentStatus.FAILED_NO_STATE_CHANGE, e);
    } catch (ExecutionException e) {
        logger.atError().setCause(e).log("Error occurred while processing deployment");
        Throwable t = e.getCause();
        if (t instanceof InterruptedException) {
            throw (InterruptedException) t;
        } else {
            return new DeploymentResult(DeploymentResult.DeploymentStatus.FAILED_NO_STATE_CHANGE, t);
        }
    } catch (InterruptedException e) {
        // DeploymentTask got interrupted while performing a blocking step.
        cancelDeploymentTask(resolveDependenciesFuture, preparePackagesFuture, deploymentMergeFuture);
        // Populate the exception up to the stack
        throw e;
    }
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) DeploymentDocument(com.aws.greengrass.deployment.model.DeploymentDocument) ComponentIdentifier(com.aws.greengrass.componentmanager.models.ComponentIdentifier) ArrayList(java.util.ArrayList) List(java.util.List) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException) ExecutionException(java.util.concurrent.ExecutionException) HashSet(java.util.HashSet) DeploymentResult(com.aws.greengrass.deployment.model.DeploymentResult) IOException(java.io.IOException) PackageLoadingException(com.aws.greengrass.componentmanager.exceptions.PackageLoadingException)

Example 5 with DeploymentTaskFailureException

use of com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException in project aws-greengrass-nucleus by aws-greengrass.

the class DeploymentService method createNewDeployment.

private void createNewDeployment(Deployment deployment) {
    logger.atInfo().kv(DEPLOYMENT_ID_LOG_KEY, deployment.getId()).kv("DeploymentType", deployment.getDeploymentType().toString()).log("Received deployment in the queue");
    DeploymentTask deploymentTask;
    boolean cancellable = true;
    if (DEFAULT.equals(deployment.getDeploymentStage())) {
        deploymentTask = createDefaultNewDeployment(deployment);
    } else {
        deploymentTask = createKernelUpdateDeployment(deployment);
        cancellable = false;
        if (DeploymentType.IOT_JOBS.equals(deployment.getDeploymentType())) {
            // Keep track of IoT jobs for de-duplication
            IotJobsHelper.getLatestQueuedJobs().addProcessedJob(deployment.getId());
        }
    }
    if (deploymentTask == null) {
        return;
    }
    deploymentStatusKeeper.persistAndPublishDeploymentStatus(deployment.getId(), deployment.getDeploymentType(), JobStatus.IN_PROGRESS.toString(), new HashMap<>());
    if (DEFAULT.equals(deployment.getDeploymentStage())) {
        try {
            context.get(KernelAlternatives.class).cleanupLaunchDirectoryLinks();
            deploymentDirectoryManager.createNewDeploymentDirectory(deployment.getDeploymentDocumentObj().getDeploymentId());
            deploymentDirectoryManager.writeDeploymentMetadata(deployment);
        } catch (IOException ioException) {
            logger.atError().log("Unable to create deployment directory", ioException);
            updateDeploymentResultAsFailed(deployment, deploymentTask, true, new DeploymentTaskFailureException(ioException));
            return;
        }
        List<String> requiredCapabilities = deployment.getDeploymentDocumentObj().getRequiredCapabilities();
        if (requiredCapabilities != null && !requiredCapabilities.isEmpty()) {
            List<String> missingCapabilities = requiredCapabilities.stream().filter(reqCapabilities -> !kernel.getSupportedCapabilities().contains(reqCapabilities)).collect(Collectors.toList());
            if (!missingCapabilities.isEmpty()) {
                updateDeploymentResultAsFailed(deployment, deploymentTask, false, new MissingRequiredCapabilitiesException("The current nucleus version doesn't support one " + "or more capabilities that are required by this deployment: " + String.join(", ", missingCapabilities)));
                return;
            }
        }
        if (DeploymentType.LOCAL.equals(deployment.getDeploymentType())) {
            try {
                copyRecipesAndArtifacts(deployment);
            } catch (InvalidRequestException | IOException e) {
                logger.atError().log("Error copying recipes and artifacts", e);
                updateDeploymentResultAsFailed(deployment, deploymentTask, false, e);
                return;
            }
        }
    }
    Future<DeploymentResult> process = executorService.submit(deploymentTask);
    logger.atInfo().kv("deployment", deployment.getId()).log("Started deployment execution");
    currentDeploymentTaskMetadata = new DeploymentTaskMetadata(deploymentTask, process, deployment.getId(), deployment.getDeploymentType(), new AtomicInteger(1), deployment.getDeploymentDocumentObj(), cancellable);
}
Also used : PackageLoadingException(com.aws.greengrass.componentmanager.exceptions.PackageLoadingException) SerializerFactory.getRecipeSerializer(com.amazon.aws.iot.greengrass.component.common.SerializerFactory.getRecipeSerializer) SerializerFactory.getRecipeSerializerJson(com.amazon.aws.iot.greengrass.component.common.SerializerFactory.getRecipeSerializerJson) DeploymentDocumentConverter(com.aws.greengrass.deployment.converter.DeploymentDocumentConverter) InvalidRequestException(com.aws.greengrass.deployment.exceptions.InvalidRequestException) THING_GROUP_RESOURCE_NAME_PREFIX(com.aws.greengrass.deployment.converter.DeploymentDocumentConverter.THING_GROUP_RESOURCE_NAME_PREFIX) Deployment(com.aws.greengrass.deployment.model.Deployment) DeploymentTask(com.aws.greengrass.deployment.model.DeploymentTask) Future(java.util.concurrent.Future) DEVICE_DEPLOYMENT_GROUP_NAME_PREFIX(com.aws.greengrass.deployment.DefaultDeploymentTask.DEVICE_DEPLOYMENT_GROUP_NAME_PREFIX) State(com.aws.greengrass.dependency.State) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) DEFAULT(com.aws.greengrass.deployment.model.Deployment.DeploymentStage.DEFAULT) Duration(java.time.Duration) Map(java.util.Map) DeploymentDocument(com.aws.greengrass.deployment.model.DeploymentDocument) Path(java.nio.file.Path) DependencyResolver(com.aws.greengrass.componentmanager.DependencyResolver) DeploymentResult(com.aws.greengrass.deployment.model.DeploymentResult) Node(com.aws.greengrass.config.Node) CancellationException(java.util.concurrent.CancellationException) LocalOverrideRequest(com.aws.greengrass.deployment.model.LocalOverrideRequest) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) LOCAL_DEPLOYMENT_GROUP_NAME(com.aws.greengrass.deployment.converter.DeploymentDocumentConverter.LOCAL_DEPLOYMENT_GROUP_NAME) Set(java.util.Set) Collectors(java.util.stream.Collectors) Topics(com.aws.greengrass.config.Topics) Kernel(com.aws.greengrass.lifecyclemanager.Kernel) List(java.util.List) Stream(java.util.stream.Stream) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException) DEPLOYMENT_ID_LOG_KEY(com.aws.greengrass.deployment.DeploymentConfigMerger.DEPLOYMENT_ID_LOG_KEY) ImplementsService(com.aws.greengrass.dependency.ImplementsService) ComponentStore(com.aws.greengrass.componentmanager.ComponentStore) ComponentIdentifier(com.aws.greengrass.componentmanager.models.ComponentIdentifier) SerializerFactory(com.aws.greengrass.util.SerializerFactory) Setter(lombok.Setter) VERSION_CONFIG_KEY(com.aws.greengrass.componentmanager.KernelConfigResolver.VERSION_CONFIG_KEY) Getter(lombok.Getter) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Configuration(com.amazon.aws.iot.greengrass.configuration.common.Configuration) UpdateSystemPolicyService(com.aws.greengrass.lifecyclemanager.UpdateSystemPolicyService) Coerce(com.aws.greengrass.util.Coerce) StandardCopyOption(java.nio.file.StandardCopyOption) HashSet(java.util.HashSet) Inject(javax.inject.Inject) ComponentManager(com.aws.greengrass.componentmanager.ComponentManager) GreengrassService(com.aws.greengrass.lifecyclemanager.GreengrassService) Context(com.aws.greengrass.dependency.Context) ComponentRecipe(com.amazon.aws.iot.greengrass.component.common.ComponentRecipe) JobStatus(software.amazon.awssdk.iot.iotjobs.model.JobStatus) PlatformResolver(com.aws.greengrass.config.PlatformResolver) ExecutorService(java.util.concurrent.ExecutorService) ServiceLoadException(com.aws.greengrass.lifecyclemanager.exceptions.ServiceLoadException) DeploymentType(com.aws.greengrass.deployment.model.Deployment.DeploymentType) Files(java.nio.file.Files) MissingRequiredCapabilitiesException(com.aws.greengrass.deployment.exceptions.MissingRequiredCapabilitiesException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) FileUtils(org.apache.commons.io.FileUtils) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) Topic(com.aws.greengrass.config.Topic) AtomicLong(java.util.concurrent.atomic.AtomicLong) Utils(com.aws.greengrass.util.Utils) DeploymentTaskMetadata(com.aws.greengrass.deployment.model.DeploymentTaskMetadata) Paths(java.nio.file.Paths) KernelAlternatives(com.aws.greengrass.lifecyclemanager.KernelAlternatives) FAILED_ROLLBACK_NOT_REQUESTED(com.aws.greengrass.deployment.model.DeploymentResult.DeploymentStatus.FAILED_ROLLBACK_NOT_REQUESTED) DeploymentStatus(com.aws.greengrass.deployment.model.DeploymentResult.DeploymentStatus) KernelConfigResolver(com.aws.greengrass.componentmanager.KernelConfigResolver) Logger(com.aws.greengrass.logging.api.Logger) IOException(java.io.IOException) DeploymentResult(com.aws.greengrass.deployment.model.DeploymentResult) KernelAlternatives(com.aws.greengrass.lifecyclemanager.KernelAlternatives) MissingRequiredCapabilitiesException(com.aws.greengrass.deployment.exceptions.MissingRequiredCapabilitiesException) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) InvalidRequestException(com.aws.greengrass.deployment.exceptions.InvalidRequestException) DeploymentTaskMetadata(com.aws.greengrass.deployment.model.DeploymentTaskMetadata) DeploymentTaskFailureException(com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException) DeploymentTask(com.aws.greengrass.deployment.model.DeploymentTask)

Aggregations

DeploymentTaskFailureException (com.aws.greengrass.deployment.exceptions.DeploymentTaskFailureException)5 PackageLoadingException (com.aws.greengrass.componentmanager.exceptions.PackageLoadingException)3 DeploymentResult (com.aws.greengrass.deployment.model.DeploymentResult)3 IOException (java.io.IOException)3 HashSet (java.util.HashSet)3 Set (java.util.Set)3 ExecutionException (java.util.concurrent.ExecutionException)3 ComponentIdentifier (com.aws.greengrass.componentmanager.models.ComponentIdentifier)2 Topics (com.aws.greengrass.config.Topics)2 Deployment (com.aws.greengrass.deployment.model.Deployment)2 DeploymentDocument (com.aws.greengrass.deployment.model.DeploymentDocument)2 HashMap (java.util.HashMap)2 List (java.util.List)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 Test (org.junit.jupiter.api.Test)2 ComponentRecipe (com.amazon.aws.iot.greengrass.component.common.ComponentRecipe)1 SerializerFactory.getRecipeSerializer (com.amazon.aws.iot.greengrass.component.common.SerializerFactory.getRecipeSerializer)1 SerializerFactory.getRecipeSerializerJson (com.amazon.aws.iot.greengrass.component.common.SerializerFactory.getRecipeSerializerJson)1 Configuration (com.amazon.aws.iot.greengrass.configuration.common.Configuration)1 ComponentManager (com.aws.greengrass.componentmanager.ComponentManager)1