<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
-
- <!-- Springframework dependencies -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
+
+ <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- <exclusions>
- <exclusion>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jersey</artifactId>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-jersey</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
+
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</exclusion>
</exclusions>
</dependency>
+
<!-- swagger dependencies -->
- <dependency>
- <groupId>io.swagger</groupId>
- <artifactId>swagger-annotations</artifactId>
- <version>1.5.9</version>
- </dependency>
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-jersey2-jaxrs</artifactId>
+ <version>1.5.21</version>
+ </dependency>
+
<!-- application dependencies -->
<dependency>
<groupId>org.onap.sdnc.apps.pomba</groupId>
<artifactId>network-discovery-api</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
-
- </dependency>
- <dependency>
- <groupId>org.glassfish.jersey.core</groupId>
- <artifactId>jersey-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.onap.aai</groupId>
- <artifactId>rest-client</artifactId>
- <version>1.2.1</version>
- </dependency>
<!-- Test dependencies -->
<dependency>
+++ /dev/null
-/*
- * ============LICENSE_START===================================================
- * Copyright (c) 2018 Amdocs
- * ============================================================================
- * 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.
- * ============LICENSE_END=====================================================
- */
-package org.onap.sdnc.apps.pomba.networkdiscovery;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CallbackConfiguration {
- /** Use same object mapper as embedded tomcat server */
- @Autowired
- private ObjectMapper objectMapper;
-
- @Value("${callback.keyStorePath:}")
- private String keyStorePath;
-
- @Value("${callback.keyStorePassword:}")
- private String keyStorePassword;
-
- @Value("${callback.connectionTimeout:5000}")
- private int connectionTimeout;
-
- @Value("${callback.readTimeout:60000}")
- private int readTimeout;
-
- @Value("${callback.username:}")
- private String basicAuthUsername;
-
- @Value("${callback.password:}")
- private String basicAuthPassword;
-
- @Bean(name="callbackClient")
- public Client getClient() {
- ClientConfig configuration = new ClientConfig()
- .property(ClientProperties.CONNECT_TIMEOUT, this.connectionTimeout)
- .property(ClientProperties.READ_TIMEOUT, this.readTimeout)
- .register(new JacksonJaxbJsonProvider(objectMapper, null));
-
- // TODO set up SSL if configured
-// if (useSsl) {
-// setupSecureSocketLayerClientConfig(clientConfig);
-// }
- // Finally, create and initialize our client...
- Client client = ClientBuilder.newClient(configuration);
-
- // ...and return it to the caller.
- return client;
- }
-
-
-}
import java.util.logging.Logger;
+import javax.annotation.PostConstruct;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import org.glassfish.jersey.logging.LoggingFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletProperties;
+import org.onap.sdnc.apps.pomba.networkdiscovery.service.rs.RestService;
import org.onap.sdnc.apps.pomba.networkdiscovery.service.rs.RestServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
+import io.swagger.jaxrs.config.BeanConfig;
+import io.swagger.jaxrs.listing.ApiListingResource;
+import io.swagger.jaxrs.listing.SwaggerSerializers;
@Component
@ApplicationPath("/")
public class JerseyConfiguration extends ResourceConfig {
- private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
-
- @Bean
- @Primary
- public ObjectMapper objectMapper() {
- ObjectMapper objectMapper = new ObjectMapper();
- objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
- objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
- objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
- return objectMapper;
- }
+
+ public static final String SERVICE_NAME = "network-discovery";
+ private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
+
@Autowired
public JerseyConfiguration() {
register(RestServiceImpl.class);
public Client jerseyClient() {
return ClientBuilder.newClient(new ClientConfig());
}
+
+ @PostConstruct
+ public void init() {
+ // Register components where DI is needed
+ this.configureSwagger();
+ }
+
+ private void configureSwagger() {
+ // Available at localhost:port/swagger.json
+ this.register(ApiListingResource.class);
+ this.register(SwaggerSerializers.class);
+
+ BeanConfig config = new BeanConfig();
+ config.setTitle("Network Discovery Swagger");
+ config.setVersion("v1");
+ config.setSchemes(new String[] { "https", "http" });
+ config.setBasePath("/" + SERVICE_NAME);
+ config.setResourcePackage(RestService.class.getPackage().getName());
+ config.setPrettyPrint(true);
+ config.setScan(true);
+ }
+
}
import java.util.Map;
import java.util.StringTokenizer;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+
import org.eclipse.jetty.util.security.Password;
-import org.onap.aai.restclient.client.RestClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
private int readTimeout;
@Bean(name = "openstackClient")
- public RestClient restClient() {
- return new RestClient().validateServerHostname(false)
- .validateServerCertChain(false)
- .connectTimeoutMs(this.connectionTimeout)
- .readTimeoutMs(this.readTimeout);
+ public Client restClient() {
+ return ClientBuilder.newClient();
}
@Bean(name = "openstackIdentityUrl")
+++ /dev/null
-/*
- * ============LICENSE_START===================================================
- * Copyright (c) 2018 Amdocs
- * ============================================================================
- * 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.
- * ============LICENSE_END=====================================================
- */
-package org.onap.sdnc.apps.pomba.networkdiscovery;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-
-@Configuration
-public class WebConfiguration {
-
- @Bean
- public WebMvcConfigurerAdapter forwardToIndex() {
- return new WebMvcConfigurerAdapter() {
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- registry.addViewController("/swagger").setViewName(
- "redirect:/swagger/index.html");
- registry.addViewController("/swagger/").setViewName(
- "redirect:/swagger/index.html");
- registry.addViewController("/docs").setViewName(
- "redirect:/docs/html/index.html");
- registry.addViewController("/docs/").setViewName(
- "redirect:/docs/html/index.html");
- }
- };
- }
-}
\ No newline at end of file
*/\r
package org.onap.sdnc.apps.pomba.networkdiscovery.service;\r
\r
-import static org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException.Error.UNAUTHORIZED;\r
-\r
import java.io.File;\r
import java.io.FileInputStream;\r
-import java.io.IOException;\r
\r
+import javax.ws.rs.client.Client;\r
+import javax.ws.rs.client.Entity;\r
+import javax.ws.rs.core.HttpHeaders;\r
import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.MultivaluedHashMap;\r
-import javax.ws.rs.core.MultivaluedMap;\r
+import javax.ws.rs.core.Response;\r
import javax.ws.rs.core.Response.Status;\r
+import javax.ws.rs.core.Response.Status.Family;\r
\r
import org.apache.commons.io.IOUtils;\r
-import org.onap.aai.restclient.client.OperationResult;\r
-import org.onap.aai.restclient.client.RestClient;\r
import org.onap.logging.ref.slf4j.ONAPLogAdapter;\r
import org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException;\r
\r
-import org.slf4j.Logger;\r
-\r
public class OSAuthentication {\r
\r
private static final String CONFIG_AUTH_DIR = "config/auth";\r
private static final String X_SUBJECT_TOKEN = "X-Subject-Token";\r
\r
- private static final String USER_PATTERN = "%USER%"; \r
- private static final String PASSWORD_PATTERN = "%PASSWORD%";\r
+ private static final String USER_PATTERN = "%USER%";\r
+ private static final String PW_PATTERN = "%PASSWORD%";\r
\r
private OSAuthentication() {\r
throw new IllegalStateException("Utility class");\r
}\r
\r
- public static String getToken(String openstackIdentityUrl, String userId, String password, RestClient openstackClient, ONAPLogAdapter adapter)\r
- throws IOException, ApplicationException {\r
-\r
- MultivaluedMap<String, String> headers = new MultivaluedHashMap<>();\r
-\r
- String mappingConfigPath = CONFIG_AUTH_DIR + File.separator + "osauth.json";\r
-\r
- File file = new File(mappingConfigPath);\r
- String payload = IOUtils.toString(new FileInputStream(file), "UTF-8");\r
- payload = payload.replaceAll(USER_PATTERN, userId);\r
- payload = payload.replaceAll(PASSWORD_PATTERN, password);\r
-\r
- OperationResult result = openstackClient.post(openstackIdentityUrl, payload, headers,\r
- MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);\r
-\r
- Logger log = adapter.unwrap();\r
-\r
- if (result.wasSuccessful()) {\r
- log.info("request at url = {} resulted in http response code: {}", \r
- openstackIdentityUrl, result.getResultCode());\r
- } else {\r
- log.error("request at url = {} resulted in http response code: {}. Failure cause: {}", \r
- openstackIdentityUrl, result.getResultCode(), result.getFailureCause());\r
- }\r
-\r
-\r
- String token = result.getHeaders().getFirst(X_SUBJECT_TOKEN);\r
- \r
- if (token == null) {\r
- throw new ApplicationException(UNAUTHORIZED, Status.UNAUTHORIZED);\r
- }\r
-\r
- log.debug("Got token: {}", token);\r
-\r
- return token;\r
- }\r
+ public static String getToken(String openstackIdentityUrl, String userId, String password, Client openstackClient,\r
+ ONAPLogAdapter adapter) throws ApplicationException {\r
+\r
+ String mappingConfigPath = CONFIG_AUTH_DIR + File.separator + "osauth.json";\r
+ File file = new File(mappingConfigPath);\r
+\r
+ Response result;\r
+ try {\r
+ String payload = IOUtils.toString(new FileInputStream(file), "UTF-8");\r
+ payload = payload.replaceAll(USER_PATTERN, userId);\r
+ payload = payload.replaceAll(PW_PATTERN, password);\r
+\r
+ result = openstackClient.target(openstackIdentityUrl).request()\r
+ .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)\r
+ .post(Entity.entity(payload, MediaType.APPLICATION_JSON));\r
+ } catch (Exception e) {\r
+ // catch the case when the connection times out (e.g., host not available).\r
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND,\r
+ "Openstack API login failed - " + e.getMessage());\r
+ }\r
+\r
+ String jsonResult = result.readEntity(String.class);\r
+ \r
+ if (result.getStatusInfo().getFamily() != Family.SUCCESSFUL) {\r
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND, jsonResult);\r
+ }\r
+\r
+ String token = result.getHeaderString(X_SUBJECT_TOKEN);\r
+ if (token == null) {\r
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND,\r
+ "Failed to get token from Openstack API response");\r
+ }\r
+\r
+ adapter.unwrap().debug("Got token: {}", token);\r
+\r
+ return token;\r
+ }\r
\r
}\r
String requestId,
String resourceType,
List<String> resourceIds,
- String notificationURL,
- String notificationAuthorization,
ONAPLogAdapter adapter)
throws ApplicationException;
}
*/
package org.onap.sdnc.apps.pomba.networkdiscovery.service;
-import com.bazaarvoice.jolt.JsonUtils;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-
-import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import javax.annotation.PreDestroy;
import javax.ws.rs.client.Client;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.StatusType;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.Response.Status.Family;
-import javax.xml.parsers.ParserConfigurationException;
-import org.onap.aai.restclient.client.OperationResult;
-import org.onap.aai.restclient.client.RestClient;
import org.onap.logging.ref.slf4j.ONAPLogAdapter;
-import org.onap.logging.ref.slf4j.ONAPLogAdapter.RequestBuilder;
-import org.onap.logging.ref.slf4j.ONAPLogConstants;
-import org.onap.logging.ref.slf4j.ONAPLogConstants.InvocationMode;
import org.onap.pomba.common.datatypes.DataQuality;
import org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException;
import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.Attribute;
public class SpringServiceImpl implements SpringService {
private static final String OPENSTACK_HEADER_TOKEN = "X-Auth-Token";
private static final String OPENSTACK_HEADER_API_VERSION = "X-OpenStack-Nova-API-Version";
- private static final int DEFAULT_WORKER_THREADS = 3;
-
- private ExecutorService executor = Executors.newFixedThreadPool(
- Integer.getInteger("discovery.threads", DEFAULT_WORKER_THREADS),
- new ThreadFactoryBuilder().setNameFormat("discovery-worker-%d").build());
@Autowired
- private RestClient openstackClient;
+ private Client openstackClient;
@Autowired
private String openstackIdentityUrl;
@Autowired
private String openstackApiMicroversion;
- @javax.annotation.Resource
- private Client callbackClient;
-
@javax.annotation.Resource
private Map<String, String> openstackTypeURLs;
- public SpringServiceImpl() throws ParserConfigurationException {
- }
-
@Override
public NetworkDiscoveryResponse findbyResourceIdAndType(String transactionId, String requestId, String resourceType,
- List<String> resourceIds, String notificationURL, String notificationAuthorization, ONAPLogAdapter adapter)
- throws ApplicationException {
+ List<String> resourceIds, ONAPLogAdapter adapter) throws ApplicationException {
NetworkDiscoveryResponse response = new NetworkDiscoveryResponse();
response.setRequestId(requestId);
- String openstackURL = this.openstackTypeURLs.get(resourceType);
// check if resourceType is supported
+ String openstackURL = this.openstackTypeURLs.get(resourceType);
if (openstackURL == null) {
- // don't know what to do with this - return empty response
- response.setCode(Status.NO_CONTENT.getStatusCode());
- response.setMessage("Unsupported resourceType " + resourceType);
- response.setAckFinalIndicator(true);
- return response;
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.BAD_REQUEST,
+ "Unsupported resourceType " + resourceType);
}
-
- // schedule discovery of specified resources
- Runnable task = new ResourceTask(transactionId, requestId, resourceType, resourceIds, notificationURL,
- notificationAuthorization, openstackURL, adapter);
- this.executor.submit(task);
-
- response.setCode(Status.ACCEPTED.getStatusCode());
- response.setMessage(Status.ACCEPTED.getReasonPhrase());
- response.setAckFinalIndicator(false);
- return response;
- }
-
- @PreDestroy
- public void shutdown() {
- this.executor.shutdown();
- }
-
- private void sendNotification(String url, String transactionId, String authorization, Object notification,
- ONAPLogAdapter adapter) {
-
- Invocation.Builder request = this.callbackClient.target(url).request().accept(MediaType.TEXT_PLAIN_TYPE);
-
- if (authorization != null) {
- request.header(HttpHeaders.AUTHORIZATION, authorization);
- request.header(ONAPLogConstants.Headers.REQUEST_ID, transactionId);
- }
- Logger log = adapter.unwrap();
- adapter.invoke(new RequestBuilderWrapper(request), InvocationMode.SYNCHRONOUS);
- try {
- log.info("Posting notfication to url = {} , payload: {}", url,
- JsonUtils.toJsonString(Entity.json(notification).getEntity()));
-
- Response result = request.post(Entity.json(notification));
-
- StatusType status = result.getStatusInfo();
-
- if (status.getFamily().equals(Family.SUCCESSFUL)) {
- log.info("request at url = {} resulted in http status code {}",
- url, status.getStatusCode());
- } else {
- log.error("request at url = {} resulted in http status code {}, reason: {}",
- url, status.getStatusCode(), status.getReasonPhrase());
- }
-
-
- } catch (Exception x) {
- log.error("Error during {} operation to endpoint at url = {} with error = {}", "POST", url,
- x.getLocalizedMessage());
- }
- }
-
- private class ResourceTask implements Runnable {
- private final String transactionId;
- private final String requestId;
- private final String resourceType;
- private final List<String> resourceIds;
- private final String notificationURL;
- private final String notificationAuthorization;
- private final String resourceURL;
- private final ONAPLogAdapter adapter;
-
- public ResourceTask(String transactionId, String requestId, String resourceType, List<String> resourceIds,
- String notificationURL, String notificationAuthorization, String resourceURL, ONAPLogAdapter adapter) {
- this.transactionId = transactionId;
- this.requestId = requestId;
- this.resourceType = resourceType;
- this.resourceIds = resourceIds;
- this.notificationURL = notificationURL;
- this.notificationAuthorization = notificationAuthorization;
- this.resourceURL = resourceURL;
- this.adapter = adapter;
- }
-
- @Override
- public void run() {
+ String token = OSAuthentication.getToken(openstackIdentityUrl, openstackIdentityUser, openstackIdentityPassword,
+ openstackClient, adapter);
+
+ NetworkDiscoveryNotification discoveryResponse = new NetworkDiscoveryNotification();
+ discoveryResponse.setRequestId(requestId);
+
+ List<Resource> resources = new ArrayList<>();
+ MessageFormat format = new MessageFormat(openstackURL);
+
+ for (String resourceId : resourceIds) {
+ String url = format.format(new Object[] { resourceId });
+ Resource resource = new Resource();
+ resource.setType(resourceType);
+ resource.setId(resourceId);
+ resources.add(resource);
+
+ Response result;
try {
- runResourceDiscoveryTask();
+ result = openstackClient.target(url).request().header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)
+ .header(OPENSTACK_HEADER_TOKEN, token)
+ .header(OPENSTACK_HEADER_API_VERSION, openstackApiMicroversion).get();
} catch (Exception e) {
- Logger log = adapter.unwrap();
- log.error("Failure in resource task", e);
-
- // Try to send out a notification of the failure:
- NetworkDiscoveryNotification notification = new NetworkDiscoveryNotification();
- notification.setRequestId(this.requestId);
- notification.setCode(Status.INTERNAL_SERVER_ERROR.getStatusCode());
- notification.setMessage(e.getMessage());
- notification.setAckFinalIndicator(true);
-
- // call client back with resource details
- sendNotification(this.notificationURL, this.transactionId, this.notificationAuthorization, notification,
- adapter);
+ // in case of time-out, exit the loop and return a failure.
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND,
+ "Openstack API GET failed - " + e.getMessage());
}
- }
-
- private void runResourceDiscoveryTask() throws IOException, ApplicationException {
-
- String token = OSAuthentication.getToken(openstackIdentityUrl, openstackIdentityUser,
- openstackIdentityPassword, openstackClient, adapter);
-
- NetworkDiscoveryNotification notification = new NetworkDiscoveryNotification();
- notification.setRequestId(this.requestId);
-
- List<Resource> resources = null;
- MessageFormat format = new MessageFormat(this.resourceURL);
- MultivaluedMap<String, String> headers = new MultivaluedHashMap<>();
- headers.add(OPENSTACK_HEADER_TOKEN, token);
- headers.add(OPENSTACK_HEADER_API_VERSION, openstackApiMicroversion);
-
- for (String resourceId : this.resourceIds) {
- String url = format.format(new Object[] { resourceId });
- OperationResult result = SpringServiceImpl.this.openstackClient.get(url, headers,
- MediaType.APPLICATION_JSON_TYPE);
-
- Resource resource = new Resource();
- resource.setType(this.resourceType);
- resource.setId(resourceId);
- if (resources == null) {
- resources = new ArrayList<>();
- notification.setResources(resources);
- }
- resources.add(resource);
-
- Logger log = adapter.unwrap();
-
- if (result.wasSuccessful()) {
- log.info("Openstack GET result code: {}", result.getResultCode());
-
- String transformedOutput = TransformationUtil.transform(result.getResult(), this.resourceType);
-
- log.debug("Jolt transformed output: {}", transformedOutput);
-
- resource.setDataQuality(DataQuality.ok());
- List<Attribute> attributeList = TransformationUtil.toAttributeList(transformedOutput);
- resource.setAttributeList(attributeList);
- } else {
- log.error("Openstack GET result code: {}. Failure cause: {}",
- result.getResultCode(), result.getFailureCause());
- resource.setDataQuality(DataQuality.error(result.getFailureCause()));
- }
+
+ String jsonResult = result.readEntity(String.class);
+ Logger log = adapter.unwrap();
+
+ log.info("Openstack GET result for resourceID {}: {}", resourceId, jsonResult);
+
+ if (result.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
+ String transformedOutput = TransformationUtil.transform(jsonResult, resourceType);
+
+ log.debug("Jolt transformed output: {}", transformedOutput);
+
+ resource.setDataQuality(DataQuality.ok());
+ List<Attribute> attributeList = TransformationUtil.toAttributeList(transformedOutput);
+ resource.setAttributeList(attributeList);
+ } else {
+ resource.setDataQuality(DataQuality.error(jsonResult));
}
- notification.setCode(Status.OK.getStatusCode());
- notification.setMessage(Status.OK.getReasonPhrase());
- notification.setAckFinalIndicator(true);
-
- // call client back with resource details
- sendNotification(this.notificationURL, this.transactionId, this.notificationAuthorization, notification,
- adapter);
}
- }
-
- private static class RequestBuilderWrapper implements RequestBuilder<RequestBuilderWrapper> {
- private Invocation.Builder builder;
-
- private RequestBuilderWrapper(Invocation.Builder builder) {
- this.builder = builder;
- }
-
- @Override
- public RequestBuilderWrapper setHeader(String name, String value) {
- this.builder.header(name, value);
- return this;
- }
+ discoveryResponse.setResources(resources);
+ discoveryResponse.setCode(Status.OK.getStatusCode());
+ discoveryResponse.setMessage(Status.OK.getReasonPhrase());
+ discoveryResponse.setAckFinalIndicator(true);
+ return discoveryResponse;
}
+
}
\ No newline at end of file
import javax.ws.rs.core.Response;
import org.onap.logging.ref.slf4j.ONAPLogConstants;
import org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException;
-import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryResponse;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
@Api(protocols="http", tags= {"resource"})
@Produces(MediaType.APPLICATION_JSON)
public interface RestService {
- public static final String SERVICE_NAME = "network-discovery";
-
@GET
@Path("/resource")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(
value = "Get Network Information",
notes = "Retrieve information from primary data sources",
- response = NetworkDiscoveryResponse.class,
authorizations = @Authorization("basicAuth")
)
@ApiResponses(
value = {
- @ApiResponse(code = 200, message = "Request has completed and no more information is forthcoming."),
- @ApiResponse(code = 202, message = "Request has been accepted and more information will be posted to notificationURL."),
+ @ApiResponse(code = 200, message = "Request has completed.", response = NetworkDiscoveryNotification.class),
@ApiResponse(code = 400, message = "Missing mandatory field in the request or HTTP header."),
+ @ApiResponse(code = 401, message = "Missing basicAuth header."),
@ApiResponse(code = 404, message = "Requested resource was not found."),
@ApiResponse(code = 500, message = "Request failed due to internal error")
})
@QueryParam("resourceId")
@ApiParam(required=true)
- List<String> resourceIds,
-
- @QueryParam("notificationURL")
- @ApiParam(required=true)
- String notificationURL) throws ApplicationException;
+ List<String> resourceIds) throws ApplicationException;
}
\ No newline at end of file
import org.onap.logging.ref.slf4j.ONAPLogConstants;
import org.onap.logging.ref.slf4j.ONAPLogConstants.ResponseStatus;
import org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException;
+import org.onap.sdnc.apps.pomba.networkdiscovery.JerseyConfiguration;
import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryResponse;
import org.onap.sdnc.apps.pomba.networkdiscovery.service.SpringService;
import org.slf4j.Logger;
String transactionId,
String requestId,
String resourceType,
- List<String> resourceIds,
- String notificationURL) throws ApplicationException {
+ List<String> resourceIds) throws ApplicationException {
ONAPLogAdapter adapter = new ONAPLogAdapter(log);
try {
- adapter.getServiceDescriptor().setServiceName(SERVICE_NAME);
+ adapter.getServiceDescriptor().setServiceName(JerseyConfiguration.SERVICE_NAME);
adapter.entering(request);
- if (version == null) {
- throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "version");
- }
-
- if (authorization == null || !this.basicAuthHeader.equals(authorization)) {
- throw new ApplicationException(UNAUTHORIZED, Status.UNAUTHORIZED);
- }
- if ((fromAppId == null) || fromAppId.trim().isEmpty()) {
- throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, ONAPLogConstants.Headers.PARTNER_NAME);
- }
- if (requestId == null || requestId.isEmpty()) {
- throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "requestId");
- }
- if (notificationURL == null) {
- throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "notificationURL");
- }
- if (resourceType == null || resourceType.isEmpty()) {
- throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "resourceType");
- }
- if (resourceIds == null || resourceIds.isEmpty()) {
- throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "resourceIds");
- }
+ validateInput(version, authorization, fromAppId, requestId, resourceType, resourceIds);
if (transactionId == null || transactionId.isEmpty()) {
transactionId = UUID.randomUUID().toString();
log.debug("transactionId is missing; using newly generated value: {}", transactionId);
}
- // just reuse received Authorization header in callback
NetworkDiscoveryResponse response = this.service.findbyResourceIdAndType(transactionId,
- requestId, resourceType, resourceIds, notificationURL, authorization, adapter);
+ requestId, resourceType, resourceIds, adapter);
adapter.getResponseDescriptor().setResponseStatus(ResponseStatus.COMPLETED);
- return Response.ok(response).build();
+ Response returnedResponse = Response.ok(response).build();
+ adapter.unwrap().info("request at url = {} resulted in http status {} and response: {}", request.getServletPath(),
+ returnedResponse.getStatus(), returnedResponse.getEntity());
+ return returnedResponse;
} catch (ApplicationException x) {
adapter.getResponseDescriptor()
.setResponseCode(x.getResponseCode())
.setResponseStatus(ResponseStatus.ERROR);
- log.error(x.getMessage(), x);
+ log.error(x.getMessage());
ResponseBuilder builder = Response.status(x.getHttpStatus()).entity(x.getMessage());
if (authorization == null) {
builder.header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"network-discovery\"");
adapter.exiting();
}
}
+
+ private void validateInput(String version, String authorization, String fromAppId, String requestId,
+ String resourceType, List<String> resourceIds) throws ApplicationException {
+ if (version == null) {
+ throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "version");
+ }
+
+ if (authorization == null || !this.basicAuthHeader.equals(authorization)) {
+ throw new ApplicationException(UNAUTHORIZED, Status.UNAUTHORIZED);
+ }
+ if ((fromAppId == null) || fromAppId.trim().isEmpty()) {
+ throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, ONAPLogConstants.Headers.PARTNER_NAME);
+ }
+ if (requestId == null || requestId.isEmpty()) {
+ throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "requestId");
+ }
+
+ if (resourceType == null || resourceType.isEmpty()) {
+ throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "resourceType");
+ }
+ if (resourceIds == null || resourceIds.isEmpty()) {
+ throw new ApplicationException(MISSING_PARAM, Status.BAD_REQUEST, "resourceIds");
+ }
+ }
}
private static final String CONFIG_JOLT = "config/jolt";\r
private static final String EMPTY_STRING = "";\r
\r
- public TransformationUtil() {\r
+ private TransformationUtil() {\r
throw new IllegalStateException("Utility class");\r
}\r
\r
package org.onap.sdnc.apps.pomba.networkdiscovery.unittest.service;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
-import static com.github.tomakehurst.wiremock.client.WireMock.ok;
import static com.github.tomakehurst.wiremock.client.WireMock.okJson;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static org.junit.Assert.fail;
import com.bazaarvoice.jolt.JsonUtils;
-import com.fasterxml.jackson.databind.AnnotationIntrospector;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
-import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
-import com.github.tomakehurst.wiremock.verification.LoggedRequest;
import java.net.URISyntaxException;
import java.text.MessageFormat;
import org.onap.pomba.common.datatypes.DataQuality;
import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.Attribute;
import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
-import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryResponse;
import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.Resource;
import org.onap.sdnc.apps.pomba.networkdiscovery.service.rs.RestService;
import org.springframework.beans.factory.annotation.Autowired;
private static final String APP = "junit";
private static final String RESOURCE_TYPE_VSERVER = "vserver";
- private static final String CALLBACK_PATH = "/callback";
private static final String AUTH = "Basic " + Base64.getEncoder().encodeToString((
"admin:" + Password.deobfuscate("OBF:1u2a1toa1w8v1tok1u30")).getBytes());
// no Authorization header
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, null, APP, this.transactionId,
- this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ this.requestId, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
// should get WWW-Authenticate header in response
assertTrue(response.getHeaderString(HttpHeaders.WWW_AUTHENTICATE).startsWith("Basic realm"));
// bad Authorization header
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, authorization, APP,
- this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
// should not get WWW-Authenticate header in response
assertNull(response.getHeaderString(HttpHeaders.WWW_AUTHENTICATE));
String authorization = "Basic " + Base64.getEncoder().encodeToString("aaa:bbb".getBytes());
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(this.httpRequest, null, authorization, APP,
- this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
// should get WWW-Authenticate header in response
assertTrue(((String) response.getEntity()).contains("version"));
// no X-FromAppId header
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, null, this.transactionId,
- this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ this.requestId, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
assertTrue(((String) response.getEntity()).contains(ONAPLogConstants.Headers.PARTNER_NAME));
}
public void testVerifyRequestId() throws Exception {
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, this.transactionId,
- null, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ null, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
assertTrue(((String) response.getEntity()).contains("requestId"));
}
- @Test
- public void testVerifyNotificationUrl() throws Exception {
- List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
- Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, this.transactionId,
- this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, null);
- assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
- assertTrue(((String) response.getEntity()).contains("notificationURL"));
- }
-
@Test
public void testVerifyResourceIds() throws Exception {
// no resourceIds list
{
List<String> resourceIds = null;
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP,
- this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
assertTrue(((String) response.getEntity()).contains("resourceIds"));
}
{
List<String> resourceIds = new ArrayList<>();
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP,
- this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds, getCallbackUrl());
+ this.transactionId, this.requestId, RESOURCE_TYPE_VSERVER, resourceIds);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
assertTrue(((String) response.getEntity()).contains("resourceIds"));
}
// no resource type
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, this.transactionId,
- this.requestId, null, resourceIds, getCallbackUrl());
+ this.requestId, null, resourceIds);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
assertTrue(((String) response.getEntity()).contains("resourceType"));
}
// no request
List<String> resourceIds = Arrays.asList(UUID.randomUUID().toString());
Response response = this.service.findbyResourceIdAndType(null, V1, AUTH, APP, this.transactionId,
- this.requestId, null, resourceIds, getCallbackUrl());
+ this.requestId, null, resourceIds);
assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus());
}
this.openstackRule.stubFor(get(resourcePath).willReturn(okJson(openstackApiResponse)));
this.identityRule.stubFor(post(identityPath).willReturn(okJson("{}").withHeader("X-Subject-Token", "tokenId")));
-
- this.callbackRule.stubFor(post(CALLBACK_PATH).willReturn(ok("Acknowledged")));
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, null, this.requestId,
- RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId), getCallbackUrl());
+ RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId));
assertEquals(Status.OK.getStatusCode(), response.getStatus());
- NetworkDiscoveryResponse entity = (NetworkDiscoveryResponse) response.getEntity();
- assertEquals(requestId, entity.getRequestId());
- assertEquals(Status.ACCEPTED.getStatusCode(), entity.getCode().intValue());
- assertEquals(Boolean.FALSE, entity.getAckFinalIndicator());
-
- List<ServeEvent> events = waitForRequests(this.callbackRule, 1, 10);
- LoggedRequest notificationRequest = events.get(0).getRequest();
- assertEquals(AUTH, notificationRequest.getHeader(HttpHeaders.AUTHORIZATION));
- String notificationJson = notificationRequest.getBodyAsString();
-
- ObjectMapper mapper = new ObjectMapper();
- AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
- mapper.setAnnotationIntrospector(introspector);
- NetworkDiscoveryNotification notification = mapper.readValue(notificationJson,
- NetworkDiscoveryNotification.class);
+ NetworkDiscoveryNotification notification = (NetworkDiscoveryNotification) response.getEntity();
assertEquals(requestId, notification.getRequestId());
assertEquals(Status.OK.getStatusCode(), notification.getCode().intValue());
}
@Test
- public void testDiscoverVserverFailure() throws Exception {
+ public void testDiscoverVserverFailureNotFound() throws Exception {
String vserverId = UUID.randomUUID().toString();
String resourcePath = MessageFormat.format("/v2.1/servers/{0}",
this.openstackRule.stubFor(get(resourcePath).willReturn(WireMock.notFound()));
this.identityRule.stubFor(post(identityPath).willReturn(okJson("{}").withHeader("X-Subject-Token", "tokenId")));
-
- this.callbackRule.stubFor(post(CALLBACK_PATH).willReturn(ok("Acknowledged")));
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, null, this.requestId,
- RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId), getCallbackUrl());
+ RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId));
assertEquals(Status.OK.getStatusCode(), response.getStatus());
- NetworkDiscoveryResponse entity = (NetworkDiscoveryResponse) response.getEntity();
- assertEquals(requestId, entity.getRequestId());
- assertEquals(Status.ACCEPTED.getStatusCode(), entity.getCode().intValue());
- assertEquals(Boolean.FALSE, entity.getAckFinalIndicator());
-
- List<ServeEvent> events = waitForRequests(this.callbackRule, 1, 10);
- LoggedRequest notificationRequest = events.get(0).getRequest();
- assertEquals(AUTH, notificationRequest.getHeader(HttpHeaders.AUTHORIZATION));
- String notificationJson = notificationRequest.getBodyAsString();
-
- ObjectMapper mapper = new ObjectMapper();
- AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
- mapper.setAnnotationIntrospector(introspector);
- NetworkDiscoveryNotification notification = mapper.readValue(notificationJson,
- NetworkDiscoveryNotification.class);
-
+ NetworkDiscoveryNotification notification = (NetworkDiscoveryNotification) response.getEntity();
assertEquals(requestId, notification.getRequestId());
assertEquals(Status.OK.getStatusCode(), notification.getCode().intValue());
assertEquals(Boolean.TRUE, notification.getAckFinalIndicator());
assertNull(vserver.getAttributeList());
}
-
/**
* Verify API returns a final response indicating no discovery possible.
*/
String resourceType = "unsupported";
List<String> resourceIds = Arrays.asList("dummyId");
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, this.transactionId,
- this.requestId, resourceType, resourceIds, getCallbackUrl());
- assertEquals(Status.OK.getStatusCode(), response.getStatus());
-
- NetworkDiscoveryResponse entity = (NetworkDiscoveryResponse) response.getEntity();
- System.err.println("entity:" + entity);
- assertEquals(Boolean.TRUE, entity.getAckFinalIndicator());
- assertEquals(Status.NO_CONTENT.getStatusCode(), entity.getCode().intValue());
+ this.requestId, resourceType, resourceIds);
+ assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
}
@Test
String identityPath = "/v3/auth/tokens";
this.identityRule.stubFor(post(identityPath).willReturn(WireMock.unauthorized()));
-
- this.callbackRule.stubFor(post(CALLBACK_PATH).willReturn(ok("Acknowledged")));
Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, null, this.requestId,
- RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId), getCallbackUrl());
-
- assertEquals(Status.OK.getStatusCode(), response.getStatus());
- NetworkDiscoveryResponse entity = (NetworkDiscoveryResponse) response.getEntity();
- assertEquals(requestId, entity.getRequestId());
- assertEquals(Status.ACCEPTED.getStatusCode(), entity.getCode().intValue());
- assertEquals(Boolean.FALSE, entity.getAckFinalIndicator());
-
- List<ServeEvent> events = waitForRequests(this.callbackRule, 1, 10);
- LoggedRequest notificationRequest = events.get(0).getRequest();
- assertEquals(AUTH, notificationRequest.getHeader(HttpHeaders.AUTHORIZATION));
- String notificationJson = notificationRequest.getBodyAsString();
-
- ObjectMapper mapper = new ObjectMapper();
- AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
- mapper.setAnnotationIntrospector(introspector);
- NetworkDiscoveryNotification notification = mapper.readValue(notificationJson,
- NetworkDiscoveryNotification.class);
+ RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId));
- assertEquals(requestId, notification.getRequestId());
- assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(), notification.getCode().intValue());
- assertEquals(Boolean.TRUE, notification.getAckFinalIndicator());
- assertNull(notification.getResources());
+ assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
}
+
+ @Test
+ public void testLoginFailureMissingToken() throws Exception {
+ String vserverId = UUID.randomUUID().toString();
+ String identityPath = "/v3/auth/tokens";
+
+ this.identityRule.stubFor(post(identityPath).willReturn(okJson("{}")));
+
+ Response response = this.service.findbyResourceIdAndType(this.httpRequest, V1, AUTH, APP, null, this.requestId,
+ RESOURCE_TYPE_VSERVER, Arrays.asList(vserverId));
+ assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+ }
private void verifyAttribute(List<Attribute> attributeList, String attrName, String attrValue) {
for (Attribute attr : attributeList) {
fail("Attribute " + attrName + " not found");
}
- private List<ServeEvent> waitForRequests(WireMockRule service, int minRequests, long timeoutSeconds)
- throws InterruptedException {
-
- long remaining = timeoutSeconds * 1000L;
- long retryInterval = Math.min(remaining / 5, 1000);
- while (true) {
- List<ServeEvent> events = service.getAllServeEvents();
- if (events.size() >= minRequests) {
- return events;
- }
- if (remaining <= 0) {
- fail("Timeout waiting for " + minRequests + " requests");
- }
- Thread.sleep(retryInterval);
- remaining -= retryInterval;
- }
- }
-
- private String getCallbackUrl() {
- return "http://localhost:" + this.callbackRule.port() + CALLBACK_PATH;
- }
}
for (Attribute attribute : resultAttributeList) {\r
resultAttributes.put(attribute.getName(), attribute.getValue());\r
}\r
- // assertThat(expectedAttributes, resultAttributes);\r
assertThat(expectedAttributes, CoreMatchers.is(resultAttributes));\r
}\r
\r