void testResolveClustersForCommandClusterCriteria()

in genie-web/src/integTest/java/com/netflix/genie/web/apis/rest/v3/controllers/CommandRestControllerIntegrationTest.java [1776:1894]


    void testResolveClustersForCommandClusterCriteria() throws Exception {
        final Cluster cluster0 = new Cluster.Builder(
            UUID.randomUUID().toString(),
            UUID.randomUUID().toString(),
            UUID.randomUUID().toString(),
            ClusterStatus.UP
        )
            .withTags(Sets.newHashSet(UUID.randomUUID().toString(), UUID.randomUUID().toString()))
            .build();
        final Cluster cluster1 = new Cluster.Builder(
            cluster0.getName(),
            cluster0.getUser(),
            cluster0.getVersion(),
            ClusterStatus.UP
        )
            .withTags(cluster0.getTags())
            .build();
        final Cluster cluster2 = new Cluster.Builder(
            UUID.randomUUID().toString(),
            UUID.randomUUID().toString(),
            UUID.randomUUID().toString(),
            ClusterStatus.UP
        )
            .withTags(Sets.newHashSet(UUID.randomUUID().toString(), UUID.randomUUID().toString()))
            .build();
        final String cluster0Id = this.createConfigResource(cluster0, null);
        final String cluster1Id = this.createConfigResource(cluster1, null);
        final String cluster2Id = this.createConfigResource(cluster2, null);

        final Command command = new Command
            .Builder(NAME, USER, VERSION, CommandStatus.ACTIVE, EXECUTABLE_AND_ARGS)
            .withClusterCriteria(
                Lists.newArrayList(
                    new Criterion.Builder().withId(cluster0Id).build(),
                    new Criterion.Builder().withName(cluster1.getName()).build(),
                    new Criterion.Builder().withVersion(cluster2.getVersion()).build(),
                    new Criterion.Builder().withStatus(ClusterStatus.TERMINATED.name()).build(),
                    new Criterion.Builder().withTags(cluster2.getTags()).build()
                )
            )
            .build();
        final String commandId = this.createConfigResource(command, null);

        final RestDocumentationFilter resolveFilter = RestAssuredRestDocumentation.document(
            "{class-name}/{method-name}/{step}/",
            // Path parameters
            Snippets.ID_PATH_PARAM,
            // Request parameters
            RequestDocumentation.requestParameters(
                RequestDocumentation
                    .parameterWithName("addDefaultStatus")
                    .description(
                        "Whether the system should add the default cluster status to the criteria. Default: true"
                    )
                    .optional()
            ),
            // Response Content Type
            Snippets.JSON_CONTENT_TYPE_HEADER,
            // Response Fields
            Snippets.resolveClustersForCommandClusterCriteriaResponsePayload()
        );

        final List<ResolvedResources<Cluster>> resolvedClusters = GenieObjectMapper.getMapper().readValue(
            RestAssured
                .given(this.getRequestSpecification())
                .filter(resolveFilter)
                .when()
                .port(this.port)
                .get(COMMANDS_API + "/{id}/resolvedClusters", commandId)
                .then()
                .statusCode(HttpStatus.OK.value())
                .contentType(Matchers.containsString(MediaType.APPLICATION_JSON_VALUE))
                .extract()
                .asString(),
            new TypeReference<>() {
            }
        );

        Assertions.assertThat(resolvedClusters).hasSize(5);
        ResolvedResources<Cluster> resolvedResources = resolvedClusters.get(0);
        Assertions.assertThat(resolvedResources.getCriterion()).isEqualTo(command.getClusterCriteria().get(0));
        Assertions
            .assertThat(resolvedResources.getResources())
            .extracting(Cluster::getId)
            .filteredOn(Optional::isPresent)
            .extracting(Optional::get)
            .containsExactlyInAnyOrder(cluster0Id);

        resolvedResources = resolvedClusters.get(1);
        Assertions.assertThat(resolvedResources.getCriterion()).isEqualTo(command.getClusterCriteria().get(1));
        Assertions
            .assertThat(resolvedResources.getResources())
            .extracting(Cluster::getId)
            .filteredOn(Optional::isPresent)
            .extracting(Optional::get)
            .containsExactlyInAnyOrder(cluster0Id, cluster1Id);

        resolvedResources = resolvedClusters.get(2);
        Assertions.assertThat(resolvedResources.getCriterion()).isEqualTo(command.getClusterCriteria().get(2));
        Assertions
            .assertThat(resolvedResources.getResources())
            .extracting(Cluster::getId)
            .filteredOn(Optional::isPresent)
            .extracting(Optional::get)
            .containsExactlyInAnyOrder(cluster2Id);

        resolvedResources = resolvedClusters.get(3);
        Assertions.assertThat(resolvedResources.getCriterion()).isEqualTo(command.getClusterCriteria().get(3));
        Assertions.assertThat(resolvedResources.getResources()).isEmpty();

        resolvedResources = resolvedClusters.get(4);
        Assertions.assertThat(resolvedResources.getCriterion()).isEqualTo(command.getClusterCriteria().get(4));
        Assertions
            .assertThat(resolvedResources.getResources())
            .extracting(Cluster::getId)
            .filteredOn(Optional::isPresent)
            .extracting(Optional::get)
            .containsExactlyInAnyOrder(cluster2Id);
    }