/*
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.cloudfoundry.operations.domains;
import org.cloudfoundry.client.CloudFoundryClient;
import org.cloudfoundry.client.v2.Metadata;
import org.cloudfoundry.client.v2.organizations.AssociateOrganizationPrivateDomainRequest;
import org.cloudfoundry.client.v2.organizations.ListOrganizationsRequest;
import org.cloudfoundry.client.v2.organizations.ListOrganizationsResponse;
import org.cloudfoundry.client.v2.organizations.OrganizationResource;
import org.cloudfoundry.client.v2.organizations.RemoveOrganizationPrivateDomainRequest;
import org.cloudfoundry.client.v2.privatedomains.CreatePrivateDomainRequest;
import org.cloudfoundry.client.v2.privatedomains.CreatePrivateDomainResponse;
import org.cloudfoundry.client.v2.privatedomains.ListPrivateDomainsRequest;
import org.cloudfoundry.client.v2.privatedomains.ListPrivateDomainsResponse;
import org.cloudfoundry.client.v2.privatedomains.PrivateDomainResource;
import org.cloudfoundry.client.v2.shareddomains.CreateSharedDomainResponse;
import org.cloudfoundry.client.v2.shareddomains.ListSharedDomainsRequest;
import org.cloudfoundry.client.v2.shareddomains.ListSharedDomainsResponse;
import org.cloudfoundry.client.v2.shareddomains.SharedDomainEntity;
import org.cloudfoundry.client.v2.shareddomains.SharedDomainResource;
import org.cloudfoundry.operations.AbstractOperationsTest;
import org.cloudfoundry.routing.RoutingClient;
import org.cloudfoundry.routing.v1.routergroups.ListRouterGroupsRequest;
import org.cloudfoundry.routing.v1.routergroups.ListRouterGroupsResponse;
import org.junit.Test;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.Duration;
import static org.assertj.core.api.Assertions.assertThat;
import static org.cloudfoundry.operations.TestObjects.fill;
import static org.mockito.Mockito.when;
public final class DefaultDomainsTest extends AbstractOperationsTest {
private final DefaultDomains domains = new DefaultDomains(Mono.just(this.cloudFoundryClient), Mono.just(this.routingClient));
@Test
public void createDomain() {
requestOrganizations(this.cloudFoundryClient, "test-organization");
requestCreatePrivateDomain(this.cloudFoundryClient, "test-domain", "test-organization-id");
this.domains
.create(CreateDomainRequest.builder()
.domain("test-domain")
.organization("test-organization")
.build())
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void createSharedDomain() {
requestCreateSharedDomain(this.cloudFoundryClient, "test-domain");
this.domains
.createShared(CreateSharedDomainRequest.builder()
.domain("test-domain")
.build())
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void listDomains() {
requestPrivateDomains(this.cloudFoundryClient);
requestSharedDomains(this.cloudFoundryClient);
this.domains
.list()
.as(StepVerifier::create)
.expectNext(Domain.builder()
.id("test-private-domain-id")
.name("test-private-domain-name")
.status(Status.OWNED)
.build(),
Domain.builder()
.id("test-shared-domain-id")
.name("test-shared-domain-name")
.status(Status.SHARED)
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void listDomainsOnlyPrivate() {
requestPrivateDomains(this.cloudFoundryClient);
requestSharedDomainsEmpty(this.cloudFoundryClient);
this.domains
.list()
.as(StepVerifier::create)
.expectNext(Domain.builder()
.id("test-private-domain-id")
.name("test-private-domain-name")
.status(Status.OWNED)
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void listDomainsOnlyShared() {
requestSharedDomains(this.cloudFoundryClient);
requestPrivateDomainsEmpty(this.cloudFoundryClient);
this.domains
.list()
.as(StepVerifier::create)
.expectNext(Domain.builder()
.id("test-shared-domain-id")
.name("test-shared-domain-name")
.status(Status.SHARED)
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void listDomainsTcp() {
requestPrivateDomains(this.cloudFoundryClient);
requestSharedDomainsTcp(this.cloudFoundryClient);
this.domains
.list()
.as(StepVerifier::create)
.expectNext(Domain.builder()
.id("test-private-domain-id")
.name("test-private-domain-name")
.status(Status.OWNED)
.build(),
Domain.builder()
.id("test-shared-domain-id")
.name("test-shared-domain-name")
.status(Status.SHARED)
.type("test-shared-domain-type")
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void listRouterGroups() {
requestListRouterGroups(this.routingClient);
this.domains
.listRouterGroups()
.as(StepVerifier::create)
.expectNext(RouterGroup.builder()
.id("test-routerGroupId")
.name("test-name")
.type("test-type")
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void shareDomain() {
requestListPrivateDomains(this.cloudFoundryClient, "test-domain", "test-domain-id");
requestOrganizations(this.cloudFoundryClient, "test-organization");
requestAssociateOrganizationPrivateDomain(this.cloudFoundryClient, "test-domain-id", "test-organization-id");
this.domains
.share(ShareDomainRequest.builder()
.domain("test-domain")
.organization("test-organization")
.build())
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void shareDomainSharedDomain() {
requestListPrivateDomainsEmpty(this.cloudFoundryClient, "test-domain");
requestOrganizations(this.cloudFoundryClient, "test-organization");
this.domains
.share(ShareDomainRequest.builder()
.domain("test-domain")
.organization("test-organization")
.build())
.as(StepVerifier::create)
.consumeErrorWith(t -> assertThat(t).isInstanceOf(IllegalArgumentException.class).hasMessage("Private domain test-domain does not exist"))
.verify(Duration.ofSeconds(5));
}
@Test
public void unshareDomain() {
requestListPrivateDomains(this.cloudFoundryClient, "test-domain", "test-domain-id");
requestOrganizations(this.cloudFoundryClient, "test-organization");
requestRemoveOrganizationPrivateDomain(this.cloudFoundryClient, "test-domain-id", "test-organization-id");
this.domains
.unshare(UnshareDomainRequest.builder()
.domain("test-domain")
.organization("test-organization")
.build())
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofSeconds(5));
}
private static void requestAssociateOrganizationPrivateDomain(CloudFoundryClient cloudFoundryClient, String domainId, String organizationId) {
when(cloudFoundryClient.organizations()
.associatePrivateDomain(AssociateOrganizationPrivateDomainRequest.builder()
.privateDomainId(domainId)
.organizationId(organizationId)
.build()))
.thenReturn(Mono.empty());
}
private static void requestCreatePrivateDomain(CloudFoundryClient cloudFoundryClient, String domain, String organizationId) {
when(cloudFoundryClient.privateDomains()
.create(CreatePrivateDomainRequest.builder()
.name(domain)
.owningOrganizationId(organizationId)
.build()))
.thenReturn(Mono
.just(fill(CreatePrivateDomainResponse.builder(), "private-domain-")
.build()));
}
private static void requestCreateSharedDomain(CloudFoundryClient cloudFoundryClient, String domain) {
when(cloudFoundryClient.sharedDomains()
.create(org.cloudfoundry.client.v2.shareddomains.CreateSharedDomainRequest.builder()
.name(domain)
.build()))
.thenReturn(Mono
.just(fill(CreateSharedDomainResponse.builder(), "shared-domain-")
.build()));
}
private static void requestListPrivateDomains(CloudFoundryClient cloudFoundryClient, String domain, String domainId) {
when(cloudFoundryClient.privateDomains()
.list(ListPrivateDomainsRequest.builder()
.name(domain)
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListPrivateDomainsResponse.builder())
.resource(fill(PrivateDomainResource.builder())
.metadata(fill(Metadata.builder(), "private-domain-")
.id(domainId)
.build())
.build())
.totalPages(1)
.build()));
}
private static void requestListPrivateDomainsEmpty(CloudFoundryClient cloudFoundryClient, String domain) {
when(cloudFoundryClient.privateDomains()
.list(ListPrivateDomainsRequest.builder()
.name(domain)
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListPrivateDomainsResponse.builder())
.build()));
}
private static void requestListRouterGroups(RoutingClient routingClient) {
when(routingClient.routerGroups()
.list(ListRouterGroupsRequest.builder()
.build()))
.thenReturn(Mono
.just(ListRouterGroupsResponse.builder()
.routerGroup(fill(org.cloudfoundry.routing.v1.routergroups.RouterGroup.builder())
.build())
.build()));
}
private static void requestOrganizations(CloudFoundryClient cloudFoundryClient, String organization) {
when(cloudFoundryClient.organizations()
.list(ListOrganizationsRequest.builder()
.name(organization)
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListOrganizationsResponse.builder())
.resource(fill(OrganizationResource.builder(), "organization-")
.build())
.build()));
}
private static void requestPrivateDomains(CloudFoundryClient cloudFoundryClient) {
when(cloudFoundryClient.privateDomains()
.list(ListPrivateDomainsRequest.builder()
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListPrivateDomainsResponse.builder())
.resource(fill(PrivateDomainResource.builder(), "private-domain-")
.build())
.build()));
}
private static void requestPrivateDomainsEmpty(CloudFoundryClient cloudFoundryClient) {
when(cloudFoundryClient.privateDomains()
.list(ListPrivateDomainsRequest.builder()
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListPrivateDomainsResponse.builder())
.build()));
}
private static void requestRemoveOrganizationPrivateDomain(CloudFoundryClient cloudFoundryClient, String domainId, String organizationId) {
when(cloudFoundryClient.organizations()
.removePrivateDomain(RemoveOrganizationPrivateDomainRequest.builder()
.privateDomainId(domainId)
.organizationId(organizationId)
.build()))
.thenReturn(Mono.empty());
}
private static void requestSharedDomains(CloudFoundryClient cloudFoundryClient) {
when(cloudFoundryClient.sharedDomains()
.list(ListSharedDomainsRequest.builder()
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListSharedDomainsResponse.builder())
.resource(fill(SharedDomainResource.builder(), "shared-domain-")
.entity(fill(SharedDomainEntity.builder(), "shared-domain-")
.routerGroupType(null)
.build())
.build())
.build()));
}
private static void requestSharedDomainsEmpty(CloudFoundryClient cloudFoundryClient) {
when(cloudFoundryClient.sharedDomains()
.list(ListSharedDomainsRequest.builder()
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListSharedDomainsResponse.builder())
.build()));
}
private static void requestSharedDomainsTcp(CloudFoundryClient cloudFoundryClient) {
when(cloudFoundryClient.sharedDomains()
.list(ListSharedDomainsRequest.builder()
.page(1)
.build()))
.thenReturn(Mono
.just(fill(ListSharedDomainsResponse.builder())
.resource(fill(SharedDomainResource.builder(), "shared-domain-")
.entity(fill(SharedDomainEntity.builder(), "shared-domain-")
.routerGroupType("test-shared-domain-type")
.build())
.build())
.build()));
}
}