Network Discovery Microservice Sync responses 17/75417/2
authorNorm Traxler <normant@amdocs.com>
Mon, 7 Jan 2019 21:32:15 +0000 (21:32 +0000)
committerNorm Traxler <normant@amdocs.com>
Wed, 9 Jan 2019 18:53:12 +0000 (18:53 +0000)
Issue-ID: SDNC-543

Change-Id: I274c23a258dcbdd4928169f119e03925b1c10ee7
Signed-off-by: Norm Traxler <normant@amdocs.com>
13 files changed:
pomba/network-discovery/pom.xml
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/CallbackConfiguration.java [deleted file]
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/JerseyConfiguration.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/OpenstackConfiguration.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/WebConfiguration.java [deleted file]
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/OSAuthentication.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringService.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/SpringServiceImpl.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestService.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/rs/RestServiceImpl.java
pomba/network-discovery/src/main/java/org/onap/sdnc/apps/pomba/networkdiscovery/service/util/TransformationUtil.java
pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/NetworkDiscoveryTest.java
pomba/network-discovery/src/test/java/org/onap/sdnc/apps/pomba/networkdiscovery/unittest/service/util/TransformationUtilTest.java

index dea7353..a428a59 100644 (file)
@@ -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 (file)
index 1d2bdab..0000000
+++ /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;
-    }
-
-
-}
index b4488db..e073e34 100644 (file)
@@ -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);
+    }
+    
 }
index ee18397..230a3f2 100644 (file)
@@ -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 (file)
index 7a7bbd9..0000000
+++ /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
index c00bf24..e0a158f 100644 (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
index e0f50f6..b4a9ce1 100644 (file)
@@ -28,8 +28,6 @@ public interface SpringService {
                                                             String requestId,
                                                             String resourceType,
                                                             List<String> resourceIds,
-                                                            String notificationURL,
-                                                            String notificationAuthorization,
                                                             ONAPLogAdapter adapter)
     throws ApplicationException;
 }
index f9de2be..5577398 100644 (file)
  */
 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;
@@ -84,195 +61,73 @@ public class SpringServiceImpl implements SpringService {
     @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
index 57fbb53..226f325 100644 (file)
@@ -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
index 0677dcd..adb5df0 100644 (file)
@@ -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");
+        }
+    }
 }
index dc17848..0984f66 100644 (file)
@@ -35,7 +35,7 @@ public class TransformationUtil {
     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
index 18a0a04..31b1abe 100644 (file)
@@ -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;
-    }
 }
index 968c1cf..dc4775f 100644 (file)
@@ -129,7 +129,6 @@ public class TransformationUtilTest {
         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