diff options
author | Norm Traxler <normant@amdocs.com> | 2019-01-07 21:32:15 +0000 |
---|---|---|
committer | Norm Traxler <normant@amdocs.com> | 2019-01-09 18:53:12 +0000 |
commit | 20c6155c781f2bec7920d37da40c23f3e2a26b89 (patch) | |
tree | e24b1f5b83529d95033b71a8050b04e1258648c2 | |
parent | e9d2fb2637ae8fc5fb0fe3474c75bf0c8409b66a (diff) |
Network Discovery Microservice Sync responses
Issue-ID: SDNC-543
Change-Id: I274c23a258dcbdd4928169f119e03925b1c10ee7
Signed-off-by: Norm Traxler <normant@amdocs.com>
13 files changed, 219 insertions, 585 deletions
diff --git a/pomba/network-discovery/pom.xml b/pomba/network-discovery/pom.xml index dea7353..a428a59 100644 --- a/pomba/network-discovery/pom.xml +++ b/pomba/network-discovery/pom.xml @@ -66,30 +66,23 @@ limitations under the License. <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> @@ -111,32 +104,20 @@ limitations under the License. </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> diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/CallbackConfiguration.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/CallbackConfiguration.java deleted file mode 100644 index 1d2bdab..0000000 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/CallbackConfiguration.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * ============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; - } - - -} diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/JerseyConfiguration.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/JerseyConfiguration.java index b4488db..e073e34 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/JerseyConfiguration.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/JerseyConfiguration.java @@ -19,6 +19,7 @@ package org.onap.sdnc.apps.pomba.networkdiscovery; 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; @@ -27,34 +28,24 @@ import org.glassfish.jersey.client.ClientConfig; 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); @@ -66,4 +57,26 @@ public class JerseyConfiguration extends ResourceConfig { 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); + } + } diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/OpenstackConfiguration.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/OpenstackConfiguration.java index ee18397..230a3f2 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/OpenstackConfiguration.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/OpenstackConfiguration.java @@ -21,8 +21,10 @@ import java.util.HashMap; 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; @@ -59,11 +61,8 @@ public class OpenstackConfiguration { 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") diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/WebConfiguration.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/WebConfiguration.java deleted file mode 100644 index 7a7bbd9..0000000 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/WebConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ============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 diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/OSAuthentication.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/OSAuthentication.java index c00bf24..e0a158f 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/OSAuthentication.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/OSAuthentication.java @@ -17,72 +17,69 @@ */
package org.onap.sdnc.apps.pomba.networkdiscovery.service;
-import static org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException.Error.UNAUTHORIZED;
-
import java.io.File;
import java.io.FileInputStream;
-import java.io.IOException;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+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.Status;
+import javax.ws.rs.core.Response.Status.Family;
import org.apache.commons.io.IOUtils;
-import org.onap.aai.restclient.client.OperationResult;
-import org.onap.aai.restclient.client.RestClient;
import org.onap.logging.ref.slf4j.ONAPLogAdapter;
import org.onap.sdnc.apps.pomba.networkdiscovery.ApplicationException;
-import org.slf4j.Logger;
-
public class OSAuthentication {
private static final String CONFIG_AUTH_DIR = "config/auth";
private static final String X_SUBJECT_TOKEN = "X-Subject-Token";
- private static final String USER_PATTERN = "%USER%";
- private static final String PASSWORD_PATTERN = "%PASSWORD%";
+ private static final String USER_PATTERN = "%USER%";
+ private static final String PW_PATTERN = "%PASSWORD%";
private OSAuthentication() {
throw new IllegalStateException("Utility class");
}
- public static String getToken(String openstackIdentityUrl, String userId, String password, RestClient openstackClient, ONAPLogAdapter adapter)
- throws IOException, ApplicationException {
-
- MultivaluedMap<String, String> headers = new MultivaluedHashMap<>();
-
- String mappingConfigPath = CONFIG_AUTH_DIR + File.separator + "osauth.json";
-
- File file = new File(mappingConfigPath);
- String payload = IOUtils.toString(new FileInputStream(file), "UTF-8");
- payload = payload.replaceAll(USER_PATTERN, userId);
- payload = payload.replaceAll(PASSWORD_PATTERN, password);
-
- OperationResult result = openstackClient.post(openstackIdentityUrl, payload, headers,
- MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
-
- Logger log = adapter.unwrap();
-
- if (result.wasSuccessful()) {
- log.info("request at url = {} resulted in http response code: {}",
- openstackIdentityUrl, result.getResultCode());
- } else {
- log.error("request at url = {} resulted in http response code: {}. Failure cause: {}",
- openstackIdentityUrl, result.getResultCode(), result.getFailureCause());
- }
-
-
- String token = result.getHeaders().getFirst(X_SUBJECT_TOKEN);
-
- if (token == null) {
- throw new ApplicationException(UNAUTHORIZED, Status.UNAUTHORIZED);
- }
-
- log.debug("Got token: {}", token);
-
- return token;
- }
+ public static String getToken(String openstackIdentityUrl, String userId, String password, Client openstackClient,
+ ONAPLogAdapter adapter) throws ApplicationException {
+
+ String mappingConfigPath = CONFIG_AUTH_DIR + File.separator + "osauth.json";
+ File file = new File(mappingConfigPath);
+
+ Response result;
+ try {
+ String payload = IOUtils.toString(new FileInputStream(file), "UTF-8");
+ payload = payload.replaceAll(USER_PATTERN, userId);
+ payload = payload.replaceAll(PW_PATTERN, password);
+
+ result = openstackClient.target(openstackIdentityUrl).request()
+ .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)
+ .post(Entity.entity(payload, MediaType.APPLICATION_JSON));
+ } catch (Exception e) {
+ // catch the case when the connection times out (e.g., host not available).
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND,
+ "Openstack API login failed - " + e.getMessage());
+ }
+
+ String jsonResult = result.readEntity(String.class);
+
+ if (result.getStatusInfo().getFamily() != Family.SUCCESSFUL) {
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND, jsonResult);
+ }
+
+ String token = result.getHeaderString(X_SUBJECT_TOKEN);
+ if (token == null) {
+ throw new ApplicationException(ApplicationException.Error.GENERAL_FAILURE, Status.NOT_FOUND,
+ "Failed to get token from Openstack API response");
+ }
+
+ adapter.unwrap().debug("Got token: {}", token);
+
+ return token;
+ }
}
diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringService.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringService.java index e0f50f6..b4a9ce1 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringService.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringService.java @@ -28,8 +28,6 @@ public interface SpringService { String requestId, String resourceType, List<String> resourceIds, - String notificationURL, - String notificationAuthorization, ONAPLogAdapter adapter) throws ApplicationException; } diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringServiceImpl.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringServiceImpl.java index f9de2be..5577398 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringServiceImpl.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringServiceImpl.java @@ -17,37 +17,19 @@ */ 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; @@ -63,14 +45,9 @@ import org.springframework.stereotype.Service; 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; @@ -85,194 +62,72 @@ public class SpringServiceImpl implements SpringService { 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 diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestService.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestService.java index 57fbb53..226f325 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestService.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestService.java @@ -38,7 +38,7 @@ import javax.ws.rs.core.MediaType; 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"}) @@ -46,8 +46,6 @@ import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryRespo @Produces(MediaType.APPLICATION_JSON) public interface RestService { - public static final String SERVICE_NAME = "network-discovery"; - @GET @Path("/resource") @Produces(MediaType.APPLICATION_JSON) @@ -55,14 +53,13 @@ public interface RestService { @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") }) @@ -94,10 +91,6 @@ public interface RestService { @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 diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestServiceImpl.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestServiceImpl.java index 0677dcd..adb5df0 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestServiceImpl.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestServiceImpl.java @@ -34,6 +34,7 @@ import org.onap.logging.ref.slf4j.ONAPLogAdapter; 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; @@ -60,54 +61,34 @@ public class RestServiceImpl implements RestService { 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\""); @@ -124,4 +105,28 @@ public class RestServiceImpl implements RestService { 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"); + } + } } diff --git a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/util/TransformationUtil.java b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/util/TransformationUtil.java index dc17848..0984f66 100644 --- a/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/util/TransformationUtil.java +++ b/pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/util/TransformationUtil.java @@ -35,7 +35,7 @@ public class TransformationUtil { private static final String CONFIG_JOLT = "config/jolt";
private static final String EMPTY_STRING = "";
- public TransformationUtil() {
+ private TransformationUtil() {
throw new IllegalStateException("Utility class");
}
diff --git a/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/NetworkDiscoveryTest.java b/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/NetworkDiscoveryTest.java index 18a0a04..31b1abe 100644 --- a/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/NetworkDiscoveryTest.java +++ b/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/NetworkDiscoveryTest.java @@ -19,7 +19,6 @@ 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; @@ -29,14 +28,8 @@ import static org.junit.Assert.assertTrue; 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; @@ -62,7 +55,6 @@ import org.onap.logging.ref.slf4j.ONAPLogConstants; 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; @@ -90,7 +82,6 @@ public class NetworkDiscoveryTest { 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()); @@ -131,7 +122,7 @@ public class NetworkDiscoveryTest { // 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")); @@ -143,7 +134,7 @@ public class NetworkDiscoveryTest { // 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)); @@ -155,7 +146,7 @@ public class NetworkDiscoveryTest { 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")); @@ -166,7 +157,7 @@ public class NetworkDiscoveryTest { // 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)); } @@ -175,27 +166,18 @@ public class NetworkDiscoveryTest { 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")); } @@ -204,7 +186,7 @@ public class NetworkDiscoveryTest { { 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")); } @@ -215,7 +197,7 @@ public class NetworkDiscoveryTest { // 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")); } @@ -225,7 +207,7 @@ public class NetworkDiscoveryTest { // 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()); } @@ -245,28 +227,12 @@ public class NetworkDiscoveryTest { 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()); @@ -285,7 +251,7 @@ public class NetworkDiscoveryTest { } @Test - public void testDiscoverVserverFailure() throws Exception { + public void testDiscoverVserverFailureNotFound() throws Exception { String vserverId = UUID.randomUUID().toString(); String resourcePath = MessageFormat.format("/v2.1/servers/{0}", @@ -296,29 +262,12 @@ public class NetworkDiscoveryTest { 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()); @@ -331,7 +280,6 @@ public class NetworkDiscoveryTest { assertNull(vserver.getAttributeList()); } - /** * Verify API returns a final response indicating no discovery possible. */ @@ -341,13 +289,8 @@ public class NetworkDiscoveryTest { 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 @@ -357,35 +300,25 @@ public class NetworkDiscoveryTest { 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) { @@ -397,25 +330,4 @@ public class NetworkDiscoveryTest { 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; - } } diff --git a/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/util/TransformationUtilTest.java b/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/util/TransformationUtilTest.java index 968c1cf..dc4775f 100644 --- a/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/util/TransformationUtilTest.java +++ b/pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/util/TransformationUtilTest.java @@ -129,7 +129,6 @@ public class TransformationUtilTest { for (Attribute attribute : resultAttributeList) {
resultAttributes.put(attribute.getName(), attribute.getValue());
}
- // assertThat(expectedAttributes, resultAttributes);
assertThat(expectedAttributes, CoreMatchers.is(resultAttributes));
}
|