Merge "fix major sonar bug"
authorSteve Smokowski <ss835w@att.com>
Thu, 14 Feb 2019 16:33:22 +0000 (16:33 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 14 Feb 2019 16:33:22 +0000 (16:33 +0000)
98 files changed:
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoKeystoneUtils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoNeutronUtils.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/HeatStackAudit.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/HeatStackAuditTest.java
asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilder.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/homingobjects/CandidateType.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/dmaapproperties/GlobalDmaapPublisher.java
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/DeleteAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIVfModuleTest.groovy
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilderTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildlingBlockRainyDayTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/dmaapproperties/GlobalDmaapPublisherTest.java
bpmn/MSOCommonBPMN/src/test/resources/application-test.yaml
bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/AaiConnectionTestImpl.java
bpmn/mso-infrastructure-bpmn/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateAndActivatePnfResourceTest.java
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/aai/AaiConnectionImpl.java
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateRelation.java [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/implementation/AaiConnection.java
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/AaiConnectionTestImpl.java
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/AaiConnectionThrowingException.java
bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateRelationTest.java [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateAndActivatePnfResource.bpmn
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Candidate.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1Test.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasksTest.java
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/SniroHoming/SniroManagerRequest1Vpn.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/SniroHoming/SniroManagerRequest3Vpn.json
common/src/main/java/org/onap/so/client/aai/AAIClient.java
common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java
common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java
common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java
common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java
common/src/main/java/org/onap/so/client/aai/AAIRestClient.java
common/src/main/java/org/onap/so/client/aai/AAISingleTransactionClient.java
common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java
common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java
common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java
common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java
common/src/main/java/org/onap/so/client/dmaap/DmaapClient.java
common/src/main/java/org/onap/so/client/dmaap/rest/DMaaPRestClient.java
common/src/main/java/org/onap/so/client/dmaap/rest/PropertiesBean.java
common/src/main/java/org/onap/so/client/dmaap/rest/RestConsumer.java
common/src/main/java/org/onap/so/client/dmaap/rest/RestPublisher.java
common/src/main/java/org/onap/so/client/graphinventory/EmptyStringToNullSerializer.java [moved from common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java with 97% similarity]
common/src/main/java/org/onap/so/client/graphinventory/Format.java
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperPatchProvider.java [moved from bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/CandidateType.java with 62% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverter.java [moved from common/src/main/java/org/onap/so/client/aai/AAIPatchConverter.java with 89% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryQueryClient.java [moved from common/src/main/java/org/onap/so/client/aai/AAIDSLQuery.java with 63% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventorySubgraphType.java [moved from common/src/main/java/org/onap/so/client/aai/AAISubgraphType.java with 89% similarity]
common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/TransactionBuilder.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNode.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLNode.java with 95% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLNodeKey.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLNodeKey.java with 95% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQuery.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLQuery.java with 96% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/DSLQueryBuilder.java [moved from common/src/main/java/org/onap/so/client/aai/entities/DSLQueryBuilder.java with 96% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java [new file with mode: 0644]
common/src/main/java/org/onap/so/client/graphinventory/entities/__.java [moved from common/src/main/java/org/onap/so/client/aai/entities/__.java with 97% similarity]
common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java
common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java
common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapConsumer.java
common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapPublisher.java
common/src/test/java/org/onap/so/client/aai/AAIObjectTypeTest.java
common/src/test/java/org/onap/so/client/aai/AAIQueryClientTest.java
common/src/test/java/org/onap/so/client/aai/AAIResourcesClientTest.java
common/src/test/java/org/onap/so/client/aai/AAIResourcesClientWithServiceInstanceUriTest.java
common/src/test/java/org/onap/so/client/aai/AAIRestClientTest.java
common/src/test/java/org/onap/so/client/aai/AAISingleTransactionClientTest.java
common/src/test/java/org/onap/so/client/aai/AAITransactionalClientTest.java
common/src/test/java/org/onap/so/client/aai/DSLQueryBuilderTest.java
common/src/test/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUriTest.java
common/src/test/java/org/onap/so/client/adapter/rest/AdapterRestClientTest.java [new file with mode: 0644]
common/src/test/java/org/onap/so/client/dmaap/DmaapPublisherTest.java
common/src/test/java/org/onap/so/client/graphinventory/GraphInventoryPatchConverterTest.java [moved from common/src/test/java/org/onap/so/client/aai/AAIPatchConverterTest.java with 88% similarity]
common/src/test/resources/dmaap.properties
docs/developer_info/Working_with_SO_Docker.rst
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/dmaap/DmaapPropertiesImpl.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/dmaap/OperationalEnvironmentPublisher.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/dmaap/OperationalEnvironmentPublisherTest.java
mso-api-handlers/mso-api-handler-infra/src/test/resources/application-test.yaml
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/app.module.ts
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/data.service.spec.ts
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/details/details.component.scss
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/home/home.component.html
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/home/home.component.ts
so-monitoring/so-monitoring-ui/src/main/frontend/src/app/home/home.constant.ts [new file with mode: 0644]

index 14aee2f..20498cb 100644 (file)
@@ -103,13 +103,6 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin{
 
     protected static final String CREATE_STACK = "CreateStack";
 
-    // Cache Heat Clients statically. Since there is just one MSO user, there is no
-    // benefit to re-authentication on every request (or across different flows). The
-    // token will be used until it expires.
-    //
-    // The cache key is "tenantId:cloudId"
-    private static Map <String, HeatCacheEntry> heatClientCache = new HashMap <> ();
-
     // Fetch cloud configuration each time (may be cached in CloudConfig class)
     @Autowired
     protected CloudConfig cloudConfig;
@@ -859,19 +852,6 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin{
         String cloudId = cloudSite.getId();
         // For DCP/LCP, the region should be the cloudId.
         String region = cloudSite.getRegionId ();
-        
-        // Check first in the cache of previously authorized clients
-        String cacheKey = cloudId + ":" + tenantId;
-        if (heatClientCache.containsKey (cacheKey)) {
-            if (!heatClientCache.get (cacheKey).isExpired ()) {
-                LOGGER.debug ("Using Cached HEAT Client for " + cacheKey);
-                return heatClientCache.get (cacheKey).getHeatClient ();
-            } else {
-                // Token is expired. Remove it from cache.
-                heatClientCache.remove (cacheKey);
-                LOGGER.debug ("Expired Cached HEAT Client for " + cacheKey);
-            }
-        }
 
         // Obtain an MSO token for the tenant
         CloudIdentity cloudIdentity = cloudSite.getIdentityService();
@@ -946,38 +926,11 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin{
             // Catch-all
             throw runtimeExceptionToMsoException (e, TOKEN_AUTH);
         }
-
         Heat heatClient = new Heat (heatUrl);
         heatClient.token (tokenId);
-
-        heatClientCache.put (cacheKey,
-                             new HeatCacheEntry (heatUrl,
-                                                 tokenId,
-                                                 expiration));
-        LOGGER.debug ("Caching HEAT Client for " + cacheKey);
-
         return heatClient;
     }
 
-    /**
-     * Forcibly expire a HEAT client from the cache. This call is for use by
-     * the KeystoneClient in case where a tenant is deleted. In that case,
-     * all cached credentials must be purged so that fresh authentication is
-     * done if a similarly named tenant is re-created.
-     * <p>
-     * Note: This is probably only applicable to dev/test environments where
-     * the same Tenant Name is repeatedly used for creation/deletion.
-     * <p>
-     *
-     */
-    public void expireHeatClient (String tenantId, String cloudId) {
-        String cacheKey = cloudId + ":" + tenantId;
-        if (heatClientCache.containsKey (cacheKey)) {
-            heatClientCache.remove (cacheKey);
-            LOGGER.debug ("Deleted Cached HEAT Client for " + cacheKey);
-        }
-    }
-
     /*
      * Query for a Heat Stack. This function is needed in several places, so
      * a common method is useful. This method takes an authenticated Heat Client
index 3936ae6..0bd2a39 100644 (file)
@@ -59,12 +59,6 @@ import com.woorea.openstack.keystone.utils.KeystoneUtils;
 @Component
 public class MsoKeystoneUtils extends MsoTenantUtils {
 
-    // Cache the Keystone Clients statically. Since there is just one MSO user, there is no
-    // benefit to re-authentication on every request (or across different flows). The
-    // token will be used until it expires.
-    //
-    // The cache key is "cloudId"
-    private static Map <String, KeystoneCacheEntry> adminClientCache = new HashMap<>();
 
        private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA, MsoKeystoneUtils.class);
        
@@ -316,10 +310,6 @@ public class MsoKeystoneUtils extends MsoTenantUtils {
             OpenStackRequest <Void> request = keystoneAdminClient.tenants ().delete (tenant.getId ());
             executeAndRecordOpenstackRequest (request);
             LOGGER.debug ("Deleted Tenant " + tenant.getId () + " (" + tenant.getName () + ")");
-
-            // Clear any cached clients. Not really needed, ID will not be reused.
-            msoHeatUtils.expireHeatClient (tenant.getId (), cloudSiteId);
-            msoNeutronUtils.expireNeutronClient (tenant.getId (), cloudSiteId);
         } catch (OpenStackBaseException e) {
             // Convert Keystone OpenStackResponseException to MsoOpenstackException
             throw keystoneErrorToMsoException (e, "Delete Tenant");
@@ -369,9 +359,6 @@ public class MsoKeystoneUtils extends MsoTenantUtils {
 
             LOGGER.debug ("Deleted Tenant " + tenant.getId () + " (" + tenant.getName () + ")");
 
-            // Clear any cached clients. Not really needed, ID will not be reused.
-            msoHeatUtils.expireHeatClient (tenant.getId (), cloudSiteId);
-            msoNeutronUtils.expireNeutronClient (tenant.getId (), cloudSiteId);
         } catch (OpenStackBaseException e) {
             // Note: It doesn't seem to matter if tenant doesn't exist, no exception is thrown.
             // Convert Keystone OpenStackResponseException to MsoOpenstackException
@@ -407,16 +394,6 @@ public class MsoKeystoneUtils extends MsoTenantUtils {
         String adminTenantName = cloudIdentity.getAdminTenant ();
         String region = cloudSite.getRegionId ();
 
-        // Check first in the cache of previously authorized clients
-        KeystoneCacheEntry entry = adminClientCache.get (cloudId);
-        if (entry != null) {
-            if (!entry.isExpired ()) {
-                return entry.getKeystoneClient ();
-            } else {
-                // Token is expired. Remove it from cache.
-                adminClientCache.remove (cloudId);
-            }
-        }
         MsoTenantUtils tenantUtils = tenantUtilsFactory.getTenantUtilsByServerType(cloudIdentity.getIdentityServerType());
         final String keystoneUrl = tenantUtils.getKeystoneUrl(region, cloudIdentity);
         Keystone keystone = new Keystone(keystoneUrl);
@@ -462,11 +439,6 @@ public class MsoKeystoneUtils extends MsoTenantUtils {
         // Note: this doesn't go back to Openstack, it's just a local object.
         keystone = new Keystone (adminUrl);
         keystone.token (token);
-
-        // Cache to avoid re-authentication for every call.
-        KeystoneCacheEntry cacheEntry = new KeystoneCacheEntry (adminUrl, token, access.getToken ().getExpires ());
-        adminClientCache.put (cloudId, cacheEntry);
-
         return keystone;
     }
 
@@ -636,32 +608,6 @@ public class MsoKeystoneUtils extends MsoTenantUtils {
         return null;
     }
 
-    private static class KeystoneCacheEntry implements Serializable {
-
-        private static final long serialVersionUID = 1L;
-
-        private String keystoneUrl;
-        private String token;
-        private Calendar expires;
-
-        public KeystoneCacheEntry (String url, String token, Calendar expires) {
-            this.keystoneUrl = url;
-            this.token = token;
-            this.expires = expires;
-        }
-
-        public Keystone getKeystoneClient () {
-            Keystone keystone = new Keystone (keystoneUrl);
-            keystone.token (token);
-            return keystone;
-        }
-
-        public boolean isExpired () {
-            // adding arbitrary guard timer of 5 minutes
-            return expires == null || System.currentTimeMillis() > (expires.getTimeInMillis() - 1800000);
-        }
-    }
-
        @Override
        public String getKeystoneUrl(String regionId, CloudIdentity cloudIdentity) throws MsoException {
                return cloudIdentity.getIdentityUrl();
index 7b82ad6..785e860 100644 (file)
@@ -67,12 +67,6 @@ import com.woorea.openstack.quantum.model.Segment;
 @Component
 public class MsoNeutronUtils extends MsoCommonUtils
 {
-       // Cache Neutron Clients statically.  Since there is just one MSO user, there is no
-       // benefit to re-authentication on every request (or across different flows).  The
-       // token will be used until it expires.
-       //
-       // The cache key is "tenantId:cloudId"
-       private static Map<String,NeutronCacheEntry> neutronClientCache = new HashMap<>();
 
        // Fetch cloud configuration each time (may be cached in CloudConfig class)
        @Autowired
@@ -364,24 +358,8 @@ public class MsoNeutronUtils extends MsoCommonUtils
     private Quantum getNeutronClient(CloudSite cloudSite, String tenantId) throws MsoException
        {
                String cloudId = cloudSite.getId();
-               String region = cloudSite.getRegionId();
-               
-               // Check first in the cache of previously authorized clients
-               String cacheKey = cloudId + ":" + tenantId;
-               if (neutronClientCache.containsKey(cacheKey)) {
-                       if (! neutronClientCache.get(cacheKey).isExpired()) {
-                               LOGGER.debug ("Using Cached HEAT Client for " + cacheKey);
-                               NeutronCacheEntry cacheEntry = neutronClientCache.get(cacheKey);
-                               Quantum neutronClient = new Quantum(cacheEntry.getNeutronUrl());
-                               neutronClient.token(cacheEntry.getToken());
-                               return neutronClient;
-                       }
-                       else {
-                               // Token is expired.  Remove it from cache.
-                               neutronClientCache.remove(cacheKey);
-                               LOGGER.debug ("Expired Cached Neutron Client for " + cacheKey);
-                       }
-               }
+               String region = cloudSite.getRegionId();        
+
 
                // Obtain an MSO token for the tenant from the identity service
                CloudIdentity cloudIdentity = cloudSite.getIdentityService();
@@ -454,31 +432,9 @@ public class MsoNeutronUtils extends MsoCommonUtils
 
                Quantum neutronClient = new Quantum(neutronUrl);
                neutronClient.token(tokenId);
-
-               neutronClientCache.put(cacheKey, new NeutronCacheEntry(neutronUrl, tokenId, expiration));
-               LOGGER.debug ("Caching Neutron Client for " + cacheKey);
-
                return neutronClient;
        }
 
-       /**
-        * Forcibly expire a Neutron client from the cache.  This call is for use by
-        * the KeystoneClient in case where a tenant is deleted.  In that case,
-        * all cached credentials must be purged so that fresh authentication is
-        * done on subsequent calls.
-        * <p>
-        * @param tenantName
-        * @param cloudId
-        */
-       public void expireNeutronClient (String tenantId, String cloudId) {
-               String cacheKey = cloudId + ":" + tenantId;
-               if (neutronClientCache.containsKey(cacheKey)) {
-                       neutronClientCache.remove(cacheKey);
-                       LOGGER.debug ("Deleted Cached Neutron Client for " + cacheKey);
-               }
-       }
-
-
        /*
         * Find a tenant (or query its existence) by its Name or Id.  Check first against the
         * ID.  If that fails, then try by name.
index 9743153..dfe5912 100644 (file)
@@ -25,6 +25,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -174,11 +176,13 @@ public class HeatStackAudit {
                return vserversToAudit;
        }
 
-       protected Optional<String> extractResourcePathFromHref(String href) {
-               URI uri;
+       protected Optional<String> extractResourcePathFromHref(String href) {           
                try {
-                       uri = new URI(href);                    
-                       return Optional.of(uri.getPath().replaceFirst("/v\\d+", "")+RESOURCES);                 
+                       Optional<String> stackPath = extractStackPathFromHref(href);
+                       if (stackPath.isPresent()){                                             
+                               return Optional.of(stackPath.get()+RESOURCES);
+                       }else
+                               return Optional.empty();
                } catch (Exception e) {
                        logger.error("Error parsing URI", e);
                }
@@ -186,10 +190,14 @@ public class HeatStackAudit {
        }
        
        protected Optional<String> extractStackPathFromHref(String href) {
-               URI uri;
                try {
-                       uri = new URI(href);                    
-                       return Optional.of(uri.getPath().replaceFirst("/v\\d+", ""));                   
+                       URI uri = new URI(href);        
+                       Pattern p = Pattern.compile("/stacks.*");
+                       Matcher m = p.matcher(uri.getPath());
+                       if (m.find()){                                          
+                               return Optional.of(m.group());
+                       }else
+                               return Optional.empty();
                } catch (Exception e) {
                        logger.error("Error parsing URI", e);
                }
index c5b93a7..b3cdd46 100644 (file)
@@ -80,19 +80,19 @@ public class HeatStackAuditTest extends HeatStackAudit {
        
        @Test
        public void extract_proper_path_Test(){
-               Optional<String> actualResult = extractStackPathFromHref("https://orchestration.com:8004/v1/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
-               assertEquals("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81", actualResult.get());
+               Optional<String> actualResult = extractStackPathFromHref("https://orchestration.com:8004/v1/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
+               assertEquals("/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81", actualResult.get());
        }
        
        @Test
        public void extract_proper_resources_path_Test(){
-               Optional<String> actualResult = extractResourcePathFromHref("https://orchestration.com:8004/v1/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
-               assertEquals("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81/resources", actualResult.get());
+               Optional<String> actualResult = extractResourcePathFromHref("https://orchestration.com:8004/v1/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
+               assertEquals("/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81/resources", actualResult.get());
        }
        
        @Test
        public void extract_invalid_uri_Test(){
-               Optional<String> actualResult = extractStackPathFromHref("orchestrn.com:8004/v18b44d60a6f94bdcb2738f9e/stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
+               Optional<String> actualResult = extractStackPathFromHref("orchestrn.com:8004/v18b44d60a6f94bdcb2738f9e//stacks/test_stack/f711be16-2654-4a09-b89d-0511fda20e81");
                assertEquals(false, actualResult.isPresent());
        }
 
@@ -114,6 +114,8 @@ public class HeatStackAuditTest extends HeatStackAudit {
                ssc_1_trusted_port_0.setInterfaceId("d2f51f82-0ec2-4581-bd1a-d2a82073e52b");
                vServer1.getLInterfaces().getLInterface().add(ssc_1_trusted_port_0);
                
+
+               
                LInterface ssc_1_mgmt_port_1 = new LInterface();
                ssc_1_mgmt_port_1.setInterfaceId("07f5b14c-147a-4d14-8c94-a9e94dbc097b");
                vServer1.getLInterfaces().getLInterface().add(ssc_1_mgmt_port_1);
@@ -156,33 +158,34 @@ public class HeatStackAuditTest extends HeatStackAudit {
                
                expectedVservers.add(vServer1);
                
+               
                Resources service1QueryResponse = objectMapper.readValue(new File("src/test/resources/Service1ResourceGroupResponse.json"), Resources.class);
-               doReturn(service1QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz/31d0647a-6043-49a4-81b6-ccab29380672/resources", cloudRegion,     tenantId, Resources.class);
+               doReturn(service1QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz/31d0647a-6043-49a4-81b6-ccab29380672/resources", cloudRegion,      tenantId, Resources.class);
                
                Resources service2QueryResponse =objectMapper.readValue(new File("src/test/resources/Service2ResourceGroupResponse.json"), Resources.class);
-               doReturn(service2QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst/447a9b41-714e-434b-b1d0-6cce8d9f0f0c/resources", cloudRegion,     tenantId, Resources.class);
+               doReturn(service2QueryResponse).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst/447a9b41-714e-434b-b1d0-6cce8d9f0f0c/resources", cloudRegion,      tenantId, Resources.class);
                
                
                Stack service2StackQuerySubInt = stackObjectMapper.readValue(new File("src/test/resources/Service2SubInterface0.json"), Stack.class);
-               doReturn(service2StackQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81", cloudRegion,tenantId, Stack.class);
+               doReturn(service2StackQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81", cloudRegion,tenantId, Stack.class);
                Resources service2ResourceQuerySubInt = objectMapper.readValue(new File("src/test/resources/Service2SubInterface1Resources.json"), Resources.class);
-               doReturn(service2ResourceQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81/resources", cloudRegion,tenantId, Resources.class);
+               doReturn(service2ResourceQuerySubInt).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service2_port_0_subinterfaces-hlzdigtimzst-0-upfi5nhurk7y/f711be16-2654-4a09-b89d-0511fda20e81/resources", cloudRegion,tenantId, Resources.class);
                
                Stack service1StackQuerySubInt1 =stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface0.json"), Stack.class);
-               doReturn(service1StackQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb", cloudRegion,tenantId, Stack.class);
+               doReturn(service1StackQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb", cloudRegion,tenantId, Stack.class);
                Resources service1ResourceQuerySubInt1 = objectMapper.readValue(new File("src/test/resources/Service1SubInterface0Resources.json"), Resources.class);
-               doReturn(service1ResourceQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb/resources", cloudRegion,tenantId, Resources.class);
+               doReturn(service1ResourceQuerySubInt1).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-1-fmn5laetg5cs/0d9cd813-2ae1-46c0-9ebb-48081f6cffbb/resources", cloudRegion,tenantId, Resources.class);
 
        
                Stack service1StackQuerySubInt2 =stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface1.json"), Stack.class);
-               doReturn(service1StackQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a", cloudRegion,tenantId, Stack.class);
+               doReturn(service1StackQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a", cloudRegion,tenantId, Stack.class);
                Resources service1ResourceQuerySubInt2 = objectMapper.readValue(new File("src/test/resources/Service1SubInterface1Resources.json"), Resources.class);
-               doReturn(service1ResourceQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a/resources", cloudRegion,tenantId, Resources.class);
+               doReturn(service1ResourceQuerySubInt2).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-0-yghihziaf36m/b7019dd0-2ee9-4447-bdef-ac25676b205a/resources", cloudRegion,tenantId, Resources.class);
 
                Stack service1StackQuerySubInt3 =stackObjectMapper.readValue(new File("src/test/resources/Service1SubInterface2.json"), Stack.class);
-               doReturn(service1StackQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c", cloudRegion,tenantId, Stack.class);
+               doReturn(service1StackQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c", cloudRegion,tenantId, Stack.class);
                Resources service1ResourceQuerySubInt3 = objectMapper.readValue(new File("src/test/resources/Service1SubInterface2Resources.json"), Resources.class);
-               doReturn(service1ResourceQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest("/ea2d13cc98b44d60a6f94bdcb2738f9e/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c/resources", cloudRegion,tenantId, Resources.class);
+               doReturn(service1ResourceQuerySubInt3).when(msoHeatUtilsMock).executeHeatClientRequest("/stacks/tsbc0005vm002ssc001-ssc_1_subint_service1_port_0_subinterfaces-dtmxjmny7yjz-2-y3ndsavmsymv/bd0fc728-cbde-4301-a581-db56f494675c/resources", cloudRegion,tenantId, Resources.class);
        
                Set<Vserver> vServersToAudit = heatStackAudit.createVserverSet(resources, novaResources);
                Set<Vserver> vserversWithSubInterfaces = heatStackAudit.processSubInterfaces(cloudRegion,tenantId,resourceGroups, vServersToAudit);
index 2f4d5ea..90b705c 100644 (file)
@@ -554,8 +554,14 @@ public class ToscaResourceInstaller {
                                                for (RequirementAssignment requirement :  requirementsList) {
                                                        if (requirement.getNodeTemplateName().equals(spNode.getName())) {
                                                                ConfigurationResourceCustomization configurationResource = createConfiguration(configNode, toscaResourceStruct, serviceProxy);
-                                                                                                                               
-                                                               configurationResourceList.add(configurationResource);
+                                                               
+                                                               Optional<ConfigurationResourceCustomization> matchingObject = configurationResourceList.stream()
+                                                                           .filter(configurationResourceCustomization -> configNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).equals(configurationResource.getModelCustomizationUUID()))
+                                                                           .findFirst();
+                                                               if(!matchingObject.isPresent()){                                                                                                                                        
+                                                                       configurationResourceList.add(configurationResource);
+                                                               }
+                                                               
                                                                break;
                                                        }
                                                }
index 025b533..750f255 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2018 Huawei Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
  * 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
@@ -154,7 +156,7 @@ public class ResourceRequestBuilder {
                 }
             }
 
-           if (resourceInputStr != null || !resourceInputStr.equals("")) {
+           if (resourceInputStr != null && !resourceInputStr.isEmpty()) {
                 return getResourceInput(resourceInputStr, serviceInputs);
            }
 
index f1534ab..6a4fa50 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.bpmn.servicedecomposition.homingobjects;
 
+import com.fasterxml.jackson.annotation.JsonValue;
+
 public enum CandidateType{
 
 
@@ -35,11 +37,8 @@ public enum CandidateType{
        }
 
        @Override
+       @JsonValue
        public String toString() {
                return name;
        }
-
-       public String getName(){
-               return name;
-       }
 }
index b210b5e..ee7999f 100644 (file)
@@ -55,6 +55,7 @@ public class ExecuteBuildingBlockRainyDay {
        private Environment environment;
        protected String retryDurationPath = "mso.rainyDay.retryDurationMultiplier";
        protected String defaultCode = "mso.rainyDay.defaultCode";
+       protected String maxRetries = "mso.rainyDay.maxRetries";
 
        public void setRetryTimer(DelegateExecution execution) {
                try {
@@ -172,10 +173,17 @@ public class ExecuteBuildingBlockRainyDay {
                        msoLogger.debug("RainyDayHandler Status Code is: " + handlingCode);
                        execution.setVariable(HANDLING_CODE, handlingCode);
                } catch (Exception e) {
-                       msoLogger.error("Failed to determine RainyDayHandler Status. Seting handlingCode = Abort", e);
                        String code = this.environment.getProperty(defaultCode);
+                       msoLogger.error("Failed to determine RainyDayHandler Status. Seting handlingCode = "+ code, e);
                        execution.setVariable(HANDLING_CODE, code);
                }
+               try{
+                       int envMaxRetries = Integer.parseInt(this.environment.getProperty(maxRetries));
+                       execution.setVariable("maxRetries", envMaxRetries);
+               } catch (Exception ex) {
+                       msoLogger.error("Could not read maxRetries from config file. Setting max to 5 retries");
+                       execution.setVariable("maxRetries", 5);
+               }
        }
 
        public void setHandlingStatusSuccess(DelegateExecution execution) {
index 3828528..17b99e2 100644 (file)
@@ -38,22 +38,21 @@ public class GlobalDmaapPublisher extends DmaapPublisher {
        }
        
        @Override
-       public String getUserName() {
+       public String getAuth() {
 
-               return UrnPropertiesReader.getVariable("mso.global.dmaap.username");
+               return UrnPropertiesReader.getVariable("mso.global.dmaap.auth");
        }
 
 
 
        @Override
-       public String getPassword() {
+       public String getKey() {
 
-               return UrnPropertiesReader.getVariable("mso.global.dmaap.password");
+               return UrnPropertiesReader.getVariable("mso.msoKey");
        }
 
        @Override
        public String getTopic() {
-               
                return UrnPropertiesReader.getVariable("mso.global.dmaap.publisher.topic");
        }
 
index 55f68f6..dac038f 100644 (file)
@@ -97,7 +97,7 @@ class CreateAAIVfModuleTest extends MsoGroovyTest{
     @Test
     void testCreateGenericVnf(){
         when(mockExecution.getVariable("CAAIVfMod_vnfName")).thenReturn("vnfName")
-        Mockito.doNothing().when(client).create(any(AAIResourceUri.class),anyObject())
+        Mockito.doNothing().when(client).create(any(AAIResourceUri.class) as AAIResourceUri,anyObject())
         createAAIVfModule.createGenericVnf(mockExecution)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createGenericVnfResponseCode", 201)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createGenericVnfResponse","Vnf Created")
@@ -112,7 +112,7 @@ class CreateAAIVfModuleTest extends MsoGroovyTest{
 
         when(mockExecution.getVariable("CAAIVfMod_personaId")).thenReturn("model1")
         when(mockExecution.getVariable("CAAIVfMod_moduleName")).thenReturn("vfModuleName")
-        Mockito.doNothing().when(client).create(any(AAIResourceUri.class),anyObject())
+        Mockito.doNothing().when(client).create(any(AAIResourceUri.class) as AAIResourceUri,anyObject())
         createAAIVfModule.createVfModule(mockExecution,false)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponseCode", 201)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponse","Vf Module Created")
@@ -173,7 +173,7 @@ class CreateAAIVfModuleTest extends MsoGroovyTest{
         Optional<GenericVnf> genericVnf = getAAIObjectFromJson(GenericVnf.class,"__files/aai/GenericVnfVfModule.json");
         when(mockExecution.getVariable("CAAIVfMod_queryGenericVnfResponse")).thenReturn(genericVnf.get())
         when(mockExecution.getVariable("CAAIVfMod_moduleName")).thenReturn("vfModuleName")
-        Mockito.doNothing().when(client).create(any(AAIResourceUri.class),anyObject())
+        Mockito.doNothing().when(client).create(any(AAIResourceUri.class) as AAIResourceUri,anyObject())
         createAAIVfModule.createVfModule(mockExecution,true)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponseCode", 201)
         Mockito.verify(mockExecution).setVariable("CAAIVfMod_createVfModuleResponse","Vf Module Created")
index 4b6f8aa..2a87251 100644 (file)
@@ -92,7 +92,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
     void testDeleteGenericVnf() {
         ExecutionEntity mockExecution = setupMock()
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
-        doNothing().when(client).delete(isA(AAIResourceUri.class))
+        doNothing().when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
         deleteAAIVfModule.deleteGenericVnf(mockExecution)
         Mockito.verify(mockExecution).setVariable(prefix + "deleteGenericVnfResponseCode", 200)
     }
@@ -169,7 +169,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
         ExecutionEntity mockExecution = setupMock()
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
         try {
-            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class))
+            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
             deleteAAIVfModule.deleteGenericVnf(mockExecution)
         } catch (Exception ex) {
             println " Test End - Handle catch-throw BpmnError()! "
@@ -186,7 +186,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
         ExecutionEntity mockExecution = setupMock()
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
         when(mockExecution.getVariable("DAAIVfMod_vfModuleId")).thenReturn("vfModuleId1")
-        doNothing().when(client).delete(isA(AAIResourceUri.class))
+        doNothing().when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
         deleteAAIVfModule.deleteVfModule(mockExecution)
         Mockito.verify(mockExecution).setVariable(prefix + "deleteVfModuleResponseCode", 200)
     }
@@ -197,7 +197,7 @@ class DeleteAAIVfModuleTest extends  MsoGroovyTest{
         when(mockExecution.getVariable("DAAIVfMod_vnfId")).thenReturn("vnfId1")
         when(mockExecution.getVariable("DAAIVfMod_vfModuleId")).thenReturn("vfModuleId1")
         try {
-            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class))
+            doThrow(new NotFoundException("Vnf Not Found")).when(client).delete(isA(AAIResourceUri.class) as AAIResourceUri)
             deleteAAIVfModule.deleteVfModule(mockExecution)
         } catch (Exception ex) {
             println " Test End - Handle catch-throw BpmnError()! "
index 2d2f58b..72bcfcf 100644 (file)
@@ -111,7 +111,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         vfModule.setVfModuleId("supercool")
         vfModule.setResourceVersion("12345")
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
-        doNothing().when(client).update(isA(AAIResourceUri.class), anyObject())
+        doNothing().when(client).update(isA(AAIResourceUri.class) as AAIResourceUri, anyObject())
         updateAAIVfModule.updateVfModule(mockExecution)
                verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 200)
     }
@@ -126,7 +126,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         vfModule.setVfModuleId("supercool")
         vfModule.setResourceVersion("12345")
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
-        doThrow(new NotFoundException("Vf Module not found")).when(client).update(isA(AAIResourceUri.class), anyObject())
+        doThrow(new NotFoundException("Vf Module not found")).when(client).update(isA(AAIResourceUri.class) as AAIResourceUri, anyObject())
         thrown.expect(BpmnError.class)
         updateAAIVfModule.updateVfModule(mockExecution)
                verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 404)
@@ -143,7 +143,7 @@ class UpdateAAIVfModuleTest  extends MsoGroovyTest {
         vfModule.setVfModuleId("supercool")
         vfModule.setResourceVersion("12345")
         when(mockExecution.getVariable(prefix + "getVfModuleResponse")).thenReturn(vfModule)
-        doThrow(new IllegalStateException("Error in AAI client")).when(client).update(isA(AAIResourceUri.class), anyObject())
+        doThrow(new IllegalStateException("Error in AAI client")).when(client).update(isA(AAIResourceUri.class) as AAIResourceUri, anyObject())
         thrown.expect(BpmnError.class)
         updateAAIVfModule.updateVfModule(mockExecution)
                verify(mockExecution).setVariable("UAAIVfMod_updateVfModuleResponseCode", 500)
index e5e1326..ddca319 100644 (file)
@@ -405,4 +405,32 @@ public class ResourceRequestBuilderTest extends BaseTest {
         assertEquals(resourceSequence.get(0), "res1");
         assertEquals(resourceSequence.get(1), "res2");
     }
-}
\ No newline at end of file
+
+    @Test
+    public void getResourceInputWithEmptyServiceResourcesTest() throws Exception {
+
+        stubFor(get(urlEqualTo("/ecomp/mso/catalog/v2/serviceResources?serviceModelUuid=c3954379-4efe-431c-8258-f84905b158e5"))
+            .willReturn(ok("{ \"serviceResources\"    : {\n" +
+                "\t\"modelInfo\"       : {\n" +
+                "\t\t\"modelName\"          : \"demoVFWCL\",\n" +
+                "\t\t\"modelUuid\"          : \"c3954379-4efe-431c-8258-f84905b158e5\",\n" +
+                "\t\t\"modelInvariantUuid\" : \"0cbff61e-3b0a-4eed-97ce-b1b4faa03493\",\n" +
+                "\t\t\"modelVersion\"       : \"1.0\"\n" +
+                "\t},\n" +
+                "\t\"serviceType\"        : \"\",\n" +
+                "\t\"serviceRole\"        : \"\",\n" +
+                "\t\"environmentContext\" : null,\n" +
+                "\t\"workloadContext\"    : \"Production\",\n" +
+                "\t\"serviceVnfs\": [], \n" +
+                "\t\"serviceNetworks\": [],\n" +
+                "\t\"serviceAllottedResources\": []\n" +
+                "\t}}")));
+
+        HashMap serviceInput = new HashMap();
+        serviceInput.put("key1", "value");
+        Map<String, Object> stringObjectMap = ResourceRequestBuilder.buildResouceRequest("c3954379-4efe-431c-8258-f84905b158e5",
+            "e776449e-2b10-45c5-9217-2775c88ca1a0", serviceInput);
+        assertEquals(0, stringObjectMap.size());
+    }
+
+}
index 868aabf..6344a3f 100644 (file)
@@ -131,6 +131,7 @@ public class ExecuteBuildlingBlockRainyDayTest extends BaseTest {
                executeBuildingBlockRainyDay.queryRainyDayTable(delegateExecution,true);
                
                assertEquals("Rollback", delegateExecution.getVariable("handlingCode"));
+               assertEquals(5,delegateExecution.getVariable("maxRetries"));
        }
        
        @Test
index 4d7c85e..fc69f81 100644 (file)
@@ -35,8 +35,8 @@ public class GlobalDmaapPublisherTest extends BaseTest{
 
        @Test
        public void testGetters() {
-               assertEquals("dmaapUsername", globalDmaapPublisher.getUserName());
-               assertEquals("ZG1hYXBQYXNzd29yZA==", globalDmaapPublisher.getPassword());
+               assertEquals("81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54", globalDmaapPublisher.getAuth());
+               assertEquals("07a7159d3bf51a0e53be7a8f89699be7", globalDmaapPublisher.getKey());
                assertEquals("com.att.mso.asyncStatusUpdate", globalDmaapPublisher.getTopic());
                assertEquals("http://localhost:" + wireMockPort, globalDmaapPublisher.getHost().get());
        }
index 945972c..afdb800 100644 (file)
@@ -146,6 +146,7 @@ mso:
       host: http://localhost:${wiremock.server.port}
       publisher:
         topic: com.att.mso.asyncStatusUpdate
+      auth: 81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54
   oof:
     auth: test
     timeout: PT10S
@@ -163,6 +164,16 @@ sdnc:
   auth: Basic YWRtaW46YWRtaW4=
   host: http://localhost:8446
   path: /restconf/operations/GENERIC-RESOURCE-API
+sdno:
+  health-check:
+    dmaap:
+      password: alRyMzJ3NUNeakxl
+      publisher:
+        topic: com.att.sdno.test-health-diagnostic-v02
+        host: https://olsd004.wnsnet.attws.com:3905
+      subscriber:
+        topic: com.att.sdno.test-health-diagnostic-v02
+      auth: 81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54
 sniro:
   conductor:
     enabled: true
@@ -178,7 +189,15 @@ sniro:
     headers.patchVersion: 1
     headers.minorVersion: 1
     headers.latestVersion: 2
-
+ruby:
+  create-ticket-request:
+    dmaap:
+      username: m04768@mso.ecomp.att.com
+      password: alRyMzJ3NUNeakxl
+    publisher:
+      topic: com.att.pdas.exp.msoCMFallout-v1
+      host: https://olsd004.wnsnet.attws.com:3905
+      auth: 81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54
 spring:
   datasource:
     jdbc-url: jdbc:mariadb://localhost:3307/camundabpmn
index 70d9405..4e0bf02 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.pnf.delegate;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
-
 import org.onap.aai.domain.yang.Pnf;
 import org.onap.so.bpmn.infrastructure.pnf.implementation.AaiConnection;
 import org.springframework.context.annotation.Primary;
@@ -39,9 +37,10 @@ public class AaiConnectionTestImpl implements AaiConnection {
     public static final String ID_WITH_ENTRY = "idWithEntryNoIp";
 
     private Map<String, Pnf> created = new HashMap<>();
+    private Map<String, String> serviceAndPnfRelationMap = new HashMap<>();
 
     @Override
-    public Optional<Pnf> getEntryFor(String correlationId) throws IOException {
+    public Optional<Pnf> getEntryFor(String correlationId) {
         if (Objects.equals(correlationId, ID_WITH_ENTRY)) {
             return Optional.of(new Pnf());
         } else {
@@ -50,15 +49,25 @@ public class AaiConnectionTestImpl implements AaiConnection {
     }
 
     @Override
-    public void createEntry(String correlationId, Pnf entry) throws IOException {
+    public void createEntry(String correlationId, Pnf entry) {
         created.put(correlationId, entry);
     }
 
+    @Override
+    public void createRelation(String serviceInstanceId, String pnfName) {
+        serviceAndPnfRelationMap.put(serviceInstanceId, pnfName);
+    }
+
     public Map<String, Pnf> getCreated() {
         return created;
     }
 
+    public Map<String, String> getServiceAndPnfRelationMap() {
+        return serviceAndPnfRelationMap;
+    }
+
     public void reset() {
         created.clear();
+        serviceAndPnfRelationMap.clear();
     }
 }
index 2d0d4b5..db6cbe0 100644 (file)
@@ -31,15 +31,19 @@ import java.util.Map;
 
 import java.util.UUID;
 import org.assertj.core.api.Assertions;
+import org.assertj.core.data.MapEntry;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
+import org.junit.Before;
 import org.junit.Test;
 import org.onap.so.BaseIntegrationTest;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
 
-    private static final String TIMEOUT_10_S = "PT10S";
     private static final String VALID_UUID = UUID.nameUUIDFromBytes("testUuid".getBytes()).toString();
+    private static final String SERVICE_INSTANCE_ID = "serviceForInstance";
+
+    private Map<String, Object> variables;
 
     @Autowired
     private AaiConnectionTestImpl aaiConnection;
@@ -47,14 +51,18 @@ public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
     @Autowired
     private DmaapClientTestImpl dmaapClientTestImpl;
 
+    @Before
+    public void setup() {
+        aaiConnection.reset();
+        variables = new HashMap<>();
+        variables.put("serviceInstanceId", SERVICE_INSTANCE_ID);
+        variables.put(PNF_UUID, VALID_UUID);
+    }
+
     @Test
     public void shouldWaitForMessageFromDmaapAndUpdateAaiEntryWhenAaiEntryExists() {
         // given
-        aaiConnection.reset();       
-        Map<String, Object> variables = new HashMap<>();
-        variables.put("timeoutForPnfEntryNotification", TIMEOUT_10_S);
         variables.put(CORRELATION_ID, AaiConnectionTestImpl.ID_WITH_ENTRY);
-        variables.put(PNF_UUID, VALID_UUID);
         // when
         ProcessInstance instance = runtimeService
                 .startProcessInstanceByKey("CreateAndActivatePnfResource", "businessKey", variables);
@@ -70,19 +78,17 @@ public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
                 "AaiEntryExists",
                 "InformDmaapClient",
                 "WaitForDmaapPnfReadyNotification",
+                "CreateRelationId",
                 "AaiEntryUpdated"
         );
+        Assertions.assertThat(aaiConnection.getServiceAndPnfRelationMap()).
+                containsOnly(MapEntry.entry(SERVICE_INSTANCE_ID,AaiConnectionTestImpl.ID_WITH_ENTRY));
     }
 
     @Test
     public void shouldCreateAaiEntryWaitForMessageFromDmaapAndUpdateAaiEntryWhenNoAaiEntryExists() {
         // given
-        aaiConnection.reset();
-       
-        Map<String, Object> variables = new HashMap<>();
-        variables.put("timeoutForPnfEntryNotification", TIMEOUT_10_S);
         variables.put(CORRELATION_ID, AaiConnectionTestImpl.ID_WITHOUT_ENTRY);
-        variables.put(PNF_UUID, VALID_UUID);
         // when
         ProcessInstance instance = runtimeService
                 .startProcessInstanceByKey("CreateAndActivatePnfResource", "businessKey", variables);
@@ -99,8 +105,11 @@ public class CreateAndActivatePnfResourceTest extends BaseIntegrationTest {
                 "AaiEntryExists",
                 "InformDmaapClient",
                 "WaitForDmaapPnfReadyNotification",
+                "CreateRelationId",
                 "AaiEntryUpdated"
         );
         Assertions.assertThat(aaiConnection.getCreated()).containsOnlyKeys(AaiConnectionTestImpl.ID_WITHOUT_ENTRY);
+        Assertions.assertThat(aaiConnection.getServiceAndPnfRelationMap()).
+                containsOnly(MapEntry.entry(SERVICE_INSTANCE_ID,AaiConnectionTestImpl.ID_WITHOUT_ENTRY));
     }
 }
index 943ce12..5189f8b 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.7.1">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2">
   <bpmn:process id="ExecuteBuildingBlock" name="ExecuteBuildingBlock" isExecutable="true">
     <bpmn:startEvent id="Start_ExecuteBuildingBlock" name="start">
       <bpmn:outgoing>SequenceFlow_0rq4c5r</bpmn:outgoing>
@@ -73,7 +73,7 @@
       <bpmn:sequenceFlow id="SequenceFlow_0ndt8ft" sourceRef="Task_SetRetryTimer" targetRef="IntermediateCatchEvent_RetryTimer" />
       <bpmn:sequenceFlow id="SequenceFlow_07a1ytc" sourceRef="IntermediateCatchEvent_RetryTimer" targetRef="EndEvent_1sez2lh" />
       <bpmn:sequenceFlow id="SequenceFlow_1wbevp0" name="yes" sourceRef="ExclusiveGateway_0ey4zpt" targetRef="Task_SetRetryTimer">
-        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("retryCount")<5}]]></bpmn:conditionExpression>
+        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("retryCount")<execution.getVariable("maxRetries")}]]></bpmn:conditionExpression>
       </bpmn:sequenceFlow>
       <bpmn:endEvent id="EndEvent_0mvmk3i">
         <bpmn:incoming>SequenceFlow_0h8v45y</bpmn:incoming>
index d57e487..1bf2a29 100644 (file)
@@ -23,7 +23,11 @@ package org.onap.so.bpmn.infrastructure.pnf.aai;
 import java.util.Optional;
 import org.onap.aai.domain.yang.Pnf;
 import org.onap.so.bpmn.infrastructure.pnf.implementation.AaiConnection;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.AAIRestClientImpl;
+import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -40,4 +44,12 @@ public class AaiConnectionImpl implements AaiConnection {
         AAIRestClientImpl restClient = new AAIRestClientImpl();
         restClient.createPnf(correlationId, entry);
     }
+
+    @Override
+    public void createRelation(String serviceInstanceId, String pnfName) {
+        AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+                serviceInstanceId);
+        AAIResourceUri pnfUri = AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnfName);
+        new AAIResourcesClient().connect(serviceInstanceURI, pnfUri);
+    }
 }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateRelation.java b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateRelation.java
new file mode 100644 (file)
index 0000000..21d4396
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Nokia.
+ * ================================================================================
+ * 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.so.bpmn.infrastructure.pnf.delegate;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.onap.so.bpmn.common.scripts.ExceptionUtil;
+import org.onap.so.bpmn.infrastructure.pnf.implementation.AaiConnection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CreateRelation implements JavaDelegate {
+
+    private static final Logger logger = LoggerFactory.getLogger(CreateRelation.class);
+
+    private AaiConnection aaiConnectionImpl;
+
+    @Autowired
+    public CreateRelation(AaiConnection aaiConnectionImpl) {
+        this.aaiConnectionImpl = aaiConnectionImpl;
+    }
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) {
+        String serviceInstanceId = (String) delegateExecution.getVariable("serviceInstanceId");
+        String pnfName = (String) delegateExecution.getVariable("correlationId");
+        try {
+            aaiConnectionImpl.createRelation(serviceInstanceId, pnfName);
+        } catch (Exception e) {
+            new ExceptionUtil().buildAndThrowWorkflowException(delegateExecution, 9999,
+                    "An exception occurred when making service and pnf relation. Exception: " + e.getMessage());
+        }
+        logger.debug("The relation has been made between service with id: {} and pnf with name: {}",
+                serviceInstanceId, pnfName);
+    }
+
+}
index 5165912..eaabb2b 100644 (file)
@@ -29,4 +29,6 @@ public interface AaiConnection {
     Optional<Pnf> getEntryFor(String correlationId) throws IOException;
 
     void createEntry(String correlationId, Pnf entry) throws IOException;
+
+    void createRelation(String serviceInstanceId, String pnfName) throws IOException;
 }
index 201e791..76b62a9 100644 (file)
@@ -37,7 +37,7 @@ public class AaiConnectionTestImpl implements AaiConnection {
     private Map<String, Pnf> created = new HashMap<>();
 
     @Override
-    public Optional<Pnf> getEntryFor(String correlationId) throws IOException {
+    public Optional<Pnf> getEntryFor(String correlationId) {
         if (Objects.equals(correlationId, ID_WITH_ENTRY)) {
             return Optional.of(new Pnf());
         } else {
@@ -50,6 +50,10 @@ public class AaiConnectionTestImpl implements AaiConnection {
         created.put(correlationId, entry);
     }
 
+    @Override
+    public void createRelation(String serviceInstanceId, String pnfName) {
+    }
+
     public Map<String, Pnf> getCreated() {
         return created;
     }
index 7df6757..300d1e4 100644 (file)
@@ -36,4 +36,10 @@ public class AaiConnectionThrowingException implements AaiConnection {
     public void createEntry(String correlationId, Pnf entry) throws IOException {
         throw new IOException();
     }
+
+    @Override
+    public void createRelation(String serviceInstanceId, String pnfName) throws IOException {
+        throw new IOException();
+    }
+
 }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateRelationTest.java b/bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/pnf/delegate/CreateRelationTest.java
new file mode 100644 (file)
index 0000000..2dd3e23
--- /dev/null
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Nokia.
+ * ================================================================================
+ * 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.so.bpmn.infrastructure.pnf.delegate;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.io.IOException;
+import org.camunda.bpm.engine.delegate.BpmnError;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.so.bpmn.infrastructure.pnf.aai.AaiConnectionImpl;
+import org.onap.so.bpmn.infrastructure.pnf.implementation.AaiConnection;
+
+public class CreateRelationTest {
+
+    private static final String SERVICE_INSTANCE_ID = "serviceTest";
+    private static final String PNF_NAME = "pnfNameTest";
+
+    private DelegateExecutionFake executionFake;
+
+    @Before
+    public void setUp() {
+        executionFake = new DelegateExecutionFake();
+        executionFake.setVariable("serviceInstanceId", SERVICE_INSTANCE_ID);
+        executionFake.setVariable("correlationId", PNF_NAME);
+    }
+
+    @Test
+    public void createRelationSuccessful() throws IOException {
+        // given
+        AaiConnection aaiConnectionMock = mock(AaiConnectionImpl.class);
+        CreateRelation testedObject = new CreateRelation(aaiConnectionMock);
+        // when
+        testedObject.execute(executionFake);
+        // then
+        verify(aaiConnectionMock).createRelation(SERVICE_INSTANCE_ID, PNF_NAME);
+    }
+
+    @Test
+    public void shouldThrowBpmnErrorWhenExceptionOccurred() {
+        CreateRelation testedObject = new CreateRelation(new AaiConnectionThrowingException());
+        executionFake.setVariable("testProcessKey", "testProcessKeyValue");
+
+        assertThatThrownBy(() -> testedObject.execute(executionFake)).isInstanceOf(BpmnError.class);
+    }
+}
index d807917..5defe21 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.3">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.11.3">
   <bpmn:collaboration id="Collaboration_1d0w8lf">
     <bpmn:participant id="Participant_1egg397" name="SO&#10;Create and Activate Pnf Resource" processRef="CreateAndActivatePnfResource" />
     <bpmn:participant id="Participant_0atuyq0" name="AAI" />
@@ -17,7 +17,7 @@
     <bpmn:sequenceFlow id="SequenceFlow_0v5ffpe" name="No" sourceRef="DoesAaiContainInfoAboutPnf" targetRef="CreatePnfEntryInAai">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{!aaiContainsInfoAboutPnf}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:sequenceFlow id="SequenceFlow_0p09qgm" sourceRef="WaitForDmaapPnfReadyNotification" targetRef="AaiEntryUpdated" />
+    <bpmn:sequenceFlow id="SequenceFlow_0p09qgm" sourceRef="WaitForDmaapPnfReadyNotification" targetRef="CreateRelationId" />
     <bpmn:sequenceFlow id="SequenceFlow_17s9025" sourceRef="AaiEntryExists" targetRef="InformDmaapClient" />
     <bpmn:sequenceFlow id="SequenceFlow_1qr6cmf" sourceRef="CreatePnfEntryInAai" targetRef="AaiEntryExists" />
     <bpmn:sequenceFlow id="SequenceFlow_1j4r3zt" sourceRef="CheckAiiForCorrelationId" targetRef="DoesAaiContainInfoAboutPnf" />
@@ -59,9 +59,6 @@
       <bpmn:incoming>SequenceFlow_1miyzfe</bpmn:incoming>
       <bpmn:errorEventDefinition errorRef="Error_1" />
     </bpmn:endEvent>
-    <bpmn:endEvent id="AaiEntryUpdated" name="AAI entry updated">
-      <bpmn:incoming>SequenceFlow_0p09qgm</bpmn:incoming>
-    </bpmn:endEvent>
     <bpmn:receiveTask id="WaitForDmaapPnfReadyNotification" name="Wait for DMAAP pnf-ready notification" messageRef="Message_13h1tlo">
       <bpmn:incoming>SequenceFlow_1o8od8e</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0p09qgm</bpmn:outgoing>
       <bpmn:incoming>SequenceFlow_1qr6cmf</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_17s9025</bpmn:outgoing>
     </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_0o6zhjk" sourceRef="CreateRelationId" targetRef="AaiEntryUpdated" />
+    <bpmn:endEvent id="AaiEntryUpdated" name="AAI entry updated">
+      <bpmn:incoming>SequenceFlow_0o6zhjk</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:serviceTask id="CreateRelationId" name="Create Relation" camunda:delegateExpression="${CreateRelation}">
+      <bpmn:incoming>SequenceFlow_0p09qgm</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0o6zhjk</bpmn:outgoing>
+    </bpmn:serviceTask>
     <bpmn:association id="Association_0d7oxnz" sourceRef="CreateAndActivatePnf_StartEvent" targetRef="TextAnnotation_1eyzes8" />
     <bpmn:textAnnotation id="TextAnnotation_1eyzes8">
-      <bpmn:text>Inputs:
+      <bpmn:text><![CDATA[Inputs:
 Â - timeoutForPnfEntryNotification - String
  - correlationId - String
- - uuid - String
-</bpmn:text>
+ - uuid - String]]></bpmn:text>
     </bpmn:textAnnotation>
   </bpmn:process>
   <bpmn:error id="Error_1" name="MSO Workflow Exception" errorCode="MSOWorkflowException" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0k52gr7_di" bpmnElement="AaiEntryUpdated">
-        <dc:Bounds x="1312" y="189" width="36" height="36" />
+        <dc:Bounds x="1364" y="189" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1287" y="230" width="88" height="14" />
+          <dc:Bounds x="1339" y="230" width="89" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="StartEvent_0j5ok9h_di" bpmnElement="CreateAndActivatePnf_StartEvent">
         <dc:Bounds x="511" y="167" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1j4r3zt_di" bpmnElement="SequenceFlow_1j4r3zt">
-        <di:waypoint x="319" y="207" />
-        <di:waypoint x="390" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="319" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="390" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="309.5" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1l1t6ak_di" bpmnElement="SequenceFlow_1l1t6ak">
-        <di:waypoint x="415" y="182" />
-        <di:waypoint x="415" y="66" />
-        <di:waypoint x="711" y="66" />
-        <di:waypoint x="711" y="182" />
+        <di:waypoint xsi:type="dc:Point" x="415" y="182" />
+        <di:waypoint xsi:type="dc:Point" x="415" y="66" />
+        <di:waypoint xsi:type="dc:Point" x="711" y="66" />
+        <di:waypoint xsi:type="dc:Point" x="711" y="182" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="430" y="159" width="19" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0v5ffpe_di" bpmnElement="SequenceFlow_0v5ffpe">
-        <di:waypoint x="440" y="207" />
-        <di:waypoint x="511" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="440" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="511" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="448" y="210" width="14" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1qr6cmf_di" bpmnElement="SequenceFlow_1qr6cmf">
-        <di:waypoint x="611" y="207" />
-        <di:waypoint x="686" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="611" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="686" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="605" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0j5ksz1_di" bpmnElement="SequenceFlow_0j5ksz1">
-        <di:waypoint x="-18" y="207" />
-        <di:waypoint x="48" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="-18" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="48" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-30" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="123" y="523" width="502" height="60" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="MessageFlow_1h3xu88_di" bpmnElement="MessageFlow_1h3xu88">
-        <di:waypoint x="561" y="247" />
-        <di:waypoint x="561" y="523" />
+        <di:waypoint xsi:type="dc:Point" x="561" y="247" />
+        <di:waypoint xsi:type="dc:Point" x="561" y="523" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="531" y="380" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="MessageFlow_09ibv5a_di" bpmnElement="MessageFlow_09ibv5a">
-        <di:waypoint x="250" y="247" />
-        <di:waypoint x="250" y="523" />
+        <di:waypoint xsi:type="dc:Point" x="250" y="247" />
+        <di:waypoint xsi:type="dc:Point" x="250" y="523" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="220" y="380" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="MessageFlow_0vjul4t_di" bpmnElement="MessageFlow_0vjul4t">
-        <di:waypoint x="289" y="523" />
-        <di:waypoint x="289" y="247" />
+        <di:waypoint xsi:type="dc:Point" x="289" y="523" />
+        <di:waypoint xsi:type="dc:Point" x="289" y="247" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="259" y="380" width="90" height="10" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="-37" y="70" width="243" height="82" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Association_0d7oxnz_di" bpmnElement="Association_0d7oxnz">
-        <di:waypoint x="-36" y="189" />
-        <di:waypoint x="-36" y="152" />
+        <di:waypoint xsi:type="dc:Point" x="-36" y="189" />
+        <di:waypoint xsi:type="dc:Point" x="-36" y="152" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="MessageFlow_1vrcp2d_di" bpmnElement="MessageFlow_1vrcp2d">
-        <di:waypoint x="1060" y="523" />
-        <di:waypoint x="1060" y="247" />
+        <di:waypoint xsi:type="dc:Point" x="1060" y="523" />
+        <di:waypoint xsi:type="dc:Point" x="1060" y="247" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="996" y="380" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_17s9025_di" bpmnElement="SequenceFlow_17s9025">
-        <di:waypoint x="736" y="207" />
-        <di:waypoint x="803" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="736" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="803" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="719" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1kc34bc_di" bpmnElement="SequenceFlow_1kc34bc">
-        <di:waypoint x="1092" y="265" />
-        <di:waypoint x="1092" y="363" />
-        <di:waypoint x="1145" y="363" />
+        <di:waypoint xsi:type="dc:Point" x="1092" y="265" />
+        <di:waypoint xsi:type="dc:Point" x="1092" y="363" />
+        <di:waypoint xsi:type="dc:Point" x="1145" y="363" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1028" y="309" width="90" height="10" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="1008" y="167" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0p09qgm_di" bpmnElement="SequenceFlow_0p09qgm">
-        <di:waypoint x="1108" y="207" />
-        <di:waypoint x="1312" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="1108" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="1195" y="207" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1148" y="187" width="90" height="10" />
+          <dc:Bounds x="1106.5" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1o8od8e_di" bpmnElement="SequenceFlow_1o8od8e">
-        <di:waypoint x="903" y="207" />
-        <di:waypoint x="1008" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="903" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="1008" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="893.5" y="187" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="MessageFlow_0tg4hw9_di" bpmnElement="MessageFlow_0tg4hw9">
-        <di:waypoint x="853" y="247" />
-        <di:waypoint x="853" y="523" />
+        <di:waypoint xsi:type="dc:Point" x="853" y="247" />
+        <di:waypoint xsi:type="dc:Point" x="853" y="523" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="823" y="380" width="90" height="10" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="803" y="167" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1miyzfe_di" bpmnElement="SequenceFlow_1miyzfe">
-        <di:waypoint x="1245" y="363" />
-        <di:waypoint x="1312" y="363" />
+        <di:waypoint xsi:type="dc:Point" x="1245" y="363" />
+        <di:waypoint xsi:type="dc:Point" x="1312" y="363" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1233.5" y="343" width="90" height="10" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="MessageFlow_1py54jr_di" bpmnElement="MessageFlow_1py54jr">
-        <di:waypoint x="1195" y="403" />
-        <di:waypoint x="1195" y="523" />
+        <di:waypoint xsi:type="dc:Point" x="1195" y="403" />
+        <di:waypoint xsi:type="dc:Point" x="1195" y="523" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1165" y="458" width="90" height="10" />
         </bpmndi:BPMNLabel>
         <dc:Bounds x="1145" y="323" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0967g8p_di" bpmnElement="SequenceFlow_0967g8p">
-        <di:waypoint x="148" y="207" />
-        <di:waypoint x="219" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="148" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="219" y="207" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="183.5" y="187" width="0" height="10" />
         </bpmndi:BPMNLabel>
           <dc:Bounds x="672" y="242" width="77" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0o6zhjk_di" bpmnElement="SequenceFlow_0o6zhjk">
+        <di:waypoint xsi:type="dc:Point" x="1295" y="207" />
+        <di:waypoint xsi:type="dc:Point" x="1364" y="207" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1329.5" y="186" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0xn3ug6_di" bpmnElement="CreateRelationId">
+        <dc:Bounds x="1195" y="167" width="100" height="80" />
+      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index 92b4e21..cb893ce 100644 (file)
@@ -403,9 +403,7 @@ public class SniroHomingV2 {
                        List<org.onap.so.client.sniro.beans.Candidate> cans = new ArrayList<org.onap.so.client.sniro.beans.Candidate>();
                        for(Candidate c:required){
                                org.onap.so.client.sniro.beans.Candidate can = new org.onap.so.client.sniro.beans.Candidate();
-                               org.onap.so.client.sniro.beans.CandidateType type = new org.onap.so.client.sniro.beans.CandidateType();
-                               type.setName(c.getIdentifierType().getName());
-                               can.setIdentifierType(type);
+                               can.setIdentifierType(c.getIdentifierType());
                                can.setIdentifiers(c.getIdentifiers());
                                can.setCloudOwner(c.getCloudOwner());
                                cans.add(can);
@@ -416,9 +414,7 @@ public class SniroHomingV2 {
                        List<org.onap.so.client.sniro.beans.Candidate> cans = new ArrayList<org.onap.so.client.sniro.beans.Candidate>();
                        for(Candidate c:excluded){
                                org.onap.so.client.sniro.beans.Candidate can = new org.onap.so.client.sniro.beans.Candidate();
-                               org.onap.so.client.sniro.beans.CandidateType type = new org.onap.so.client.sniro.beans.CandidateType();
-                               type.setName(c.getIdentifierType().getName());
-                               can.setIdentifierType(type);
+                               can.setIdentifierType(c.getIdentifierType());
                                can.setIdentifiers(c.getIdentifiers());
                                can.setCloudOwner(c.getCloudOwner());
                                cans.add(can);
index 18230c4..fec7e84 100644 (file)
@@ -35,6 +35,9 @@ import org.onap.so.adapters.nwrest.CreateNetworkResponse;
 import org.onap.so.adapters.nwrest.DeleteNetworkError;
 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
 import org.onap.so.adapters.nwrest.DeleteNetworkResponse;
+import org.onap.so.adapters.nwrest.UpdateNetworkError;
+import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
+import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.orchestration.NetworkAdapterResources;
 import org.slf4j.Logger;
@@ -115,6 +118,14 @@ public class NetworkAdapterRestV1 {
                                                DeleteNetworkResponse deleteNetworkResponse = (DeleteNetworkResponse) unmarshalXml(callback, DeleteNetworkResponse.class);
                                                execution.setVariable("deleteNetworkResponse", deleteNetworkResponse);
                                        }
+                               } else if (networkAdapterRequest instanceof UpdateNetworkRequest) {
+                                       if (callback.contains("updateNetworkError")) {
+                                               UpdateNetworkError updateNetworkError = (UpdateNetworkError) unmarshalXml(callback, UpdateNetworkError.class);
+                                               throw new Exception(updateNetworkError.getMessage());
+                                       } else {
+                                               UpdateNetworkResponse updateNetworkResponse = (UpdateNetworkResponse) unmarshalXml(callback, UpdateNetworkResponse.class);
+                                               execution.setVariable("updateNetworkResponse", updateNetworkResponse);
+                                       }
                                }
                        }
                } catch (Exception e) {
index 78a84b1..f6c9597 100644 (file)
@@ -41,6 +41,7 @@ import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -54,6 +55,7 @@ public class WorkflowActionBBTasks {
        private static final String G_ALACARTE = "aLaCarte";
        private static final String G_ACTION = "requestAction";
        private static final String RETRY_COUNT = "retryCount";
+       protected String maxRetries = "mso.rainyDay.maxRetries";
        private static final Logger logger = LoggerFactory.getLogger(WorkflowActionBBTasks.class);
 
        @Autowired
@@ -62,6 +64,8 @@ public class WorkflowActionBBTasks {
        private WorkflowAction workflowAction;
        @Autowired
        private WorkflowActionBBFailure workflowActionBBFailure;
+       @Autowired
+       private Environment environment;
        
        public void selectBB(DelegateExecution execution) {
                List<ExecuteBuildingBlock> flowsToExecute = (List<ExecuteBuildingBlock>) execution
@@ -215,17 +219,24 @@ public class WorkflowActionBBTasks {
                String requestId = (String) execution.getVariable(G_REQUEST_ID);
                String retryDuration = (String) execution.getVariable("RetryDuration");
                int retryCount = (int) execution.getVariable(RETRY_COUNT);
+               int envMaxRetries;
+               try{
+                       envMaxRetries = Integer.parseInt(this.environment.getProperty(maxRetries));     
+               } catch (Exception ex) {
+                       logger.error("Could not read maxRetries from config file. Setting max to 5 retries");
+                       envMaxRetries = 5;
+               }
                int nextCount = retryCount +1;
                if (handlingCode.equals("Retry")){
                        workflowActionBBFailure.updateRequestErrorStatusMessage(execution);
                        try{
                                InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
-                               request.setRetryStatusMessage("Retry " + nextCount + "/5 will be started in " + retryDuration);
+                               request.setRetryStatusMessage("Retry " + nextCount + "/" + envMaxRetries + " will be started in " + retryDuration);
                                requestDbclient.updateInfraActiveRequests(request); 
                        } catch(Exception ex){
                                logger.warn("Failed to update Request Db Infra Active Requests with Retry Status",ex);
                        }
-                       if(retryCount<5){
+                       if(retryCount<envMaxRetries){
                                int currSequence = (int) execution.getVariable("gCurrentSequence");
                                execution.setVariable("gCurrentSequence", currSequence-1);
                                execution.setVariable(RETRY_COUNT, nextCount);
index 1f8c56e..3b7e509 100644 (file)
@@ -23,6 +23,8 @@ package org.onap.so.client.sniro.beans;
 import java.io.Serializable;
 import java.util.List;
 
+import org.onap.so.bpmn.servicedecomposition.homingobjects.CandidateType;
+
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class Candidate implements Serializable{
index 278afc7..516c948 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.adapter.network.tasks;
 
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertThat;
+
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.xml.bind.JAXBException;
 
 import org.junit.Test;
 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
+import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
 
 public class NetworkAdapterRestV1Test {
 
@@ -36,4 +42,17 @@ public class NetworkAdapterRestV1Test {
                String returnedXml = response.toXmlString();
                System.out.println(returnedXml);
        }
+
+       @Test
+       public void testUnmarshalXmlUpdate() throws IOException, JAXBException {
+               UpdateNetworkResponse expectedResponse = new UpdateNetworkResponse();
+               expectedResponse.setMessageId("ec100bcc-2659-4aa4-b4d8-3255715c2a51");
+               expectedResponse.setNetworkId("80de31e3-cc78-4111-a9d3-5b92bf0a39eb");
+               Map<String,String>subnetMap = new HashMap<String,String>();
+               subnetMap.put("95cd8437-25f1-4238-8720-cbfe7fa81476", "d8d16606-5d01-4822-b160-9a0d257303e0");
+               expectedResponse.setSubnetMap(subnetMap);
+               String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><updateNetworkResponse><messageId>ec100bcc-2659-4aa4-b4d8-3255715c2a51</messageId><networkId>80de31e3-cc78-4111-a9d3-5b92bf0a39eb</networkId><subnetMap><entry><key>95cd8437-25f1-4238-8720-cbfe7fa81476</key><value>d8d16606-5d01-4822-b160-9a0d257303e0</value></entry></subnetMap></updateNetworkResponse>";
+               UpdateNetworkResponse response = (UpdateNetworkResponse) new NetworkAdapterRestV1().unmarshalXml(xml, UpdateNetworkResponse.class);
+               assertThat(expectedResponse, sameBeanAs(response));
+       }
 }
index f3b094f..2fc6297 100644 (file)
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
 import org.junit.Before;
@@ -46,6 +47,7 @@ import org.onap.so.bpmn.core.WorkflowException;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.db.request.beans.InfraActiveRequests;
+import org.springframework.core.env.Environment;
 
 public class WorkflowActionBBTasksTest extends BaseTaskTest {
 
@@ -64,6 +66,9 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
        
        private DelegateExecution execution;
        
+       @Mock
+       protected Environment environment;
+       
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
@@ -287,6 +292,7 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
                String reqId = "reqId123";
                execution.setVariable("mso-request-id", reqId);
                doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               doReturn("6").when(environment).getProperty("mso.rainyDay.maxRetries");
                execution.setVariable("handlingCode","Retry");
                execution.setVariable("retryCount", 1);
                execution.setVariable("gCurrentSequence",1);
@@ -296,6 +302,25 @@ public class WorkflowActionBBTasksTest extends BaseTaskTest {
                assertEquals(0,execution.getVariable("gCurrentSequence"));
        }
        
+       @Test
+       public void checkRetryStatusTestExceededMaxRetries(){
+               String reqId = "reqId123";
+               execution.setVariable("mso-request-id", reqId);
+               doNothing().when(workflowActionBBFailure).updateRequestErrorStatusMessage(isA(DelegateExecution.class));
+               doReturn("6").when(environment).getProperty("mso.rainyDay.maxRetries");
+               execution.setVariable("handlingCode","Retry");
+               execution.setVariable("retryCount", 6);
+               execution.setVariable("gCurrentSequence",1);
+               InfraActiveRequests req = new InfraActiveRequests();
+               doReturn(req).when(requestsDbClient).getInfraActiveRequestbyRequestId(reqId);
+               try{
+                       workflowActionBBTasks.checkRetryStatus(execution);
+               } catch (BpmnError e) {
+                       WorkflowException exception = (WorkflowException) execution.getVariable("WorkflowException");
+                       assertEquals("Exceeded maximum retries. Ending flow with status Abort",exception.getErrorMessage());
+               }
+       }
+       
        @Test
        public void checkRetryStatusNoRetryTest(){
                String reqId = "reqId123";
index 83ecd6a..6713f80 100644 (file)
@@ -42,9 +42,7 @@
         "modelInvariantId" : "testProxyModelInvariantUuid2"
       },
       "requiredCandidates" : [ {
-        "identifierType" : {
-          "name" : "vnfId"
-        },
+        "identifierType" : "vnfId",
         "identifiers" : [ "testVnfId" ]
       } ]
     } ],
index c3c5c07..14a89c9 100644 (file)
@@ -42,9 +42,7 @@
         "modelInvariantId" : "testProxyModelInvariantUuid2"
       },
       "requiredCandidates" : [ {
-        "identifierType" : {
-          "name" : "vnfId"
-        },
+        "identifierType" : "vnfId",
         "identifiers" : [ "testVnfId" ]
       } ]
     }, {
@@ -66,9 +64,7 @@
         "modelInvariantId" : "testProxyModelInvariantUuid2"
       },
       "requiredCandidates" : [ {
-        "identifierType" : {
-          "name" : "vnfId"
-        },
+        "identifierType" : "vnfId",
         "identifiers" : [ "testVnfId" ]
       } ]
     }, {
@@ -90,9 +86,7 @@
         "modelInvariantId" : "testProxyModelInvariantUuid2"
       },
       "requiredCandidates" : [ {
-        "identifierType" : {
-          "name" : "vnfId"
-        },
+        "identifierType" : "vnfId",
         "identifiers" : [ "testVnfId" ]
       } ]
     } ],
index be55342..21bbc51 100644 (file)
@@ -27,20 +27,24 @@ import javax.ws.rs.core.UriBuilder;
 
 import org.onap.so.client.RestClient;
 import org.onap.so.client.graphinventory.GraphInventoryClient;
+import org.onap.so.client.graphinventory.GraphInventoryVersion;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriComputationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AAIClient extends GraphInventoryClient {
+public class AAIClient extends GraphInventoryClient {
 
        private static final String AAI_ROOT = "/aai";
        protected static Logger logger = LoggerFactory.getLogger(AAIClient.class);
        protected AAIVersion version;
-       public AAIClient() {
+       protected AAIClient() {
+               super(AAIProperties.class);
+       }
+       
+       protected AAIClient(AAIVersion version) {
                super(AAIProperties.class);
        }
-
        @Override
        protected URI constructPath(GraphInventoryUri uri) {
                
@@ -48,7 +52,7 @@ public abstract class AAIClient extends GraphInventoryClient {
        }
 
        @Override
-       protected RestClient createClient(GraphInventoryUri uri) {
+       public RestClient createClient(GraphInventoryUri uri) {
                try {
                        return new AAIRestClient(getRestProperties(), constructPath(uri));
                } catch (GraphInventoryUriComputationException | NotFoundException e) {
@@ -57,11 +61,18 @@ public abstract class AAIClient extends GraphInventoryClient {
                }
        }
        
-       protected AAIVersion getVersion() {
+       @Override
+       public AAIVersion getVersion() {
                if (version == null) {
                        return this.<AAIProperties>getRestProperties().getDefaultVersion();
                } else {
                        return this.version;
                }
        }
+       
+
+       @Override
+       public String getGraphDBName() {
+               return "A&AI";
+       }
 }
index 33c9769..9c8345d 100644 (file)
 
 package org.onap.so.client.aai;
 
-import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperPatchProvider;
 
-public class AAICommonObjectMapperPatchProvider extends AAICommonObjectMapperProvider {
+public class AAICommonObjectMapperPatchProvider extends GraphInventoryCommonObjectMapperPatchProvider {
 
        
        public AAICommonObjectMapperPatchProvider() {
                super();
-               EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer(); 
-               SimpleModule emptyStringModule = new SimpleModule();
-               emptyStringModule.addSerializer(String.class, sp);
-               mapper.registerModule(emptyStringModule);
        }
 }
index 0e20718..15bc2ea 100644 (file)
 
 package org.onap.so.client.aai;
 
-import org.onap.so.client.policy.CommonObjectMapperProvider;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.AnnotationIntrospector;
-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 com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
-
-public class AAICommonObjectMapperProvider extends CommonObjectMapperProvider {
+public class AAICommonObjectMapperProvider extends GraphInventoryCommonObjectMapperProvider {
 
        public AAICommonObjectMapperProvider() {
-               mapper = new ObjectMapper();
-               mapper.setSerializationInclusion(Include.NON_NULL);
-               mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
-               mapper.enable(MapperFeature.USE_ANNOTATIONS);
-               mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
-               mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
-               mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-               AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
-        AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
-        // first Jaxb, second Jackson annotations
-        mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
+               super();
        }
 
 }
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java b/common/src/main/java/org/onap/so/client/aai/AAIDSLQueryClient.java
new file mode 100644 (file)
index 0000000..e9b58b4
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.aai;
+
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryQueryClient;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+
+public class AAIDSLQueryClient extends GraphInventoryQueryClient<AAIDSLQueryClient> {
+
+       public AAIDSLQueryClient() {
+               super(new AAIClient());
+       }
+       
+       public AAIDSLQueryClient(AAIVersion version) {
+               super(new AAIClient(version));
+       }
+
+       @Override
+       protected GraphInventoryUri getQueryUri() {
+               return AAIUriFactory.createResourceUri(AAIObjectType.DSL);
+       }
+       
+}
index 14d7f43..21e36cd 100644 (file)
@@ -26,8 +26,7 @@ import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-
-import javax.annotation.Priority;
+import java.util.regex.Pattern;
 
 import org.onap.aai.annotations.Metadata;
 import org.onap.aai.domain.yang.AggregateRoute;
@@ -61,6 +60,7 @@ import org.onap.aai.domain.yang.RouteTableReference;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.ServiceSubscription;
 import org.onap.aai.domain.yang.SpPartner;
+import org.onap.aai.domain.yang.SriovPf;
 import org.onap.aai.domain.yang.Subnet;
 import org.onap.aai.domain.yang.Tenant;
 import org.onap.aai.domain.yang.TunnelXconnect;
@@ -119,6 +119,7 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable {
        public static final AAIObjectType MODEL_VER = new AAIObjectType(AAINamespaceConstants.SERVICE_DESIGN_AND_CREATION + "/models/model/{model-invariant-id}", ModelVer.class);
        public static final AAIObjectType TUNNEL_XCONNECT = new AAIObjectType(AAIObjectType.ALLOTTED_RESOURCE.uriTemplate(), TunnelXconnect.class);
        public static final AAIObjectType P_INTERFACE = new AAIObjectType(AAIObjectType.PSERVER.uriTemplate(), PInterface.class);
+       public static final AAIObjectType SRIOV_PF = new AAIObjectType(AAIObjectType.P_INTERFACE.uriTemplate(), SriovPf.class); 
        public static final AAIObjectType PHYSICAL_LINK = new AAIObjectType(AAINamespaceConstants.NETWORK, PhysicalLink.class);
        public static final AAIObjectType INSTANCE_GROUP = new AAIObjectType(AAINamespaceConstants.NETWORK, InstanceGroup.class);
        public static final AAIObjectType COLLECTION = new AAIObjectType(AAINamespaceConstants.NETWORK, Collection.class);
@@ -218,6 +219,6 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable {
        }
 
        protected String removeParentUri(Class<?> aaiObjectClass, String parentUri) {
-                return aaiObjectClass.getAnnotation(Metadata.class).uriTemplate().replace(parentUri, "");
+               return aaiObjectClass.getAnnotation(Metadata.class).uriTemplate().replaceFirst(Pattern.quote(parentUri), "");
        }
 }
index 184b4e5..c3523e9 100644 (file)
 
 package org.onap.so.client.aai;
 
-import java.util.Optional;
-
-import org.onap.so.client.RestClient;
-import org.onap.so.client.aai.entities.CustomQuery;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
-import org.onap.so.client.graphinventory.Format;
+import org.onap.so.client.graphinventory.GraphInventoryQueryClient;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 
-public class AAIQueryClient extends AAIClient {
+public class AAIQueryClient extends GraphInventoryQueryClient<AAIQueryClient> {
 
-       private Optional<String> depth = Optional.empty();
-       private boolean nodesOnly = false;
-       private Optional<AAISubgraphType> subgraph = Optional.empty();
-       
        public AAIQueryClient() {
-               super();
+               super(new AAIClient());
        }
        
        public AAIQueryClient(AAIVersion version) {
-               super();
-               this.version = version;
-       }
-       
-       public String query(Format format, CustomQuery query) {
-               return this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString()))
-               .put(query, String.class);
-       }
-       
-       public AAIQueryClient depth (String depth) {
-               this.depth = Optional.of(depth);
-               return this;
+               super(new AAIClient(version));
        }
-       public AAIQueryClient nodesOnly() {
-               this.nodesOnly = true;
-               return this;
-       }
-       public AAIQueryClient subgraph(AAISubgraphType type){
-               
-               subgraph =  Optional.of(type);
 
-               return this;
+       @Override
+       protected GraphInventoryUri getQueryUri() {
+               return AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY);
        }
        
-       protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) {
-               GraphInventoryUri clone = uri.clone();
-               if (this.depth.isPresent()) {
-                       clone.queryParam("depth", depth.get());
-               }
-               if (this.nodesOnly) {
-                       clone.queryParam("nodesOnly", "");
-               }
-               if (this.subgraph.isPresent()) {
-                       clone.queryParam("subgraph", this.subgraph.get().toString());
-               }
-               return clone;
-       }
        @Override
-       protected RestClient createClient(GraphInventoryUri uri) {
-               return super.createClient(setupQueryParams(uri));
+       protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) {
+               return super.setupQueryParams(uri);
        }
+       
 }
index 87951d5..ee1736f 100644 (file)
 
 package org.onap.so.client.aai;
 
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
 import java.util.Optional;
 
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
 import org.onap.aai.domain.yang.Relationship;
-import org.onap.so.client.RestClient;
-import org.onap.so.client.RestProperties;
 import org.onap.so.client.aai.entities.AAIEdgeLabel;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
-import org.onap.so.client.aai.entities.uri.AAIUri;
-import org.onap.so.client.graphinventory.entities.uri.Depth;
+import org.onap.so.client.graphinventory.GraphInventoryResourcesClient;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
 
-public class AAIResourcesClient extends AAIClient {
-                       
-       public AAIResourcesClient() {
-               super();
-       }
+public class AAIResourcesClient extends GraphInventoryResourcesClient<AAIResourcesClient, AAIResourceUri, AAIEdgeLabel, AAIResultWrapper, AAITransactionalClient, AAISingleTransactionClient> {
        
-       public AAIResourcesClient(AAIVersion version) {
-               super();
-               this.version = version;
-       }
-       
-       /**
-        * creates a new object in A&AI
-        * 
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public void create(AAIResourceUri uri, Object obj) {
-               RestClient aaiRC = this.createClient(uri);
-               aaiRC.put(obj);
-               return;
-       }
-       
-       /**
-        * creates a new object in A&AI with no payload body
-        * 
-        * @param uri
-        * @return
-        */
-       public void createEmpty(AAIResourceUri uri) {
-               RestClient aaiRC = this.createClient(uri);
-               aaiRC.put("");
-               return;
-       }
-       
-       /**
-        * returns false if the object does not exist in A&AI
-        * 
-        * @param uri
-        * @return
-        */
-       public boolean exists(AAIResourceUri uri) {
-               AAIUri forceMinimal = this.addParams(Optional.of(Depth.ZERO), true, uri);
-               try {
-                       RestClient aaiRC = this.createClient(forceMinimal);
-                       
-                       return aaiRC.get().getStatus() == Status.OK.getStatusCode();
-               } catch (NotFoundException e) {
-                       return false;
-               }
-       }
-       
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * @param uriA
-        * @param uriB
-        * @return
-        */
-       public void connect(AAIResourceUri uriA, AAIResourceUri uriB) {
-               AAIResourceUri uriAClone = uriA.clone();
-               RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
-               aaiRC.put(this.buildRelationship(uriB));
-               return;
-       }
-       
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * with a given edge label
-        * @param uriA
-        * @param uriB
-        * @param edge label
-        * @return
-        */
-       public void connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
-               AAIResourceUri uriAClone = uriA.clone();
-               RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
-               aaiRC.put(this.buildRelationship(uriB, label));
-               return;
-       }
-       
-       /**
-        * Removes relationship from two objects in A&AI
-        * 
-        * @param uriA
-        * @param uriB
-        * @return
-        */
-       public void disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
-               AAIResourceUri uriAClone = uriA.clone();
-               RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
-               aaiRC.delete(this.buildRelationship(uriB));
-               return;
-       }
-       
-       /**
-        * Deletes object from A&AI. Automatically handles resource-version.
-        * 
-        * @param uri
-        * @return
-        */
-       public void delete(AAIResourceUri uri) {
-               AAIResourceUri clone = uri.clone();
-               RestClient aaiRC = this.createClient(clone);
-               Map<String, Object> result = aaiRC.get(new GenericType<Map<String, Object>>(){})
-                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI"));
-               String resourceVersion = (String) result.get("resource-version");
-               aaiRC = this.createClient(clone.resourceVersion(resourceVersion));
-               aaiRC.delete();
-               return;
-       }
-       
-       /**
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public void update(AAIResourceUri uri, Object obj) {
-               RestClient aaiRC = this.createClient(uri);
-               aaiRC.patch(obj);
-               return;
-       }
-       
-       /**
-        * Retrieves an object from A&AI and unmarshalls it into the Class specified
-        * @param clazz
-        * @param uri
-        * @return
-        */
-       public <T> Optional<T> get(Class<T> clazz, AAIResourceUri uri) {
-               try {
-                       return this.createClient(uri).get(clazz);
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               return Optional.empty();
-                       } else {
-                               throw e;
-                       }
-               }
-       }
-       
-       /**
-        * Retrieves an object from A&AI and returns complete response
-        * @param uri
-        * @return
-        */
-       public Response getFullResponse(AAIResourceUri uri) {
-               try {
-                       return this.createClient(uri).get();
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               return e.getResponse();
-                       } else {
-                               throw e;
-                       }
-               }
-       }
+       private AAIClient aaiClient;
        
-       /**
-        * Retrieves an object from A&AI and automatically unmarshalls it into a Map or List 
-        * @param resultClass
-        * @param uri
-        * @return
-        */
-       public <T> Optional<T> get(GenericType<T> resultClass, AAIResourceUri uri) {
-               try {
-                       return this.createClient(uri).get(resultClass);
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               return Optional.empty();
-                       } else {
-                               throw e;
-                       }
-               }
+       public AAIResourcesClient() {
+               super(new AAIClient());
+               aaiClient = (AAIClient) super.client;
        }
        
-       /**
-        * Retrieves an object from A&AI wrapped in a helper class which offer additional features
-        * 
-        * @param uri
-        * @return
-        */
-       public AAIResultWrapper get(AAIResourceUri uri) {
-               String json;
-               try {
-                       json = this.createClient(uri).get(String.class).orElse(null);
-               } catch (NotFoundException e) {
-                       if (this.getRestProperties().mapNotFoundToEmpty()) {
-                               json = null;
-                       } else {
-                               throw e;
-                       }
-               }
-               return new AAIResultWrapper(json);
+       public AAIResourcesClient(AAIVersion version) {
+               super(new AAIClient(version));
+               aaiClient = (AAIClient) super.client;
        }
-       
-       /**
-        * Retrieves an object from A&AI wrapped in a helper class which offer additional features
-        * If the object cannot be found in A&AI the method will throw the runtime exception
-        * included as an argument
-        * @param uri
-        * @return
-        */
-       public AAIResultWrapper get(AAIResourceUri uri, Class<? extends RuntimeException> c) {
-               String json;
-               try {
-                       json = this.createClient(uri).get(String.class)
-                                       .orElseThrow(() -> createException(c, uri.build() + " not found in A&AI", Optional.empty()));
-               } catch (NotFoundException e) {
-                       throw createException(c, "could not construct uri for use with A&AI", Optional.of(e));
-               }
 
+       @Override
+       public AAIResultWrapper createWrapper(String json) {
                return new AAIResultWrapper(json);
        }
-       
-       private RuntimeException createException(Class<? extends RuntimeException> c, String message, Optional<Throwable> t) {
-               RuntimeException e;
-               try {
-                       if (t.isPresent()) {
-                               e = c.getConstructor(String.class, Throwable.class).newInstance(message, t.get());
-                       } else {
-                               e = c.getConstructor(String.class).newInstance(message);
-                       }
-               } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                               | NoSuchMethodException | SecurityException e1) {
-                       throw new IllegalArgumentException("could not create instance for " + c.getName());
-               }
-               
-               return e;
-       }
-       
-       protected Relationship buildRelationship(AAIResourceUri uri) {
-               return buildRelationship(uri, Optional.empty());
-       }
-       
-       protected Relationship buildRelationship(AAIResourceUri uri, AAIEdgeLabel label) {
-               return buildRelationship(uri, Optional.of(label));
-       }
-       protected Relationship buildRelationship(AAIResourceUri uri, Optional<AAIEdgeLabel> label) {
-               final Relationship result = new Relationship();
-               result.setRelatedLink(uri.build().toString());
-               if (label.isPresent()) {
-                       result.setRelationshipLabel(label.get().toString());
-               }
-               return result;
-       }
-       
-       /**
-        * Will automatically create the object if it does not exist
-        * 
-        * @param obj - Optional object which serializes to a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public AAIResourcesClient createIfNotExists(AAIResourceUri uri, Optional<Object> obj) {
-               if(!this.exists(uri)){
-                       if (obj.isPresent()) {
-                               this.create(uri, obj.get());
-                       } else {
-                               this.createEmpty(uri);
-                       }
-                       
-               }
-               return this;
-       }
 
-       /**
-        * Starts a transaction which encloses multiple A&AI mutations
-        * 
-        * @return
-        */
+       @Override
        public AAITransactionalClient beginTransaction() {
-               return new AAITransactionalClient(this.getVersion());
+               return new AAITransactionalClient(this, aaiClient);
        }
-       
-       /**
-        * Starts a transaction groups multiple A&AI mutations
-        * 
-        * @return
-        */
+
+       @Override
        public AAISingleTransactionClient beginSingleTransaction() {
-               return new AAISingleTransactionClient(this.getVersion());
+               return new AAISingleTransactionClient(this, aaiClient);
        }
        
-       private AAIUri addParams(Optional<Depth> depth, boolean nodesOnly, AAIUri uri) {
-               AAIUri clone = uri.clone();
-               if (depth.isPresent()) {
-                       clone.depth(depth.get());
-               }
-               if (nodesOnly) {
-                       clone.nodesOnly(nodesOnly);
-               }
-               
-               return clone;
+       @Override
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri) {
+               return super.buildRelationship(uri, Optional.empty());
+       }
+       
+       @Override
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, GraphInventoryEdgeLabel label) {
+               return super.buildRelationship(uri, Optional.of(label));
        }
+       
        @Override
-       public <T extends RestProperties> T getRestProperties() {
-               return super.getRestProperties();
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, Optional<GraphInventoryEdgeLabel> label) {
+               return super.buildRelationship(uri, label);
        }
+       
 }
index 4f235c3..a265119 100644 (file)
@@ -28,6 +28,7 @@ import javax.ws.rs.core.Response;
 
 import org.onap.so.client.ResponseExceptionMapper;
 import org.onap.so.client.RestClientSSL;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 import org.onap.so.client.policy.CommonObjectMapperProvider;
 import org.onap.so.utils.TargetEntity;
 
@@ -36,7 +37,7 @@ public class AAIRestClient extends RestClientSSL {
        private final AAIProperties aaiProperties;
        private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider();
 
-       private final AAIPatchConverter patchConverter = new AAIPatchConverter();
+       private final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
        
        protected AAIRestClient(AAIProperties props, URI uri) {
                super(props, Optional.of(uri));
@@ -81,7 +82,7 @@ public class AAIRestClient extends RestClientSSL {
                return super.patch(convertToPatchFormat(obj), resultClass);
        }
        
-       protected AAIPatchConverter getPatchConverter() {
+       protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
        
index 2ecdb7c..ee15e10 100644 (file)
@@ -22,178 +22,45 @@ package org.onap.so.client.aai;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 
-import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.GenericType;
 
-import org.onap.aai.domain.yang.Relationship;
 import org.onap.so.client.RestClient;
 import org.onap.so.client.aai.entities.AAIEdgeLabel;
 import org.onap.so.client.aai.entities.AAIError;
-import org.onap.so.client.aai.entities.bulkprocess.Transactions;
 import org.onap.so.client.aai.entities.singletransaction.OperationBodyRequest;
 import org.onap.so.client.aai.entities.singletransaction.OperationBodyResponse;
 import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest;
 import org.onap.so.client.aai.entities.singletransaction.SingleTransactionResponse;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
-import org.onap.so.client.aai.entities.uri.AAIUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
+import org.onap.so.client.graphinventory.GraphInventoryTransactionClient;
 import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Joiner;
 
-public class AAISingleTransactionClient extends AAIClient {
+public class AAISingleTransactionClient extends GraphInventoryTransactionClient<AAISingleTransactionClient, AAIResourceUri, AAIEdgeLabel> {
 
        private final SingleTransactionRequest request;
-       private final AAIVersion version;
-       private int actionCount = 0;
-       
-       private final AAIPatchConverter patchConverter = new AAIPatchConverter();
-       
-       protected AAISingleTransactionClient(AAIVersion version) {
+       private AAIResourcesClient resourcesClient;
+       private AAIClient aaiClient;
+       protected AAISingleTransactionClient(AAIResourcesClient resourcesClient, AAIClient aaiClient) {
                super();
-               this.version = version;
+               this.resourcesClient = resourcesClient;
+               this.aaiClient = aaiClient;
                this.request = new SingleTransactionRequest();
        }
-
-       /**
-        * creates a new object in A&AI
-        * 
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public AAISingleTransactionClient create(AAIResourceUri uri, Object obj) {
-               request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri.build().toString()).withBody(obj));
-               incrementActionAmount();
-               return this;
-       }
-
-       /**
-        * creates a new object in A&AI with no payload body
-        * 
-        * @param uri
-        * @return
-        */
-       public AAISingleTransactionClient createEmpty(AAIResourceUri uri) {
-               request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri.build().toString()).withBody(new HashMap<String, String>()));
-               incrementActionAmount();
-               return this;
-       }
-
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * @param uriA
-        * @param uriB
-        * @return
-        */
-       public AAISingleTransactionClient connect(AAIResourceUri uriA, AAIResourceUri uriB) {
-               AAIResourceUri uriAClone = uriA.clone();
-               request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
-               incrementActionAmount();
-               return this;
-       }
-
-       /**
-        * relationship between multiple objects in A&AI - connects A to all objects specified in list
-        * 
-        * @param uriA
-        * @param uris
-        * @return
-        */
-       public AAISingleTransactionClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
-               for (AAIResourceUri uri : uris) {
-                       this.connect(uriA, uri);
-               }
-               return this;
-       }
-       
-       public AAISingleTransactionClient connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
-               AAIResourceUri uriAClone = uriA.clone();
-               RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
-               aaiRC.put(this.buildRelationship(uriB, label));
-               return this;
-       }
        
-       public AAISingleTransactionClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris, AAIEdgeLabel label) {
-               for (AAIResourceUri uri : uris) {
-                       this.connect(uriA, uri, label);
-               }
-               return this;
-       }
-
-       /**
-        * Removes relationship from two objects in A&AI
-        * 
-        * @param uriA
-        * @param uriB
-        * @return
-        */
-       public AAISingleTransactionClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
-               AAIResourceUri uriAClone = uriA.clone();
-               request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
-               incrementActionAmount();
-               return this;
-       }
-
-       /**
-        * Removes relationship from multiple objects - disconnects A from all objects specified in list
-        * @param uriA
-        * @param uris
-        * @return
-        */
-       public AAISingleTransactionClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
-               for (AAIResourceUri uri : uris) {
-                       this.disconnect(uriA, uri);
-               }
-               return this;
-       }
-       /**
-        * Deletes object from A&AI. Automatically handles resource-version.
-        * 
-        * @param uri
-        * @return
-        */
-       public AAISingleTransactionClient delete(AAIResourceUri uri) {
-               AAIResourcesClient client = new AAIResourcesClient();
-               AAIResourceUri clone = uri.clone();
-               Map<String, Object> result = client.get(new GenericType<Map<String, Object>>(){}, clone)
-                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI"));
-               String resourceVersion = (String) result.get("resource-version");
-               request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(clone.resourceVersion(resourceVersion).build().toString()).withBody(""));
-               incrementActionAmount();
-               return this;
-       }
-
-       /**
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public AAISingleTransactionClient update(AAIResourceUri uri, Object obj) {
-               
-               final String payload = getPatchConverter().convertPatchFormat(obj);
-               request.getOperations().add(new OperationBodyRequest().withAction("patch").withUri(uri.build().toString()).withBody(payload));
-               incrementActionAmount();
-               return this;
-       }
-
-       private void incrementActionAmount() {
-               actionCount++;
-       }
-       /**
-        * Executes all created transactions in A&AI
-        * @throws BulkProcessFailed 
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionClient#execute()
         */
+       @Override
        public void execute() throws BulkProcessFailed {
-               RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.SINGLE_TRANSACTION));
+               RestClient client = aaiClient.createClient(AAIUriFactory.createResourceUri(AAIObjectType.SINGLE_TRANSACTION));
                try {
                        SingleTransactionResponse response = client.post(this.request, SingleTransactionResponse.class);
                        if (response != null) {
@@ -235,33 +102,44 @@ public class AAISingleTransactionClient extends AAIClient {
                        return Optional.empty();
                }
        }
+
        
-       private Relationship buildRelationship(AAIResourceUri uri) {
-               return buildRelationship(uri, Optional.empty());
+       protected SingleTransactionRequest getRequest() {
+               return this.request;
        }
-       
-       private Relationship buildRelationship(AAIResourceUri uri, AAIEdgeLabel label) {
-               return buildRelationship(uri, Optional.of(label));
+
+       @Override
+       public void put(String uri, Object body) {
+               request.getOperations().add(new OperationBodyRequest().withAction("put").withUri(uri).withBody(body));
        }
-       private Relationship buildRelationship(AAIResourceUri uri, Optional<AAIEdgeLabel> label) {
-               final Relationship result = new Relationship();
-               result.setRelatedLink(uri.build().toString());
-               if (label.isPresent()) {
-                       result.setRelationshipLabel(label.toString());
-               }
-               return result;
+
+       @Override
+       public void delete(String uri, Object body) {
+               request.getOperations().add(new OperationBodyRequest().withAction("delete").withUri(uri).withBody(body));
        }
 
        @Override
-       protected AAIVersion getVersion() {
-               return this.version;
+       public void patch(String uri, Object body) {
+               request.getOperations().add(new OperationBodyRequest().withAction("patch").withUri(uri).withBody(body));
+       }
+
+       @Override
+       protected <T> Optional<T> get(GenericType<T> genericType, AAIResourceUri clone) {
+               return resourcesClient.get(genericType, clone);
        }
        
-       protected SingleTransactionRequest getRequest() {
-               return this.request;
+       @Override
+       protected boolean exists(AAIResourceUri uri) {
+               return resourcesClient.exists(uri);
+       }
+       
+       @Override
+       protected String getGraphDBName() {
+               return aaiClient.getGraphDBName();
        }
        
-       protected AAIPatchConverter getPatchConverter() {
+       @Override
+       protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
 }
index 118a3ed..474ae89 100644 (file)
 
 package org.onap.so.client.aai;
 
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 
-import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 
@@ -42,8 +38,9 @@ import org.onap.so.client.aai.entities.bulkprocess.OperationBody;
 import org.onap.so.client.aai.entities.bulkprocess.Transaction;
 import org.onap.so.client.aai.entities.bulkprocess.Transactions;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
-import org.onap.so.client.aai.entities.uri.AAIUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
+import org.onap.so.client.graphinventory.GraphInventoryTransactionClient;
 import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
 import org.onap.so.jsonpath.JsonPathUtil;
 
@@ -51,18 +48,17 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Joiner;
 
-public class AAITransactionalClient extends AAIClient {
+public class AAITransactionalClient extends GraphInventoryTransactionClient<AAITransactionalClient, AAIResourceUri, AAIEdgeLabel> {
 
        private final Transactions transactions;
        private Transaction currentTransaction;
-       private final AAIVersion version;
-       private int actionCount = 0;
-       
-       private final AAIPatchConverter patchConverter = new AAIPatchConverter();
        
-       protected AAITransactionalClient(AAIVersion version) {
+       private AAIResourcesClient resourcesClient;
+       private AAIClient aaiClient;
+       protected AAITransactionalClient(AAIResourcesClient resourcesClient, AAIClient aaiClient) {
                super();
-               this.version = version;
+               this.resourcesClient = resourcesClient;
+               this.aaiClient = aaiClient;
                this.transactions = new Transactions();
                startTransaction();
        }
@@ -73,146 +69,20 @@ public class AAITransactionalClient extends AAIClient {
                currentTransaction = transaction;
        }
        
-       /**
-        * adds an additional transaction and closes the previous transaction
-        * 
-        * @return AAITransactionalClient
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#beginNewTransaction()
         */
        public AAITransactionalClient beginNewTransaction() {
                startTransaction();
                return this;
        }
        
-       /**
-        * creates a new object in A&AI
-        * 
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public AAITransactionalClient create(AAIResourceUri uri, Object obj) {
-               currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(obj));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /**
-        * creates a new object in A&AI with no payload body
-        * 
-        * @param uri
-        * @return
-        */
-       public AAITransactionalClient createEmpty(AAIResourceUri uri) {
-               currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(new HashMap<String, String>()));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /**
-        * Adds a relationship between two objects in A&AI 
-        * @param uriA
-        * @param uriB
-        * @return
-        */
-       public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB) {
-               AAIResourceUri uriAClone = uriA.clone();
-               currentTransaction.getPut().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /**
-        * relationship between multiple objects in A&AI - connects A to all objects specified in list
-        * 
-        * @param uriA
-        * @param uris
-        * @return
-        */
-       public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
-               for (AAIResourceUri uri : uris) {
-                       this.connect(uriA, uri);
-               }
-               return this;
-       }
-       
-       public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB, AAIEdgeLabel label) {
-               AAIResourceUri uriAClone = uriA.clone();
-               RestClient aaiRC = this.createClient(uriAClone.relationshipAPI());
-               aaiRC.put(this.buildRelationship(uriB, label));
-               return this;
-       }
-       
-       public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris, AAIEdgeLabel label) {
-               for (AAIResourceUri uri : uris) {
-                       this.connect(uriA, uri, label);
-               }
-               return this;
-       }
-       
-       /**
-        * Removes relationship from two objects in A&AI
-        * 
-        * @param uriA
-        * @param uriB
-        * @return
-        */
-       public AAITransactionalClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) {
-               AAIResourceUri uriAClone = uriA.clone();
-               currentTransaction.getDelete().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB)));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /**
-        * Removes relationship from multiple objects - disconnects A from all objects specified in list
-        * @param uriA
-        * @param uris
-        * @return
-        */
-       public AAITransactionalClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) {
-               for (AAIResourceUri uri : uris) {
-                       this.disconnect(uriA, uri);
-               }
-               return this;
-       }
-       /**
-        * Deletes object from A&AI. Automatically handles resource-version.
-        * 
-        * @param uri
-        * @return
-        */
-       public AAITransactionalClient delete(AAIResourceUri uri) {
-               AAIResourcesClient client = new AAIResourcesClient();
-               AAIResourceUri clone = uri.clone();
-               Map<String, Object> result = client.get(new GenericType<Map<String, Object>>(){}, clone)
-                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI"));
-               String resourceVersion = (String) result.get("resource-version");
-               currentTransaction.getDelete().add(new OperationBody().withUri(clone.resourceVersion(resourceVersion).build().toString()).withBody(""));
-               incrementActionAmount();
-               return this;
-       }
-       
-       /**
-        * @param obj - can be any object which will marshal into a valid A&AI payload
-        * @param uri
-        * @return
-        */
-       public AAITransactionalClient update(AAIResourceUri uri, Object obj) {
-               final String payload = getPatchConverter().convertPatchFormat(obj);
-               currentTransaction.getPatch().add(new OperationBody().withUri(uri.build().toString()).withBody(payload));
-               incrementActionAmount();
-               return this;
-       }
-       
-       private void incrementActionAmount() {
-               actionCount++;
-       }
-       /**
-        * Executes all created transactions in A&AI
-        * @throws BulkProcessFailed 
+       /* (non-Javadoc)
+        * @see org.onap.so.client.aai.GraphInventoryTransactionalClient#execute()
         */
+       @Override
        public void execute() throws BulkProcessFailed {
-               RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.BULK_PROCESS));
+               RestClient client = aaiClient.createClient(AAIUriFactory.createResourceUri(AAIObjectType.BULK_PROCESS));
                try {
                        Response response = client.put(this.transactions);
                        if (response.hasEntity()) {
@@ -283,17 +153,44 @@ public class AAITransactionalClient extends AAIClient {
                }
                return result;
        }
+       
+       protected Transactions getTransactions() {
+               return this.transactions;
+       }
+
+       @Override
+       public void put(String uri, Object body) {
+               currentTransaction.getPut().add(new OperationBody().withUri(uri).withBody(body));
+       }
+
+       @Override
+       public void delete(String uri, Object body) {
+               currentTransaction.getDelete().add(new OperationBody().withUri(uri).withBody(body));
+               
+       }
+
+       @Override
+       public void patch(String uri, Object body) {
+               currentTransaction.getPatch().add(new OperationBody().withUri(uri).withBody(body));
+       }
 
        @Override
-       protected AAIVersion getVersion() {
-               return this.version;
+       protected <T> Optional<T> get(GenericType<T> genericType, AAIResourceUri clone) {
+               return resourcesClient.get(genericType, clone);
        }
        
-       protected Transactions getTransactions() {
-               return this.transactions;
+       @Override
+       protected boolean exists(AAIResourceUri uri) {
+               return resourcesClient.exists(uri);
+       }
+
+       @Override
+       protected String getGraphDBName() {
+               return aaiClient.getGraphDBName();
        }
        
-       protected AAIPatchConverter getPatchConverter() {
+       @Override
+       protected GraphInventoryPatchConverter getPatchConverter() {
                return this.patchConverter;
        }
 }
index 77ea9bc..9b3f98b 100644 (file)
 
 package org.onap.so.client.aai.entities;
 
-import java.io.IOException;
 import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
 
-
-import org.onap.so.client.aai.AAICommonObjectMapperProvider;
-import org.onap.so.jsonpath.JsonPathUtil;
+import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class AAIResultWrapper implements Serializable {
+public class AAIResultWrapper extends GraphInventoryResultWrapper implements Serializable {
 
        private static final long serialVersionUID = 5895841925807816737L;
-       private final String jsonBody;
-       private final ObjectMapper mapper;
-       private final transient Logger logger = LoggerFactory.getLogger(AAIResultWrapper.class);
+       private final static transient Logger logger = LoggerFactory.getLogger(AAIResultWrapper.class);
        
        public AAIResultWrapper(String json) {
-               this.jsonBody = json;
-               this.mapper = new AAICommonObjectMapperProvider().getMapper();
+               super(json, logger);
        }
        
        public AAIResultWrapper(Object aaiObject) {
-               this.mapper = new AAICommonObjectMapperProvider().getMapper();
-               this.jsonBody = mapObjectToString(aaiObject);
-       }
-       
-       protected String mapObjectToString(Object aaiObject) {
-               try {
-                       return mapper.writeValueAsString(aaiObject);
-               } catch (JsonProcessingException e) {
-                       logger.warn("could not parse object into json - defaulting to {}");
-                       return "{}";
-               }
+               super(aaiObject, logger);
        }
-       public Optional<Relationships> getRelationships() {
-               final String path = "$.relationship-list";
-               if (isEmpty()) {
-                       return Optional.empty();
-               }
-               Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody, path);
-               if (result.isPresent()) {
-                       return Optional.of(new Relationships(result.get()));
-               } else {
-                       return Optional.empty();
-               }
-       }
-       
-       public String getJson() {
-               if(jsonBody == null) {
-                       return "{}";
-               } else {
-                       return jsonBody;
-               }
-       }
-       
-       public Map<String, Object> asMap() {
-               if (isEmpty()) {
-                       return new HashMap<>();
-               }
-               try {
-                       return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){});
-               } catch (IOException e) {
-                       return new HashMap<>();
-               }
-       }
-       
-       public <T> Optional<T> asBean(Class<T> clazz) {
-               if (isEmpty()) {
-                       return Optional.empty();
-               }
-               try {
-                       return Optional.of(mapper.readValue(this.jsonBody, clazz));
-               } catch (IOException e) {
-                       return Optional.empty();
-               }
-       }
-       
-       public boolean isEmpty() {
-               return jsonBody == null;
-       }
-       @Override
-       public String toString() {
-               return this.getJson();
-       }
-
 }
index 76413c2..7cb37d9 100644 (file)
@@ -59,6 +59,10 @@ public class AAISimpleUri extends SimpleUri implements AAIResourceUri {
                super(parentUri, childType, childValues);
        }
        
+       protected AAISimpleUri(AAIResourceUri parentUri, AAIObjectPlurals childType) {
+               super(parentUri, childType);
+       }
+       
        @Override
        public AAISimpleUri relationshipAPI() {
                return (AAISimpleUri) super.relationshipAPI();
index 77c6108..ac0aba3 100644 (file)
@@ -85,6 +85,11 @@ public class AAIUriFactory {
                return new AAISimpleUri(parentUri, childType, childValues);
        }
        
+       public static AAIResourceUri createResourceFromParentURI(AAIResourceUri parentUri, AAIObjectPlurals childType) {
+               
+               return new AAISimpleUri(parentUri, childType);
+       }
+       
        /**
         * Creates a uri for a plural type e.g. /cloud-infrastructure/pservers
         * 
index dde0b31..dea00dd 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.so.client.dmaap;
 
 import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.util.Base64;
 import java.util.Map;
 import java.util.Optional;
@@ -31,13 +32,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
-
+import org.onap.so.utils.CryptoUtils;
 
 public abstract class DmaapClient {
-       
+
        protected static Logger logger = LoggerFactory.getLogger(DmaapClient.class);
        protected final Map<String, String> msoProperties;
        protected final Properties properties;
+
        public DmaapClient(String filepath) throws IOException {
                Resource resource = new ClassPathResource(filepath);
                DmaapProperties dmaapProperties = DmaapPropertiesLoader.getInstance().getNewImpl();
@@ -48,27 +50,34 @@ public abstract class DmaapClient {
                this.msoProperties = dmaapProperties.getProperties();
                this.properties = new Properties();
                this.properties.load(resource.getInputStream());
-               this.properties.put("password", this.deobfuscatePassword(this.getPassword()));
-               this.properties.put("username", this.getUserName());
+               try {
+                       this.properties.put("auth", CryptoUtils.decrypt(this.getAuth(), this.getKey()).getBytes());
+               } catch (GeneralSecurityException e) {
+                       logger.error(e.getMessage(), e);
+               }
+               this.properties.put("key", this.getKey());
                this.properties.put("topic", this.getTopic());
                Optional<String> host = this.getHost();
                if (host.isPresent()) {
                        this.properties.put("host", host.get());
                }
        }
-       protected String deobfuscatePassword(String password) {
-               
+
+       protected String deobfuscatePassword(String decrypted_key) {
+
                try {
-                       return new String(Base64.getDecoder().decode(password.getBytes()));
-               } catch(IllegalArgumentException iae) {
-                       logger.error("llegal Arguments",iae);
-                       return password;
+                       return new String(Base64.getDecoder().decode(decrypted_key.getBytes()));
+               } catch (IllegalArgumentException iae) {
+                       logger.error("llegal Arguments", iae);
+                       return decrypted_key;
                }
        }
-       
-       
-       public abstract String getUserName();
-       public abstract String getPassword();
+
+       public abstract String getKey();
+
+       public abstract String getAuth();
+
        public abstract String getTopic();
+
        public abstract Optional<String> getHost();
 }
index 0438ff2..9fd8c05 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.so.client.dmaap.rest;
 
 import java.net.URL;
-import java.util.Base64;
 import java.util.Map;
 
 import org.onap.so.client.RestClient;
+import org.onap.so.utils.CryptoUtils;
 import org.onap.so.utils.TargetEntity;
 
 public class DMaaPRestClient extends RestClient {
 
-       private final String username;
-       private final String password;
-       public DMaaPRestClient(URL url, String contentType, String username, String password) {
+       private final String auth;
+       private final String key;
+
+       public DMaaPRestClient(URL url, String contentType, String auth, String key) {
                super(url, contentType);
-               this.username = username;
-               this.password = password;
+               this.auth = auth;
+               this.key = key;
        }
 
-    @Override
-    public TargetEntity getTargetEntity(){
-        return TargetEntity.DMAAP;
-    }
+       @Override
+       public TargetEntity getTargetEntity() {
+               return TargetEntity.DMAAP;
+       }
 
        @Override
        protected void initializeHeaderMap(Map<String, String> headerMap) {
-               headerMap.put("Authorization", "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes()));
+               if (auth != null && !auth.isEmpty() && key != null && !key.isEmpty()) {
+                       addBasicAuthHeader(auth, key);
+               }       
        }
 
 }
index f43c658..1884921 100644 (file)
@@ -24,8 +24,8 @@ import java.util.Properties;
 
 public class PropertiesBean {
 
-       private String username;
-       private String password;
+       private String auth;
+       private String key;
        private String environment;
        private String partition;
        private String contentType;
@@ -35,8 +35,8 @@ public class PropertiesBean {
        
        
        public PropertiesBean(Properties properties) {
-               this.withUsername(properties.getProperty("username"))
-               .withPassword(properties.getProperty("password"))
+               this.withAuth(properties.getProperty("auth"))
+               .withKey(properties.getProperty("key"))
                .withTopic(properties.getProperty("topic"))
                .withEnvironment(properties.getProperty("environment"))
                .withHost(properties.getProperty("host"))
@@ -44,24 +44,24 @@ public class PropertiesBean {
                .withPartition(properties.getProperty("partition"))
                .withContentType(properties.getProperty("contentType", "application/json"));
        }
-       public String getUsername() {
-               return username;
+       public String getAuth() {
+               return auth;
        }
-       public void setUsername(String username) {
-               this.username = username;
+       public void setAuth(String auth) {
+               this.auth = auth;
        }
-       public PropertiesBean withUsername(String username) {
-               this.username = username;
+       public PropertiesBean withAuth(String auth) {
+               this.auth = auth;
                return this;
        }
-       public String getPassword() {
-               return password;
+       public String getKey() {
+               return key;
        }
-       public void setPassword(String password) {
-               this.password = password;
+       public void setKey(String key) {
+               this.key = key;
        }
-       public PropertiesBean withPassword(String password) {
-               this.password = password;
+       public PropertiesBean withKey(String key) {
+               this.key = key;
                return this;
        }
        public String getEnvironment() {
index 39af156..bee5a0c 100644 (file)
@@ -37,7 +37,7 @@ public class RestConsumer implements Consumer {
        private final RestClient client;
        public RestConsumer(Properties properties) {
                PropertiesBean bean = new PropertiesBean(properties);
-               client = new DMaaPRestClient(this.createURL(bean), bean.getContentType(), bean.getUsername(), bean.getPassword());
+               client = new DMaaPRestClient(this.createURL(bean), bean.getContentType(), bean.getAuth(), bean.getKey());
        }
        
        private URL createURL(PropertiesBean properties) {
index 090e505..af660c2 100644 (file)
@@ -35,7 +35,7 @@ public class RestPublisher implements Publisher {
 
        public RestPublisher(Properties properties) {
                PropertiesBean bean = new PropertiesBean(properties);
-               client = new DMaaPRestClient(this.createURL(bean), bean.getContentType(), bean.getUsername(), bean.getPassword());
+               client = new DMaaPRestClient(this.createURL(bean), bean.getContentType(), bean.getAuth(), bean.getKey());
        }
        
        private URL createURL(PropertiesBean properties) {
index 5cbf132..0a3e0b4 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.client.graphinventory;
 public enum Format {
 
        RESOURCE("resource"),
+       RESOURCE_AND_URL("resource_and_url"),
        SIMPLE("simple"),
        RAW("raw"),
        CONSOLE("console"),
index 0d10c21..30e91dc 100644 (file)
@@ -37,12 +37,16 @@ public abstract class GraphInventoryClient {
        }
        protected abstract URI constructPath(GraphInventoryUri uri);
        
-       protected abstract RestClient createClient(GraphInventoryUri uri);
+       public abstract RestClient createClient(GraphInventoryUri uri);
 
-       protected <T extends RestProperties> T getRestProperties() {
+       public <T extends RestProperties> T getRestProperties() {
                if (props == null) {
                        throw new IllegalStateException("No RestProperty implementation found on classpath");
                }
                return (T)props;
        }
+       
+       public abstract GraphInventoryVersion getVersion();
+       
+       public abstract String getGraphDBName();
 }
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP - SO
  * ================================================================================
- * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.sniro.beans;
+package org.onap.so.client.graphinventory;
 
-import java.io.Serializable;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+public class GraphInventoryCommonObjectMapperPatchProvider extends GraphInventoryCommonObjectMapperProvider {
 
-public class CandidateType implements Serializable{
-
-       private static final long serialVersionUID = 2273215496314532173L;
-
-       @JsonProperty("name")
-       private String name;
-
-
-       public String getName(){
-               return name;
+       
+       public GraphInventoryCommonObjectMapperPatchProvider() {
+               super();
+               EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer(); 
+               SimpleModule emptyStringModule = new SimpleModule();
+               emptyStringModule.addSerializer(String.class, sp);
+               mapper.registerModule(emptyStringModule);
        }
-
-       public void setName(String name){
-               this.name = name;
-       }
-
 }
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryCommonObjectMapperProvider.java
new file mode 100644 (file)
index 0000000..f985742
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.graphinventory;
+
+import org.onap.so.client.policy.CommonObjectMapperProvider;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+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 com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
+
+public class GraphInventoryCommonObjectMapperProvider extends CommonObjectMapperProvider {
+
+       public GraphInventoryCommonObjectMapperProvider() {
+               mapper = new ObjectMapper();
+               mapper.setSerializationInclusion(Include.NON_NULL);
+               mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+               mapper.enable(MapperFeature.USE_ANNOTATIONS);
+               mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+               mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
+               mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+               AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
+        AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
+        // first Jaxb, second Jackson annotations
+        mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
+       }
+
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
+import org.onap.so.client.aai.AAICommonObjectMapperPatchProvider;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryPatchDepthExceededException;
 import org.onap.so.jsonpath.JsonPathUtil;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 
-public class AAIPatchConverter {
+public class GraphInventoryPatchConverter {
 
        private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider();
        private static final AAICommonObjectMapperPatchProvider patchProvider = new AAICommonObjectMapperPatchProvider();
        private static final Pattern LOCATE_COMPLEX_OBJECT = Pattern.compile("^((?!relationship-list).)+?\\['[^\\[\\]]+?'\\]$");
 
        
-       protected String convertPatchFormat(Object obj) {
+       public String convertPatchFormat(Object obj) {
                return validatePatchObject(marshallObjectToPatchFormat(obj));
        }
        
-       protected String validatePatchObject(String payload) {
+       public String validatePatchObject(String payload) {
                if (hasComplexObject(payload)) {
                        throw new GraphInventoryPatchDepthExceededException(payload);
                }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 import java.util.Optional;
 
-import org.onap.so.client.RestClient;
-import org.onap.so.client.aai.entities.DSLQuery;
-import org.onap.so.client.aai.entities.uri.AAIUriFactory;
-import org.onap.so.client.graphinventory.Format;
+import org.onap.so.client.aai.entities.CustomQuery;
 import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
 
-public class AAIDSLQuery extends AAIClient {
+public abstract class GraphInventoryQueryClient<S> {
 
        private Optional<String> depth = Optional.empty();
        private boolean nodesOnly = false;
-       private Optional<AAISubgraphType> subgraph = Optional.empty();
+       private Optional<GraphInventorySubgraphType> subgraph = Optional.empty();
+       private GraphInventoryClient client;
        
-       public AAIDSLQuery() {
-               super();
+       public GraphInventoryQueryClient(GraphInventoryClient client) {
+               this.client = client;
        }
        
-       public AAIDSLQuery(AAIVersion version) {
-               super();
-               this.version = version;
-       }
+       protected abstract GraphInventoryUri getQueryUri();
        
-       public String query(Format format, DSLQuery query) {
-               return this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.DSL).queryParam("format", format.toString()))
-               .put(query, String.class);
+       public String query(Format format, CustomQuery query) {
+               return client.createClient(setupQueryParams(getQueryUri().queryParam("format", format.toString()))).put(query, String.class);
        }
        
-       public AAIDSLQuery depth (String depth) {
+       public S depth (String depth) {
                this.depth = Optional.of(depth);
-               return this;
+               return (S) this;
        }
-       public AAIDSLQuery nodesOnly() {
+       public S nodesOnly() {
                this.nodesOnly = true;
-               return this;
+               return (S) this;
        }
-       public AAIDSLQuery subgraph(AAISubgraphType type){
+       public S subgraph(GraphInventorySubgraphType type){
                
                subgraph =  Optional.of(type);
 
-               return this;
+               return (S) this;
        }
        
        protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) {
@@ -76,8 +70,4 @@ public class AAIDSLQuery extends AAIClient {
                }
                return clone;
        }
-       @Override
-       protected RestClient createClient(GraphInventoryUri uri) {
-               return super.createClient(setupQueryParams(uri));
-       }
 }
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryResourcesClient.java
new file mode 100644 (file)
index 0000000..39d2d01
--- /dev/null
@@ -0,0 +1,306 @@
+package org.onap.so.client.graphinventory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.so.client.RestClient;
+import org.onap.so.client.RestProperties;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.GraphInventoryResultWrapper;
+import org.onap.so.client.graphinventory.entities.uri.Depth;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri;
+
+public abstract class GraphInventoryResourcesClient<Self, Uri extends GraphInventoryResourceUri, EdgeLabel extends GraphInventoryEdgeLabel, Wrapper extends GraphInventoryResultWrapper, TransactionalClient, SingleTransactionClient> {
+
+       protected GraphInventoryClient client;
+       
+       protected GraphInventoryResourcesClient(GraphInventoryClient client) {
+               this.client = client;
+       }
+       /**
+        * creates a new object in GraphInventory
+        * 
+        * @param obj - can be any object which will marshal into a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       public void create(Uri uri, Object obj) {
+               RestClient giRC = client.createClient(uri);
+               giRC.put(obj);
+       }
+
+       /**
+        * creates a new object in GraphInventory with no payload body
+        * 
+        * @param uri
+        * @return
+        */
+       public void createEmpty(Uri uri) {
+               RestClient giRC = client.createClient(uri);
+               giRC.put("");
+       }
+
+       /**
+        * returns false if the object does not exist in GraphInventory
+        * 
+        * @param uri
+        * @return
+        */
+       public boolean exists(Uri uri) {
+               GraphInventoryUri forceMinimal = this.addParams(Optional.of(Depth.ZERO), true, uri);
+               try {
+                       RestClient giRC = client.createClient(forceMinimal);
+                       
+                       return giRC.get().getStatus() == Status.OK.getStatusCode();
+               } catch (NotFoundException e) {
+                       return false;
+               }
+       }
+
+       /**
+        * Adds a relationship between two objects in GraphInventory 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       public void connect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               RestClient giRC = client.createClient(uriAClone.relationshipAPI());
+               giRC.put(this.buildRelationship(uriB));
+       }
+
+       /**
+        * Adds a relationship between two objects in GraphInventory 
+        * with a given edge label
+        * @param uriA
+        * @param uriB
+        * @param edge label
+        * @return
+        */
+       public void connect(Uri uriA, Uri uriB, EdgeLabel label) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               RestClient giRC = client.createClient(uriAClone.relationshipAPI());
+               giRC.put(this.buildRelationship(uriB, label));
+       }
+
+       /**
+        * Removes relationship from two objects in GraphInventory
+        * 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       public void disconnect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               RestClient giRC = client.createClient(uriAClone.relationshipAPI());
+               giRC.delete(this.buildRelationship(uriB));
+       }
+
+       /**
+        * Deletes object from GraphInventory. Automatically handles resource-version.
+        * 
+        * @param uri
+        * @return
+        */
+       public void delete(Uri uri) {
+               GraphInventoryResourceUri clone = uri.clone();
+               RestClient giRC = client.createClient(clone);
+               Map<String, Object> result = giRC.get(new GenericType<Map<String, Object>>(){})
+                               .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in " + client.getGraphDBName()));
+               String resourceVersion = (String) result.get("resource-version");
+               giRC = client.createClient(clone.resourceVersion(resourceVersion));
+               giRC.delete();
+       }
+
+       /**
+        * @param obj - can be any object which will marshal into a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       public void update(Uri uri, Object obj) {
+               RestClient giRC = client.createClient(uri);
+               giRC.patch(obj);
+       }
+
+       /**
+        * Retrieves an object from GraphInventory and unmarshalls it into the Class specified
+        * @param clazz
+        * @param uri
+        * @return
+        */
+       public <T> Optional<T> get(Class<T> clazz, Uri uri) {
+               try {
+                       return client.createClient(uri).get(clazz);
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               return Optional.empty();
+                       } else {
+                               throw e;
+                       }
+               }
+       }
+
+       /**
+        * Retrieves an object from GraphInventory and returns complete response
+        * @param uri
+        * @return
+        */
+       public Response getFullResponse(Uri uri) {
+               try {
+                       return client.createClient(uri).get();
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               return e.getResponse();
+                       } else {
+                               throw e;
+                       }
+               }
+       }
+
+       /**
+        * Retrieves an object from GraphInventory and automatically unmarshalls it into a Map or List 
+        * @param resultClass
+        * @param uri
+        * @return
+        */
+       public <T> Optional<T> get(GenericType<T> resultClass, Uri uri) {
+               try {
+                       return client.createClient(uri).get(resultClass);
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               return Optional.empty();
+                       } else {
+                               throw e;
+                       }
+               }
+       }
+       /**
+        * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
+        * 
+        * @param uri
+        * @return
+        */
+       public Wrapper get(Uri uri) {
+               String json;
+               try {
+                       json = client.createClient(uri).get(String.class).orElse(null);
+               } catch (NotFoundException e) {
+                       if (this.getRestProperties().mapNotFoundToEmpty()) {
+                               json = null;
+                       } else {
+                               throw e;
+                       }
+               }
+               return this.createWrapper(json);
+       }
+
+       /**
+        * Retrieves an object from GraphInventory wrapped in a helper class which offer additional features
+        * If the object cannot be found in GraphInventory the method will throw the runtime exception
+        * included as an argument
+        * @param uri
+        * @return
+        */
+       public Wrapper get(Uri uri, Class<? extends RuntimeException> c) {
+               String json;
+               try {
+                       json = client.createClient(uri).get(String.class)
+                                       .orElseThrow(() -> createException(c, uri.build() + " not found in " + client.getGraphDBName(), Optional.empty()));
+               } catch (NotFoundException e) {
+                       throw createException(c, "could not construct uri for use with " + client.getGraphDBName(), Optional.of(e));
+               }
+
+               return this.createWrapper(json);
+       }
+       
+       private RuntimeException createException(Class<? extends RuntimeException> c, String message, Optional<Throwable> t) {
+               RuntimeException e;
+               try {
+                       if (t.isPresent()) {
+                               e = c.getConstructor(String.class, Throwable.class).newInstance(message, t.get());
+                       } else {
+                               e = c.getConstructor(String.class).newInstance(message);
+                       }
+               } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                               | NoSuchMethodException | SecurityException e1) {
+                       throw new IllegalArgumentException("could not create instance for " + c.getName());
+               }
+               
+               return e;
+       }
+
+       /**
+        * Will automatically create the object if it does not exist
+        * 
+        * @param obj - Optional object which serializes to a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       public Self createIfNotExists(Uri uri, Optional<Object> obj) {
+               if(!this.exists(uri)){
+                       if (obj.isPresent()) {
+                               this.create(uri, obj.get());
+                       } else {
+                               this.createEmpty(uri);
+                       }
+                       
+               }
+               return (Self)this;
+       }
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri) {
+               return buildRelationship(uri, Optional.empty());
+       }
+       
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, GraphInventoryEdgeLabel label) {
+               return buildRelationship(uri, Optional.of(label));
+       }
+       protected Relationship buildRelationship(GraphInventoryResourceUri uri, Optional<GraphInventoryEdgeLabel> label) {
+               final Relationship result = new Relationship();
+               result.setRelatedLink(uri.build().toString());
+               if (label.isPresent()) {
+                       result.setRelationshipLabel(label.get().toString());
+               }
+               return result;
+       }
+       
+       public abstract Wrapper createWrapper(String json);
+       
+       /**
+        * Starts a transaction which encloses multiple GraphInventory mutations
+        * 
+        * @return
+        */
+       public abstract TransactionalClient beginTransaction();
+
+       /**
+        * Starts a transaction groups multiple GraphInventory mutations
+        * 
+        * @return
+        */
+       public abstract SingleTransactionClient beginSingleTransaction();
+
+       private GraphInventoryUri addParams(Optional<Depth> depth, boolean nodesOnly, GraphInventoryUri uri) {
+               GraphInventoryUri clone = uri.clone();
+               if (depth.isPresent()) {
+                       clone.depth(depth.get());
+               }
+               if (nodesOnly) {
+                       clone.nodesOnly(nodesOnly);
+               }
+               
+               return clone;
+       }
+       
+       public <T extends RestProperties> T getRestProperties() {
+               return client.getRestProperties();
+       }
+
+}
\ No newline at end of file
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 
-public enum AAISubgraphType {
+public enum GraphInventorySubgraphType {
        STAR("star"),
        PRUNE("prune");
 
        private final String name;
 
-       private AAISubgraphType(String name) {
+       private GraphInventorySubgraphType(String name) {
                this.name = name;
        }
 
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryTransactionClient.java
new file mode 100644 (file)
index 0000000..8d1a945
--- /dev/null
@@ -0,0 +1,240 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.graphinventory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.core.GenericType;
+
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.so.client.aai.AAIVersion;
+import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest;
+import org.onap.so.client.graphinventory.entities.GraphInventoryEdgeLabel;
+import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri;
+import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class GraphInventoryTransactionClient<Self, Uri extends GraphInventoryResourceUri, EdgeLabel extends GraphInventoryEdgeLabel> implements TransactionBuilder {
+
+       protected static Logger logger = LoggerFactory.getLogger(GraphInventoryTransactionClient.class);
+
+       protected int actionCount = 0;
+       
+       protected final GraphInventoryPatchConverter patchConverter = new GraphInventoryPatchConverter();
+       
+       protected GraphInventoryTransactionClient() {
+       }
+
+       /**
+        * creates a new object in A&AI
+        * 
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       public Self create(Uri uri, Object obj) {
+               this.put(uri.build().toString(), obj);
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * creates a new object in A&AI with no payload body
+        * 
+        * @param uri
+        * @return
+        */
+       public Self createEmpty(Uri uri) {
+               this.put(uri.build().toString(), new HashMap<String, String>());
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * Will automatically create the object if it does not exist
+        * 
+        * @param obj - Optional object which serializes to a valid GraphInventory payload
+        * @param uri
+        * @return
+        */
+       public Self createIfNotExists(Uri uri, Optional<Object> obj) {
+               if(!this.exists(uri)){
+                       if (obj.isPresent()) {
+                               this.create(uri, obj.get());
+                               incrementActionAmount();
+                       } else {
+                               this.createEmpty(uri);
+                               incrementActionAmount();
+                       }
+                       
+               }
+               return (Self)this;
+       }
+       
+       /**
+        * Adds a relationship between two objects in A&AI 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       public Self connect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               this.put(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB));
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self connect(Uri uriA, List<Uri> uris) {
+               for (Uri uri : uris) {
+                       this.connect(uriA, uri);
+               }
+               return (Self)this;
+       }
+       
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self connect(Uri uriA, Uri uriB, EdgeLabel label) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               this.put(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB, label));
+               return (Self)this;
+       }
+       
+       /**
+        * relationship between multiple objects in A&AI - connects A to all objects specified in list
+        * 
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self connect(Uri uriA, List<Uri> uris, EdgeLabel label) {
+               for (Uri uri : uris) {
+                       this.connect(uriA, uri, label);
+               }
+               return (Self)this;
+       }
+
+       /**
+        * Removes relationship from two objects in A&AI
+        * 
+        * @param uriA
+        * @param uriB
+        * @return
+        */
+       public Self disconnect(Uri uriA, Uri uriB) {
+               GraphInventoryResourceUri uriAClone = uriA.clone();
+               this.delete(uriAClone.relationshipAPI().build().toString(), this.buildRelationship(uriB));
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       /**
+        * Removes relationship from multiple objects - disconnects A from all objects specified in list
+        * @param uriA
+        * @param uris
+        * @return
+        */
+       public Self disconnect(Uri uriA, List<Uri> uris) {
+               for (Uri uri : uris) {
+                       this.disconnect(uriA, uri);
+               }
+               return (Self)this;
+       }
+       /**
+        * Deletes object from A&AI. Automatically handles resource-version.
+        * 
+        * @param uri
+        * @return
+        */
+       public Self delete(Uri uri) {
+               Map<String, Object> result = this.get(new GenericType<Map<String, Object>>(){}, (Uri)uri.clone())
+                               .orElseThrow(() -> new NotFoundException(uri.build() + " does not exist in " + this.getGraphDBName()));
+               String resourceVersion = (String) result.get("resource-version");
+               this.delete(uri.resourceVersion(resourceVersion).build().toString(), "");
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       protected abstract <T> Optional<T> get(GenericType<T> genericType, Uri clone);
+       
+       protected abstract boolean exists(Uri uri);
+       
+       protected abstract String getGraphDBName();
+
+       /**
+        * @param obj - can be any object which will marshal into a valid A&AI payload
+        * @param uri
+        * @return
+        */
+       public Self update(Uri uri, Object obj) {
+               
+               final String payload = getPatchConverter().convertPatchFormat(obj);
+               this.patch(uri.build().toString(), payload);
+               incrementActionAmount();
+               return (Self)this;
+       }
+
+       private void incrementActionAmount() {
+               actionCount++;
+       }
+       /**
+        * Executes all created transactions in A&AI
+        * @throws BulkProcessFailed 
+        */
+       public abstract void execute() throws BulkProcessFailed;
+       
+       private Relationship buildRelationship(Uri uri) {
+               return buildRelationship(uri, Optional.empty());
+       }
+       
+       private Relationship buildRelationship(Uri uri, EdgeLabel label) {
+               return buildRelationship(uri, Optional.of(label));
+       }
+       private Relationship buildRelationship(Uri uri, Optional<EdgeLabel> label) {
+               final Relationship result = new Relationship();
+               result.setRelatedLink(uri.build().toString());
+               if (label.isPresent()) {
+                       result.setRelationshipLabel(label.toString());
+               }
+               return result;
+       }
+       
+       protected GraphInventoryPatchConverter getPatchConverter() {
+               return this.patchConverter;
+       }
+       
+}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/TransactionBuilder.java b/common/src/main/java/org/onap/so/client/graphinventory/TransactionBuilder.java
new file mode 100644 (file)
index 0000000..2cab4b5
--- /dev/null
@@ -0,0 +1,10 @@
+package org.onap.so.client.graphinventory;
+
+public interface TransactionBuilder {
+
+       
+       void put(String uri, Object body);
+       void delete(String uri, Object body);
+       void patch(String uri,Object body);
+       
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.onap.so.client.aai.entities.QueryStep;
 import org.onap.so.client.graphinventory.GraphInventoryObjectName;
 
 public class DSLNode implements QueryStep {
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.onap.so.client.aai.entities.QueryStep;
+
 import com.google.common.base.Joiner;
 
 
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.onap.so.client.aai.entities.QueryStep;
+
 import com.google.common.base.Joiner;
 
 
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/GraphInventoryResultWrapper.java
new file mode 100644 (file)
index 0000000..cc1ce00
--- /dev/null
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.graphinventory.entities;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.aai.entities.Relationships;
+import org.onap.so.jsonpath.JsonPathUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class GraphInventoryResultWrapper implements Serializable {
+
+       private static final long serialVersionUID = 5895841925807816727L;
+       protected final String jsonBody;
+       protected final ObjectMapper mapper;
+       private final transient Logger logger;
+       
+       protected GraphInventoryResultWrapper(String json, Logger logger) {
+               this.jsonBody = json;
+               this.mapper = new AAICommonObjectMapperProvider().getMapper();
+               this.logger = logger;
+       }
+       
+       protected GraphInventoryResultWrapper(Object aaiObject, Logger logger) {
+               this.mapper = new AAICommonObjectMapperProvider().getMapper();
+               this.jsonBody = mapObjectToString(aaiObject);
+               this.logger = logger;
+       }
+       
+       protected String mapObjectToString(Object aaiObject) {
+               try {
+                       return mapper.writeValueAsString(aaiObject);
+               } catch (JsonProcessingException e) {
+                       logger.warn("could not parse object into json - defaulting to {}");
+                       return "{}";
+               }
+       }
+       public Optional<Relationships> getRelationships() {
+               final String path = "$.relationship-list";
+               if (isEmpty()) {
+                       return Optional.empty();
+               }
+               Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody, path);
+               if (result.isPresent()) {
+                       return Optional.of(new Relationships(result.get()));
+               } else {
+                       return Optional.empty();
+               }
+       }
+       
+       public String getJson() {
+               if(jsonBody == null) {
+                       return "{}";
+               } else {
+                       return jsonBody;
+               }
+       }
+       
+       public Map<String, Object> asMap() {
+               if (isEmpty()) {
+                       return new HashMap<>();
+               }
+               try {
+                       return mapper.readValue(this.jsonBody, new TypeReference<Map<String, Object>>(){});
+               } catch (IOException e) {
+                       return new HashMap<>();
+               }
+       }
+       
+       public <T> Optional<T> asBean(Class<T> clazz) {
+               if (isEmpty()) {
+                       return Optional.empty();
+               }
+               try {
+                       return Optional.of(mapper.readValue(this.jsonBody, clazz));
+               } catch (IOException e) {
+                       return Optional.empty();
+               }
+       }
+       
+       public boolean isEmpty() {
+               return jsonBody == null;
+       }
+       @Override
+       public String toString() {
+               return this.getJson();
+       }
+
+}
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai.entities;
+package org.onap.so.client.graphinventory.entities;
 
 import org.onap.so.client.graphinventory.GraphInventoryObjectName;
 
index 93de913..dc4179a 100644 (file)
@@ -98,6 +98,13 @@ public class SimpleUri implements GraphInventoryResourceUri, Serializable {
                validateValuesSize(childType.partialUri(), values);
        }
        
+       protected SimpleUri(GraphInventoryResourceUri parentUri, GraphInventoryObjectPlurals childType) {
+               this.type = null;
+               this.pluralType = childType;
+               this.internalURI =  UriBuilder.fromUri(parentUri.build()).path(childType.partialUri());
+               this.values = new Object[0];
+       }
+       
        protected void setInternalURI(UriBuilder builder) {
                this.internalURI = builder;
        }
index 1d4e014..93a2d96 100644 (file)
@@ -32,13 +32,13 @@ public class RubyCreateTicketRequestPublisher extends DmaapPublisher{
        }
        
        @Override
-       public String getUserName() {
-               return msoProperties.get("ruby.create-ticket-request.dmaap.username");
+       public String getAuth() {
+               return msoProperties.get("ruby.create-ticket-request.dmaap.auth");
        }
 
        @Override
-       public String getPassword() {
-               return msoProperties.get("ruby.create-ticket-request.dmaap.password");
+       public String getKey() {
+               return msoProperties.get("mso.msoKey");
        }
 
        @Override
index 8154b91..a76c47c 100644 (file)
@@ -42,13 +42,13 @@ public class SDNOHealthCheckDmaapConsumer extends DmaapConsumer {
        }
        
        @Override
-       public String getUserName() {
-               return msoProperties.get("sdno.health-check.dmaap.username");
+       public String getAuth() {
+               return msoProperties.get("sdno.health-check.dmaap.auth");
        }
 
        @Override
-       public String getPassword() {
-               return msoProperties.get("sdno.health-check.dmaap.password");
+       public String getKey() {
+               return msoProperties.get("mso.msoKey");
        }
 
        @Override
index 2556e67..f4af205 100644 (file)
@@ -33,13 +33,13 @@ public class SDNOHealthCheckDmaapPublisher extends DmaapPublisher {
        }
        
        @Override
-       public String getUserName() {
-               return msoProperties.get("sdno.health-check.dmaap.username");
+       public String getAuth() {
+               return msoProperties.get("sdno.health-check.dmaap.auth");
        }
 
        @Override
-       public String getPassword() {
-               return msoProperties.get("sdno.health-check.dmaap.password");
+       public String getKey() {
+               return msoProperties.get("sdno.health-check.dmaap.msoKey");
        }
 
        @Override
index d4eaf08..64a83f9 100644 (file)
@@ -80,4 +80,11 @@ public class AAIObjectTypeTest {
                assertEquals("/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}", type.uriTemplate());
                assertEquals("/p-interfaces/p-interface/{interface-name}", type.partialUri());
        }
+       
+       @Test
+       public void networkPolicyObjectTypeTest() {
+               final String id = "test1";
+               AAIUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, id);
+               assertEquals("/network/network-policies/network-policy/test1", aaiUri.build().toString());
+       }
 }
index 43616ba..84c3cad 100644 (file)
 
 package org.onap.so.client.aai;
 
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -36,9 +33,8 @@ import javax.ws.rs.core.Response;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.Spy;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.client.RestClient;
 import org.onap.so.client.aai.entities.CustomQuery;
@@ -46,6 +42,8 @@ import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.graphinventory.Format;
+import org.onap.so.client.graphinventory.GraphInventoryClient;
+import org.onap.so.client.graphinventory.GraphInventorySubgraphType;
 
 
 @RunWith(MockitoJUnitRunner.class) 
@@ -57,7 +55,10 @@ public class AAIQueryClientTest {
        @Mock
        RestClient restClient;
        
-       @Spy
+       @Mock
+       GraphInventoryClient client;
+       
+       @InjectMocks
        AAIQueryClient aaiQueryClient = new AAIQueryClient();
        
        @Test
@@ -67,16 +68,16 @@ public class AAIQueryClientTest {
                Format format = Format.SIMPLE;
                CustomQuery query = new CustomQuery(uris);
                
-               doReturn(restClient).when(aaiQueryClient).createClient(isA(AAIUri.class));
+               doReturn(restClient).when(client).createClient(isA(AAIUri.class));
                aaiQueryClient.query(format, query);
-               verify(aaiQueryClient, times(1)).createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString()));
+               verify(client, times(1)).createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString()));
                verify(restClient, times(1)).put(query, String.class);
        }
        
        @Test
        public void testCreateClient() {
                String depth = "testDepth";
-               AAISubgraphType subgraph = AAISubgraphType.STAR;
+               GraphInventorySubgraphType subgraph = GraphInventorySubgraphType.STAR;
                
                aaiQueryClient.depth(depth);
                aaiQueryClient.nodesOnly();
index 32a9ca5..a55fbc9 100644 (file)
@@ -35,18 +35,26 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.so.client.aai.entities.AAIEdgeLabel;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
+import org.onap.so.client.graphinventory.GraphInventoryClient;
 
 import com.github.tomakehurst.wiremock.admin.NotFoundException;
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
+
+@RunWith(MockitoJUnitRunner.class)
 public class AAIResourcesClientTest {
 
 
@@ -56,6 +64,18 @@ public class AAIResourcesClientTest {
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
+       
+       @Spy
+       public AAIClient client;
+       
+       @InjectMocks
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
+       @Before
+       public void beforeTest() {
+               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
+       }
+       
        @Test
        public void verifyNotExists() {
                AAIResourceUri path = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test");
@@ -66,7 +86,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "text/plain")
                                        .withBody("hello")
                                        .withStatus(404)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                boolean result = client.exists(path);
                assertEquals("path not found", false, result);
        }
@@ -87,7 +107,7 @@ public class AAIResourcesClientTest {
                                .willReturn(
                                        aResponse()
                                        .withStatus(204)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.delete(path);
        }
        
@@ -102,7 +122,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "application/json")
                                        .withBodyFile("aai/resources/mockObject.json")
                                        .withStatus(200)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.get(path);
        }
        
@@ -118,7 +138,7 @@ public class AAIResourcesClientTest {
                                        .withStatus(200)));
                
                AAIResourceUri pathClone = path.clone();
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.connect(path, path2);
                assertEquals("uri not modified", pathClone.build().toString(), path.build().toString());
        }
@@ -135,7 +155,7 @@ public class AAIResourcesClientTest {
                                        .withStatus(204)));
                
                AAIResourceUri pathClone = path.clone();
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                client.disconnect(path, path2);
                assertEquals("uri not modified", pathClone.build().toString(), path.build().toString());
        }
@@ -150,7 +170,7 @@ public class AAIResourcesClientTest {
                                        aResponse()
                                        .withStatus(200)));
                
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
 
                client.update(path, "{}");
        }
@@ -165,7 +185,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "text/plain")
                                        .withBody("hello")
                                        .withStatus(404)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                AAIResultWrapper result = client.get(path);
                assertEquals("is empty", true, result.isEmpty());
        }
@@ -180,7 +200,7 @@ public class AAIResourcesClientTest {
                                        .withHeader("Content-Type", "text/plain")
                                        .withBody("hello")
                                        .withStatus(404)));
-               AAIResourcesClient client= createClient();
+               AAIResourcesClient client= aaiClient;
                thrown.expect(NotFoundException.class);
                thrown.expectMessage(containsString(path.build() + " not found in A&AI"));
                AAIResultWrapper result = client.get(path, NotFoundException.class);
@@ -188,7 +208,7 @@ public class AAIResourcesClientTest {
        
        @Test
        public void buildRelationshipTest() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, "test");
                Relationship relationship = new Relationship();
                relationship.setRelatedLink(uri.build().toString());
@@ -200,10 +220,5 @@ public class AAIResourcesClientTest {
                assertThat("expect equal has label", actual, sameBeanAs(relationship));
                
        }
-       
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
+
 }
index 3d23213..5493d67 100644 (file)
@@ -40,6 +40,10 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.entities.uri.ServiceInstanceUri;
@@ -47,6 +51,7 @@ import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
 
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
 
+@RunWith(MockitoJUnitRunner.class)
 public class AAIResourcesClientWithServiceInstanceUriTest {
 
        @Rule
@@ -55,9 +60,17 @@ public class AAIResourcesClientWithServiceInstanceUriTest {
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
+       @Spy
+       public AAIClient client;
+       
+       @InjectMocks
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
        private ServiceInstanceUri uri;
        @Before
        public void setUp() {
+               
+               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
                wireMockRule.stubFor(get(urlMatching("/aai/v[0-9]+/nodes.*")) 
                                .willReturn(aResponse() 
                                        .withStatus(404) 
@@ -65,12 +78,12 @@ public class AAIResourcesClientWithServiceInstanceUriTest {
                                        .withHeader("Mock", "true")));
                
                uri = spy((ServiceInstanceUri)AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "id"));
-               doReturn(createClient()).when(uri).getResourcesClient();
+               doReturn(aaiClient).when(uri).getResourcesClient();
        }
        
        @Test
        public void getWithClass() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                Optional<String> result = client.get(String.class, uri);
                
                assertThat(result.isPresent(), equalTo(false));
@@ -78,42 +91,38 @@ public class AAIResourcesClientWithServiceInstanceUriTest {
        
        @Test
        public void getFullResponse() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                Response result = client.getFullResponse(uri);
                assertThat(result.getStatus(), equalTo(Status.NOT_FOUND.getStatusCode()));
        }
        
        @Test
        public void getWithGenericType() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                Optional<List<String>> result = client.get(new GenericType<List<String>>() {}, uri);
                assertThat(result.isPresent(), equalTo(false));
        }
        
        @Test
        public void getAAIWrapper() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                AAIResultWrapper result = client.get(uri);
                assertThat(result.isEmpty(), equalTo(true));
        }
        
        @Test
        public void getWithException() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                this.thrown.expect(IllegalArgumentException.class);
                AAIResultWrapper result = client.get(uri, IllegalArgumentException.class);
        }
        
        @Test
        public void existsTest() {
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                doReturn(uri).when(uri).clone();
                boolean result = client.exists(uri);
                assertThat(result, equalTo(false));
        }
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
+
 }
index ad15417..95b30f9 100644 (file)
@@ -41,6 +41,7 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.client.RestClientSSL;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryPatchDepthExceededException;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -68,7 +69,7 @@ public class AAIRestClientTest {
        public void verifyPatchValidation() throws URISyntaxException {
                AAIRestClient client = new AAIRestClient(props, new URI(""));
                AAIRestClient spy = spy(client);
-               AAIPatchConverter patchValidatorMock = mock(AAIPatchConverter.class);
+               GraphInventoryPatchConverter patchValidatorMock = mock(GraphInventoryPatchConverter.class);
                doReturn(patchValidatorMock).when(spy).getPatchConverter();
                String payload = "{}";
                doReturn(Response.ok().build()).when(spy).method(eq("PATCH"), any());
index 428fa27..d875f38 100644 (file)
@@ -38,6 +38,10 @@ import java.util.Optional;
 import org.json.JSONException;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.Pserver;
 import org.onap.aai.domain.yang.v9.Complex;
 import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRequest;
@@ -45,6 +49,7 @@ import org.onap.so.client.aai.entities.singletransaction.SingleTransactionRespon
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 import org.skyscreamer.jsonassert.JSONAssert;
 
 import com.fasterxml.jackson.core.JsonParseException;
@@ -52,6 +57,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
+@RunWith(MockitoJUnitRunner.class)
 public class AAISingleTransactionClientTest {
 
        private final static String AAI_JSON_FILE_LOCATION = "src/test/resources/__files/aai/singletransaction/";
@@ -60,6 +66,10 @@ public class AAISingleTransactionClientTest {
        
        ObjectMapper mapper;
        
+       public AAIClient client = new AAIClient();
+       
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
        @Before
        public void before() throws JsonParseException, JsonMappingException, IOException {
                mapper = new AAICommonObjectMapperProvider().getMapper();
@@ -68,7 +78,6 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void testRequest() throws JSONException,IOException {
-               AAIResourcesClient client = createClient();
                Pserver pserver = new Pserver();
                pserver.setHostname("pserver-hostname");
                pserver.setFqdn("pserver-bulk-process-single-transactions-multiple-actions-1-fqdn");
@@ -77,7 +86,7 @@ public class AAISingleTransactionClientTest {
                Complex complex = new Complex();
                complex.setCity("my-city");
                AAISingleTransactionClient singleTransaction = 
-               client.beginSingleTransaction()
+               aaiClient.beginSingleTransaction()
                        .create(uriA, pserver)
                        .update(uriA, pserver2)
                        .create(uriB, complex);
@@ -92,8 +101,7 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void testFailure() throws IOException {
-               AAIResourcesClient client = createClient();
-               AAISingleTransactionClient singleTransaction = client.beginSingleTransaction();
+               AAISingleTransactionClient singleTransaction = aaiClient.beginSingleTransaction();
                SingleTransactionResponse expected = mapper.readValue(this.getJson("sample-response-failure.json"), SingleTransactionResponse.class);
                Optional<String> errorMessage = singleTransaction.locateErrorMessages(expected);
                
@@ -104,8 +112,7 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void testSuccessResponse() throws IOException {
-               AAIResourcesClient client = createClient();
-               AAISingleTransactionClient singleTransaction = client.beginSingleTransaction();
+               AAISingleTransactionClient singleTransaction = aaiClient.beginSingleTransaction();
                SingleTransactionResponse expected = mapper.readValue(this.getJson("sample-response.json"), SingleTransactionResponse.class);
                Optional<String> errorMessage = singleTransaction.locateErrorMessages(expected);
                
@@ -116,8 +123,8 @@ public class AAISingleTransactionClientTest {
        
        @Test
        public void confirmPatchFormat() {
-               AAISingleTransactionClient singleTransaction = spy(new AAISingleTransactionClient(AAIVersion.LATEST));
-               AAIPatchConverter mock = mock(AAIPatchConverter.class);
+               AAISingleTransactionClient singleTransaction = spy(new AAISingleTransactionClient(aaiClient, client));
+               GraphInventoryPatchConverter mock = mock(GraphInventoryPatchConverter.class);
                doReturn(mock).when(singleTransaction).getPatchConverter();
                singleTransaction.update(uriA, "{}");
                verify(mock, times(1)).convertPatchFormat(any());
@@ -126,9 +133,4 @@ public class AAISingleTransactionClientTest {
                 return new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + filename)));
        }
        
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
 }
index 6213758..3e2801c 100644 (file)
@@ -38,11 +38,15 @@ import java.util.Optional;
 
 import org.junit.Before;
 import org.junit.Test;
-
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -50,6 +54,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
+@RunWith(MockitoJUnitRunner.class)
 public class AAITransactionalClientTest {
 
        private final static String AAI_JSON_FILE_LOCATION = "src/test/resources/__files/aai/bulkprocess/";
@@ -62,6 +67,10 @@ public class AAITransactionalClientTest {
        
        ObjectMapper mapper;
        
+       public AAIClient client = new AAIClient();
+       
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
        @Before
        public void before() throws JsonParseException, JsonMappingException, IOException {
                mapper = new AAICommonObjectMapperProvider().getMapper();
@@ -73,7 +82,7 @@ public class AAITransactionalClientTest {
                final Relationship body = new Relationship();
                body.setRelatedLink(uriB.build().toString());
                
-               AAITransactionalClient transactions = createClient().beginTransaction()
+               AAITransactionalClient transactions = aaiClient.beginTransaction()
                                .create(uriA.clone().relationshipAPI(), body);
                
                String serializedTransactions = mapper.writeValueAsString(transactions.getTransactions());
@@ -89,7 +98,7 @@ public class AAITransactionalClientTest {
                uris.add(uriB);
                
                AAIResourceUri uriAClone = uriA.clone();
-               AAITransactionalClient transactions = createClient()
+               AAITransactionalClient transactions = aaiClient
                                .beginTransaction().connect(uriA, uris).connect(uriC, uriD)
                                .beginNewTransaction().connect(uriE, uriF);
                
@@ -106,7 +115,7 @@ public class AAITransactionalClientTest {
                List<AAIResourceUri> uris = new ArrayList<AAIResourceUri>();
                uris.add(uriB);
                
-               AAITransactionalClient transactions = createClient().beginTransaction()
+               AAITransactionalClient transactions = aaiClient.beginTransaction()
                                .disconnect(uriA, uris);
                
                String serializedTransactions = mapper.writeValueAsString(transactions.getTransactions());
@@ -122,7 +131,7 @@ public class AAITransactionalClientTest {
                body.setRelatedLink(uriB.build().toString());
                
                AAIResourceUri uriAClone = uriA.clone().relationshipAPI();
-               AAITransactionalClient transactions = createClient().beginTransaction().update(uriAClone, body);
+               AAITransactionalClient transactions = aaiClient.beginTransaction().update(uriAClone, body);
                
                String serializedTransactions = mapper.writeValueAsString(transactions.getTransactions());
                Map<String, Object> actual = mapper.readValue(serializedTransactions, new TypeReference<Map<String, Object>>(){});
@@ -133,7 +142,7 @@ public class AAITransactionalClientTest {
        
        @Test
        public void verifyResponse() throws IOException {
-               AAITransactionalClient transactions = createClient()
+               AAITransactionalClient transactions = aaiClient
                                .beginTransaction();
        
                assertEquals("success status", Optional.empty(), transactions.locateErrorMessages(getJson("response-success.json")));
@@ -142,10 +151,10 @@ public class AAITransactionalClientTest {
        
        @Test
        public void confirmPatchFormat() {
-               AAITransactionalClient client = spy(new AAITransactionalClient(AAIVersion.LATEST));
-               AAIPatchConverter mock = mock(AAIPatchConverter.class);
-               doReturn(mock).when(client).getPatchConverter();
-               client.update(uriA, "{}");
+               AAITransactionalClient transactionClient = spy(new AAITransactionalClient(aaiClient, client));
+               GraphInventoryPatchConverter mock = mock(GraphInventoryPatchConverter.class);
+               doReturn(mock).when(transactionClient).getPatchConverter();
+               transactionClient.update(uriA, "{}");
                verify(mock, times(1)).convertPatchFormat(any());
        }
        
@@ -153,9 +162,4 @@ public class AAITransactionalClientTest {
                 return new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + filename)));
        }
        
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
 }
index e66f43f..69d46de 100644 (file)
@@ -23,9 +23,9 @@ package org.onap.so.client.aai;
 import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
-import org.onap.so.client.aai.entities.DSLNode;
-import org.onap.so.client.aai.entities.DSLQueryBuilder;
-import org.onap.so.client.aai.entities.__;
+import org.onap.so.client.graphinventory.entities.DSLNode;
+import org.onap.so.client.graphinventory.entities.DSLQueryBuilder;
+import org.onap.so.client.graphinventory.entities.__;
 
 public class DSLQueryBuilderTest {
 
index 6059e7b..15c1c24 100644 (file)
@@ -26,7 +26,6 @@ import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -45,10 +44,16 @@ import java.util.Optional;
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.UriBuilder;
 
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
 import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.client.aai.AAIClient;
 import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.defaultproperties.DefaultAAIPropertiesImpl;
@@ -58,6 +63,7 @@ import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriNotFoundExc
 
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
 
+@RunWith(MockitoJUnitRunner.class)
 public class ServiceInstanceUriTest {
 
        private final static String AAI_JSON_FILE_LOCATION = "src/test/resources/__files/aai/resources/";
@@ -68,6 +74,16 @@ public class ServiceInstanceUriTest {
        @Rule
        public final ExpectedException exception = ExpectedException.none();
         
+       @Spy
+       public AAIClient client;
+       
+       @InjectMocks
+       public AAIResourcesClient aaiClient = new AAIResourcesClient();
+       
+       @Before
+       public void beforeTest() {
+               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
+       }
        @Test
        public void found() throws IOException {
                final String content = new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + "service-instance-pathed-query.json")));
@@ -179,7 +195,7 @@ public class ServiceInstanceUriTest {
        public void noVertexFound() throws GraphInventoryUriNotFoundException, GraphInventoryPayloadException {
                ServiceInstanceUri instance = new ServiceInstanceUri("key3");
                ServiceInstanceUri spy = spy(instance);
-               AAIResourcesClient client = createClient();
+               AAIResourcesClient client = aaiClient;
                doReturn(client).when(spy).getResourcesClient();
                stubFor(get(urlPathMatching("/aai/v[0-9]+/nodes/service-instances/service-instance/key3")) 
                                .willReturn(aResponse() 
@@ -189,10 +205,4 @@ public class ServiceInstanceUriTest {
                exception.expect(NotFoundException.class);
                spy.build();    
        }
-       
-       private AAIResourcesClient createClient() {
-               AAIResourcesClient client = spy(new AAIResourcesClient());
-               doReturn(new DefaultAAIPropertiesImpl()).when(client).getRestProperties();
-               return client;
-       }
 }
diff --git a/common/src/test/java/org/onap/so/client/adapter/rest/AdapterRestClientTest.java b/common/src/test/java/org/onap/so/client/adapter/rest/AdapterRestClientTest.java
new file mode 100644 (file)
index 0000000..f4490fa
--- /dev/null
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Nokia.
+ * ================================================================================
+ * 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.so.client.adapter.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.entry;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.GeneralSecurityException;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.codec.binary.Base64;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.so.client.policy.JettisonStyleMapperProvider;
+import org.onap.so.utils.CryptoUtils;
+import org.onap.so.utils.TargetEntity;
+
+public class AdapterRestClientTest {
+
+    private static final String CRYPTO_KEY = "546573746F736973546573746F736973";
+    private static final String INVALID_CRYPTO_KEY = "1234";
+
+    private Map<String, String> headerMap;
+    private AdapterRestProperties adapterRestPropertiesMock;
+
+    @Before
+    public void setup() {
+        headerMap = new HashMap<>();
+        adapterRestPropertiesMock = mock(AdapterRestProperties.class);
+    }
+
+    @Test
+    public void initializeHeaderMap_success() throws URISyntaxException, GeneralSecurityException {
+        // given
+        String encyptedMessage = CryptoUtils.encrypt("testAdapter", CRYPTO_KEY);
+        when(adapterRestPropertiesMock.getAuth()).thenReturn(encyptedMessage);
+        when(adapterRestPropertiesMock.getKey()).thenReturn(CRYPTO_KEY);
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        // when
+        testedObject.initializeHeaderMap(headerMap);
+        // then
+        assertThat(headerMap).containsOnly(entry("Authorization", getExpectedEncodedString(encyptedMessage)));
+    }
+
+    @Test
+    public void initializeHeaderMap_putNullToMapWhenAuthIsNull() throws URISyntaxException {
+        // given
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        // when
+        testedObject.initializeHeaderMap(headerMap);
+        // then
+        assertThat(headerMap).containsOnly(entry("Authorization", null));
+    }
+
+    @Test
+    public void initializeHeaderMap_putNullToMapWhenExOccurs() throws URISyntaxException, GeneralSecurityException {
+        // given
+        String encyptedMessage = CryptoUtils.encrypt("testAdapter", CRYPTO_KEY);
+        when(adapterRestPropertiesMock.getAuth()).thenReturn(encyptedMessage);
+        when(adapterRestPropertiesMock.getKey()).thenReturn(INVALID_CRYPTO_KEY);
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""),
+                "accept", "contentType");
+        // when
+        testedObject.initializeHeaderMap(headerMap);
+        // then
+        assertThat(headerMap).containsOnly(entry("Authorization", null));
+    }
+
+    @Test
+    public void getTargetEntity_success() throws URISyntaxException {
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        assertThat(testedObject.getTargetEntity()).isEqualTo(TargetEntity.OPENSTACK_ADAPTER);
+    }
+
+    @Test
+    public void getCommonObjectMapperProvider_success() throws URISyntaxException {
+        AdapterRestClient testedObject = new AdapterRestClient(adapterRestPropertiesMock, new URI(""));
+        assertThat(testedObject.getCommonObjectMapperProvider()).isInstanceOf(JettisonStyleMapperProvider.class);
+    }
+
+    private String getExpectedEncodedString(String encryptedMessage) throws GeneralSecurityException {
+        String auth = CryptoUtils.decrypt(encryptedMessage, CRYPTO_KEY);
+        byte[] encoded = Base64.encodeBase64(auth.getBytes());
+        String encodedString = new String(encoded);
+        return "Basic " + encodedString;
+    }
+}
index c0633c1..0836ed2 100644 (file)
@@ -29,13 +29,13 @@ public class DmaapPublisherTest {
 
     DmaapPublisher dmaapPublisher = new DmaapPublisher(120) {
         @Override
-        public String getUserName() {
-            return "test";
+        public String getAuth() {
+            return "8F73A1691F6271E769329C176EE3EA48F52786AF12A3E16259007EED2A0F0CC3CB965F4AB5318483015723CCE1C0B48AB6C4DED6E251869393B01E4EC532FC88D4A128B92F4CDB34719B171923";
         }
 
         @Override
-        public String getPassword() {
-            return "test";
+        public String getKey() {
+            return "07a7159d3bf51a0e53be7a8f89699be7";
         }
 
         @Override
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.client.aai;
+package org.onap.so.client.graphinventory;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -35,6 +35,8 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.so.client.aai.AAICommonObjectMapperProvider;
+import org.onap.so.client.graphinventory.GraphInventoryPatchConverter;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
@@ -42,13 +44,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 
 @RunWith(MockitoJUnitRunner.class)
-public class AAIPatchConverterTest {
+public class GraphInventoryPatchConverterTest {
 
        private ObjectMapper mapper = new AAICommonObjectMapperProvider().getMapper();
 
        @Test
        public void convertObjectToPatchFormatTest() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                GenericVnf vnf = new GenericVnf();
                vnf.setIpv4Loopback0Address("");
                String result = validator.marshallObjectToPatchFormat(vnf);
@@ -60,7 +62,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void convertStringToPatchFormatTest() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                String payload = "{\"ipv4-loopback0-address\":\"\"}";
                String result = validator.marshallObjectToPatchFormat(payload);
                
@@ -69,7 +71,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void convertStringToPatchFormatNull_Test() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                String payload = "{\"ipv4-loopback0-address\": null}";
                String result = validator.marshallObjectToPatchFormat(payload);
                System.out.println(result);
@@ -78,7 +80,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void convertMapToPatchFormatTest() throws URISyntaxException, JsonParseException, JsonMappingException, IOException {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                HashMap<String, String> map = new HashMap<>();
                map.put("ipv4-loopback0-address", "");
                map.put("ipv4-loopback1-address", "192.168.1.1");
@@ -89,7 +91,7 @@ public class AAIPatchConverterTest {
        
        @Test
        public void hasComplexObjectTest() {
-               AAIPatchConverter validator = new AAIPatchConverter();
+               GraphInventoryPatchConverter validator = new GraphInventoryPatchConverter();
                String hasNesting = "{ \"hello\" : \"world\", \"nested\" : { \"key\" : \"value\" } }";
                String noNesting = "{ \"hello\" : \"world\" }";
                String arrayCase = "{ \"hello\" : \"world\", \"nestedSimple\" : [\"value1\" , \"value2\"], \"nestedComplex\" : [{\"key\" : \"value\"}]}";
index 7ce1019..5593455 100644 (file)
@@ -4,4 +4,7 @@ sdno.health-check.dmaap.subscriber.topic=com.att.sdno.test-health-diagnostic-v02
 sdno.health-check.dmaap.publisher.topic=com.att.sdno.test-health-diagnostic-v02
 ruby.create-ticket-request.dmaap.username=testuser
 ruby.create-ticket-request.dmaap.password=eHQ1cUJrOUc
-ruby.create-ticket-request.publisher.topic=com.att.pdas.st1.msoCMFallout-v1
\ No newline at end of file
+ruby.create-ticket-request.publisher.topic=com.att.pdas.st1.msoCMFallout-v1
+ruby.create-ticket-request.dmaap.auth=81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54
+sdno.health-check.dmaap.auth=81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54
+mso.msoKey=07a7159d3bf51a0e53be7a8f89699be7
\ No newline at end of file
index ee958ef..6e31d22 100644 (file)
@@ -10,177 +10,244 @@ Verify that docker images are built
 
 .. code-block:: bash
 
-  docker images openecomp/mso
+  docker images
 
   *Example Output:*
 
-  REPOSITORY     TAG                                  IMAGE ID     CREATED       SIZE
-
-  openecomp/mso  1.1-SNAPSHOT-latest                  419e9d8a17e8 3 minutes ago 1.62GB
-
-  openecomp/mso  1.1.0-SNAPSHOT-STAGING-20170926T2015 419e9d8a17e8 3 minutes ago 1.62GB
-
-  openecomp/mso  latest                               419e9d8a17e8 3 minutes ago 1.62GB
-
-Start the mariadb container
-----------------------------
+  REPOSITORY                      TAG                            IMAGE ID            CREATED              SIZE
+  onap/so/so-monitoring           1.3.0-SNAPSHOT                 bb8f368a3ddb        7 seconds ago        206MB
+  onap/so/so-monitoring           1.3.0-SNAPSHOT-20190213T0846   bb8f368a3ddb        7 seconds ago        206MB
+  onap/so/so-monitoring           1.3.0-SNAPSHOT-latest          bb8f368a3ddb        7 seconds ago        206MB
+  onap/so/so-monitoring           latest                         bb8f368a3ddb        7 seconds ago        206MB
+  onap/so/api-handler-infra       1.3.0-SNAPSHOT                 2573165483e9        21 seconds ago       246MB
+  onap/so/api-handler-infra       1.3.0-SNAPSHOT-20190213T0846   2573165483e9        21 seconds ago       246MB
+  onap/so/api-handler-infra       1.3.0-SNAPSHOT-latest          2573165483e9        21 seconds ago       246MB
+  onap/so/api-handler-infra       latest                         2573165483e9        21 seconds ago       246MB
+  onap/so/bpmn-infra              1.3.0-SNAPSHOT                 8b1487665f2e        38 seconds ago       324MB
+  onap/so/bpmn-infra              1.3.0-SNAPSHOT-20190213T0846   8b1487665f2e        38 seconds ago       324MB
+  onap/so/bpmn-infra              1.3.0-SNAPSHOT-latest          8b1487665f2e        38 seconds ago       324MB
+  onap/so/bpmn-infra              latest                         8b1487665f2e        38 seconds ago       324MB
+  onap/so/sdc-controller          1.3.0-SNAPSHOT                 c663bb7d7c0d        About a minute ago   241MB
+  onap/so/sdc-controller          1.3.0-SNAPSHOT-20190213T0846   c663bb7d7c0d        About a minute ago   241MB
+  onap/so/sdc-controller          1.3.0-SNAPSHOT-latest          c663bb7d7c0d        About a minute ago   241MB
+  onap/so/sdc-controller          latest                         c663bb7d7c0d        About a minute ago   241MB
+  onap/so/vfc-adapter             1.3.0-SNAPSHOT                 dee0005ef18b        About a minute ago   212MB
+  onap/so/vfc-adapter             1.3.0-SNAPSHOT-20190213T0846   dee0005ef18b        About a minute ago   212MB
+  onap/so/vfc-adapter             1.3.0-SNAPSHOT-latest          dee0005ef18b        About a minute ago   212MB
+  onap/so/vfc-adapter             latest                         dee0005ef18b        About a minute ago   212MB
+  onap/so/openstack-adapter       1.3.0-SNAPSHOT                 fe9103aa9f36        About a minute ago   235MB
+  onap/so/openstack-adapter       1.3.0-SNAPSHOT-20190213T0846   fe9103aa9f36        About a minute ago   235MB
+  onap/so/openstack-adapter       1.3.0-SNAPSHOT-latest          fe9103aa9f36        About a minute ago   235MB
+  onap/so/openstack-adapter       latest                         fe9103aa9f36        About a minute ago   235MB
+  onap/so/sdnc-adapter            1.3.0-SNAPSHOT                 d02d42d92b06        2 minutes ago        231MB
+  onap/so/sdnc-adapter            1.3.0-SNAPSHOT-20190213T0846   d02d42d92b06        2 minutes ago        231MB
+  onap/so/sdnc-adapter            1.3.0-SNAPSHOT-latest          d02d42d92b06        2 minutes ago        231MB
+  onap/so/sdnc-adapter            latest                         d02d42d92b06        2 minutes ago        231MB
+  onap/so/request-db-adapter      1.3.0-SNAPSHOT                 5e0136f2201b        2 minutes ago        215MB
+  onap/so/request-db-adapter      1.3.0-SNAPSHOT-20190213T0846   5e0136f2201b        2 minutes ago        215MB
+  onap/so/request-db-adapter      1.3.0-SNAPSHOT-latest          5e0136f2201b        2 minutes ago        215MB
+  onap/so/request-db-adapter      latest                         5e0136f2201b        2 minutes ago        215MB
+  onap/so/catalog-db-adapter      1.3.0-SNAPSHOT                 bf1c2fe49acb        2 minutes ago        218MB
+  onap/so/catalog-db-adapter      1.3.0-SNAPSHOT-20190213T0846   bf1c2fe49acb        2 minutes ago        218MB
+  onap/so/catalog-db-adapter      1.3.0-SNAPSHOT-latest          bf1c2fe49acb        2 minutes ago        218MB
+  onap/so/catalog-db-adapter      latest                         bf1c2fe49acb        2 minutes ago        218MB
+  onap/so/base-image              1.0                            1685bba9831d        3 minutes ago        108MB
+  openjdk                         8-jdk-alpine                   792ff45a2a17        7 days ago           105MB
+  nexus3.onap.org:10001/openjdk   8-jdk-alpine                   792ff45a2a17        7 days ago           105MB
+
+Start the containers
+---------------------
 
 .. code-block:: bash
 
   cd $HOME/onap/workspace/SO/docker-config
 
-  MTU=1500 docker-compose up mariadb
+  ./deploy.sh
+
+  This should also download & start the mariaDB docker.
 
 *Example Output:*
 
 .. code-block:: bash
 
-  . . . many lines omitted . . .
-  mariadb_1  | Version: '10.1.11-MariaDB-1~jessie-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
-
-Log into the mariadb container and run the mysql client program
----------------------------------------------------------------
+  Deploying with local images, not pulling them from Nexus.
+  docker command: local docker using unix socket
+  Removing network dockerconfig_default
+  Creating network "dockerconfig_default" with driver "bridge"
+  Pulling mariadb (mariadb:10.1.11)...
+  10.1.11: Pulling from library/mariadb
+  7268d8f794c4: Pull complete
+  a3ed95caeb02: Pull complete
+  e5a99361f38c: Pull complete
+  20b20853e29d: Pull complete
+  9dbc63cf121f: Pull complete
+  fdebb5c64c6c: Pull complete
+  3154860d3699: Pull complete
+  3cfa7ffec11c: Pull complete
+  943211713cac: Pull complete
+  d65a44f4573e: Pull complete
+  Digest: sha256:3821f92155bf4311a59b7ec6219b79cbf9a42c75805000a7c8fe5d9f3ad28276
+  Status: Downloaded newer image for mariadb:10.1.11
+  Creating dockerconfig_mariadb_1
+  Waiting for 'dockerconfig_mariadb_1' deployment to finish ...
+  Waiting for 'dockerconfig_mariadb_1' deployment to finish ...
+  Waiting for 'dockerconfig_mariadb_1' deployment to finish ...
+  Waiting for 'dockerconfig_mariadb_1' deployment to finish ...
+  Waiting for 'dockerconfig_mariadb_1' deployment to finish ...
+  Waiting for 'dockerconfig_mariadb_1' deployment to finish ...
+  dockerconfig_mariadb_1 is up-to-date
+  Creating dockerconfig_catalog-db-adapter_1
+  Creating dockerconfig_request-db-adapter_1
+  Creating dockerconfig_sdc-controller_1
+  Creating dockerconfig_vfc-adapter_1
+  Creating dockerconfig_openstack-adapter_1
+  Creating dockerconfig_sdnc-adapter_1
+  Creating dockerconfig_api-handler-infra_1
+  Creating dockerconfig_so-monitoring_1
+  Creating dockerconfig_bpmn-infra_1
+
+Check containers are now up
+----------------------------
 
 .. code-block:: bash
 
-  docker exec -it dockerconfig_mariadb_1 /bin/bash
-  mysql -uroot -ppassword
+  docker ps
 
-Start the mso container
------------------------
+  *Example Output:*
 
+  CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                     NAMES
+  324ce4636285        onap/so/bpmn-infra           "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8081->8081/tcp    dockerconfig_bpmn-infra_1
+  60986a742f6f        onap/so/so-monitoring        "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8088->8088/tcp    dockerconfig_so-monitoring_1
+  ea6e3e396166        onap/so/api-handler-infra    "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8080->8080/tcp    dockerconfig_api-handler-infra_1
+  473ca2dc852c        onap/so/sdnc-adapter         "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8086->8086/tcp    dockerconfig_sdnc-adapter_1
+  7ae53b222a39        onap/so/vfc-adapter          "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8084->8084/tcp    dockerconfig_vfc-adapter_1
+  8844999c9fc8        onap/so/openstack-adapter    "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8087->8087/tcp    dockerconfig_openstack-adapter_1
+  d500c33665b6        onap/so/sdc-controller       "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8085->8085/tcp    dockerconfig_sdc-controller_1
+  852483370df3        onap/so/request-db-adapter   "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8083->8083/tcp    dockerconfig_request-db-adapter_1
+  cdfa29ee96cc        onap/so/catalog-db-adapter   "/app/wait-for.sh ..."   5 minutes ago       Up 5 minutes        0.0.0.0:8082->8082/tcp    dockerconfig_catalog-db-adapter_1
+  7c7116026c07        mariadb:10.1.11              "/docker-entrypoin..."   5 minutes ago       Up 5 minutes        0.0.0.0:32770->3306/tcp   dockerconfig_mariadb_1
+
+Check SO health
+---------------
 .. code-block:: bash
 
-  cd $HOME/onap/workspace/SO/docker-config
-
-  MTU=1500 docker-compose up mso
+  curl http://localhost:8080/manage/health
 
-*Example Output:*
-
-.. code-block:: bash
+  *Example Output:*
 
-  . . . many lines omitted . . .
-  mso_1      | 20:59:31,586 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final 
-  (WildFly Core 2.2.0.Final) started in 59937ms - Started 2422 of 2747 services (604 services are lazy, passive or
-  on-demand)
+  {"status":"UP"}
 
 Log into the mso container
 --------------------------
 
 .. code-block:: bash
 
-  docker exec -it dockerconfig_mso_1 /bin/bash
+  docker exec -it dockerconfig_api-handler-infra_1 sh
 
 Inspect a docker image
 ----------------------
 
-This command shows interesting information about the structure of the mso image.  Note that an image is NOT a running container.  It is the template that a container is created from.
+This command shows interesting information about the structure of the mso image.  Note that an image is NOT a running container.
+It is the template that a container is created from.
 
 .. code-block:: bash
 
-  docker inspect openecomp/mso
+  docker inspect onap/so/api-handler-infra
   Example Output:
 
   [
     {
-        "Id": "sha256:419e9d8a17e8d7e876dfc36c1f3ed946bccbb29aa6faa6cd8e32fbc77c0ef6e5",
+        "Id": "sha256:2573165483e9ac87826da9c08984a9d0e1d93a90c681b22d9b4f90ed579350dc",
         "RepoTags": [
-            "openecomp/mso:1.1-SNAPSHOT-latest",
-            "openecomp/mso:1.1.0-SNAPSHOT-STAGING-20170926T2015",
-            "openecomp/mso:latest"
+            "onap/so/api-handler-infra:1.3.0-SNAPSHOT",
+            "onap/so/api-handler-infra:1.3.0-SNAPSHOT-20190213T0846",
+            "onap/so/api-handler-infra:1.3.0-SNAPSHOT-latest",
+            "onap/so/api-handler-infra:latest"
         ],
         "RepoDigests": [],
-        "Parent": "sha256:70f1ba3d6289411fce96ba78755a3fd6055a370d33464553d72c753889b12693",
+        "Parent": "sha256:66b508441811ab4ed9968f8702a0d0a697f517bbc10d8d9076e5b98ae4437344",
         "Comment": "",
-        "Created": "2017-09-26T20:40:10.179358574Z",
-        "Container": "284aa05909390a3c0ffc1ec6d0f6e2071799d56b08369707505897bc73d2ea30",
+        "Created": "2019-02-13T09:37:33.770342225Z",
+        "Container": "8be46c735d21935631130f9017c3747779aab26eab54a9149b1edde122f7576d",
         "ContainerConfig": {
-            "Hostname": "6397aa10f0c4",
+            "Hostname": "ac4a12e21390",
             "Domainname": "",
-            "User": "root",
+            "User": "",
             "AttachStdin": false,
             "AttachStdout": false,
             "AttachStderr": false,
-            "ExposedPorts": {
-                "8080/tcp": {}
-            },
             "Tty": false,
             "OpenStdin": false,
             "StdinOnce": false,
             "Env": [
-                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin",
+                "LANG=C.UTF-8",
+                "JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk",
+                "JAVA_VERSION=8u191",
+                "JAVA_ALPINE_VERSION=8.191.12-r0",
                 "HTTP_PROXY=",
                 "HTTPS_PROXY=",
                 "http_proxy=",
-                "https_proxy=",
-                "JBOSS_HOME=/opt/jboss",
-                "CHEF_REPO_NAME=chef-repo",
-                "CHEF_CONFIG_NAME=mso-config"
+                "https_proxy="
             ],
             "Cmd": [
                 "/bin/sh",
                 "-c",
                 "#(nop) ",
-                "CMD [\"/opt/mso/scripts/start-jboss-server.sh\"]"
+                "CMD [\"/app/start-app.sh\"]"
             ],
             "ArgsEscaped": true,
-            "Image": "sha256:70f1ba3d6289411fce96ba78755a3fd6055a370d33464553d72c753889b12693",
+            "Image": "sha256:66b508441811ab4ed9968f8702a0d0a697f517bbc10d8d9076e5b98ae4437344",
             "Volumes": {
-                "/shared": {}
+                "/app/ca-certificates": {},
+                "/app/config": {}
             },
-            "WorkingDir": "",
+            "WorkingDir": "/app",
             "Entrypoint": null,
             "OnBuild": [],
-            "Labels": {
-                "Description": "This image contains the ONAP SO",
-                "Version": "1.0"
-            }
+            "Labels": {}
         },
         "DockerVersion": "17.05.0-ce",
-        "Author": "\"The ONAP Team\"",
+        "Author": "",
         "Config": {
-            "Hostname": "6397aa10f0c4",
+            "Hostname": "ac4a12e21390",
             "Domainname": "",
-            "User": "root",
+            "User": "",
             "AttachStdin": false,
             "AttachStdout": false,
             "AttachStderr": false,
-            "ExposedPorts": {
-                "8080/tcp": {}
-            },
             "Tty": false,
             "OpenStdin": false,
             "StdinOnce": false,
             "Env": [
-                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin",
+                "LANG=C.UTF-8",
+                "JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk",
+                "JAVA_VERSION=8u191",
+                "JAVA_ALPINE_VERSION=8.191.12-r0",
                 "HTTP_PROXY=",
                 "HTTPS_PROXY=",
                 "http_proxy=",
-                "https_proxy=",
-                "JBOSS_HOME=/opt/jboss",
-                "CHEF_REPO_NAME=chef-repo",
-                "CHEF_CONFIG_NAME=mso-config"
+                "https_proxy="
             ],
             "Cmd": [
-                "/opt/mso/scripts/start-jboss-server.sh"
+                "/app/start-app.sh"
             ],
             "ArgsEscaped": true,
-            "Image": "sha256:70f1ba3d6289411fce96ba78755a3fd6055a370d33464553d72c753889b12693",
+            "Image": "sha256:66b508441811ab4ed9968f8702a0d0a697f517bbc10d8d9076e5b98ae4437344",
             "Volumes": {
-                "/shared": {}
+                "/app/ca-certificates": {},
+                "/app/config": {}
             },
-            "WorkingDir": "",
+            "WorkingDir": "/app",
             "Entrypoint": null,
             "OnBuild": [],
-            "Labels": {
-                "Description": "This image contains the ONAP SO",
-                "Version": "1.0"
-            }
+            "Labels": {}
         },
         "Architecture": "amd64",
         "Os": "linux",
-        "Size": 1616881263,
-        "VirtualSize": 1616881263,
+        "Size": 245926705,
+        "VirtualSize": 245926705,
         "GraphDriver": {
             "Data": null,
             "Name": "aufs"
@@ -188,21 +255,20 @@ This command shows interesting information about the structure of the mso image.
         "RootFS": {
             "Type": "layers",
             "Layers": [
-                "sha256:a2022691bf950a72f9d2d84d557183cb9eee07c065a76485f1695784855c5193",
-                "sha256:ae620432889d2553535199dbdd8ba5a264ce85fcdcd5a430974d81fc27c02b45",
-                . . .  many lines omitted . . .
-                "sha256:0f9e9dacce9191617e979f05e32ee782b1632e07130fd7fee19b0b2d635aa006",
-                "sha256:84572c6389f8ae41150e14a8f1a28a70720de91ab1032f8755b5449dc04449c9"
+                "sha256:503e53e365f34399c4d58d8f4e23c161106cfbce4400e3d0a0357967bad69390",
+                "sha256:744b4cd8cf79c70508aace3697b6c3b46bee2c14f1c14b6ff09fd0ba5735c6d4",
+                "sha256:4c6899b75fdbea2f44efe5a2f8d9f5319c1cf7e87151de0de1014aba6ce71244",
+                "sha256:2e076d24f6d1277456e33e58fc8adcfd69dfd9c025f61aa7b98d500e7195beb2",
+                "sha256:bb67f2d5f8196c22137a9e98dd4190339a65c839822d16954070eeb0b2a17aa2",
+                "sha256:afbbd0cc43999d5c5b0ff54dfd82365a3feb826e5c857d9b4a7cf378001cd4b3",
+                "sha256:1920a7ca0f8ae38a79a1339ce742aaf3d7a095922d96e37074df67cf031d5035",
+                "sha256:1261fbaef67c5be677dae1c0f50394587832ea9d8c7dc105df2f3db6dfb92a3a",
+                "sha256:a33d8ee5c18908807458ffe643184228c21d3c5d5c5df1251f0f7dfce512f7e8",
+                "sha256:80704fca12eddb4cc638cee105637266e04ab5706b4e285d4fc6cac990e96d63",
+                "sha256:55abe39073a47f29aedba790a92c351501f21b3628414fa49a073c010ee747d1",
+                "sha256:cc4136c2c52ad522bd492545d4dd18265676ca690aa755994adf64943b119b28",
+                "sha256:2163a1f989859fdb3af6e253b74094e92a0fc1ee59f5eb959971f94eb1f98094"
             ]
         }
     }
-]
-
-Log into the mso image
------------------------
-
-This command allows you to inspect the files inside the mso image.  Note that an image is NOT a running container.  It is the template that a container is created from.
-
-.. code-block:: bash
-
-  docker run -it --entrypoint=/bin/bash openecomp/mso -i
+  ]
index 813299c..8409d9c 100644 (file)
@@ -31,8 +31,8 @@ public class DmaapPropertiesImpl implements DmaapProperties {
 
        private final Map<String, String> props  = new HashMap<>();
        private static final String[] propertyNames = {
-                       "mso.so.operational-environment.dmaap.username",
-                       "mso.so.operational-environment.dmaap.password",
+                       "mso.so.operational-environment.dmaap.auth",
+                       "mso.msoKey",
                        "mso.so.operational-environment.publisher.topic",
                        "mso.so.operational-environment.dmaap.host"
        };
index 52c395e..31bc6fc 100644 (file)
@@ -37,15 +37,15 @@ public class OperationalEnvironmentPublisher extends DmaapPublisher {
        }
        
        @Override
-       public String getUserName() {
+       public String getAuth() {
 
-               return this.msoProperties.get("mso.so.operational-environment.dmaap.username");
+               return this.msoProperties.get("mso.so.operational-environment.dmaap.auth");
        }
 
        @Override
-       public String getPassword() {
+       public String getKey() {
 
-               return this.msoProperties.get("mso.so.operational-environment.dmaap.password");
+               return this.msoProperties.get("mso.msoKey");
        }
 
        @Override
index 59df7ae..7329f31 100644 (file)
@@ -43,8 +43,8 @@ public class OperationalEnvironmentPublisherTest extends BaseTest {
        @Test
        public void getProperties() throws FileNotFoundException, IOException {
                
-               assertEquals("testuser", publisher.getUserName());
-               assertEquals("VjR5NDcxSzA=", publisher.getPassword());
+               assertEquals("B3705D6C2D521257CC2422ACCF03B001811ACC49F564DDB3A2CF2A1378B6D35A23CDCB696F2E1EDFBE6758DFE7C74B94F4A7DF84A0E2BB904935AC4D900D5597DF981ADE6CE1FF3AF993BED0", publisher.getAuth());
+               assertEquals("07a7159d3bf51a0e53be7a8f89699be7", publisher.getKey());
                assertEquals("test.operationalEnvironmentEvent", publisher.getTopic());
                assertEquals("http://localhost:" + env.getProperty("wiremock.server.port"), publisher.getHost().get());
        }
index 63eb053..4826c87 100644 (file)
@@ -1,10 +1,10 @@
 # will be used as entry in DB to say SITE OFF/ON for healthcheck
 
-server:
-    port: 8080
-    tomcat:
-        max-threads: 50
-ssl-enable: false
+server:  
+  port: 8080
+  tomcat:
+    max-threads: 50
+  
 
 mso:
   health:
@@ -77,6 +77,7 @@ mso:
         username: testuser
         password: VjR5NDcxSzA=
         host: http://localhost:${wiremock.server.port}
+        auth: B3705D6C2D521257CC2422ACCF03B001811ACC49F564DDB3A2CF2A1378B6D35A23CDCB696F2E1EDFBE6758DFE7C74B94F4A7DF84A0E2BB904935AC4D900D5597DF981ADE6CE1FF3AF993BED0
       publisher:
         topic: test.operationalEnvironmentEvent
   
index 3d736ed..2330863 100644 (file)
@@ -1,79 +1,75 @@
-/**\r
-============LICENSE_START=======================================================\r
- Copyright (C) 2018 Ericsson. All rights reserved.\r
-================================================================================\r
-Licensed under the Apache License, Version 2.0 (the "License");\r
-you may not use this file except in compliance with the License.\r
-You may obtain a copy of the License at\r
-\r
-    http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-Unless required by applicable law or agreed to in writing, software\r
-distributed under the License is distributed on an "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-See the License for the specific language governing permissions and\r
- limitations under the License.\r
-\r
-SPDX-License-Identifier: Apache-2.0\r
-============LICENSE_END=========================================================\r
-\r
-@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com\r
-*/\r
-\r
-import { BrowserModule } from '@angular/platform-browser';\r
-import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\r
-\r
-import { AppRoutingModule } from './app-routing.module';\r
-import { AppComponent } from './app.component';\r
-import { SidebarComponent } from './sidebar/sidebar.component';\r
-import { TopbarComponent } from './topbar/topbar.component';\r
-import { HomeComponent } from './home/home.component';\r
-import { HttpClientModule } from '@angular/common/http';\r
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';\r
-import { MatTableModule } from '@angular/material';\r
-import { DetailsComponent } from './details/details.component';\r
-import { ToastrNotificationService } from './toastr-notification-service.service';\r
-import { MatTabsModule } from '@angular/material/tabs';\r
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r
-import { MatSelectModule } from '@angular/material/select';\r
-import { MatFormFieldModule, MatInputModule } from '@angular/material';\r
-import { MatDatepickerModule } from '@angular/material/datepicker';\r
-import { MatNativeDateModule } from '@angular/material';\r
-import { MatCardModule } from '@angular/material/card';\r
-import { NgxSpinnerModule } from 'ngx-spinner';\r
-import { RouterModule, Routes } from '@angular/router';\r
-import { APP_BASE_HREF } from '@angular/common';\r
-\r
-@NgModule({\r
-  declarations: [\r
-    AppComponent,\r
-    SidebarComponent,\r
-    TopbarComponent,\r
-    HomeComponent,\r
-    DetailsComponent\r
-  ],\r
-  imports: [\r
-    BrowserModule,\r
-    AppRoutingModule,\r
-    HttpClientModule,\r
-    FormsModule,\r
-    MatTableModule,\r
-    MatTabsModule,\r
-    BrowserAnimationsModule,\r
-    MatSelectModule,\r
-    MatFormFieldModule,\r
-    MatInputModule,\r
-    MatDatepickerModule,\r
-    MatNativeDateModule,\r
-    MatCardModule,\r
-    NgxSpinnerModule,\r
-    RouterModule,\r
-    RouterModule.forRoot([])\r
-  ],\r
-  schemas: [\r
-    CUSTOM_ELEMENTS_SCHEMA\r
-  ],\r
-  providers: [ToastrNotificationService],\r
-  bootstrap: [AppComponent]\r
-})\r
-export class AppModule { }\r
+/**
+============LICENSE_START=======================================================
+ Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+ limitations under the License.
+
+SPDX-License-Identifier: Apache-2.0
+============LICENSE_END=========================================================
+
+@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com
+*/
+
+import { BrowserModule } from '@angular/platform-browser';
+import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
+
+import { AppRoutingModule } from './app-routing.module';
+import { AppComponent } from './app.component';
+import { SidebarComponent } from './sidebar/sidebar.component';
+import { TopbarComponent } from './topbar/topbar.component';
+import { HomeComponent } from './home/home.component';
+import { HttpClientModule } from '@angular/common/http';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { DetailsComponent } from './details/details.component';
+import { ToastrNotificationService } from './toastr-notification-service.service';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { MatFormFieldModule, MatInputModule, MatTableModule, MatTabsModule, MatSelectModule, MatNativeDateModule, MatDatepickerModule, MatCardModule, MatPaginatorModule, MatSortModule } from '@angular/material';
+import { NgxSpinnerModule } from 'ngx-spinner';
+import { RouterModule, Routes } from '@angular/router';
+import { APP_BASE_HREF } from '@angular/common';
+
+@NgModule({
+  declarations: [
+    AppComponent,
+    SidebarComponent,
+    TopbarComponent,
+    HomeComponent,
+    DetailsComponent
+  ],
+  imports: [
+    BrowserModule,
+    AppRoutingModule,
+    HttpClientModule,
+    FormsModule,
+    MatTableModule,
+    MatTabsModule,
+    BrowserAnimationsModule,
+    MatSelectModule,
+    MatFormFieldModule,
+    MatInputModule,
+    MatDatepickerModule,
+    MatNativeDateModule,
+    MatCardModule,
+    NgxSpinnerModule,
+    RouterModule,
+    MatPaginatorModule,
+    MatSortModule,
+    RouterModule.forRoot([])
+  ],
+  schemas: [
+    CUSTOM_ELEMENTS_SCHEMA
+  ],
+  providers: [ToastrNotificationService],
+  bootstrap: [AppComponent]
+})
+export class AppModule { }
index 834b8c3..0438aa3 100644 (file)
-/**\r
-============LICENSE_START=======================================================\r
- Copyright (C) 2018 Ericsson. All rights reserved.\r
-================================================================================\r
-Licensed under the Apache License, Version 2.0 (the "License");\r
-you may not use this file except in compliance with the License.\r
-You may obtain a copy of the License at\r
-\r
-    http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-Unless required by applicable law or agreed to in writing, software\r
-distributed under the License is distributed on an "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-See the License for the specific language governing permissions and\r
- limitations under the License.\r
-\r
-SPDX-License-Identifier: Apache-2.0\r
-============LICENSE_END=========================================================\r
-\r
-@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com\r
-*/\r
-\r
-import { TestBed, inject } from '@angular/core/testing';\r
-\r
-import { DataService } from './data.service';\r
-import { HttpClient } from '@angular/common/http';\r
-import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';\r
-import { async } from '@angular/core/testing';\r
-import { HttpClientModule } from '@angular/common/http';\r
-import { ToastrNotificationService } from './toastr-notification-service.service';\r
-import { environment } from '../environments/environment';\r
-\r
-class StubbedToastrNotificationService extends ToastrNotificationService {\r
-  toastrSettings() {\r
-  }\r
-}\r
-\r
-describe('DataService', () => {\r
-  beforeEach(() => {\r
-    TestBed.configureTestingModule({\r
-      providers: [DataService, { provide: ToastrNotificationService, useClass: StubbedToastrNotificationService }],\r
-      imports: [HttpClientTestingModule]\r
-    });\r
-  });\r
-\r
-  // Ensure creation of DataService component\r
-  it('component should be created', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      expect(service).toBeTruthy();\r
-    })));\r
-\r
-  // Test retrieveInstance function making POST call\r
-  it('test retrieveInstance POST request', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      service.retrieveInstance({}, 1, 2).subscribe(data => { });\r
-      var url = environment.soMonitoringBackendURL + 'v1/search?from=1&to=2';\r
-      const mockReq = httpClient.expectOne(url);\r
-      expect(mockReq.request.method).toEqual('POST');\r
-      mockReq.flush({});\r
-    })));\r
-\r
-  // Test getProcessInstanceId function making GET request to retrieve processInstanceID\r
-  it('test getProcessInstanceId GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      service.getProcessInstanceId("").subscribe(data => { });\r
-      var url = environment.soMonitoringBackendURL + 'process-instance-id/' + "";\r
-      const mockReq = httpClient.expectOne(url);\r
-      expect(mockReq.request.method).toEqual('GET');\r
-      mockReq.flush({});\r
-    })));\r
-\r
-  // Test getActivityInstance function making GET request to retrieve activityInstance\r
-  it('test getActivityInstance GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      service.getActivityInstance("").subscribe(data => { });\r
-      var url = environment.soMonitoringBackendURL + 'activity-instance/' + "";\r
-      const mockReq = httpClient.expectOne(url);\r
-      expect(mockReq.request.method).toEqual('GET');\r
-      mockReq.flush({});\r
-    })));\r
-\r
-  // Test getProcessInstance function making GET request to retrieve processInstance\r
-  it('test getProcessInstance GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      service.getProcessInstance("");\r
-      var url = environment.soMonitoringBackendURL + 'process-instance/' + "";\r
-      const mockReq = httpClient.expectOne(url);\r
-      expect(mockReq.request.method).toEqual('GET');\r
-    })));\r
-\r
-  // Test getProcessDefinition function making GET request to retrieve processDefinition\r
-  it('test getProcessDefinition GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      service.getProcessDefinition("").subscribe(data => { });\r
-      var url = environment.soMonitoringBackendURL + 'process-definition/' + "";\r
-      const mockReq = httpClient.expectOne(url);\r
-      expect(mockReq.request.method).toEqual('GET');\r
-      mockReq.flush({});\r
-    })));\r
-\r
-  // Test getVariableInstance function making GET request to retrieve variableInstance\r
-  it('test getVariableInstance GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],\r
-    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {\r
-      service.getVariableInstance("").subscribe(data => { });\r
-      var url = environment.soMonitoringBackendURL + 'variable-instance/' + "";\r
-      const mockReq = httpClient.expectOne(url);\r
-      expect(mockReq.request.method).toEqual('GET');\r
-      mockReq.flush({});\r
-    })));\r
-});\r
+/**
+============LICENSE_START=======================================================
+ Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+ limitations under the License.
+
+SPDX-License-Identifier: Apache-2.0
+============LICENSE_END=========================================================
+
+@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com
+*/
+
+import { TestBed, inject } from '@angular/core/testing';
+
+import { DataService } from './data.service';
+import { HttpClient } from '@angular/common/http';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { async } from '@angular/core/testing';
+import { HttpClientModule } from '@angular/common/http';
+import { ToastrNotificationService } from './toastr-notification-service.service';
+import { environment } from '../environments/environment';
+
+class StubbedToastrNotificationService extends ToastrNotificationService {
+  toastrSettings() {
+  }
+}
+
+describe('DataService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [DataService, { provide: ToastrNotificationService, useClass: StubbedToastrNotificationService }],
+      imports: [HttpClientTestingModule]
+    });
+  });
+
+  // Ensure creation of DataService component
+  it('component should be created', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      expect(service).toBeTruthy();
+    })));
+
+  // Test retrieveInstance function making POST call
+  it('test retrieveInstance POST request', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      service.retrieveInstance({}, 1, 2).subscribe(data => { });
+      var url = environment.soMonitoringBackendURL + 'v1/search?from=1&to=2';
+      const mockReq = httpClient.expectOne(url);
+      expect(mockReq.request.method).toEqual('POST');
+      mockReq.flush({});
+    })));
+
+  // Test getProcessInstanceId function making GET request to retrieve processInstanceID
+  it('test getProcessInstanceId GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      service.getProcessInstanceId("").subscribe(data => { });
+      var url = environment.soMonitoringBackendURL + 'process-instance-id/' + "";
+      const mockReq = httpClient.expectOne(url);
+      expect(mockReq.request.method).toEqual('GET');
+      mockReq.flush({});
+    })));
+
+  // Test getActivityInstance function making GET request to retrieve activityInstance
+  it('test getActivityInstance GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      service.getActivityInstance("").then(data => { });
+      var url = environment.soMonitoringBackendURL + 'activity-instance/' + "";
+      const mockReq = httpClient.expectOne(url);
+      expect(mockReq.request.method).toEqual('GET');
+      mockReq.flush({});
+    })));
+
+  // Test getProcessInstance function making GET request to retrieve processInstance
+  it('test getProcessInstance GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      service.getProcessInstance("");
+      var url = environment.soMonitoringBackendURL + 'process-instance/' + "";
+      const mockReq = httpClient.expectOne(url);
+      expect(mockReq.request.method).toEqual('GET');
+    })));
+
+  // Test getProcessDefinition function making GET request to retrieve processDefinition
+  it('test getProcessDefinition GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      service.getProcessDefinition("").subscribe(data => { });
+      var url = environment.soMonitoringBackendURL + 'process-definition/' + "";
+      const mockReq = httpClient.expectOne(url);
+      expect(mockReq.request.method).toEqual('GET');
+      mockReq.flush({});
+    })));
+
+  // Test getVariableInstance function making GET request to retrieve variableInstance
+  it('test getVariableInstance GET request', async(inject([HttpTestingController, DataService, ToastrNotificationService],
+    (httpClient: HttpTestingController, service: DataService, toastr: ToastrNotificationService) => {
+      service.getVariableInstance("").subscribe(data => { });
+      var url = environment.soMonitoringBackendURL + 'variable-instance/' + "";
+      const mockReq = httpClient.expectOne(url);
+      expect(mockReq.request.method).toEqual('GET');
+      mockReq.flush({});
+    })));
+});
index 52ace2f..2789723 100644 (file)
@@ -1,68 +1,72 @@
-/**\r
-============LICENSE_START=======================================================\r
- Copyright (C) 2018 Ericsson. All rights reserved.\r
-================================================================================\r
-Licensed under the Apache License, Version 2.0 (the "License");\r
-you may not use this file except in compliance with the License.\r
-You may obtain a copy of the License at\r
-\r
-    http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-Unless required by applicable law or agreed to in writing, software\r
-distributed under the License is distributed on an "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-See the License for the specific language governing permissions and\r
- limitations under the License.\r
-\r
-SPDX-License-Identifier: Apache-2.0\r
-============LICENSE_END=========================================================\r
-\r
-@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com\r
-*/\r
-\r
-#canvas {\r
-  background: white;\r
-  padding: 0;\r
-  margin: 0;\r
-  width: 70%;\r
-  height: 470px;\r
-  margin-top: 0;\r
-  box-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);\r
-}\r
-\r
-#besideCanvas {\r
-  background: white;\r
-  padding-left: 20px;\r
-  margin: 0;\r
-  width: 28%;\r
-  height: 470px;\r
-  margin-top: 0;\r
-  box-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);\r
-  font-family: 'Montserrat', sans-serif;\r
-  font-size: 17px;\r
-}\r
-\r
-.topCanvas {\r
-  display: flex;\r
-  justify-content: space-between;\r
-}\r
-\r
-.mat-column-durationInMillis {\r
-  flex: 0 0 8%;\r
-}\r
-\r
-.mat-column-name {\r
-  flex: 0 0 40%;\r
-}\r
-\r
-.mat-column-type {\r
-  flex: 0 0 8%;\r
-}\r
-\r
-.mat-column-value {\r
-  flex: 0 0 52%;\r
-}\r
-\r
-.highlight:not(.djs-connection) .djs-visual > :nth-child(1) {\r
-   fill: cyan !important; /* color elements as green */\r
- }\r
+/**
+============LICENSE_START=======================================================
+ Copyright (C) 2018 Ericsson. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+ limitations under the License.
+
+SPDX-License-Identifier: Apache-2.0
+============LICENSE_END=========================================================
+
+@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com
+*/
+#canvas {
+  background: white;
+  padding: 0;
+  margin: 0;
+  width: 70%;
+  height: 470px;
+  margin-top: 0;
+  box-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);
+}
+
+#besideCanvas {
+  background: white;
+  padding-left: 20px;
+  margin: 0;
+  width: 28%;
+  height: 470px;
+  margin-top: 0;
+  box-shadow: 0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12);
+  font-family: 'Montserrat', sans-serif;
+  font-size: 17px;
+}
+
+.topCanvas {
+  display: flex;
+  justify-content: space-between;
+}
+
+.mat-column-durationInMillis {
+  flex: 0 0 8%;
+}
+
+.mat-column-name {
+  flex: 0 0 40%;
+}
+
+.mat-column-type {
+  flex: 0 0 8%;
+}
+
+.mat-column-value {
+  flex: 0 0 52%;
+}
+
+.highlight:not(.djs-connection) .djs-visual > :nth-child(1) {
+  fill: cyan !important;
+  /* color elements as green */
+}
+
+.tab-group {
+  word-break: break-all;
+}
index e4556ca..0c0e1c0 100644 (file)
@@ -17,7 +17,7 @@ limitations under the License.
 SPDX-License-Identifier: Apache-2.0
 ============LICENSE_END=========================================================
 
-@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com
+@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com, andrei.barcovschi@ericsson.com
 -->
 
 <base href="/">
@@ -50,26 +50,26 @@ SPDX-License-Identifier: Apache-2.0
         <input matInput #searchValueRI type="text" [(ngModel)]="searchData.requestId" placeholder="Request Id">
       </mat-form-field>
 
-        <!-- Angular Start Date Picker -->
-        <mat-form-field class="startDate">
-          <input matInput #startDate [matDatepicker]="picker" [(ngModel)]="searchData.startDate" placeholder="Choose a start date">
-          <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
-          <mat-datepicker #picker></mat-datepicker>
-        </mat-form-field>
-
-        <!-- Dropdown box for Start Hour selection -->
-        <mat-form-field class="selectHour">
-          <mat-select class="formatBox" [(ngModel)]="searchData.selectedStartHour" name="hourFrom" placeholder="Select Hour">
-            <mat-option *ngFor="let option of hourOptions" [value]="option">{{option}}</mat-option>
-          </mat-select>
-        </mat-form-field>
-
-        <!-- Dropdown box for Start Minute selection -->
-        <mat-form-field class="selectMinute">
-          <mat-select class="formatBox" [(ngModel)]="searchData.selectedStartMinute" name="minuteFrom" placeholder="Select Minute">
-            <mat-option *ngFor="let option of minuteOptions" [value]="option">{{option}}</mat-option>
-          </mat-select>
-        </mat-form-field>
+      <!-- Angular Start Date Picker -->
+      <mat-form-field class="startDate">
+        <input matInput #startDate [matDatepicker]="picker" [(ngModel)]="searchData.startDate" placeholder="Choose a start date">
+        <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
+        <mat-datepicker #picker></mat-datepicker>
+      </mat-form-field>
+
+      <!-- Dropdown box for Start Hour selection -->
+      <mat-form-field class="selectHour">
+        <mat-select class="formatBox" [(ngModel)]="searchData.selectedStartHour" name="hourFrom" placeholder="Select Hour">
+          <mat-option *ngFor="let option of hourOptions" [value]="option">{{option}}</mat-option>
+        </mat-select>
+      </mat-form-field>
+
+      <!-- Dropdown box for Start Minute selection -->
+      <mat-form-field class="selectMinute">
+        <mat-select class="formatBox" [(ngModel)]="searchData.selectedStartMinute" name="minuteFrom" placeholder="Select Minute">
+          <mat-option *ngFor="let option of minuteOptions" [value]="option">{{option}}</mat-option>
+        </mat-select>
+      </mat-form-field>
     </div>
 
     <!-- Dropdown Filter and TextBox for Service Name -->
@@ -83,26 +83,26 @@ SPDX-License-Identifier: Apache-2.0
         <input matInput #searchValueSN type="text" [(ngModel)]="searchData.serviceInstanceName" placeholder="Service Name">
       </mat-form-field>
 
-        <!-- Angular End Date Picker -->
-        <mat-form-field class="endDate">
-          <input matInput #endDate [matDatepicker]="endpicker" [(ngModel)]="searchData.endDate" placeholder="Choose an end date">
-          <mat-datepicker-toggle matSuffix [for]="endpicker"></mat-datepicker-toggle>
-          <mat-datepicker #endpicker></mat-datepicker>
-        </mat-form-field>
-
-        <!-- Dropdown box for End Hour selection -->
-        <mat-form-field class="selectHour">
-          <mat-select class="formatBox" [(ngModel)]="searchData.selectedEndHour" name="hourTo" placeholder="Select Hour">
-            <mat-option *ngFor="let option of hourOptions" [value]="option">{{option}}</mat-option>
-          </mat-select>
-        </mat-form-field>
-
-        <!-- Dropdown box for End Minute selection -->
-        <mat-form-field class="selectMinute">
-          <mat-select class="formatBox" [(ngModel)]="searchData.selectedEndMinute" name="minuteTo" placeholder="Select Minute">
-            <mat-option *ngFor="let option of minuteOptions" [value]="option">{{option}}</mat-option>
-          </mat-select>
-        </mat-form-field>
+      <!-- Angular End Date Picker -->
+      <mat-form-field class="endDate">
+        <input matInput #endDate [matDatepicker]="endpicker" [(ngModel)]="searchData.endDate" placeholder="Choose an end date">
+        <mat-datepicker-toggle matSuffix [for]="endpicker"></mat-datepicker-toggle>
+        <mat-datepicker #endpicker></mat-datepicker>
+      </mat-form-field>
+
+      <!-- Dropdown box for End Hour selection -->
+      <mat-form-field class="selectHour">
+        <mat-select class="formatBox" [(ngModel)]="searchData.selectedEndHour" name="hourTo" placeholder="Select Hour">
+          <mat-option *ngFor="let option of hourOptions" [value]="option">{{option}}</mat-option>
+        </mat-select>
+      </mat-form-field>
+
+      <!-- Dropdown box for End Minute selection -->
+      <mat-form-field class="selectMinute">
+        <mat-select class="formatBox" [(ngModel)]="searchData.selectedEndMinute" name="minuteTo" placeholder="Select Minute">
+          <mat-option *ngFor="let option of minuteOptions" [value]="option">{{option}}</mat-option>
+        </mat-select>
+      </mat-form-field>
     </div>
 
     <!-- Dropdown Filter for Status -->
@@ -125,42 +125,44 @@ SPDX-License-Identifier: Apache-2.0
   <div class="example-container mat-elevation-z8">
     <mat-tab-group class="tab-group">
       <mat-tab label="Service Instances">
-        <mat-table [dataSource]="processData">
+        <mat-table [dataSource]="processData" matSort>
           <ng-container matColumnDef="requestId">
-            <mat-header-cell *matHeaderCellDef> Request Id </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Request Id </mat-header-cell>
             <mat-cell *matCellDef="let process"><a routerLink="" (click)="getProcessIsntanceId(process.requestId)">{{ process.requestId }}</a></mat-cell>
           </ng-container>
           <ng-container matColumnDef="serviceInstanceId">
-            <mat-header-cell *matHeaderCellDef> Instance Id </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Instance Id </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ process.serviceInstanceId }} </mat-cell>
           </ng-container>
           <ng-container matColumnDef="serviceIstanceName">
-            <mat-header-cell *matHeaderCellDef> Instance Name </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Instance Name </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ process.serviceIstanceName }} </mat-cell>
           </ng-container>
           <ng-container matColumnDef="networkId">
-            <mat-header-cell *matHeaderCellDef> Network Id </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Network Id </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ process.networkId }} </mat-cell>
           </ng-container>
           <ng-container matColumnDef="requestStatus">
-            <mat-header-cell *matHeaderCellDef> Request Status </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Request Status </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ process.requestStatus }} </mat-cell>
           </ng-container>
           <ng-container matColumnDef="serviceType">
-            <mat-header-cell *matHeaderCellDef> Service Type </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Service Type </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ process.serviceType }} </mat-cell>
           </ng-container>
           <ng-container matColumnDef="startTime">
-            <mat-header-cell *matHeaderCellDef> Start Time </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> Start Time </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ (process.startTime | date:'yyyy-MM-dd HH:mm:sss Z') }} </mat-cell>
           </ng-container>
           <ng-container matColumnDef="endTime">
-            <mat-header-cell *matHeaderCellDef> End Time </mat-header-cell>
+            <mat-header-cell *matHeaderCellDef mat-sort-header> End Time </mat-header-cell>
             <mat-cell *matCellDef="let process"> {{ (process.endTime | date:'yyyy-MM-dd HH:mm:sss Z') }} </mat-cell>
           </ng-container>
           <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
           <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
         </mat-table>
+        <mat-paginator [pageSizeOptions]="pageSizeOptions" showFirstLastButtons>
+        </mat-paginator>
       </mat-tab>
 
       <mat-tab label="Service Statistics">
index b8fac61..25b75d7 100644 (file)
@@ -17,27 +17,23 @@ See the License for the specific language governing permissions and
 SPDX-License-Identifier: Apache-2.0
 ============LICENSE_END=========================================================
 
-@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com
+@authors: ronan.kenny@ericsson.com, waqas.ikram@ericsson.com, andrei.barcovschi@ericsson.com
 */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, ViewChild, ElementRef, Input, ViewEncapsulation } from '@angular/core';
 import { DataService } from '../data.service';
 import { ActivatedRoute, Router } from "@angular/router";
 import { Process } from '../model/process.model';
-
 import { ProcessInstanceId } from '../model/processInstanceId.model';
 import { ToastrNotificationService } from '../toastr-notification-service.service';
 import { MatSelectModule } from '@angular/material/select';
-import { ViewEncapsulation } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { MatFormFieldModule, MatInputModule } from '@angular/material';
+import { FormsModule, FormControl } from '@angular/forms';
 import { SearchData } from '../model/searchData.model';
 import { MatDatepickerModule } from '@angular/material/datepicker';
-import { FormControl } from '@angular/forms';
 import { SearchRequest } from '../model/SearchRequest.model';
-import { ElementRef } from '@angular/core';
-import { Input } from '@angular/core';
 import { NgxSpinnerService } from 'ngx-spinner';
+import { MatFormFieldModule, MatInputModule, MatPaginator, MatSort, MatTableDataSource } from '@angular/material';
+import { Constants } from './home.constant';
 
 @Component({
   selector: 'app-home',
@@ -60,24 +56,19 @@ export class HomeComponent implements OnInit {
   percentagePending = 0;
   percentageUnlocked = 0;
 
-  options = [{ name: "EQUAL", value: "EQ" }, { name: "NOT EQUAL", value: "NEQ" }, { name: "LIKE", value: "LIKE" }];
-  statusOptions = [{ name: "ALL", value: "ALL" }, { name: "COMPLETE", value: "COMPLETE" }, { name: "IN_PROGRESS", value: "IN_PROGRESS" },
-  { name: "FAILED", value: "FAILED" }, { name: "PENDING", value: "PENDING" }, { name: "UNLOCKED", value: "UNLOCKED" }];
-
-  hourOptions = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11",
-    "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"];
+  options = Constants.OPTIONS;
+  statusOptions = Constants.STATUS_OPTIONS;
+  hourOptions = Constants.HOUR_OPTIONS;
+  minuteOptions = Constants.MINUTE_OPTIONS;
+  displayedColumns = Constants.DISPLAYED_COLUMNS;
+  pageSizeOptions = Constants.DEFAULT_PAGE_SIZE_OPTIONS;
 
-  minuteOptions = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15",
-    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
-    "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55",
-    "56", "57", "58", "59"];
-
-  processData: Process[];
   searchData: SearchData;
-
   startingDate: Date;
+  processData: MatTableDataSource<Process>;
 
-  displayedColumns = ['requestId', 'serviceInstanceId', 'serviceIstanceName', 'networkId', 'requestStatus', 'serviceType', 'startTime', 'endTime'];
+  @ViewChild(MatPaginator) paginator: MatPaginator;
+  @ViewChild(MatSort) sort: MatSort;
 
   constructor(private route: ActivatedRoute, private data: DataService,
     private router: Router, private popup: ToastrNotificationService,
@@ -93,16 +84,21 @@ export class HomeComponent implements OnInit {
       this.data.retrieveInstance(result.getFilters(), result.getStartTimeInMilliseconds(), result.getEndTimeInMilliseconds())
         .subscribe((data: Process[]) => {
           this.spinner.hide();
-          this.processData = data;
+          var processData: Process[] = data;
+          this.processData = new MatTableDataSource<Process>(processData);
+          this.processData.sort = this.sort;
+          this.processData.paginator = this.paginator;
+          this.processData.paginator.firstPage();
+
           this.popup.info("Number of records found: " + data.length)
 
           // Calculate Statistics for Service Statistics tab
-          this.completeVal = this.processData.filter(i => i.requestStatus === "COMPLETE").length;
-          this.inProgressVal = this.processData.filter(i => i.requestStatus === "IN_PROGRESS").length;
-          this.failedVal = this.processData.filter(i => i.requestStatus === "FAILED").length;
-          this.pendingVal = this.processData.filter(i => i.requestStatus === "PENDING").length;
-          this.unlockedVal = this.processData.filter(i => i.requestStatus === "UNLOCKED").length;
-          this.totalVal = this.processData.length;
+          this.completeVal = processData.filter(i => i.requestStatus === "COMPLETE").length;
+          this.inProgressVal = processData.filter(i => i.requestStatus === "IN_PROGRESS").length;
+          this.failedVal = processData.filter(i => i.requestStatus === "FAILED").length;
+          this.pendingVal = processData.filter(i => i.requestStatus === "PENDING").length;
+          this.unlockedVal = processData.filter(i => i.requestStatus === "UNLOCKED").length;
+          this.totalVal = processData.length;
 
           // Calculate percentages to 2 decimal places and compare to 0 to avoid NaN error
           if (this.totalVal != 0) {
@@ -142,7 +138,5 @@ export class HomeComponent implements OnInit {
     });
   }
 
-  ngOnInit() {
-
-  }
+  ngOnInit() { }
 }
diff --git a/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/home/home.constant.ts b/so-monitoring/so-monitoring-ui/src/main/frontend/src/app/home/home.constant.ts
new file mode 100644 (file)
index 0000000..23ef63f
--- /dev/null
@@ -0,0 +1,41 @@
+
+/**
+============LICENSE_START=======================================================
+ Copyright (C) 2019 Ericsson. All rights reserved.
+================================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+ limitations under the License.
+
+SPDX-License-Identifier: Apache-2.0
+============LICENSE_END=========================================================
+
+@authors: andrei.barcovschi@ericsson.com, waqas.ikram@ericsson.com
+*/
+
+export class Constants {
+  public static OPTIONS = [{ name: "EQUAL", value: "EQ" }, { name: "NOT EQUAL", value: "NEQ" }, { name: "LIKE", value: "LIKE" }];
+
+  public static STATUS_OPTIONS = [{ name: "ALL", value: "ALL" }, { name: "COMPLETE", value: "COMPLETE" }, { name: "IN_PROGRESS", value: "IN_PROGRESS" },
+  { name: "FAILED", value: "FAILED" }, { name: "PENDING", value: "PENDING" }, { name: "UNLOCKED", value: "UNLOCKED" }];
+
+  public static HOUR_OPTIONS = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11",
+    "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"];
+
+  public static MINUTE_OPTIONS = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15",
+    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
+    "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55",
+    "56", "57", "58", "59"];
+
+  public static DISPLAYED_COLUMNS = ['requestId', 'serviceInstanceId', 'serviceIstanceName', 'networkId', 'requestStatus', 'serviceType', 'startTime', 'endTime'];
+
+  public static DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
+}