/*
* 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.client.v2;
import org.cloudfoundry.AbstractIntegrationTest;
import org.cloudfoundry.client.CloudFoundryClient;
import org.cloudfoundry.client.v2.securitygroups.AssociateSecurityGroupSpaceRequest;
import org.cloudfoundry.client.v2.securitygroups.AssociateSecurityGroupSpaceResponse;
import org.cloudfoundry.client.v2.securitygroups.CreateSecurityGroupRequest;
import org.cloudfoundry.client.v2.securitygroups.CreateSecurityGroupResponse;
import org.cloudfoundry.client.v2.securitygroups.DeleteSecurityGroupRequest;
import org.cloudfoundry.client.v2.securitygroups.GetSecurityGroupRequest;
import org.cloudfoundry.client.v2.securitygroups.ListSecurityGroupRunningDefaultsRequest;
import org.cloudfoundry.client.v2.securitygroups.ListSecurityGroupSpacesRequest;
import org.cloudfoundry.client.v2.securitygroups.ListSecurityGroupStagingDefaultsRequest;
import org.cloudfoundry.client.v2.securitygroups.ListSecurityGroupsRequest;
import org.cloudfoundry.client.v2.securitygroups.RemoveSecurityGroupRunningDefaultRequest;
import org.cloudfoundry.client.v2.securitygroups.RemoveSecurityGroupSpaceRequest;
import org.cloudfoundry.client.v2.securitygroups.RemoveSecurityGroupStagingDefaultRequest;
import org.cloudfoundry.client.v2.securitygroups.RuleEntity;
import org.cloudfoundry.client.v2.securitygroups.SecurityGroupEntity;
import org.cloudfoundry.client.v2.securitygroups.SecurityGroupResource;
import org.cloudfoundry.client.v2.securitygroups.SetSecurityGroupRunningDefaultRequest;
import org.cloudfoundry.client.v2.securitygroups.SetSecurityGroupRunningDefaultResponse;
import org.cloudfoundry.client.v2.securitygroups.SetSecurityGroupStagingDefaultRequest;
import org.cloudfoundry.client.v2.securitygroups.SetSecurityGroupStagingDefaultResponse;
import org.cloudfoundry.client.v2.securitygroups.UpdateSecurityGroupRequest;
import org.cloudfoundry.client.v2.spaces.CreateSpaceRequest;
import org.cloudfoundry.client.v2.spaces.SpaceEntity;
import org.cloudfoundry.client.v2.spaces.SpaceResource;
import org.cloudfoundry.util.JobUtils;
import org.cloudfoundry.util.PaginationUtils;
import org.cloudfoundry.util.ResourceUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import reactor.util.function.Tuples;
import java.time.Duration;
import static org.cloudfoundry.client.v2.securitygroups.Protocol.TCP;
import static org.cloudfoundry.util.tuple.TupleUtils.function;
public final class SecurityGroupsTest extends AbstractIntegrationTest {
@Autowired
private CloudFoundryClient cloudFoundryClient;
@Autowired
private Mono<String> organizationId;
@Test
public void associateSpace() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
String spaceName = this.nameFactory.getSpaceName();
this.organizationId
.then(organizationId ->
Mono.when(
createSecurityGroupId(this.cloudFoundryClient, securityGroupName),
createSpaceId(this.cloudFoundryClient, organizationId, spaceName)
))
.then(function((securityGroupId, spaceId) -> this.cloudFoundryClient.securityGroups()
.associateSpace(AssociateSecurityGroupSpaceRequest.builder()
.securityGroupId(securityGroupId)
.spaceId(spaceId)
.build())))
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName)
.as(StepVerifier::create)
.expectNext(securityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void create() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
this.cloudFoundryClient.securityGroups()
.create(CreateSecurityGroupRequest.builder()
.name(securityGroupName)
.rule(RuleEntity.builder()
.destination("0.0.0.0/0")
.log(false)
.ports("2048-3000")
.protocol(TCP)
.build())
.build())
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName)
.as(StepVerifier::create)
.expectNext(securityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void delete() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName)
.then(securityGroupId -> this.cloudFoundryClient.securityGroups()
.delete(DeleteSecurityGroupRequest.builder()
.securityGroupId(securityGroupId)
.build())
.then(job -> JobUtils.waitForCompletion(this.cloudFoundryClient, Duration.ofMinutes(5), job)))
.thenMany(requestListSecurityGroups(this.cloudFoundryClient, securityGroupName))
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void deleteSpace() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
String spaceName = this.nameFactory.getSpaceName();
this.organizationId
.then(organizationId -> Mono.when(
createSecurityGroupId(this.cloudFoundryClient, securityGroupName),
createSpaceId(this.cloudFoundryClient, organizationId, spaceName)
))
.then(function((securityGroupId, spaceId) -> associateSpace(this.cloudFoundryClient, spaceId, securityGroupId)
.then(Mono.just(Tuples.of(securityGroupId, spaceId)))))
.flatMapMany(function((securityGroupId, spaceId) -> this.cloudFoundryClient.securityGroups()
.removeSpace(RemoveSecurityGroupSpaceRequest.builder()
.securityGroupId(securityGroupId)
.spaceId(spaceId)
.build())
.then(Mono.just(Tuples.of(securityGroupId, spaceId)))))
.flatMap(function((securityGroupId, spaceId) -> requestListSecurityGroupSpaces(this.cloudFoundryClient, spaceId, securityGroupId)))
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void get() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName)
.then(securityGroupId -> this.cloudFoundryClient.securityGroups()
.get(GetSecurityGroupRequest.builder()
.securityGroupId(securityGroupId)
.build())
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName))
.as(StepVerifier::create)
.expectNext(securityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void list() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
requestCreateSecurityGroup(this.cloudFoundryClient, securityGroupName)
.thenMany(PaginationUtils.
requestClientV2Resources(page -> this.cloudFoundryClient.securityGroups()
.list(ListSecurityGroupsRequest.builder()
.name(securityGroupName)
.page(page)
.build()))
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName))
.as(StepVerifier::create)
.expectNext(securityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void listRunningDefaults() {
String securityGroupName1 = this.nameFactory.getSecurityGroupName();
String securityGroupName2 = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName1)
.then(securityGroupId -> requestSetRunningDefault(this.cloudFoundryClient, securityGroupId))
.then(createSecurityGroupId(this.cloudFoundryClient, securityGroupName2)
.then(securityGroupId -> requestSetRunningDefault(this.cloudFoundryClient, securityGroupId)))
.thenMany(requestListRunningDefaults(this.cloudFoundryClient))
.filter(response -> securityGroupName1.equals(response.getEntity().getName()) || securityGroupName2.equals(response.getEntity().getName()))
.as(StepVerifier::create)
.expectNextCount(2)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void listSpaces() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
String spaceName = this.nameFactory.getSpaceName();
this.organizationId
.then(organizationId ->
Mono.when(
createSecurityGroupId(this.cloudFoundryClient, securityGroupName),
createSpaceId(this.cloudFoundryClient, organizationId, spaceName)
))
.then(function((securityGroupId, spaceId) -> associateSpace(this.cloudFoundryClient, spaceId, securityGroupId)
.then(Mono.just(Tuples.of(securityGroupId, spaceId)))))
.flatMapMany(function((securityGroupId, spaceId) -> PaginationUtils.
requestClientV2Resources(page -> this.cloudFoundryClient.securityGroups()
.listSpaces(ListSecurityGroupSpacesRequest.builder()
.page(page)
.securityGroupId(securityGroupId)
.spaceId(spaceId)
.build()))))
.map(ResourceUtils::getEntity)
.map(SpaceEntity::getName)
.as(StepVerifier::create)
.expectNext(spaceName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void listStagingDefaults() {
String securityGroupName1 = this.nameFactory.getSecurityGroupName();
String securityGroupName2 = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName1)
.then(securityGroupId -> requestSetStagingDefault(this.cloudFoundryClient, securityGroupId))
.then(createSecurityGroupId(this.cloudFoundryClient, securityGroupName2)
.then(securityGroupId -> requestSetStagingDefault(this.cloudFoundryClient, securityGroupId)))
.thenMany(requestListStagingDefaults(this.cloudFoundryClient))
.filter(response -> securityGroupName1.equals(response.getEntity().getName()) || securityGroupName2.equals(response.getEntity().getName()))
.as(StepVerifier::create)
.expectNextCount(2)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void setRunningDefault() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName)
.then(securityGroupId -> this.cloudFoundryClient.securityGroups()
.setRunningDefault(SetSecurityGroupRunningDefaultRequest.builder()
.securityGroupId(securityGroupId)
.build()))
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName)
.as(StepVerifier::create)
.expectNext(securityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void setStagingDefault() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName)
.then(securityGroupId -> this.cloudFoundryClient.securityGroups()
.setStagingDefault(SetSecurityGroupStagingDefaultRequest.builder()
.securityGroupId(securityGroupId)
.build()))
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName)
.as(StepVerifier::create)
.expectNext(securityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void unsetRunningDefault() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName)
.then(securityGroupId -> requestSetRunningDefault(this.cloudFoundryClient, securityGroupId)
.then(this.cloudFoundryClient.securityGroups()
.removeRunningDefault(RemoveSecurityGroupRunningDefaultRequest.builder()
.securityGroupId(securityGroupId)
.build())))
.thenMany(requestListRunningDefaults(this.cloudFoundryClient))
.filter(response -> securityGroupName.equals(response.getEntity().getName()))
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void unsetStagingDefault() {
String securityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, securityGroupName)
.then(securityGroupId -> requestSetStagingDefault(this.cloudFoundryClient, securityGroupId)
.then(this.cloudFoundryClient.securityGroups()
.removeStagingDefault(RemoveSecurityGroupStagingDefaultRequest.builder()
.securityGroupId(securityGroupId)
.build())))
.thenMany(requestListRunningDefaults(this.cloudFoundryClient))
.filter(response -> securityGroupName.equals(response.getEntity().getName()))
.as(StepVerifier::create)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
@Test
public void update() {
String oldSecurityGroupName = this.nameFactory.getSecurityGroupName();
String newSecurityGroupName = this.nameFactory.getSecurityGroupName();
createSecurityGroupId(this.cloudFoundryClient, oldSecurityGroupName)
.then(securityGroupId -> this.cloudFoundryClient.securityGroups()
.update(UpdateSecurityGroupRequest.builder()
.securityGroupId(securityGroupId)
.name(newSecurityGroupName)
.build()))
.then(requestListSecurityGroups(this.cloudFoundryClient, newSecurityGroupName)
.single()
.map(ResourceUtils::getEntity)
.map(SecurityGroupEntity::getName))
.as(StepVerifier::create)
.expectNext(newSecurityGroupName)
.expectComplete()
.verify(Duration.ofMinutes(5));
}
private static Mono<AssociateSecurityGroupSpaceResponse> associateSpace(CloudFoundryClient cloudFoundryClient, String spaceId, String securityGroupId) {
return cloudFoundryClient.securityGroups()
.associateSpace(AssociateSecurityGroupSpaceRequest.builder()
.securityGroupId(securityGroupId)
.spaceId(spaceId)
.build());
}
private static Mono<String> createSecurityGroupId(CloudFoundryClient cloudFoundryClient, String securityGroupName) {
return requestCreateSecurityGroup(cloudFoundryClient, securityGroupName)
.map(ResourceUtils::getId);
}
private static Mono<String> createSpaceId(CloudFoundryClient cloudFoundryClient, String organizationId, String spaceName) {
return cloudFoundryClient.spaces()
.create(CreateSpaceRequest.builder()
.organizationId(organizationId)
.name(spaceName)
.build())
.map(ResourceUtils::getId);
}
private static Mono<CreateSecurityGroupResponse> requestCreateSecurityGroup(CloudFoundryClient cloudFoundryClient, String securityGroupName) {
return cloudFoundryClient.securityGroups()
.create(CreateSecurityGroupRequest.builder()
.name(securityGroupName)
.build());
}
private static Flux<SecurityGroupResource> requestListRunningDefaults(CloudFoundryClient cloudFoundryClient) {
return PaginationUtils.
requestClientV2Resources(page -> cloudFoundryClient.securityGroups()
.listRunningDefaults(ListSecurityGroupRunningDefaultsRequest.builder()
.build()));
}
private static Flux<SpaceResource> requestListSecurityGroupSpaces(CloudFoundryClient cloudFoundryClient, String spaceId, String securityGroupId) {
return PaginationUtils.requestClientV2Resources(page -> cloudFoundryClient.securityGroups()
.listSpaces(ListSecurityGroupSpacesRequest.builder()
.page(page)
.securityGroupId(securityGroupId)
.spaceId(spaceId)
.build()));
}
private static Flux<SecurityGroupResource> requestListSecurityGroups(CloudFoundryClient cloudFoundryClient, String securityGroupName) {
return PaginationUtils.requestClientV2Resources(page -> cloudFoundryClient.securityGroups()
.list(ListSecurityGroupsRequest.builder()
.name(securityGroupName)
.page(page)
.build()));
}
private static Flux<SecurityGroupResource> requestListStagingDefaults(CloudFoundryClient cloudFoundryClient) {
return PaginationUtils.
requestClientV2Resources(page -> cloudFoundryClient.securityGroups()
.listStagingDefaults(ListSecurityGroupStagingDefaultsRequest.builder()
.build()));
}
private static Mono<SetSecurityGroupRunningDefaultResponse> requestSetRunningDefault(CloudFoundryClient cloudFoundryClient, String securityGroupId) {
return cloudFoundryClient.securityGroups()
.setRunningDefault(SetSecurityGroupRunningDefaultRequest.builder()
.securityGroupId(securityGroupId)
.build());
}
private static Mono<SetSecurityGroupStagingDefaultResponse> requestSetStagingDefault(CloudFoundryClient cloudFoundryClient, String securityGroupId) {
return cloudFoundryClient.securityGroups()
.setStagingDefault(SetSecurityGroupStagingDefaultRequest.builder()
.securityGroupId(securityGroupId)
.build());
}
}