Guard policy Backend

Introduce Guard policy backend code

Issue-ID: CLAMP-190
Change-Id: I7d60c6dd700c84607329f5449287465379b94807
Signed-off-by: sebdet <sd378r@intl.att.com>
diff --git a/src/main/java/org/onap/clamp/clds/client/GuardPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/GuardPolicyDelegate.java
new file mode 100644
index 0000000..9287abb
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/client/GuardPolicyDelegate.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * 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.clamp.clds.client;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
+import org.onap.clamp.clds.client.req.policy.GuardPolicyAttributesConstructor;
+import org.onap.clamp.clds.client.req.policy.PolicyClient;
+import org.onap.clamp.clds.config.ClampProperties;
+import org.onap.clamp.clds.model.properties.ModelProperties;
+import org.onap.clamp.clds.model.properties.Policy;
+import org.onap.clamp.clds.model.properties.PolicyChain;
+import org.onap.clamp.clds.model.properties.PolicyItem;
+import org.onap.clamp.clds.util.LoggingUtils;
+import org.onap.policy.api.AttributeType;
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Send Guard Policy info to policy API. It uses the policy code to define
+ * the model and communicate with it. See also the PolicyClient class.
+ */
+@Component
+public class GuardPolicyDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(GuardPolicyDelegate.class);
+    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
+    private final PolicyClient policyClient;
+    private final ClampProperties refProp;
+
+    @Autowired
+    public GuardPolicyDelegate(PolicyClient policyClient, ClampProperties refProp) {
+        this.policyClient = policyClient;
+        this.refProp = refProp;
+    }
+
+    /**
+     * Perform activity. Send Guard Policies info to policy api.
+     *
+     * @param camelExchange
+     *        The Camel Exchange object containing the properties
+     * @throws BuilderException
+     *         In case of issues with OperationalPolicyRequestAttributesConstructor
+     * @throws UnsupportedEncodingException
+     *         In case of issues with the Charset encoding
+     */
+    @Handler
+    public void execute(Exchange camelExchange) throws BuilderException, UnsupportedEncodingException {
+        String responseMessageGuard = null;
+        ModelProperties prop = ModelProperties.create(camelExchange);
+        Policy policy = prop.getType(Policy.class);
+        if (policy.isFound()) {
+            for (PolicyChain policyChain : prop.getType(Policy.class).getPolicyChains()) {
+                for(PolicyItem policyItem:policyChain.getPolicyItems()) {
+                    if ("on".equals(policyItem.getEnableGuardPolicy()))
+                        responseMessageGuard = createGuardPolicy(prop, policyItem);
+                }
+            }
+            if (responseMessageGuard != null) {
+                camelExchange.setProperty("guardPolicyResponseMessage", responseMessageGuard.getBytes());
+            }
+        }
+    }
+
+    private String createGuardPolicy(ModelProperties prop, PolicyItem policyItem) {
+        Map<AttributeType, Map<String, String>> attributes = GuardPolicyAttributesConstructor
+            .formatAttributes(refProp, prop, prop.getType(Policy.class).getId(), policyItem);
+        return policyClient.sendGuardPolicy(attributes, prop, LoggingUtils.getRequestId());
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/client/GuardPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/GuardPolicyDeleteDelegate.java
new file mode 100644
index 0000000..9e8e1b8
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/client/GuardPolicyDeleteDelegate.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * 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.clamp.clds.client;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
+import org.onap.clamp.clds.client.req.policy.PolicyClient;
+import org.onap.clamp.clds.model.CldsEvent;
+import org.onap.clamp.clds.model.properties.ModelProperties;
+import org.onap.clamp.clds.model.properties.Policy;
+import org.onap.clamp.clds.model.properties.PolicyChain;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Delete Operational Policy via policy api.
+ */
+@Component
+public class GuardPolicyDeleteDelegate {
+
+    protected static final EELFLogger logger = EELFManager.getInstance()
+        .getLogger(GuardPolicyDeleteDelegate.class);
+    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
+    @Autowired
+    private PolicyClient policyClient;
+
+    /**
+     * Perform activity. Delete Operational Policy via policy api.
+     *
+     * @param camelExchange
+     *            The Camel Exchange object containing the properties
+     */
+    @Handler
+    public void execute(Exchange camelExchange) {
+        ModelProperties prop = ModelProperties.create(camelExchange);
+        Policy policy = prop.getType(Policy.class);
+        prop.setCurrentModelElementId(policy.getId());
+        String eventAction = (String) camelExchange.getProperty("eventAction");
+        String responseMessage = "";
+        if (!eventAction.equalsIgnoreCase(CldsEvent.ACTION_CREATE) && policy.isFound()) {
+            for (PolicyChain policyChain : policy.getPolicyChains()) {
+                prop.setPolicyUniqueId(policyChain.getPolicyId());
+                responseMessage = policyClient.deleteBrms(prop);
+            }
+            if (responseMessage != null) {
+                camelExchange.setProperty("operationalPolicyDeleteResponseMessage", responseMessage.getBytes());
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructor.java b/src/main/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructor.java
new file mode 100644
index 0000000..f11b492
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructor.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * 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.clamp.clds.client.req.policy;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.onap.clamp.clds.config.ClampProperties;
+import org.onap.clamp.clds.model.properties.ModelProperties;
+import org.onap.clamp.clds.model.properties.PolicyItem;
+import org.onap.policy.api.AttributeType;
+
+public class GuardPolicyAttributesConstructor {
+    private static final EELFLogger logger = EELFManager.getInstance()
+        .getLogger(GuardPolicyAttributesConstructor.class);
+
+    private GuardPolicyAttributesConstructor() {
+    }
+
+    public static Map<AttributeType, Map<String, String>> formatAttributes(ClampProperties refProp,
+        ModelProperties modelProperties, String modelElementId, PolicyItem policyItem) {
+        Map<String, String> matchingAttributes = prepareMatchingAttributes(refProp, policyItem, modelProperties);
+        return createAttributesMap(matchingAttributes);
+    }
+
+    private static Map<String, String> prepareMatchingAttributes(ClampProperties refProp,
+        PolicyItem policyItem, ModelProperties modelProp) {
+        logger.info("Preparing matching attributes for guard...");
+        Map<String, String> matchingAttributes = new HashMap<>();
+        matchingAttributes.put("actor",policyItem.getActor());
+        matchingAttributes.put("recipe",policyItem.getRecipe());
+        matchingAttributes.put("targets",policyItem.getGuardTargets());
+        matchingAttributes.put("clname",modelProp.getControlNameAndPolicyUniqueId());
+        if ("MinMax".equals(policyItem.getGuardPolicyType())) {
+            matchingAttributes.put("min",policyItem.getMinGuard());
+            matchingAttributes.put("max",policyItem.getMaxGuard());
+        } else if ("FrequencyLimiter".equals(policyItem.getGuardPolicyType())) {
+            matchingAttributes.put("limit",policyItem.getLimitGuard());
+            matchingAttributes.put("timeWindow",policyItem.getTimeWindowGuard());
+            matchingAttributes.put("timeUnits",policyItem.getTimeUnitsGuard());
+        }
+        matchingAttributes.put("guardActiveStart",policyItem.getGuardActiveStart());
+        matchingAttributes.put("guardActiveEnd",policyItem.getGuardActiveEnd());
+
+        logger.info("Prepared: " + matchingAttributes);
+        return matchingAttributes;
+    }
+
+    private static Map<AttributeType, Map<String, String>> createAttributesMap(Map<String, String> matchingAttributes) {
+        Map<AttributeType, Map<String, String>> attributes = new HashMap<>();
+        attributes.put(AttributeType.MATCHING, matchingAttributes);
+        return attributes;
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java b/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java
index cd387b3..58366d9 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/policy/PolicyClient.java
@@ -43,6 +43,7 @@
 import org.onap.policy.api.DeletePolicyCondition;
 import org.onap.policy.api.DeletePolicyParameters;
 import org.onap.policy.api.PolicyChangeResponse;
+import org.onap.policy.api.PolicyClass;
 import org.onap.policy.api.PolicyConfigException;
 import org.onap.policy.api.PolicyConfigType;
 import org.onap.policy.api.PolicyEngine;
@@ -50,6 +51,7 @@
 import org.onap.policy.api.PolicyParameters;
 import org.onap.policy.api.PolicyType;
 import org.onap.policy.api.PushPolicyParameters;
+import org.onap.policy.api.RuleProvider;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Primary;
@@ -80,6 +82,40 @@
     private PolicyConfiguration policyConfiguration;
 
     /**
+     * Perform Guard policy type.
+     *
+     * @param attributes
+     *            A map of attributes
+     * @param prop
+     *            The ModelProperties
+     * @param policyRequestUuid
+     *            PolicyRequest UUID
+     * @return The response message of policy
+     */
+    public String sendGuardPolicy(Map<AttributeType, Map<String, String>> attributes, ModelProperties prop,
+        String policyRequestUuid) {
+        PolicyParameters policyParameters = new PolicyParameters();
+        // Set Policy Type(Mandatory)
+        policyParameters.setPolicyClass(PolicyClass.Decision);
+        // Set Policy Name(Mandatory)
+        policyParameters.setPolicyName(prop.getPolicyScopeAndNameWithUniqueId()+"Guard");
+        // documentation says this is options, but when tested, got the
+        // following failure: java.lang.Exception: Policy send failed: PE300 -
+        // Data Issue: No policyDescription given.
+        policyParameters.setPolicyDescription(refProp.getStringValue("op.policyDescription"));
+        policyParameters.setOnapName("PDPD");
+        policyParameters.setRuleProvider(RuleProvider.GUARD_YAML);
+        policyParameters.setAttributes(attributes);
+        // Set a random UUID(Mandatory)
+        policyParameters.setRequestID(UUID.fromString(policyRequestUuid));
+        String policyNamePrefix = refProp.getStringValue(POLICY_OP_NAME_PREFIX_PROPERTY_NAME);
+        String rtnMsg = send(policyParameters, prop, policyNamePrefix);
+        String policyType = "Decision";
+        push(policyType, prop);
+        return rtnMsg;
+    }
+
+    /**
      * Perform BRMS policy type.
      *
      * @param attributes
@@ -332,7 +368,7 @@
         configRequestParameters.setPolicyName(policyName);
         try {
             Collection<String> response = getPolicyEngine().listConfig(configRequestParameters);
-            if (response != null && !response.isEmpty()) {
+            if (response != null && !response.isEmpty() && !response.contains("Policy Name: null")) {
                 policyexists = true;
             }
         } catch (PolicyConfigException e) {
@@ -392,6 +428,27 @@
     }
 
     /**
+     * Format and send delete Guard requests to Policy.
+     *
+     * @param prop
+     *            The ModelProperties
+     * @return The response message from policy
+     */
+    public String deleteGuard(ModelProperties prop) {
+        String deletePolicyResponse = "";
+        try {
+            String policyNamePrefix = refProp.getStringValue(POLICY_OP_NAME_PREFIX_PROPERTY_NAME);
+            if (checkPolicyExists(policyNamePrefix, prop)) {
+                deletePolicyResponse = deletePolicy(prop, "Decision");
+            }
+        } catch (Exception e) {
+            logger.error("Exception occurred during policy communication", e);
+            throw new PolicyClientException("Exception while communicating with Policy", e);
+        }
+        return deletePolicyResponse;
+    }
+
+    /**
      * Format and send delete BRMS requests to Policy.
      *
      * @param prop
diff --git a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
index 54a5196..d3e89fb 100644
--- a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
+++ b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
@@ -277,7 +277,7 @@
      *
      * @return model names
      */
-    public List<ValueItem> getBpmnNames() {
+    public List<ValueItem> getModelNames() {
         String sql = "SELECT model_name FROM model ORDER BY 1;";
         return jdbcTemplateObject.query(sql, new ValueItemMapper());
     }
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java b/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java
index 7caba41..2ac51ab 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java
@@ -71,6 +71,17 @@
     private String oapRop;
     private String oapLimit;
 
+    private String enableGuardPolicy;
+    private String guardPolicyType;
+    private String guardTargets;
+    private String minGuard;
+    private String maxGuard;
+    private String limitGuard;
+    private String timeUnitsGuard;
+    private String timeWindowGuard;
+    private String guardActiveStart;
+    private String guardActiveEnd;
+
     /**
      * Parse Policy given json node.
      *
@@ -99,6 +110,17 @@
         oapRop = AbstractModelElement.getValueByName(node, "oapRop");
         oapLimit = AbstractModelElement.getValueByName(node, "oapLimit");
         actor = AbstractModelElement.getValueByName(node, "actor");
+
+        enableGuardPolicy = AbstractModelElement.getValueByName(node, "enableGuardPolicy");
+        guardPolicyType = AbstractModelElement.getValueByName(node, "guardPolicyType");
+        guardTargets = AbstractModelElement.getValueByName(node, "guardTargets");
+        minGuard = AbstractModelElement.getValueByName(node, "minGuard");
+        maxGuard = AbstractModelElement.getValueByName(node, "maxGuard");
+        limitGuard = AbstractModelElement.getValueByName(node, "limitGuard");
+        timeUnitsGuard = AbstractModelElement.getValueByName(node, "timeUnitsGuard");
+        timeWindowGuard = AbstractModelElement.getValueByName(node, "timeWindowGuard");
+        guardActiveStart = AbstractModelElement.getValueByName(node, "guardActiveStart");
+        guardActiveEnd = AbstractModelElement.getValueByName(node, "guardActiveEnd");
     }
 
     /**
@@ -236,4 +258,45 @@
         }
         return oapLimit;
     }
+
+    public String getEnableGuardPolicy() {
+        return enableGuardPolicy;
+    }
+
+    public String getGuardPolicyType() {
+        return guardPolicyType;
+    }
+
+    public String getGuardTargets() {
+        return guardTargets;
+    }
+
+    public String getMinGuard() {
+        return minGuard;
+    }
+
+    public String getMaxGuard() {
+        return maxGuard;
+    }
+
+    public String getLimitGuard() {
+        return limitGuard;
+    }
+
+    public String getTimeUnitsGuard() {
+        return timeUnitsGuard;
+    }
+
+    public String getTimeWindowGuard() {
+        return timeWindowGuard;
+    }
+
+    public String getGuardActiveStart() {
+        return guardActiveStart;
+    }
+
+    public String getGuardActiveEnd() {
+        return guardActiveEnd;
+    }
+
 }
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java
index 521f3ce..243881f 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsService.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java
@@ -300,7 +300,7 @@
         Date startTime = new Date();
         isAuthorized(permissionReadCl);
         logger.info("GET list of model names");
-        List<ValueItem> names = cldsDao.getBpmnNames();
+        List<ValueItem> names = cldsDao.getModelNames();
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("GET model names completed");
diff --git a/src/main/resources/application-noaaf.properties b/src/main/resources/application-noaaf.properties
index fe7eabc..0ce8a7b 100644
--- a/src/main/resources/application-noaaf.properties
+++ b/src/main/resources/application-noaaf.properties
@@ -197,12 +197,12 @@
 #DCAE Inventory Url Properties
 clamp.config.dcae.inventory.url=http://dcae.api.simpledemo.onap.org:8080
 clamp.config.dcae.intentory.retry.interval=10000
-clamp.config.dcae.intentory.retry.limit=3
+clamp.config.dcae.intentory.retry.limit=5
 
 #DCAE Dispatcher Url Properties
 clamp.config.dcae.dispatcher.url=http://dcae.api.simpledemo.onap.org:8188
-clamp.config.dcae.dispatcher.retry.interval=10000
-clamp.config.dcae.dispatcher.retry.limit=10
+clamp.config.dcae.dispatcher.retry.interval=20000
+clamp.config.dcae.dispatcher.retry.limit=30
 clamp.config.dcae.header.requestId = X-ECOMP-RequestID
 
 #Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 9e2e3c9..cdbe613 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -177,7 +177,7 @@
 #
 # Operational Policy request build properties
 #
-clamp.config.op.policyDescription=from clds
+clamp.config.op.policyDescription=from CLAMP
 # default
 clamp.config.op.templateName=ClosedLoopControlName
 clamp.config.op.operationTopic=APPC-CL
@@ -214,12 +214,12 @@
 #DCAE Inventory Url Properties
 clamp.config.dcae.inventory.url=http://dcae.api.simpledemo.onap.org:8080
 clamp.config.dcae.intentory.retry.interval=10000
-clamp.config.dcae.intentory.retry.limit=3
+clamp.config.dcae.intentory.retry.limit=5
 
 #DCAE Dispatcher Url Properties
 clamp.config.dcae.dispatcher.url=http://dcae.api.simpledemo.onap.org:8188
-clamp.config.dcae.dispatcher.retry.interval=10000
-clamp.config.dcae.dispatcher.retry.limit=10
+clamp.config.dcae.dispatcher.retry.interval=20000
+clamp.config.dcae.dispatcher.retry.limit=30
 clamp.config.dcae.header.requestId = X-ECOMP-RequestID
 
 #Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !
diff --git a/src/main/resources/clds/camel/routes/flexible-flow.xml b/src/main/resources/clds/camel/routes/flexible-flow.xml
index 8305c2e..c7f7ec3 100644
--- a/src/main/resources/clds/camel/routes/flexible-flow.xml
+++ b/src/main/resources/clds/camel/routes/flexible-flow.xml
@@ -10,6 +10,7 @@
 										<constant>30000</constant>
 								</delay>
 								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
 								<to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate" />
 						</when>
 						<when>
@@ -22,6 +23,7 @@
 								</delay>
 								<to
 										uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.GuardPolicyDeleteDelegate" />
 						</when>
 						<when>
 								<simple> ${exchangeProperty.actionCd} == 'UPDATE'</simple>
@@ -31,16 +33,19 @@
 										<constant>30000</constant>
 								</delay>
 								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
 								<to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate" />
 						</when>
 						<when>
 								<simple> ${exchangeProperty.actionCd} == 'STOP'</simple>
 								<to
 										uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
+								<to uri="bean:org.onap.clamp.clds.client.GuardPolicyDeleteDelegate" />
 								<to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate" />
 						</when>
 						<when>
 								<simple> ${exchangeProperty.actionCd} == 'RESTART'</simple>
+								<to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
 								<to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
 								<to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate" />
 						</when>
diff --git a/src/main/resources/clds/templates/globalProperties.json b/src/main/resources/clds/templates/globalProperties.json
index 880b992..b6f68f6 100644
--- a/src/main/resources/clds/templates/globalProperties.json
+++ b/src/main/resources/clds/templates/globalProperties.json
@@ -78,7 +78,22 @@
 			"Failure_Exception": "Failure: Exception",
 			"Failure": "Failure: Other",
 			"Success": "Success"
-		}
+		},
+		"guardTargets": ".*",
+		"minGuard":1,
+		"maxGuard":1,
+		"limitGuard":1,
+		"timeUnitsGuard":{
+			"minute":"minute",
+			"hour":"hour",
+			"day":"day",
+			"week":"week",
+			"month":"month",
+			"year":"year"
+		},
+		"timeWindowGuard":10,
+		"guardActiveStart":"00:00:01-05:00",
+		"guardActiveEnd":"00:00:00-05:00"
 	},
 	"shared": {
 		"byService": {
diff --git a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
index 8e7e70d..3c508bd 100644
--- a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
@@ -5,20 +5,20 @@
  * 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. 
+ * 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 
+ *
+ * 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.clamp.clds.it;
@@ -34,22 +34,22 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.GeneralSecurityException;
-import java.security.Principal;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.xml.transform.TransformerException;
 
 import org.apache.commons.codec.DecoderException;
 import org.json.JSONException;
+import org.json.simple.parser.ParseException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Matchers;
 import org.mockito.Mockito;
 import org.onap.clamp.clds.dao.CldsDao;
-import org.onap.clamp.clds.model.CldsHealthCheck;
 import org.onap.clamp.clds.model.CldsInfo;
 import org.onap.clamp.clds.model.CldsModel;
 import org.onap.clamp.clds.model.CldsServiceData;
@@ -62,9 +62,9 @@
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -89,7 +89,7 @@
     private LoggingUtils util;
     /**
      * Setup the variable before the tests execution.
-     * 
+     *
      * @throws IOException
      *             In case of issues when opening the files
      */
@@ -99,6 +99,7 @@
         imageText = ResourceFileUtil.getResourceAsString("example/dao/image-template.xml");
         bpmnPropText = ResourceFileUtil.getResourceAsString("example/dao/bpmn-prop.json");
 
+        authList.add(new SimpleGrantedAuthority("permission-type-cl-manage|dev|*"));
         authList.add(new SimpleGrantedAuthority("permission-type-cl|dev|read"));
         authList.add(new SimpleGrantedAuthority("permission-type-cl|dev|update"));
         authList.add(new SimpleGrantedAuthority("permission-type-template|dev|read"));
@@ -148,7 +149,7 @@
     }
 
     @Test
-    public void testPutModel() {
+    public void testCompleteFlow() throws TransformerException, ParseException {
         SecurityContext securityContext = Mockito.mock(SecurityContext.class);
         Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
 
@@ -166,43 +167,50 @@
         assertEquals(bpmnText, newTemplateRead.getBpmnText());
         assertEquals(imageText, newTemplateRead.getImageText());
         // Save the model
+        String randomNameModel = RandomStringUtils.randomAlphanumeric(5);
         CldsModel newModel = new CldsModel();
-        newModel.setName(randomNameTemplate);
+        newModel.setName(randomNameModel);
         newModel.setBpmnText(bpmnText);
         newModel.setImageText(imageText);
         newModel.setPropText(bpmnPropText);
         newModel.setControlNamePrefix("ClosedLoop-");
-        newModel.setTemplateName("test-template");
+        newModel.setTemplateName(randomNameTemplate);
         newModel.setTemplateId(newTemplate.getId());
         newModel.setDocText(newTemplate.getPropText());
         // Test the PutModel method
-        String randomNameModel = RandomStringUtils.randomAlphanumeric(5);
+
         cldsService.putModel(randomNameModel, newModel);
         // Verify whether it has been added properly or not
         assertNotNull(cldsDao.getModel(randomNameModel));
+
+        // Verify with GetModel
+        assertEquals(cldsService.getModel(randomNameModel).getTemplateName(),randomNameTemplate);
+        assertEquals(cldsService.getModel(randomNameModel).getName(),randomNameModel);
+
+        assertTrue(cldsService.getModelNames().size() >= 1);
     }
 
     @Test
     public void testGetSdcServices() throws GeneralSecurityException, DecoderException, JSONException, IOException {
         String result = cldsService.getSdcServices();
         JSONAssert.assertEquals(
-                ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result,
-                true);
+            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result,
+            true);
     }
 
     @Test
     public void testGetSdcPropertiesByServiceUuidForRefresh()
-            throws GeneralSecurityException, DecoderException, JSONException, IOException {
+        throws GeneralSecurityException, DecoderException, JSONException, IOException {
         SecurityContext securityContext = Mockito.mock(SecurityContext.class);
         Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
 
         cldsService.setSecurityContext(securityContext);
         // Test basic functionalities
         String result = cldsService.getSdcPropertiesByServiceUUIDForRefresh("4cc5b45a-1f63-4194-8100-cd8e14248c92",
-                false);
+            false);
         JSONAssert.assertEquals(
-                ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"),
-                result, true);
+            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"),
+            result, true);
         // Now test the Cache effect
         CldsServiceData cldsServiceDataCache = cldsDao.getCldsServiceCache("c95b0e7c-c1f0-4287-9928-7964c5377a46");
         // Should not be there, so should be null