Merge "Create a camel route that would retrieve all the DCAE blueprints"
diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java
index 558102c..19bc23d 100644
--- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java
+++ b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryCache.java
@@ -36,7 +36,7 @@
  */
 public class DcaeInventoryCache {
 
-    private Map<String, Set<DcaeInventoryResponse>> blueprintsMap = new ConcurrentHashMap<>();
+    private static Map<String, Set<DcaeInventoryResponse>> blueprintsMap = new ConcurrentHashMap<>();
 
     /**
      * Add Dcae inventory response.
diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
index bdf6e70..67bd026 100644
--- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
+++ b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
@@ -53,9 +53,6 @@
     @Expose
     private String asdcResourceId;
 
-    @Expose
-    private String selfLink;
-
     public String getTypeName() {
         return typeName;
     }
@@ -96,14 +93,6 @@
         this.asdcResourceId = asdcResourceId;
     }
 
-    public String getSelfLink() {
-        return selfLink;
-    }
-
-    public void setSelfLink(String selfLink) {
-        this.selfLink = selfLink;
-    }
-
     @Override
     public int compareTo(DcaeInventoryResponse otherResponse) {
         int thisResourceId = Integer.parseInt(this.asdcResourceId);
diff --git a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java
index 9b13129..7a0d8b4 100644
--- a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java
+++ b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java
@@ -24,10 +24,17 @@
 package org.onap.clamp.loop.components.external;
 
 import com.google.gson.JsonObject;
-
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.UUID;
-
 import org.apache.camel.Exchange;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse;
 import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.loop.Loop;
@@ -164,4 +171,26 @@
         }
         return this.getState();
     }
+
+    /**
+     * Convert the json response to a DcaeInventoryResponse.
+     *
+     * @param responseBody The DCAE response Json paylaod
+     * @return list of DcaeInventoryResponse
+     * @throws ParseException In case of issues with the Json parsing
+     */
+    public static List<DcaeInventoryResponse> convertToDcaeInventoryResponse(String responseBody)
+            throws ParseException {
+        JSONParser parser = new JSONParser();
+        JSONObject jsonObj = (JSONObject) parser.parse(responseBody);
+        JSONArray itemsArray = (JSONArray) jsonObj.get("items");
+        Iterator it = itemsArray.iterator();
+        List<DcaeInventoryResponse> inventoryResponseList = new LinkedList<>();
+        while (it.hasNext()) {
+            JSONObject item = (JSONObject) it.next();
+            DcaeInventoryResponse response = JsonUtils.GSON.fromJson(item.toString(), DcaeInventoryResponse.class);
+            inventoryResponseList.add(response);
+        }
+        return inventoryResponseList;
+    }
 }
diff --git a/src/main/resources/clds/camel/routes/dcae-flows.xml b/src/main/resources/clds/camel/routes/dcae-flows.xml
index fb3bc90..6c96334 100644
--- a/src/main/resources/clds/camel/routes/dcae-flows.xml
+++ b/src/main/resources/clds/camel/routes/dcae-flows.xml
@@ -213,4 +213,47 @@
 		</doTry>
 
 	</route>
+	<route id="get-all-dcae-blueprint-inventory">
+		<from uri="direct:get-all-dcae-blueprint-inventory" />
+		<log loggingLevel="INFO"
+			 message="Getting all DCAE blueprint from inventory" />
+		<to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting all blueprint from inventory')" />
+		<doTry>
+			<setHeader headerName="CamelHttpMethod">
+				<constant>GET</constant>
+			</setHeader>
+			<setHeader headerName="X-ONAP-RequestID">
+				<simple>${exchangeProperty[X-ONAP-RequestID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-InvocationID">
+				<simple>${exchangeProperty[X-ONAP-InvocationID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-PartnerName">
+				<simple>${exchangeProperty[X-ONAP-PartnerName]}
+				</simple>
+			</setHeader>
+			<log loggingLevel="INFO"
+				 message="Endpoint to query Blueprints from DCAE inventory: {{clamp.config.dcae.inventory.url}}/dcae-service-types?${header[CamelHttpQuery]}"></log>
+			<toD uri="{{clamp.config.dcae.inventory.url}}/dcae-service-types;bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=30000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+			<convertBodyTo type="java.lang.String" />
+			<setProperty propertyName="dcaeResponseList">
+				<method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+						method="convertToDcaeInventoryResponse(${body})" />
+			</setProperty>
+			<split>
+				<simple>${exchangeProperty[dcaeResponseList]}</simple>
+				<convertBodyTo type="org.onap.clamp.clds.model.dcae.DcaeInventoryResponse" />
+				<setProperty propertyName="dcaeResponse">
+					<simple>${body}</simple>
+				</setProperty>
+				<to uri="bean:org.onap.clamp.clds.model.dcae.DcaeInventoryCache?method=addDcaeInventoryResponse(${exchangeProperty[dcaeResponse]})" />
+			</split>
+			<doFinally>
+				<to uri="direct:reset-raise-http-exception-flag" />
+				<to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+			</doFinally>
+		</doTry>
+	</route>
 </routes>
\ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java
similarity index 60%
rename from src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
rename to src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java
index 26cc831..50da400 100644
--- a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
+++ b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTestItCase.java
@@ -24,14 +24,31 @@
 package org.onap.clamp.clds.model.dcae;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
 
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.ExchangeBuilder;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.clamp.clds.Application;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
 
-public class DcaeInventoryResponseCacheTest {
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class DcaeInventoryResponseCacheTestItCase {
 
     public static DcaeInventoryCache inventoryCache = new DcaeInventoryCache();
 
+    @Autowired
+    CamelContext camelContext;
+
     /**
      * Initialize the responses.
      */
@@ -78,4 +95,32 @@
         }
     }
 
+    @Test
+    public void testDcaeInventoryResponse() {
+        Exchange exchange = ExchangeBuilder.anExchange(camelContext).build();
+        Exchange exchangeResponse = camelContext.createProducerTemplate()
+                .send("direct:get-all-dcae-blueprint-inventory", exchange);
+        assertThat(exchangeResponse.getIn().getHeader("CamelHttpResponseCode")).isEqualTo(200);
+        Set<DcaeInventoryResponse> blueprint = inventoryCache.getAllBlueprintsPerLoopId("testAsdcServiceId");
+        assertThat(blueprint.size()).isEqualTo(2);
+
+        DcaeInventoryResponse response1 = new DcaeInventoryResponse();
+        response1.setAsdcResourceId("0");
+        response1.setTypeName("testTypeName");
+        response1.setAsdcServiceId("testAsdcServiceId");
+        response1.setBlueprintTemplate("testBlueprintTemplate");
+        response1.setTypeId("testtypeId");
+        DcaeInventoryResponse response2 = new DcaeInventoryResponse();
+        response2.setAsdcResourceId("1");
+        response2.setTypeName("testTypeName2");
+        response2.setAsdcServiceId("testAsdcServiceId");
+        response2.setBlueprintTemplate("testBlueprintTemplate2");
+        response2.setTypeId("testtypeId2");
+
+        Set<DcaeInventoryResponse> expectedBlueprint = new HashSet<>();
+        expectedBlueprint.add(response1);
+        expectedBlueprint.add(response2);
+
+        assertEquals(blueprint, expectedBlueprint);
+    }
 }
diff --git a/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java b/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java
index 9692151..0a7c424 100644
--- a/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java
+++ b/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java
@@ -30,11 +30,15 @@
 
 import java.io.IOException;
 import java.util.HashSet;
+import java.util.List;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
+import org.json.simple.parser.ParseException;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse;
 import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse;
 import org.onap.clamp.loop.components.external.DcaeComponent;
 import org.onap.clamp.loop.components.external.ExternalComponentState;
@@ -151,4 +155,89 @@
         ExternalComponentState state9 = dcae.computeState(exchange);
         assertThat(state9.getStateName()).isEqualTo("IN_ERROR");
     }
+
+    @Test
+    public void convertToDcaeInventoryResponseTest() throws IOException, ParseException {
+        String dcaeFakeResponse = "{\n"
+                + "  \"links\": {\n"
+                + "    \"previousLink\": {\n"
+                + "      \"title\": \"string\",\n"
+                + "      \"rel\": \"string\",\n"
+                + "      \"uri\": \"string\",\n"
+                + "      \"uriBuilder\": {},\n"
+                + "      \"rels\": [\n"
+                + "        \"string\"\n"
+                + "      ],\n"
+                + "      \"params\": {\n"
+                +  "        \"additionalProp1\": \"string\",\n"
+                + "        \"additionalProp2\": \"string\",\n"
+                + "        \"additionalProp3\": \"string\"\n"
+                + "      },\n"
+                + "      \"type\": \"string\"\n"
+                + "    },\n"
+                + "    \"nextLink\": {\n"
+                + "      \"title\": \"string\",\n"
+                + "      \"rel\": \"string\",\n"
+                + "      \"uri\": \"string\",\n"
+                + "      \"uriBuilder\": {},\n"
+                + "      \"rels\": [\n"
+                + "        \"string\"\n"
+                + "      ],\n"
+                + "      \"params\": {\n"
+                + "        \"additionalProp1\": \"string\",\n"
+                + "        \"additionalProp2\": \"string\",\n"
+                + "        \"additionalProp3\": \"string\"\n"
+                + "      },\n"
+                + "      \"type\": \"string\"\n"
+                + "    }\n"
+                + "  },\n"
+                + "  \"totalCount\": 0,\n"
+                + "  \"items\": [\n"
+                + "    {\n"
+                + "      \"owner\": \"testOwner\",\n"
+                + "      \"application\": \"testApplication\",\n"
+                + "      \"component\": \"testComponent\",\n"
+                + "      \"typeName\": \"testTypeName\",\n"
+                + "      \"typeVersion\": 0,\n"
+                + "      \"blueprintTemplate\": \"testBlueprintTemplate\",\n"
+                + "      \"serviceIds\": [\n"
+                + "        \"serviceId1\", \"serviceId2\"\n"
+                + "      ],\n"
+                + "      \"vnfTypes\": [\n"
+                + "        \"vnfType1\", \"vnfType2\"\n"
+                + "      ],\n"
+                + "      \"serviceLocations\": [\n"
+                + "        \"serviceLocation1\", \"serviceLocation2\"\n"
+                + "      ],\n"
+                + "      \"asdcServiceId\": \"testAsdcServiceId\",\n"
+                + "      \"asdcResourceId\": \"testAsdcResourceId\",\n"
+                + "      \"asdcServiceURL\": \"testAsdcServiceURL\",\n"
+                + "      \"typeId\": \"testTypeId\",\n"
+                + "      \"selfLink\": {\n"
+                + "        \"title\": \"selfLinkTitle\",\n"
+                + "        \"rel\": \"selfLinkRel\",\n"
+                + "        \"uri\": \"selfLinkUri\",\n"
+                + "        \"uriBuilder\": {},\n"
+                + "        \"rels\": [\n"
+                + "          \"string\"\n"
+                + "        ],\n"
+                + "        \"params\": {\n"
+                + "          \"additionalProp1\": \"string\",\n"
+                + "          \"additionalProp2\": \"string\",\n"
+                + "          \"additionalProp3\": \"string\"\n"
+                + "        },\n"
+                + "        \"type\": \"string\"\n"
+                + "      },\n"
+                + "      \"created\": \"2020-01-22T09:38:15.436Z\",\n"
+                + "      \"deactivated\": \"2020-01-22T09:38:15.437Z\"\n"
+                + "    }\n"
+                + "  ]\n"
+                + "}";
+        List<DcaeInventoryResponse> responseObject = DcaeComponent.convertToDcaeInventoryResponse(dcaeFakeResponse);
+        assertThat(responseObject.get(0).getAsdcResourceId()).isEqualTo("testAsdcResourceId");
+        assertThat(responseObject.get(0).getAsdcServiceId()).isEqualTo("testAsdcServiceId");
+        assertThat(responseObject.get(0).getTypeName()).isEqualTo("testTypeName");
+        assertThat(responseObject.get(0).getTypeId()).isEqualTo("testTypeId");
+        assertThat(responseObject.get(0).getBlueprintTemplate()).isEqualTo("testBlueprintTemplate");
+    }
 }
diff --git a/src/test/resources/clds/camel/routes/dcae-flows.xml b/src/test/resources/clds/camel/routes/dcae-flows.xml
index fb3bc90..1e5cbd8 100644
--- a/src/test/resources/clds/camel/routes/dcae-flows.xml
+++ b/src/test/resources/clds/camel/routes/dcae-flows.xml
@@ -213,4 +213,47 @@
 		</doTry>
 
 	</route>
+	<route id="get-all-dcae-blueprint-inventory">
+		<from uri="direct:get-all-dcae-blueprint-inventory" />
+		<log loggingLevel="INFO"
+			 message="Getting all DCAE blueprint from inventory" />
+		<to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting all blueprint from inventory')" />
+		<doTry>
+			<setHeader headerName="CamelHttpMethod">
+				<constant>GET</constant>
+			</setHeader>
+			<setHeader headerName="X-ONAP-RequestID">
+				<simple>${exchangeProperty[X-ONAP-RequestID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-InvocationID">
+				<simple>${exchangeProperty[X-ONAP-InvocationID]}
+				</simple>
+			</setHeader>
+			<setHeader headerName="X-ONAP-PartnerName">
+				<simple>${exchangeProperty[X-ONAP-PartnerName]}
+				</simple>
+			</setHeader>
+			<log loggingLevel="INFO"
+				 message="Endpoint to query Blueprints from DCAE inventory: {{clamp.config.dcae.inventory.url}}/dcae-service-types?${header[CamelHttpQuery]}"></log>
+			<toD uri="{{clamp.config.dcae.inventory.url}}/dcae-service-types;bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=30000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+			<convertBodyTo type="java.lang.String" />
+			<setProperty propertyName="dcaeResponseList">
+				<method ref="org.onap.clamp.loop.components.external.DcaeComponent"
+						method="convertToDcaeInventoryResponse(${body})" />
+			</setProperty>
+			<split>
+				<simple>${exchangeProperty[dcaeResponseList]}</simple>
+				<convertBodyTo type="org.onap.clamp.clds.model.dcae.DcaeInventoryResponse" />
+					<setProperty propertyName="dcaeResponse">
+						<simple>${body}</simple>
+					</setProperty>
+				<to uri="bean:org.onap.clamp.clds.model.dcae.DcaeInventoryCache?method=addDcaeInventoryResponse(${exchangeProperty[dcaeResponse]})" />
+			</split>
+			<doFinally>
+				<to uri="direct:reset-raise-http-exception-flag" />
+				<to uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" />
+			</doFinally>
+		</doTry>
+	</route>
 </routes>
\ No newline at end of file
diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py
index 9dcc4b3..32f7faf 100755
--- a/src/test/resources/http-cache/third_party_proxy.py
+++ b/src/test/resources/http-cache/third_party_proxy.py
@@ -249,6 +249,22 @@
         with open(cached_file_content, 'w') as f:
             f.write(jsonGenerated)
         return True
+     elif self.path.startswith("/dcae-service-types") and http_type == "GET":
+        if not _file_available:
+            self.path = "/dcae-service-types"
+            cached_file_folder = '%s/%s' % (TMP_ROOT, self.path)
+            cached_file_content = self._get_cached_content_file_name(cached_file_folder)
+            cached_file_header = self._get_cached_header_file_name(cached_file_folder)
+            print "self.path start with /dcae-service-types, generating response json..."
+            response = "{\"links\": {\"previousLink\": {\"title\": \"string\",\"rel\": \"string\",\"uri\": \"string\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"nextLink\": {\"title\": \"string\",\"rel\": \"string\",\"uri\": \"string\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"}},\"totalCount\": 1,\"items\": [{\"owner\": \"testOwner\",\"application\": \"testApplication\",\"component\": \"testComponent\",\"typeName\": \"testTypeName\",\"typeVersion\": 0,\"blueprintTemplate\": \"testBlueprintTemplate\",\"serviceIds\": [\"serviceId1\", \"serviceId2\"],\"vnfTypes\": [\"vnfType1\", \"vnfType2\"],\"serviceLocations\": [\"serviceLocation1\", \"serviceLocation2\"],\"asdcServiceId\": \"testAsdcServiceId\",\"asdcResourceId\": \"0\",\"asdcServiceURL\": \"testAsdcServiceURL\",\"typeId\": \"testtypeId\",\"selfLink\": {\"title\": \"selfLinkTitle\",\"rel\": \"selfLinkRel\",\"uri\": \"selfLinkUri\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"created\": \"2020-01-22T09:38:15.436Z\",\"deactivated\": \"2020-01-22T09:38:15.437Z\"},{\"owner\": \"testOwner2\",\"application\": \"testApplication1\",\"component\": \"testComponent2\",\"typeName\": \"testTypeName2\",\"typeVersion\": 0,\"blueprintTemplate\": \"testBlueprintTemplate2\",\"serviceIds\": [\"serviceId3\", \"serviceId4\"],\"vnfTypes\": [\"vnfType13\", \"vnfType4\"],\"serviceLocations\": [\"serviceLocation3\", \"serviceLocation4\"],\"asdcServiceId\": \"testAsdcServiceId\",\"asdcResourceId\": \"1\",\"asdcServiceURL\": \"testAsdcServiceURL2\",\"typeId\": \"testtypeId2\",\"selfLink\": {\"title\": \"selfLinkTitle\",\"rel\": \"selfLinkRel\",\"uri\": \"selfLinkUri\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"created\": \"2020-01-22T09:38:15.436Z\",\"deactivated\": \"2020-01-22T09:38:15.437Z\"}]}"
+            print "jsonGenerated: " + response
+
+            os.makedirs(cached_file_folder, 0777)
+            with open(cached_file_header, 'w') as f:
+                f.write("{\"Content-Length\": \"" + str(len(response)) + "\", \"Content-Type\": \"application/json\"}")
+            with open(cached_file_content, 'w') as f:
+                f.write(response)
+        return True
      else:
         return False
 
@@ -305,6 +321,9 @@
         if self.path.startswith("/dcae-service-types?asdcResourceId="):
             print "DCAE case deleting folder created " + cached_file_folder
             shutil.rmtree(cached_file_folder, ignore_errors=False, onerror=None)
+        elif self.path.startswith("/dcae-service-types"):
+            print "DCAE case deleting folder created " + cached_file_folder
+            shutil.rmtree(cached_file_folder, ignore_errors=False, onerror=None)
         else:
             print "NOT in DCAE case deleting folder created " + cached_file_folder