Create submit route

Create required components for Submit route in camel + unit tests +
Policy payload generation + emulator feature for new policy api

Issue-ID: CLAMP-303
Change-Id: If9033cfa3f4e346e2cbd7f891baff1f2c04a40a2
Signed-off-by: sebdet <sebastien.determe@intl.att.com>
diff --git a/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
index f105650..c3b24bc 100644
--- a/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
@@ -21,14 +21,19 @@
  */
 package org.onap.clamp.clds.config;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.rest.RestBindingMode;
 import org.onap.clamp.clds.util.ClampVersioning;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class CamelConfiguration extends RouteBuilder {
 
+    @Autowired
+    CamelContext camelContext;
+
     @Override
     public void configure() {
         restConfiguration().component("servlet").bindingMode(RestBindingMode.json).jsonDataFormat("json-gson")
@@ -38,5 +43,6 @@
             .apiProperty("api.version", ClampVersioning.getCldsVersionFromProps())
             .apiProperty("base.path", "/restservices/clds/");
         // .apiProperty("cors", "true");
+        camelContext.setTracing(true);
     }
 }
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java
index 93374fe..5a8ccca 100644
--- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java
+++ b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java
@@ -88,7 +88,7 @@
         }
         String msName = theBiggestMicroServiceKey.toLowerCase().contains(HOLMES_PREFIX) ? HOLMES : TCA;
         return Collections
-            .singletonList(new MicroService(msName, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "", "", ""));
+            .singletonList(new MicroService(msName, "onap.policy.monitoring.cdap.tca.hi.lo.app", "", "", ""));
     }
 
     String getName(Entry<String, JsonElement> entry) {
diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
index b6b591d..1859a4d 100644
--- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
+++ b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
@@ -31,8 +31,7 @@
 import com.google.gson.annotations.Expose;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -182,15 +181,20 @@
         return (new Yaml()).dump(jsonMap);
     }
 
-    public List<String> createGuardPolicyPayloads() {
-        List<String> result = new ArrayList<>();
+    /**
+     * Return a map containing all Guard policies indexed by Guard policy Name.
+     * 
+     * @return The Guards map
+     */
+    public Map<String, String> createGuardPolicyPayloads() {
+        Map<String, String> result = new HashMap<>();
 
         JsonObject guard = new JsonObject();
         JsonElement guardsList = this.getConfigurationsJson().get("guard_policies");
         for (Entry<String, JsonElement> guardElem : guardsList.getAsJsonObject().entrySet()) {
             guard.addProperty("policy-id", guardElem.getKey());
             guard.add("contents", guardElem.getValue());
-            result.add(new GsonBuilder().create().toJson(guard));
+            result.put(guardElem.getKey(), new GsonBuilder().create().toJson(guard));
         }
         return result;
     }
diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
index c17595e..76f4588 100644
--- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -102,35 +102,82 @@
 				</setBody>
 				<log
 					loggingLevel="INFO"
-					message="Loop name received: ${body}"></log>
+					message="Receive SUBMIT request for loop: ${body}" />
 				<to
 					uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-				<setHeader headerName="LoopObject">
-					<method
-						ref="org.onap.clamp.loop.LoopService"
-						method="getLoop" />
-				</setHeader>
-				<split streaming="true">
+				<to uri="direct:load-loop" />
+				<log
+					loggingLevel="INFO"
+					message="Processing all MICRO-SERVICES policies defined in loop ${header.LoopObject.getName()}" />
+				<split>
 					<simple>${header.LoopObject.getMicroServicePolicies()}
 					</simple>
-					<setHeader headerName="HttpQueryException">
+					<setHeader headerName="microServicePolicy">
+						<simple>${body}</simple>
+					</setHeader>
+					<log
+						loggingLevel="INFO"
+						message="Processing Micro Service Policy: ${header.microServicePolicy.getName()}" />
+					<setHeader headerName="HttpQueryExceptionFlag">
 						<simple resultType="java.lang.Boolean">false</simple>
 					</setHeader>
-					<to uri="direct:delete-micro-service"/>
-					
-					<setHeader headerName="HttpQueryException">
+					<to uri="direct:delete-micro-service-policy" />
+
+					<setHeader headerName="HttpQueryExceptionFlag">
 						<simple resultType="java.lang.Boolean">true</simple>
 					</setHeader>
-					<setBody>
-						<simple>${body.createPolicyPayload()}</simple>
-					</setBody>
-					<to uri="direct:create-micro-service"/>
+					<to uri="direct:create-micro-service-policy" />
+				</split>
+
+				<log
+					loggingLevel="INFO"
+					message="Processing all OPERATIONAL policies defined in loop ${header.LoopObject.getName()}" />
+				<split>
+					<simple>${header.LoopObject.getOperationalPolicies()}
+					</simple>
+					<setHeader headerName="operationalPolicy">
+						<simple>${body}</simple>
+					</setHeader>
+					<log
+						loggingLevel="INFO"
+						message="Processing Operational Policy: ${header.operationalPolicy.getName()}" />
+					<setHeader headerName="HttpQueryExceptionFlag">
+						<simple resultType="java.lang.Boolean">false</simple>
+					</setHeader>
+					<to uri="direct:delete-operational-policy" />
+
+					<setHeader headerName="HttpQueryExceptionFlag">
+						<simple resultType="java.lang.Boolean">true</simple>
+					</setHeader>
+					<to uri="direct:create-operational-policy" />
+					<log
+						loggingLevel="INFO"
+						message="Processing all GUARD policies defined in loop ${header.LoopObject.getName()}" />
+					<split>
+						<simple>${header.operationalPolicy.createGuardPolicyPayloads().entrySet()}
+						</simple>
+						<setHeader headerName="guardPolicy">
+							<simple>${body}</simple>
+						</setHeader>
+						<log
+							loggingLevel="INFO"
+							message="Processing Guard Policy: ${header.guardPolicy.getKey()}" />
+
+						<setHeader headerName="HttpQueryExceptionFlag">
+							<simple resultType="java.lang.Boolean">false</simple>
+						</setHeader>
+						<to uri="direct:delete-guard-policy" />
+
+						<setHeader headerName="HttpQueryExceptionFlag">
+							<simple resultType="java.lang.Boolean">true</simple>
+						</setHeader>
+						<to uri="direct:create-guard-policy" />
+					</split>
 
 				</split>
 			</route>
 		</put>
-		<put
-			uri="/v2/loop/delete/{loopName}">
+		<put uri="/v2/loop/delete/{loopName}">
 			<route>
 				<to
 					uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
diff --git a/src/main/resources/clds/camel/routes/flexible-flow.xml b/src/main/resources/clds/camel/routes/flexible-flow.xml
index b824499..15a247b 100644
--- a/src/main/resources/clds/camel/routes/flexible-flow.xml
+++ b/src/main/resources/clds/camel/routes/flexible-flow.xml
@@ -75,43 +75,168 @@
 			</when>
 		</choice>
 	</route>
-	<route id="delete-micro-service">
-		<from uri="direct:delete-micro-service" />
 
+	<route id="load-loop">
+		<from uri="direct:load-loop" />
+		<setHeader headerName="LoopObject">
+			<method
+				ref="org.onap.clamp.loop.LoopService"
+				method="getLoop" />
+		</setHeader>
+
+		<when>
+			<simple>${header.LoopObject} == null</simple>
+			<setHeader headerName="CamelHttpResponseCode">
+				<constant>404</constant>
+			</setHeader>
+			<log
+				loggingLevel="WARNING"
+				message="Loop not found in database: ${body}" />
+			<stop />
+		</when>
+
+	</route>
+
+	<route id="create-micro-service-policy">
+		<from uri="direct:create-micro-service-policy" />
+		<log
+			loggingLevel="INFO"
+			message="Creating Micro Service Policy: ${header.microServicePolicy.getName()}" />
+		<setBody>
+			<simple>${header.microServicePolicy.createPolicyPayload()}
+			</simple>
+		</setBody>
+		<setHeader headerName="CamelHttpMethod">
+			<constant>POST</constant>
+		</setHeader>
+		<setHeader headerName="Content-Type">
+			<constant>application/json</constant>
+		</setHeader>
+		<setHeader headerName="CamelHttpUri">
+			<simple>{{clamp.config.policy.url}}/policyTypes/${header.microServicePolicy.getModelType()}/versions/1.0.0/policies
+			</simple>
+		</setHeader>
+		<log
+			loggingLevel="INFO"
+			message="Policy Endpoint for microservice: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+		<toD
+			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}" />
+	</route>
+	<route id="delete-micro-service-policy">
+		<from uri="direct:delete-micro-service-policy" />
+		<log
+			loggingLevel="INFO"
+			message="Deleting Micro Service Policy: ${header.microServicePolicy.getName()}" />
+		<setBody>
+			<constant>null</constant>
+		</setBody>
 		<setHeader headerName="CamelHttpMethod">
 			<constant>DELETE</constant>
 		</setHeader>
 		<setHeader headerName="CamelHttpUri">
-			<simple>{{clamp.config.policy.url}}/policyTypes/${body.getModelType()}/versions/1.0.0/policies/${body.getName()}
+			<simple>{{clamp.config.policy.url}}/policyTypes/${header.microServicePolicy.getModelType()}/versions/1.0.0/policies/${header.microServicePolicy.getName()}
 			</simple>
 		</setHeader>
-		<setBody>
-			<constant>null</constant>
-		</setBody>
-		<!--<convertBodyTo type="org.onap.clamp.policy.microservice.MicroServicePolicy"/> -->
 		<log
 			loggingLevel="INFO"
 			message="Policy Endpoint for microservice: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
 		<toD
-			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryException}" />
-
+			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false" />
 	</route>
-	<route id="create-micro-service">
-		<from uri="direct:create-micro-service" />
 
+	<route id="create-operational-policy">
+		<from uri="direct:create-operational-policy" />
+		<log
+			loggingLevel="INFO"
+			message="Creating Operational Policy: ${header.operationalPolicy.getName()}" />
+		<setBody>
+			<simple>${header.operationalPolicy.createPolicyPayload()}
+			</simple>
+		</setBody>
 		<setHeader headerName="CamelHttpMethod">
 			<constant>POST</constant>
 		</setHeader>
+		<setHeader headerName="Content-Type">
+			<constant>application/json</constant>
+		</setHeader>
 		<setHeader headerName="CamelHttpUri">
-			<simple>{{clamp.config.policy.url}}/policyTypes/${body.getModelType()}/versions/1.0.0/policies
+			<simple>{{clamp.config.policy.url}}/policyTypes/onap.policies.controloop.operational/versions/1.0.0/policies
 			</simple>
 		</setHeader>
-		<!--<convertBodyTo type="org.onap.clamp.policy.microservice.MicroServicePolicy"/> -->
 		<log
 			loggingLevel="INFO"
-			message="Policy Endpoint for microservice: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+			message="Policy Endpoint for operational ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
 		<toD
-			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryException}" />
+			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}" />
+	</route>
+	<route id="delete-operational-policy">
+		<from uri="direct:delete-operational-policy" />
+		<log
+			loggingLevel="INFO"
+			message="Deleting Operational Policy: ${header.operationalPolicy.getName()}" />
+		<setBody>
+			<constant>null</constant>
+		</setBody>
+		<setHeader headerName="CamelHttpMethod">
+			<constant>DELETE</constant>
+		</setHeader>
+		<setHeader headerName="CamelHttpUri">
+			<simple>{{clamp.config.policy.url}}/policyTypes/onap.policies.controloop.operational/versions/1.0.0/policies/${header.operationalPolicy.getName()}
+			</simple>
+		</setHeader>
+		<log
+			loggingLevel="INFO"
+			message="Policy Endpoint for operational: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+		<toD
+			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false" />
+
+	</route>
+
+	<route id="create-guard-policy">
+		<from uri="direct:create-guard-policy" />
+		<log
+			loggingLevel="INFO"
+			message="Creating Guard Policy: ${header.guardPolicy.getKey()}" />
+		<setBody>
+			<simple>${header.guardPolicy.getValue()}
+			</simple>
+		</setBody>
+		<setHeader headerName="CamelHttpMethod">
+			<constant>POST</constant>
+		</setHeader>
+		<setHeader headerName="Content-Type">
+			<constant>application/json</constant>
+		</setHeader>
+		<setHeader headerName="CamelHttpUri">
+			<simple>{{clamp.config.policy.url}}/policyTypes/onap.policies.controlloop.Guard/versions/1.0.0/policies
+			</simple>
+		</setHeader>
+		<log
+			loggingLevel="INFO"
+			message="Policy Endpoint for operational ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+		<toD
+			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}" />
+	</route>
+	<route id="delete-guard-policy">
+		<from uri="direct:delete-guard-policy" />
+		<log
+			loggingLevel="INFO"
+			message="Deleting Guard Policy: ${header.guardPolicy.getKey()}" />
+		<setBody>
+			<constant>null</constant>
+		</setBody>
+		<setHeader headerName="CamelHttpMethod">
+			<constant>DELETE</constant>
+		</setHeader>
+		<setHeader headerName="CamelHttpUri">
+			<simple>{{clamp.config.policy.url}}/policyTypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${header.guardPolicy.getKey()}
+			</simple>
+		</setHeader>
+		<log
+			loggingLevel="INFO"
+			message="Policy Endpoint for operational: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+		<toD
+			uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false" />
 	</route>
 
 </routes>
\ No newline at end of file