Create submit route 45/84545/1
authorsebdet <sebastien.determe@intl.att.com>
Mon, 8 Apr 2019 16:32:26 +0000 (18:32 +0200)
committersebdet <sebastien.determe@intl.att.com>
Mon, 8 Apr 2019 16:32:26 +0000 (18:32 +0200)
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>
src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java
src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
src/main/resources/clds/camel/rest/clamp-api-v2.xml
src/main/resources/clds/camel/routes/flexible-flow.xml
src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java
src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java
src/test/resources/example/sdc/blueprint-dcae/tca.yaml
src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml
src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
src/test/resources/http-cache/third_party_proxy.py

index f105650..c3b24bc 100644 (file)
  */
 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 @@ public class CamelConfiguration extends RouteBuilder {
             .apiProperty("api.version", ClampVersioning.getCldsVersionFromProps())
             .apiProperty("base.path", "/restservices/clds/");
         // .apiProperty("cors", "true");
+        camelContext.setTracing(true);
     }
 }
index 93374fe..5a8ccca 100644 (file)
@@ -88,7 +88,7 @@ public class BlueprintParser {
         }
         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) {
index b6b591d..1859a4d 100644 (file)
@@ -31,8 +31,7 @@ import com.google.gson.JsonObject;
 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 @@ public class OperationalPolicy implements Serializable, Policy {
         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;
     }
index c17595e..76f4588 100644 (file)
                                </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-policy" />
+
+                                       <setHeader headerName="HttpQueryExceptionFlag">
+                                               <simple resultType="java.lang.Boolean">true</simple>
+                                       </setHeader>
+                                       <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-micro-service"/>
-                                       
-                                       <setHeader headerName="HttpQueryException">
+                                       <to uri="direct:delete-operational-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-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')" />
index b824499..15a247b 100644 (file)
                        </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>DELETE</constant>
+                       <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/${body.getName()}
+                       <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>
-               <!--<convertBodyTo type="org.onap.clamp.policy.microservice.MicroServicePolicy"/> -->
+               <setHeader headerName="CamelHttpMethod">
+                       <constant>DELETE</constant>
+               </setHeader>
+               <setHeader headerName="CamelHttpUri">
+                       <simple>{{clamp.config.policy.url}}/policyTypes/${header.microServicePolicy.getModelType()}/versions/1.0.0/policies/${header.microServicePolicy.getName()}
+                       </simple>
+               </setHeader>
                <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-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/onap.policies.controloop.operational/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-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-micro-service">
-               <from uri="direct:create-micro-service" />
 
+       <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/${body.getModelType()}/versions/1.0.0/policies
+                       <simple>{{clamp.config.policy.url}}/policyTypes/onap.policies.controlloop.Guard/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.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.HttpQueryException}" />
+                       uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryExceptionFlag}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false" />
        </route>
 
 </routes>
\ No newline at end of file
index 93d7166..e86fb27 100644 (file)
@@ -163,7 +163,7 @@ public class BlueprintParserTest {
 
     @Test
     public void fallBackToOneMicroServiceTCATest() {
-        MicroService tcaMS = new MicroService(BlueprintParser.TCA, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "", "",
+        MicroService tcaMS = new MicroService(BlueprintParser.TCA, "onap.policy.monitoring.cdap.tca.hi.lo.app", "", "",
             "");
 
         List<MicroService> expected = Collections.singletonList(tcaMS);
@@ -174,8 +174,8 @@ public class BlueprintParserTest {
 
     @Test
     public void fallBackToOneMicroServiceHolmesTest() {
-        MicroService holmesMS = new MicroService(BlueprintParser.HOLMES, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "",
-            "", "");
+        MicroService holmesMS = new MicroService(BlueprintParser.HOLMES, "onap.policy.monitoring.cdap.tca.hi.lo.app",
+            "", "", "");
 
         List<MicroService> expected = Collections.singletonList(holmesMS);
         List<MicroService> actual = new BlueprintParser()
index 1f57422..739708c 100644 (file)
@@ -29,7 +29,7 @@ import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.Map;
 
 import org.junit.Test;
 import org.onap.clamp.clds.util.ResourceFileUtil;
@@ -53,12 +53,12 @@ public class OperationalPolicyPayloadTest {
             ResourceFileUtil.getResourceAsString("tosca/operational-policy-properties.json"), JsonObject.class);
         OperationalPolicy policy = new OperationalPolicy("testPolicy", null, jsonConfig);
 
-        List<String> guardsList = policy.createGuardPolicyPayloads();
+        Map<String, String> guardsList = policy.createGuardPolicyPayloads();
 
         JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/guard1-policy-payload.json"),
-            guardsList.get(0), false);
+            guardsList.get("guard1"), false);
 
         JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/guard2-policy-payload.json"),
-            guardsList.get(1), false);
+            guardsList.get("guard2"), false);
     }
 }
index b165907..b2bf8bb 100644 (file)
@@ -17,7 +17,7 @@ node_templates:
     properties:
       policy_id: 
         get_input: policy_id
-        policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
+        policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.app
   cdap_host_host:
     type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
     properties:
index 5590136..fb04257 100644 (file)
@@ -166,5 +166,5 @@ node_templates:
     properties:
       policy_id:
            get_input: policy_id
-           policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
+           policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.app
 
index b165907..b2bf8bb 100644 (file)
@@ -17,7 +17,7 @@ node_templates:
     properties:
       policy_id: 
         get_input: policy_id
-        policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
+        policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.app
   cdap_host_host:
     type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
     properties:
index 30f5107..f19aa0d 100755 (executable)
@@ -171,7 +171,7 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
             with open(cached_file_content, 'w') as f:
                 f.write(jsonGenerated)
         return True
-     elif (self.path.startswith("/pdp/api/") and http_type == "PUT" or http_type == "DELETE") or (self.path.startswith("/pdp/api/policyEngineImport") and http_type == "POST"):
+     elif (self.path.startswith("/pdp/api/") and (http_type == "PUT" or http_type == "DELETE")) or (self.path.startswith("/pdp/api/policyEngineImport") and http_type == "POST"):
         print "self.path start with /pdp/api/, copying body to response ..."
         if not os.path.exists(cached_file_folder):
             os.makedirs(cached_file_folder, 0777)
@@ -180,6 +180,25 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
         with open(cached_file_content, 'w+') as f:
             f.write(self.data_string)
         return True
+     elif self.path.startswith("/policy/api/v1/policyTypes/") and http_type == "POST":
+        print "self.path start with POST new policy API /pdp/api/, copying body to response ..."
+        if not os.path.exists(cached_file_folder):
+            os.makedirs(cached_file_folder, 0777)
+        with open(cached_file_header, 'w+') as f:
+            f.write("{\"Content-Length\": \"" + str(len(self.data_string)) + "\", \"Content-Type\": \""+str(self.headers['Content-Type'])+"\"}")
+        with open(cached_file_content, 'w+') as f:
+            f.write(self.data_string)
+        return True
+     elif self.path.startswith("/policy/api/v1/policyTypes/") and http_type == "DELETE":
+        print "self.path start with DELETE new policy API /policy/api/v1/policyTypes/ ..."
+        if not os.path.exists(cached_file_folder):
+            os.makedirs(cached_file_folder, 0777)
+    
+        with open(cached_file_header, 'w+') as f:
+                f.write("{\"Content-Length\": \"" + str(len("")) + "\", \"Content-Type\": \""+str("")+"\"}")
+        with open(cached_file_content, 'w+') as f:
+                f.write(self.data_string)
+        return True
      else:
         return False
 
@@ -337,7 +356,10 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
         cached_file_header=""
         print("\n\n\nGot a DELETE for %s " % self.path)
         self.check_credentials()
-        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
+        if self.headers.get('Content-Length') is not None:
+            self.data_string = self.rfile.read(int(self.headers['Content-Length']))
+        else:
+            self.data_string = "empty generated"
         print("self.headers:\n %s" % self.headers)
 
         is_special = self._execute_content_generated_cases("DELETE")