/*
* Copyright (c) 2014 Intellectual Reserve, Inc. All rights reserved.
*
* 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 cf.spring.servicebroker;
import com.fasterxml.jackson.databind.JsonNode;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
/**
* @author Mike Heath
*/
public class CatalogTest extends AbstractServiceBrokerTest {
@EnableAutoConfiguration
@Configuration
@EnableServiceBroker(username = USERNAME, password = PASSWORD)
static class EmptyServiceBrokerCatalog {
}
private static final String BROKER_ID = "1";
private static final String BROKER_NAME = "testbroker";
private static final String BROKER_DESCRIPTION = "This is one heck of a cool broker";
@Component
@ServiceBroker(@Service(id = BROKER_ID, name = BROKER_NAME, description = BROKER_DESCRIPTION, bindable = "false", plans = {}))
static class EmptyPlanServiceBrokerConfiguration {
@Provision ProvisionResponse provision(ProvisionRequest request) { return null; }
}
public static final String PLAN_ID = "plan-1";
public static final String PLAN_NAME = "plan name";
public static final String PLAN_DESCRIPTION = "This is the plan.";
@Component
@ServiceBroker(@Service(id = BROKER_ID, name = BROKER_NAME, description = BROKER_DESCRIPTION, plans = {
@ServicePlan(id = PLAN_ID, name = PLAN_NAME, description = PLAN_DESCRIPTION)
}))
static class ServiceBrokerSinglePlanConfiguration {
@Provision ProvisionResponse provision(ProvisionRequest request) { return null; }
@Bind BindResponse bind(BindRequest request) { return null; }
}
/*
* A request to the catalog with invalid credentials MUST return a 401.
*/
@Test
public void badAuthentication() throws Exception {
final SpringApplication application = new SpringApplication(EmptyServiceBrokerCatalog.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = HttpClients.createDefault()
) {
final HttpUriRequest catalogRequest = RequestBuilder.get()
.setUri("http://localhost:8080" + Constants.CATALOG_URI)
.build();
final CloseableHttpResponse response = client.execute(catalogRequest);
assertEquals(response.getStatusLine().getStatusCode(), 401);
}
}
@Test
public void postToCatalog() throws Exception {
final SpringApplication application = new SpringApplication(EmptyServiceBrokerCatalog.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = HttpClients.createDefault()
) {
final HttpUriRequest catalogRequest = RequestBuilder.post()
.setUri("http://localhost:8080" + Constants.CATALOG_URI)
.build();
final CloseableHttpResponse response = client.execute(catalogRequest);
assertEquals(response.getStatusLine().getStatusCode(), 405);
}
}
@Test
public void goodAuthentication() throws Exception {
final SpringApplication application = new SpringApplication(EmptyServiceBrokerCatalog.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = buildAuthenticatingClient()
) {
final HttpUriRequest catalogRequest = RequestBuilder.get()
.setUri("http://localhost:8080" + Constants.CATALOG_URI)
.build();
final CloseableHttpResponse response = client.execute(catalogRequest);
assertEquals(response.getStatusLine().getStatusCode(), 200);
}
}
private static final String CONFIGURABLE_USERNAME = "configurable-username";
private static final String CONFIGURABLE_PASSWORD = "configurable-password";
@EnableAutoConfiguration
@Configuration
@EnableServiceBroker(username = "#{username}", password = "#{password}")
static class SpelServiceBrokerCatalog {
@Bean
String username() { return CONFIGURABLE_USERNAME; }
@Bean
String password() { return CONFIGURABLE_PASSWORD; }
}
@Test
public void spelCatalogCredentials() throws Exception {
final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(CONFIGURABLE_USERNAME, CONFIGURABLE_PASSWORD));
final SpringApplication application = new SpringApplication(SpelServiceBrokerCatalog.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();
) {
final HttpUriRequest catalogRequest = RequestBuilder.get()
.setUri("http://localhost:8080" + Constants.CATALOG_URI)
.build();
final CloseableHttpResponse response = client.execute(catalogRequest);
assertEquals(response.getStatusLine().getStatusCode(), 200);
}
}
@Test
public void emptyCatalog() throws Exception {
final SpringApplication application = new SpringApplication(EmptyServiceBrokerCatalog.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = buildAuthenticatingClient()
) {
JsonNode catalog = loadCatalog(client);
assertNotNull(catalog);
assertTrue(catalog.has("services"));
final JsonNode services = catalog.get("services");
assertTrue(services.isArray());
assertEquals(services.size(), 0);
}
}
@Test
public void serviceBrokerWithNoPlansInCatalog() throws Exception {
final SpringApplication application = new SpringApplication(EmptyServiceBrokerCatalog.class, EmptyPlanServiceBrokerConfiguration.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = buildAuthenticatingClient()
) {
JsonNode catalog = loadCatalog(client);
assertNotNull(catalog);
assertTrue(catalog.has("services"));
final JsonNode services = catalog.get("services");
assertTrue(services.isArray());
assertEquals(services.size(), 1);
final JsonNode serviceBroker = services.get(0);
// Required "id" field
assertTrue(serviceBroker.has("id"));
assertEquals(serviceBroker.get("id").asText(), BROKER_ID);
// Required "name" field
assertTrue(serviceBroker.has("name"));
assertEquals(serviceBroker.get("name").asText(), BROKER_NAME);
// Required "description" field
assertTrue(serviceBroker.has("description"));
assertEquals(serviceBroker.get("description").asText(), BROKER_DESCRIPTION);
// Required "bindable" field
assertTrue(serviceBroker.has("bindable"));
assertFalse(serviceBroker.get("bindable").asBoolean());
// Required "plans" array field
assertTrue(serviceBroker.has("plans"));
final JsonNode plans = serviceBroker.get("plans");
assertTrue(plans.isArray());
assertEquals(plans.size(), 0);
}
}
@Test
public void serviceBrokerWithPlansInCatalog() throws Exception {
final SpringApplication application = new SpringApplication(EmptyServiceBrokerCatalog.class, ServiceBrokerSinglePlanConfiguration.class);
try (
ConfigurableApplicationContext context = application.run();
CloseableHttpClient client = buildAuthenticatingClient()
) {
JsonNode catalog = loadCatalog(client);
assertNotNull(catalog);
assertTrue(catalog.has("services"));
final JsonNode services = catalog.get("services");
assertTrue(services.isArray());
assertEquals(services.size(), 1);
final JsonNode serviceBroker = services.get(0);
assertTrue(serviceBroker.has("plans"));
final JsonNode plans = serviceBroker.get("plans");
assertTrue(plans.isArray());
assertEquals(plans.size(), 1);
final JsonNode plan = plans.get(0);
assertTrue(plan.has("id"));
assertEquals(plan.get("id").asText(), PLAN_ID);
assertTrue(plan.has("name"));
assertEquals(plan.get("name").asText(), PLAN_NAME);
assertTrue(plan.has("description"));
assertEquals(plan.get("description").asText(), PLAN_DESCRIPTION);
assertTrue(plan.has("free"));
assertTrue(plan.get("free").asBoolean());
}
}
}