aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java29
-rw-r--r--src/main/java/org/onap/clamp/clds/dao/CldsDao.java133
-rw-r--r--src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java6
-rw-r--r--src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java23
-rw-r--r--src/main/java/org/onap/clamp/loop/CsarInstallerImpl.java5
-rw-r--r--src/main/java/org/onap/clamp/loop/Loop.java22
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopController.java48
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopOperation.java126
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopService.java52
-rw-r--r--src/main/java/org/onap/clamp/loop/log/LoopLog.java10
-rw-r--r--src/main/java/org/onap/clamp/loop/log/LoopLogService.java43
-rw-r--r--src/main/java/org/onap/clamp/policy/Policy.java18
-rw-r--r--src/main/java/org/onap/clamp/policy/PolicyOperation.java131
-rw-r--r--src/main/java/org/onap/clamp/policy/PolicyService.java4
-rw-r--r--src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java120
-rw-r--r--src/main/java/org/onap/clamp/policy/microservice/MicroservicePolicyService.java19
-rw-r--r--src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java69
-rw-r--r--src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html104
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js156
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/propertyController.js17
-rw-r--r--src/main/resources/application-noaaf.properties2
-rw-r--r--src/main/resources/application.properties2
-rw-r--r--src/main/resources/clds/camel/rest/clamp-api-v2.xml235
-rw-r--r--src/main/resources/clds/camel/routes/flexible-flow.xml172
-rw-r--r--src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java6
-rw-r--r--src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java66
-rw-r--r--src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java26
-rw-r--r--src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java22
-rw-r--r--src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java160
-rw-r--r--src/test/java/org/onap/clamp/loop/LoopToJsonTest.java23
-rw-r--r--src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java47
-rw-r--r--src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java64
-rw-r--r--src/test/resources/example/sdc/blueprint-dcae/tca.yaml1
-rw-r--r--src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml1
-rw-r--r--src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml1
-rw-r--r--src/test/resources/example/sdc/expected-result/policy-data.yaml2008
-rwxr-xr-xsrc/test/resources/example/sdc/service-Vloadbalancerms-csar.csarbin0 -> 112273 bytes
-rw-r--r--src/test/resources/tosca/guard1-policy-payload.json16
-rw-r--r--src/test/resources/tosca/guard2-policy-payload.json16
-rw-r--r--src/test/resources/tosca/micro-service-policy-payload.json41
-rw-r--r--src/test/resources/tosca/micro-service-policy-properties.json23
-rw-r--r--src/test/resources/tosca/operational-policy-payload.yaml31
-rw-r--r--src/test/resources/tosca/operational-policy-properties.json71
43 files changed, 3446 insertions, 723 deletions
diff --git a/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java b/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java
index 8372e3f59..8e1c75bb4 100644
--- a/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.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.config.spring;
@@ -28,10 +28,8 @@ import javax.xml.transform.TransformerConfigurationException;
import org.onap.clamp.clds.config.ClampProperties;
import org.onap.clamp.clds.config.EncodedPasswordBasicDataSource;
-import org.onap.clamp.clds.dao.CldsDao;
import org.onap.clamp.clds.transform.XslTransformer;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
@@ -50,7 +48,7 @@ public class CldsConfiguration {
/**
* Clds Identity database DataSource configuration
- *
+ *
* @return
*/
@Bean(name = "cldsDataSource")
@@ -66,13 +64,6 @@ public class CldsConfiguration {
return bean;
}
- @Bean(name = "cldsDao")
- public CldsDao getCldsDao(@Qualifier("cldsDataSource") DataSource dataSource) {
- CldsDao cldsDao = new CldsDao();
- cldsDao.setDataSource(dataSource);
- return cldsDao;
- }
-
@Bean(name = "cldsBpmnTransformer")
public XslTransformer getCldsBpmnXslTransformer() throws TransformerConfigurationException {
XslTransformer xslTransformer = new XslTransformer();
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 5da26b19a..0cf68ea1b 100644
--- a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
+++ b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
@@ -26,7 +26,6 @@ package org.onap.clamp.clds.dao;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
@@ -35,7 +34,6 @@ import java.util.Map;
import javax.sql.DataSource;
-import org.onap.clamp.clds.model.CldsDbServiceCache;
import org.onap.clamp.clds.model.CldsDictionary;
import org.onap.clamp.clds.model.CldsDictionaryItem;
import org.onap.clamp.clds.model.CldsEvent;
@@ -43,11 +41,11 @@ import org.onap.clamp.clds.model.CldsModel;
import org.onap.clamp.clds.model.CldsModelInstance;
import org.onap.clamp.clds.model.CldsModelProp;
import org.onap.clamp.clds.model.CldsMonitoringDetails;
-import org.onap.clamp.clds.model.CldsServiceData;
import org.onap.clamp.clds.model.CldsTemplate;
import org.onap.clamp.clds.model.CldsToscaModel;
import org.onap.clamp.clds.model.ValueItem;
-import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
@@ -86,14 +84,17 @@ public class CldsDao {
/**
* Log message when instantiating.
*/
- public CldsDao() {
+ @Autowired
+ public CldsDao(@Qualifier("cldsDataSource") DataSource dataSource) {
logger.info("CldsDao instantiating...");
+ setDataSource(dataSource);
}
/**
* When dataSource is provided, instantiate spring jdbc objects.
*
- * @param dataSource the data source
+ * @param dataSource
+ * the data source
*/
public void setDataSource(DataSource dataSource) {
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
@@ -117,7 +118,8 @@ public class CldsDao {
/**
* Get a model from the database given the model name.
*
- * @param modelName the model name
+ * @param modelName
+ * the model name
* @return the model
*/
public CldsModel getModel(String modelName) {
@@ -138,16 +140,19 @@ public class CldsDao {
/**
* Get a model from the database given the controlNameUuid.
*
- * @param controlNameUuid the control name uuid
+ * @param controlNameUuid
+ * the control name uuid
* @return the model by uuid
*/
public CldsModel getModelByUuid(String controlNameUuid) {
return getModel(null, controlNameUuid);
}
+
/**
* Get a model and template information from the database given the model name.
*
- * @param modelName the model name
+ * @param modelName
+ * the model name
* @return model model template
*/
@@ -179,8 +184,10 @@ public class CldsDao {
* Update model in the database using parameter values and return updated model
* object.
*
- * @param model the model
- * @param userid the userid
+ * @param model
+ * the model
+ * @param userid
+ * the userid
* @return model
*/
public CldsModel setModel(CldsModel model, String userid) {
@@ -208,8 +215,10 @@ public class CldsDao {
* Inserts new modelInstance in the database using parameter values and return
* updated model object.
*
- * @param model the model
- * @param modelInstancesList the model instances list
+ * @param model
+ * the model
+ * @param modelInstancesList
+ * the model instances list
*/
public void insModelInstance(CldsModel model, List<CldsModelInstance> modelInstancesList) {
// Delete all existing model instances for given controlNameUUID
@@ -241,10 +250,14 @@ public class CldsDao {
* Insert an event in the database - require either modelName or
* controlNamePrefix/controlNameUuid.
*
- * @param modelName the model name
- * @param controlNamePrefix the control name prefix
- * @param controlNameUuid the control name uuid
- * @param cldsEvent the clds event
+ * @param modelName
+ * the model name
+ * @param controlNamePrefix
+ * the control name prefix
+ * @param controlNameUuid
+ * the control name uuid
+ * @param cldsEvent
+ * the clds event
* @return clds event
*/
public CldsEvent insEvent(String modelName, String controlNamePrefix, String controlNameUuid, CldsEvent cldsEvent) {
@@ -268,8 +281,10 @@ public class CldsDao {
/**
* Update event with process instance id.
*
- * @param eventId the event id
- * @param processInstanceId the process instance id
+ * @param eventId
+ * the event id
+ * @param processInstanceId
+ * the process instance id
*/
public void updEvent(String eventId, String processInstanceId) {
SqlParameterSource in = new MapSqlParameterSource().addValue("v_event_id", eventId)
@@ -291,8 +306,10 @@ public class CldsDao {
* Update template in the database using parameter values and return updated
* template object.
*
- * @param template the template
- * @param userid the userid
+ * @param template
+ * the template
+ * @param userid
+ * the userid
*/
public void setTemplate(CldsTemplate template, String userid) {
SqlParameterSource in = new MapSqlParameterSource().addValue("v_template_name", template.getName())
@@ -322,7 +339,8 @@ public class CldsDao {
/**
* Get a template from the database given the model name.
*
- * @param templateName the template name
+ * @param templateName
+ * the template name
* @return model template
*/
public CldsTemplate getTemplate(String templateName) {
@@ -367,7 +385,7 @@ public class CldsDao {
public List<CldsModelProp> getDeployedModelProperties() {
List<CldsModelProp> cldsModelPropList = new ArrayList<>();
String modelsSql = "select m.model_id, m.model_name, mp.model_prop_id, mp.model_prop_text FROM model m, "
- + "model_properties mp, event e "
+ + "model_properties mp, event e "
+ "WHERE m.model_prop_id = mp.model_prop_id and m.event_id = e.event_id and e.action_cd = 'DEPLOY'";
List<Map<String, Object>> rows = jdbcTemplateObject.queryForList(modelsSql);
CldsModelProp cldsModelProp = null;
@@ -421,7 +439,8 @@ public class CldsDao {
/**
* Method to delete model from database.
*
- * @param modelName the model name
+ * @param modelName
+ * the model name
*/
public void deleteModel(String modelName) {
SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", modelName);
@@ -461,7 +480,8 @@ public class CldsDao {
/**
* Method to retrieve a tosca models by Policy Type from database.
*
- * @param policyType the policy type
+ * @param policyType
+ * the policy type
* @return List of CldsToscaModel
*/
public List<CldsToscaModel> getToscaModelByPolicyType(String policyType) {
@@ -471,7 +491,8 @@ public class CldsDao {
/**
* Method to retrieve a tosca models by toscaModelName, version from database.
*
- * @param toscaModelName the tosca model name
+ * @param toscaModelName
+ * the tosca model name
* @return List of CldsToscaModel
*/
public List<CldsToscaModel> getToscaModelByName(String toscaModelName) {
@@ -486,8 +507,7 @@ public class CldsDao {
String toscaModelSql = "SELECT tm.tosca_model_name, tm.tosca_model_id, tm.policy_type, "
+ "tmr.tosca_model_revision_id, tmr.tosca_model_json, tmr.version, tmr.user_id, tmr.createdTimestamp, "
- + "tmr.lastUpdatedTimestamp "
- + ((toscaModelName != null) ? (", tmr.tosca_model_yaml ") : " ")
+ + "tmr.lastUpdatedTimestamp " + ((toscaModelName != null) ? (", tmr.tosca_model_yaml ") : " ")
+ "FROM tosca_model tm, tosca_model_revision tmr WHERE tm.tosca_model_id = tmr.tosca_model_id "
+ ((toscaModelName != null) ? (" AND tm.tosca_model_name = '" + toscaModelName + "'") : " ")
+ ((policyType != null) ? (" AND tm.policy_type = '" + policyType + "'") : " ")
@@ -520,8 +540,10 @@ public class CldsDao {
/**
* Method to upload a new version of Tosca Model Yaml in Database.
*
- * @param cldsToscaModel the clds tosca model
- * @param userId the user id
+ * @param cldsToscaModel
+ * the clds tosca model
+ * @param userId
+ * the user id
* @return CldsToscaModel clds tosca model
*/
public CldsToscaModel updateToscaModelWithNewVersion(CldsToscaModel cldsToscaModel, String userId) {
@@ -537,8 +559,10 @@ public class CldsDao {
/**
* Method to upload a new Tosca model Yaml in DB. Default version is 1.0
*
- * @param cldsToscaModel the clds tosca model
- * @param userId the user id
+ * @param cldsToscaModel
+ * the clds tosca model
+ * @param userId
+ * the user id
* @return CldsToscaModel clds tosca model
*/
public CldsToscaModel insToscaModel(CldsToscaModel cldsToscaModel, String userId) {
@@ -558,7 +582,8 @@ public class CldsDao {
/**
* Method to insert a new Dictionary in Database.
*
- * @param cldsDictionary the clds dictionary
+ * @param cldsDictionary
+ * the clds dictionary
*/
public void insDictionary(CldsDictionary cldsDictionary) {
SqlParameterSource in = new MapSqlParameterSource()
@@ -571,9 +596,12 @@ public class CldsDao {
/**
* Method to update Dictionary with new info in Database.
*
- * @param dictionaryId the dictionary id
- * @param cldsDictionary the clds dictionary
- * @param userId the user id
+ * @param dictionaryId
+ * the dictionary id
+ * @param cldsDictionary
+ * the clds dictionary
+ * @param userId
+ * the user id
*/
public void updateDictionary(String dictionaryId, CldsDictionary cldsDictionary, String userId) {
@@ -586,8 +614,10 @@ public class CldsDao {
/**
* Method to get list of Dictionaries from the Database.
*
- * @param dictionaryId the dictionary id
- * @param dictionaryName the dictionary name
+ * @param dictionaryId
+ * the dictionary id
+ * @param dictionaryName
+ * the dictionary name
* @return dictionary
*/
public List<CldsDictionary> getDictionary(String dictionaryId, String dictionaryName) {
@@ -620,8 +650,10 @@ public class CldsDao {
/**
* Method to insert a new Dictionary Element for given dictionary in Database.
*
- * @param cldsDictionaryItem the clds dictionary item
- * @param userId the user id
+ * @param cldsDictionaryItem
+ * the clds dictionary item
+ * @param userId
+ * the user id
*/
public void insDictionarElements(CldsDictionaryItem cldsDictionaryItem, String userId) {
SqlParameterSource in = new MapSqlParameterSource()
@@ -638,9 +670,12 @@ public class CldsDao {
* Method to update Dictionary Elements with new info for a given dictionary in
* Database.
*
- * @param dictionaryElementId the dictionary element id
- * @param cldsDictionaryItem the clds dictionary item
- * @param userId the user id
+ * @param dictionaryElementId
+ * the dictionary element id
+ * @param cldsDictionaryItem
+ * the clds dictionary item
+ * @param userId
+ * the user id
*/
public void updateDictionaryElements(String dictionaryElementId, CldsDictionaryItem cldsDictionaryItem,
String userId) {
@@ -659,9 +694,12 @@ public class CldsDao {
* Method to get list of all dictionary elements for a given dictionary in the
* Database.
*
- * @param dictionaryName the dictionary name
- * @param dictionaryId the dictionary id
- * @param dictElementShortName the dict element short name
+ * @param dictionaryName
+ * the dictionary name
+ * @param dictionaryId
+ * the dictionary id
+ * @param dictElementShortName
+ * the dict element short name
* @return dictionary elements
*/
public List<CldsDictionaryItem> getDictionaryElements(String dictionaryName, String dictionaryId,
@@ -701,7 +739,8 @@ public class CldsDao {
* Method to get Map of all dictionary elements with key as dictionary short
* name and value as the full name.
*
- * @param dictionaryElementType the dictionary element type
+ * @param dictionaryElementType
+ * the dictionary element type
* @return Map of dictionary elements as key value pair
*/
public Map<String, String> getDictionaryElementsByType(String dictionaryElementType) {
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 7447fbae1..93374fe11 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
@@ -27,7 +27,6 @@ import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
import java.util.Collections;
import java.util.HashSet;
@@ -88,7 +87,8 @@ public class BlueprintParser {
}
}
String msName = theBiggestMicroServiceKey.toLowerCase().contains(HOLMES_PREFIX) ? HOLMES : TCA;
- return Collections.singletonList(new MicroService(msName, "", "", "", ""));
+ return Collections
+ .singletonList(new MicroService(msName, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "", "", ""));
}
String getName(Entry<String, JsonElement> entry) {
@@ -124,7 +124,7 @@ public class BlueprintParser {
if (properties.has(POLICYID)) {
JsonObject policyIdObj = properties.get(POLICYID).getAsJsonObject();
if (policyIdObj.has(POLICY_TYPEID)) {
- return policyIdObj.get(POLICY_TYPEID).getAsString();
+ return policyIdObj.get(POLICY_TYPEID).getAsString();
}
}
}
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
index b65a994ac..65d5592a8 100644
--- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
+++ b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
@@ -42,6 +42,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.commons.io.IOUtils;
+import org.codehaus.plexus.util.StringUtils;
import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
import org.onap.sdc.api.notification.IArtifactInfo;
@@ -71,6 +72,8 @@ public class CsarHandler {
public static final String RESOURCE_INSTANCE_NAME_PREFIX = "/Artifacts/Resources/";
public static final String RESOURCE_INSTANCE_NAME_SUFFIX = "/Deployment/";
public static final String POLICY_DEFINITION_NAME_SUFFIX = "Definitions/policies.yml";
+ public static final String DATA_DEFINITION_NAME_SUFFIX = "Definitions/data.yml";
+ public static final String DATA_DEFINITION_KEY = "data_types:";
public CsarHandler(INotificationData iNotif, String controller, String clampCsarPath) throws CsarHandlerException {
this.sdcNotification = iNotif;
@@ -159,6 +162,10 @@ public class CsarHandler {
return csarFilePath;
}
+ public String setFilePath(String newPath) {
+ return csarFilePath = newPath;
+ }
+
public synchronized ISdcCsarHelper getSdcCsarHelper() {
return sdcCsarHelper;
}
@@ -171,12 +178,26 @@ public class CsarHandler {
return mapOfBlueprints;
}
+ /**
+ * Get the whole policy model Yaml. It combines the content of policies.yaml and data.yaml.
+ * @return The whole policy model yaml
+ * @throws IOException The IO Exception
+ */
public Optional<String> getPolicyModelYaml() throws IOException {
String result = null;
try (ZipFile zipFile = new ZipFile(csarFilePath)) {
ZipEntry entry = zipFile.getEntry(POLICY_DEFINITION_NAME_SUFFIX);
if (entry != null) {
- result = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8);
+ ZipEntry data = zipFile.getEntry(DATA_DEFINITION_NAME_SUFFIX);
+ if (data != null) {
+ String dataStr = IOUtils.toString(zipFile.getInputStream(data), StandardCharsets.UTF_8);
+ String dataStrWithoutHeader = dataStr.substring(dataStr.indexOf(DATA_DEFINITION_KEY));
+ String policyStr = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8);
+ StringUtils.chomp(policyStr);
+ result = policyStr.concat(dataStrWithoutHeader);
+ } else {
+ result = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8);
+ }
} else {
logger.info("Policy model not found inside the CSAR file: " + csarFilePath);
}
diff --git a/src/main/java/org/onap/clamp/loop/CsarInstallerImpl.java b/src/main/java/org/onap/clamp/loop/CsarInstallerImpl.java
index 05d5c480c..9bb9e01e7 100644
--- a/src/main/java/org/onap/clamp/loop/CsarInstallerImpl.java
+++ b/src/main/java/org/onap/clamp/loop/CsarInstallerImpl.java
@@ -163,8 +163,9 @@ public class CsarInstallerImpl implements CsarInstaller {
Policy.generatePolicyName(microService.getName(), csar.getSdcNotification().getServiceName(),
csar.getSdcNotification().getServiceVersion(),
blueprintArtifact.getResourceAttached().getResourceInstanceName(),
- blueprintArtifact.getBlueprintArtifactName()), microService.getModelType(),
- csar.getPolicyModelYaml().orElse(""), false, new HashSet<>(Arrays.asList(newLoop)), microService.getBlueprintName());
+ blueprintArtifact.getBlueprintArtifactName()),
+ microService.getModelType(), csar.getPolicyModelYaml().orElse(""), false,
+ new HashSet<>(Arrays.asList(newLoop)));
newSet.add(microServicePolicy);
microService.setMappedNameJpa(microServicePolicy.getName());
diff --git a/src/main/java/org/onap/clamp/loop/Loop.java b/src/main/java/org/onap/clamp/loop/Loop.java
index e62874a8a..a24d3449f 100644
--- a/src/main/java/org/onap/clamp/loop/Loop.java
+++ b/src/main/java/org/onap/clamp/loop/Loop.java
@@ -134,7 +134,7 @@ public class Loop implements Serializable {
this.name = name;
}
- String getDcaeDeploymentId() {
+ public String getDcaeDeploymentId() {
return dcaeDeploymentId;
}
@@ -142,7 +142,7 @@ public class Loop implements Serializable {
this.dcaeDeploymentId = dcaeDeploymentId;
}
- String getDcaeDeploymentStatusUrl() {
+ public String getDcaeDeploymentStatusUrl() {
return dcaeDeploymentStatusUrl;
}
@@ -150,7 +150,7 @@ public class Loop implements Serializable {
this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl;
}
- String getSvgRepresentation() {
+ public String getSvgRepresentation() {
return svgRepresentation;
}
@@ -158,7 +158,7 @@ public class Loop implements Serializable {
this.svgRepresentation = svgRepresentation;
}
- String getBlueprint() {
+ public String getBlueprint() {
return blueprint;
}
@@ -166,7 +166,7 @@ public class Loop implements Serializable {
this.blueprint = blueprint;
}
- LoopState getLastComputedState() {
+ public LoopState getLastComputedState() {
return lastComputedState;
}
@@ -174,7 +174,7 @@ public class Loop implements Serializable {
this.lastComputedState = lastComputedState;
}
- Set<OperationalPolicy> getOperationalPolicies() {
+ public Set<OperationalPolicy> getOperationalPolicies() {
return operationalPolicies;
}
@@ -182,7 +182,7 @@ public class Loop implements Serializable {
this.operationalPolicies = operationalPolicies;
}
- Set<MicroServicePolicy> getMicroServicePolicies() {
+ public Set<MicroServicePolicy> getMicroServicePolicies() {
return microServicePolicies;
}
@@ -190,7 +190,7 @@ public class Loop implements Serializable {
this.microServicePolicies = microServicePolicies;
}
- JsonObject getGlobalPropertiesJson() {
+ public JsonObject getGlobalPropertiesJson() {
return globalPropertiesJson;
}
@@ -198,7 +198,7 @@ public class Loop implements Serializable {
this.globalPropertiesJson = globalPropertiesJson;
}
- Set<LoopLog> getLoopLogs() {
+ public Set<LoopLog> getLoopLogs() {
return loopLogs;
}
@@ -221,7 +221,7 @@ public class Loop implements Serializable {
log.setLoop(this);
}
- String getDcaeBlueprintId() {
+ public String getDcaeBlueprintId() {
return dcaeBlueprintId;
}
@@ -229,7 +229,7 @@ public class Loop implements Serializable {
this.dcaeBlueprintId = dcaeBlueprintId;
}
- JsonObject getModelPropertiesJson() {
+ public JsonObject getModelPropertiesJson() {
return modelPropertiesJson;
}
diff --git a/src/main/java/org/onap/clamp/loop/LoopController.java b/src/main/java/org/onap/clamp/loop/LoopController.java
index a02fa9333..b862780de 100644
--- a/src/main/java/org/onap/clamp/loop/LoopController.java
+++ b/src/main/java/org/onap/clamp/loop/LoopController.java
@@ -24,7 +24,6 @@
package org.onap.clamp.loop;
import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
@@ -42,9 +41,9 @@ public class LoopController {
private final LoopService loopService;
private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken<List<OperationalPolicy>>() {
- }.getType();
+ }.getType();
private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken<List<MicroServicePolicy>>() {
- }.getType();
+ }.getType();
@Autowired
public LoopController(LoopService loopService) {
@@ -61,32 +60,41 @@ public class LoopController {
/**
* Update the Operational Policy properties.
- * @param loopName The loop name
- * @param operationalPoliciesJson The new Operational Policy properties
+ *
+ * @param loopName
+ * The loop name
+ * @param operationalPoliciesJson
+ * The new Operational Policy properties
* @return The updated loop
*/
public Loop updateOperationalPolicies(String loopName, JsonArray operationalPoliciesJson) {
- List<OperationalPolicy> operationalPolicies = JsonUtils.GSON
- .fromJson(operationalPoliciesJson, OPERATIONAL_POLICY_TYPE);
+ List<OperationalPolicy> operationalPolicies = JsonUtils.GSON.fromJson(operationalPoliciesJson,
+ OPERATIONAL_POLICY_TYPE);
return loopService.updateAndSaveOperationalPolicies(loopName, operationalPolicies);
}
/**
* Update the whole array of MicroService policies properties
- * @param loopName The loop name
- * @param microServicePoliciesJson The array of all MicroService policies properties
+ *
+ * @param loopName
+ * The loop name
+ * @param microServicePoliciesJson
+ * The array of all MicroService policies properties
* @return The updated loop
*/
public Loop updateMicroservicePolicies(String loopName, JsonArray microServicePoliciesJson) {
- List<MicroServicePolicy> microservicePolicies = JsonUtils.GSON
- .fromJson(microServicePoliciesJson, MICROSERVICE_POLICY_TYPE);
+ List<MicroServicePolicy> microservicePolicies = JsonUtils.GSON.fromJson(microServicePoliciesJson,
+ MICROSERVICE_POLICY_TYPE);
return loopService.updateAndSaveMicroservicePolicies(loopName, microservicePolicies);
}
/**
* Update the global properties
- * @param loopName The loop name
- * @param globalProperties The updated global properties
+ *
+ * @param loopName
+ * The loop name
+ * @param globalProperties
+ * The updated global properties
* @return The updated loop
*/
public Loop updateGlobalPropertiesJson(String loopName, JsonObject globalProperties) {
@@ -95,8 +103,11 @@ public class LoopController {
/**
* Update one MicroService policy properties
- * @param loopName The loop name
- * @param newMicroservicePolicy The new MicroService policy properties
+ *
+ * @param loopName
+ * The loop name
+ * @param newMicroservicePolicy
+ * The new MicroService policy properties
* @return The updated MicroService policy
*/
public MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) {
@@ -105,11 +116,12 @@ public class LoopController {
/**
* Get the SVG representation of the loop
- * @param loopName The loop name
+ *
+ * @param loopName
+ * The loop name
* @return The SVG representation
*/
public String getSVGRepresentation(String loopName) {
- return loopService.getClosedLoopModelSVG(loopName);
-
+ return loopService.getLoop(loopName).getSvgRepresentation();
}
}
diff --git a/src/main/java/org/onap/clamp/loop/LoopOperation.java b/src/main/java/org/onap/clamp/loop/LoopOperation.java
index 7def783b5..5b55ab0de 100644
--- a/src/main/java/org/onap/clamp/loop/LoopOperation.java
+++ b/src/main/java/org/onap/clamp/loop/LoopOperation.java
@@ -45,7 +45,6 @@ import org.onap.clamp.clds.config.ClampProperties;
import org.onap.clamp.clds.util.LoggingUtils;
import org.onap.clamp.clds.util.ONAPLogConstants;
import org.onap.clamp.exception.OperationException;
-import org.onap.clamp.policy.PolicyOperation;
import org.onap.clamp.util.HttpConnectionManager;
import org.slf4j.event.Level;
import org.springframework.beans.factory.annotation.Autowired;
@@ -59,30 +58,30 @@ import org.yaml.snakeyaml.Yaml;
@Component
public class LoopOperation {
- protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class);
- protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger();
+ protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class);
+ protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger();
private final DcaeDispatcherServices dcaeDispatcherServices;
private final LoopService loopService;
private LoggingUtils util = new LoggingUtils(logger);
- private PolicyOperation policyOp;
@Autowired
private HttpServletRequest request;
@Autowired
- public LoopOperation(LoopService loopService, DcaeDispatcherServices dcaeDispatcherServices,
- ClampProperties refProp, HttpConnectionManager httpConnectionManager, PolicyOperation policyOp) {
+ public LoopOperation(LoopService loopService, DcaeDispatcherServices dcaeDispatcherServices,
+ ClampProperties refProp, HttpConnectionManager httpConnectionManager) {
this.loopService = loopService;
this.dcaeDispatcherServices = dcaeDispatcherServices;
- this.policyOp = policyOp;
}
/**
* Deploy the closed loop.
*
- * @param loopName the loop name
+ * @param loopName
+ * the loop name
* @return the updated loop
- * @throws Exceptions during the operation
+ * @throws Exceptions
+ * during the operation
*/
public Loop deployLoop(Exchange camelExchange, String loopName) throws OperationException {
util.entering(request, "CldsService: Deploy model");
@@ -98,10 +97,9 @@ public class LoopOperation {
// verify the current closed loop state
if (loop.getLastComputedState() != LoopState.SUBMITTED) {
- String msg = "Deploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
+ String msg = "Deploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
+ ". It could be deployed only when it is in SUBMITTED state.";
- util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
- ONAPLogConstants.ResponseStatus.ERROR);
+ util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
}
@@ -118,25 +116,27 @@ public class LoopOperation {
Map<String, Object> yamlMap = yaml.load(loop.getBlueprint());
JsonObject bluePrint = wrapSnakeObject(yamlMap).getAsJsonObject();
- loop.setDcaeDeploymentStatusUrl(dcaeDispatcherServices.createNewDeployment(deploymentId, loop.getDcaeBlueprintId(), bluePrint));
+ loop.setDcaeDeploymentStatusUrl(
+ dcaeDispatcherServices.createNewDeployment(deploymentId, loop.getDcaeBlueprintId(), bluePrint));
loop.setLastComputedState(LoopState.DEPLOYED);
// save the updated loop
- loopService.saveOrUpdateLoop (loop);
+ loopService.saveOrUpdateLoop(loop);
// audit log
LoggingUtils.setTimeContext(startTime, new Date());
auditLogger.info("Deploy model completed");
util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
- return loop;
+ return loop;
}
/**
* Un deploy closed loop.
*
- * @param loopName the loop name
+ * @param loopName
+ * the loop name
* @return the updated loop
*/
- public Loop unDeployLoop(String loopName) throws OperationException {
+ public Loop unDeployLoop(String loopName) throws OperationException {
util.entering(request, "LoopOperation: Undeploy the closed loop");
Date startTime = new Date();
Loop loop = loopService.getLoop(loopName);
@@ -146,14 +146,13 @@ public class LoopOperation {
util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO,
ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
- }
+ }
// verify the current closed loop state
if (loop.getLastComputedState() != LoopState.DEPLOYED) {
- String msg = "Unploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
+ String msg = "Unploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
+ ". It could be undeployed only when it is in DEPLOYED state.";
- util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
- ONAPLogConstants.ResponseStatus.ERROR);
+ util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
}
@@ -165,7 +164,7 @@ public class LoopOperation {
loop.setLastComputedState(LoopState.SUBMITTED);
// save the updated loop
- loopService.saveOrUpdateLoop (loop);
+ loopService.saveOrUpdateLoop(loop);
// audit log
LoggingUtils.setTimeContext(startTime, new Date());
@@ -175,14 +174,14 @@ public class LoopOperation {
}
private JsonElement wrapSnakeObject(Object o) {
- //NULL => JsonNull
+ // NULL => JsonNull
if (o == null)
return JsonNull.INSTANCE;
// Collection => JsonArray
if (o instanceof Collection) {
JsonArray array = new JsonArray();
- for (Object childObj : (Collection<?>)o)
+ for (Object childObj : (Collection<?>) o)
array.add(wrapSnakeObject(childObj));
return array;
}
@@ -192,14 +191,14 @@ public class LoopOperation {
JsonArray array = new JsonArray();
int length = Array.getLength(array);
- for (int i=0; i<length; i++)
+ for (int i = 0; i < length; i++)
array.add(wrapSnakeObject(Array.get(array, i)));
return array;
}
// Map => JsonObject
if (o instanceof Map) {
- Map<?, ?> map = (Map<?, ?>)o;
+ Map<?, ?> map = (Map<?, ?>) o;
JsonObject jsonObject = new JsonObject();
for (final Map.Entry<?, ?> entry : map.entrySet()) {
@@ -217,12 +216,15 @@ public class LoopOperation {
/**
* Submit the Ms policies.
*
- * @param loopName the loop name
+ * @param loopName
+ * the loop name
* @return the updated loop
- * @throws IOException IO exception
- * @throws Exceptions during the operation
+ * @throws IOException
+ * IO exception
+ * @throws Exceptions
+ * during the operation
*/
- public Loop submitMsPolicies (String loopName) throws OperationException, IOException {
+ public Loop submitMsPolicies(String loopName) throws OperationException, IOException {
util.entering(request, "LoopOperation: delete microservice policies");
Date startTime = new Date();
Loop loop = loopService.getLoop(loopName);
@@ -236,33 +238,34 @@ public class LoopOperation {
// verify the current closed loop state
if (loop.getLastComputedState() != LoopState.SUBMITTED && loop.getLastComputedState() != LoopState.DESIGN) {
- String msg = "Submit MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ String msg = "Submit MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ ". It could be deleted only when it is in SUBMITTED state.";
- util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
- ONAPLogConstants.ResponseStatus.ERROR);
+ util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
}
// Establish the api call to Policy to create the ms services
- policyOp.createMsPolicy(loop.getMicroServicePolicies());
+ // policyOp.createMsPolicy(loop.getMicroServicePolicies());
// audit log
LoggingUtils.setTimeContext(startTime, new Date());
auditLogger.info("Deletion of MS policies completed");
util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
- return loop;
+ return loop;
}
-
/**
* Delete the Ms policies.
*
- * @param loopName the loop name
+ * @param loopName
+ * the loop name
* @return the updated loop
- * @throws IOException IO exception
- * @throws Exceptions during the operation
+ * @throws IOException
+ * IO exception
+ * @throws Exceptions
+ * during the operation
*/
- public Loop deleteMsPolicies (Exchange camelExchange, String loopName) throws OperationException, IOException {
+ public Loop deleteMsPolicies(Exchange camelExchange, String loopName) throws OperationException, IOException {
util.entering(request, "LoopOperation: delete microservice policies");
Date startTime = new Date();
Loop loop = loopService.getLoop(loopName);
@@ -276,31 +279,32 @@ public class LoopOperation {
// verify the current closed loop state
if (loop.getLastComputedState() != LoopState.SUBMITTED) {
- String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ ". It could be deleted only when it is in SUBMITTED state.";
- util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
- ONAPLogConstants.ResponseStatus.ERROR);
+ util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
}
// Establish the api call to Policy to create the ms services
- policyOp.deleteMsPolicy(loop.getMicroServicePolicies());
+ // policyOp.deleteMsPolicy(loop.getMicroServicePolicies());
// audit log
LoggingUtils.setTimeContext(startTime, new Date());
auditLogger.info("Deletion of MS policies completed");
util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
- return loop;
+ return loop;
}
/**
* Delete the operational policy.
*
- * @param loopName the loop name
+ * @param loopName
+ * the loop name
* @return the updated loop
- * @throws Exceptions during the operation
+ * @throws Exceptions
+ * during the operation
*/
- public Loop deleteOpPolicy (Exchange camelExchange, String loopName) throws OperationException {
+ public Loop deleteOpPolicy(Exchange camelExchange, String loopName) throws OperationException {
util.entering(request, "LoopOperation: delete guard policy");
Date startTime = new Date();
Loop loop = loopService.getLoop(loopName);
@@ -314,31 +318,32 @@ public class LoopOperation {
// verify the current closed loop state
if (loop.getLastComputedState() != LoopState.SUBMITTED) {
- String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ ". It could be deleted only when it is in SUBMITTED state.";
- util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
- ONAPLogConstants.ResponseStatus.ERROR);
+ util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
}
// Establish the api call to Policy to delete operational policy
- //client.deleteOpPolicy();
+ // client.deleteOpPolicy();
// audit log
LoggingUtils.setTimeContext(startTime, new Date());
auditLogger.info("Deletion of Guard policy completed");
util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
- return loop;
+ return loop;
}
/**
* Delete the Guard policy.
*
- * @param loopName the loop name
+ * @param loopName
+ * the loop name
* @return the updated loop
- * @throws Exceptions during the operation
+ * @throws Exceptions
+ * during the operation
*/
- public Loop deleteGuardPolicy (Exchange camelExchange, String loopName) throws OperationException {
+ public Loop deleteGuardPolicy(Exchange camelExchange, String loopName) throws OperationException {
util.entering(request, "LoopOperation: delete operational policy");
Date startTime = new Date();
Loop loop = loopService.getLoop(loopName);
@@ -352,20 +357,19 @@ public class LoopOperation {
// verify the current closed loop state
if (loop.getLastComputedState() != LoopState.SUBMITTED) {
- String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
+ ". It could be deleted only when it is in SUBMITTED state.";
- util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
- ONAPLogConstants.ResponseStatus.ERROR);
+ util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
throw new OperationException(msg);
}
// Establish the api call to Policy to delete Guard policy
- //client.deleteOpPolicy();
+ // client.deleteOpPolicy();
// audit log
LoggingUtils.setTimeContext(startTime, new Date());
auditLogger.info("Deletion of operational policy completed");
util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
- return loop;
+ return loop;
}
}
diff --git a/src/main/java/org/onap/clamp/loop/LoopService.java b/src/main/java/org/onap/clamp/loop/LoopService.java
index 34e1b4bef..8d61b877b 100644
--- a/src/main/java/org/onap/clamp/loop/LoopService.java
+++ b/src/main/java/org/onap/clamp/loop/LoopService.java
@@ -23,20 +23,22 @@
package org.onap.clamp.loop;
+import com.google.gson.JsonObject;
+
import java.util.List;
import java.util.Set;
-import com.google.gson.JsonObject;
-
import javax.persistence.EntityNotFoundException;
import org.onap.clamp.policy.microservice.MicroServicePolicy;
import org.onap.clamp.policy.microservice.MicroservicePolicyService;
import org.onap.clamp.policy.operational.OperationalPolicy;
import org.onap.clamp.policy.operational.OperationalPolicyService;
+import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service
+@Component
public class LoopService {
private final LoopsRepository loopsRepository;
@@ -46,15 +48,14 @@ public class LoopService {
/**
* Constructor.
*/
- public LoopService(LoopsRepository loopsRepository,
- MicroservicePolicyService microservicePolicyService,
+ public LoopService(LoopsRepository loopsRepository, MicroservicePolicyService microservicePolicyService,
OperationalPolicyService operationalPolicyService) {
this.loopsRepository = loopsRepository;
this.microservicePolicyService = microservicePolicyService;
this.operationalPolicyService = operationalPolicyService;
}
- public Loop saveOrUpdateLoop(Loop loop) {
+ Loop saveOrUpdateLoop(Loop loop) {
return loopsRepository.save(loop);
}
@@ -63,61 +64,36 @@ public class LoopService {
}
public Loop getLoop(String loopName) {
- return loopsRepository
- .findById(loopName)
- .orElse(null);
- }
-
- String getClosedLoopModelSVG(String loopName) {
- Loop closedLoopByName = findClosedLoopByName(loopName);
- return closedLoopByName.getSvgRepresentation();
+ return loopsRepository.findById(loopName).orElse(null);
}
Loop updateAndSaveOperationalPolicies(String loopName, List<OperationalPolicy> newOperationalPolicies) {
Loop loop = findClosedLoopByName(loopName);
- updateOperationalPolicies(loop, newOperationalPolicies);
+ Set<OperationalPolicy> newPolicies = operationalPolicyService.updatePolicies(loop, newOperationalPolicies);
+ loop.setOperationalPolicies(newPolicies);
return loopsRepository.save(loop);
}
Loop updateAndSaveMicroservicePolicies(String loopName, List<MicroServicePolicy> newMicroservicePolicies) {
Loop loop = findClosedLoopByName(loopName);
- updateMicroservicePolicies(loop, newMicroservicePolicies);
+ Set<MicroServicePolicy> newPolicies = microservicePolicyService.updatePolicies(loop, newMicroservicePolicies);
+ loop.setMicroServicePolicies(newPolicies);
return loopsRepository.save(loop);
}
Loop updateAndSaveGlobalPropertiesJson(String loopName, JsonObject newGlobalPropertiesJson) {
Loop loop = findClosedLoopByName(loopName);
- updateGlobalPropertiesJson(loop, newGlobalPropertiesJson);
+ loop.setGlobalPropertiesJson(newGlobalPropertiesJson);
return loopsRepository.save(loop);
}
MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) {
Loop loop = findClosedLoopByName(loopName);
- MicroServicePolicy newPolicies = microservicePolicyService
- .getAndUpdateMicroServicePolicy(loop, newMicroservicePolicy);
+ MicroServicePolicy newPolicies = microservicePolicyService.getAndUpdateMicroServicePolicy(loop,
+ newMicroservicePolicy);
return newPolicies;
}
- private Loop updateOperationalPolicies(Loop loop, List<OperationalPolicy> newOperationalPolicies) {
- Set<OperationalPolicy> newPolicies = operationalPolicyService
- .updatePolicies(loop, newOperationalPolicies);
-
- loop.setOperationalPolicies(newPolicies);
- return loop;
- }
-
- private Loop updateMicroservicePolicies(Loop loop, List<MicroServicePolicy> newMicroservicePolicies) {
- Set<MicroServicePolicy> newPolicies = microservicePolicyService
- .updatePolicies(loop, newMicroservicePolicies);
- loop.setMicroServicePolicies(newPolicies);
- return loop;
- }
-
- private Loop updateGlobalPropertiesJson(Loop loop, JsonObject newGlobalPropertiesJson) {
- loop.setGlobalPropertiesJson(newGlobalPropertiesJson);
- return loop;
- }
-
private Loop findClosedLoopByName(String loopName) {
return loopsRepository.findById(loopName)
.orElseThrow(() -> new EntityNotFoundException("Couldn't find closed loop named: " + loopName));
diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLog.java b/src/main/java/org/onap/clamp/loop/log/LoopLog.java
index 0c51c0c1f..3edb2ee59 100644
--- a/src/main/java/org/onap/clamp/loop/log/LoopLog.java
+++ b/src/main/java/org/onap/clamp/loop/log/LoopLog.java
@@ -40,6 +40,7 @@ import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
+
import org.onap.clamp.loop.Loop;
/**
@@ -79,6 +80,15 @@ public class LoopLog implements Serializable {
@Column(name = "log_instant", nullable = false)
private Instant logInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS);
+ public LoopLog() {
+ }
+
+ public LoopLog(String message, LogType logType, Loop loop) {
+ this.message = message;
+ this.logType = logType;
+ this.loop = loop;
+ }
+
public Long getId() {
return id;
}
diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLogService.java b/src/main/java/org/onap/clamp/loop/log/LoopLogService.java
new file mode 100644
index 000000000..b593b41ed
--- /dev/null
+++ b/src/main/java/org/onap/clamp/loop/log/LoopLogService.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 Nokia 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.loop.log;
+
+import org.onap.clamp.loop.Loop;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoopLogService {
+
+ private final LoopLogRepository repository;
+
+ @Autowired
+ public LoopLogService(LoopLogRepository repository) {
+ this.repository = repository;
+ }
+
+ public void addLog(String message, String logType, Loop loop) {
+ repository.save(new LoopLog(message, LogType.valueOf(logType), loop));
+ }
+}
diff --git a/src/main/java/org/onap/clamp/policy/Policy.java b/src/main/java/org/onap/clamp/policy/Policy.java
index 683881bfa..f4efab0d7 100644
--- a/src/main/java/org/onap/clamp/policy/Policy.java
+++ b/src/main/java/org/onap/clamp/policy/Policy.java
@@ -31,13 +31,21 @@ public interface Policy {
JsonObject getJsonRepresentation();
+ String createPolicyPayload();
+
/**
* Generate the policy name.
- * @param policyType The policy type
- * @param serviceName The service name
- * @param serviceVersion The service version
- * @param resourceName The resource name
- * @param blueprintFilename The blueprint file name
+ *
+ * @param policyType
+ * The policy type
+ * @param serviceName
+ * The service name
+ * @param serviceVersion
+ * The service version
+ * @param resourceName
+ * The resource name
+ * @param blueprintFilename
+ * The blueprint file name
* @return The generated policy name
*/
static String generatePolicyName(String policyType, String serviceName, String serviceVersion, String resourceName,
diff --git a/src/main/java/org/onap/clamp/policy/PolicyOperation.java b/src/main/java/org/onap/clamp/policy/PolicyOperation.java
deleted file mode 100644
index edce8ff50..000000000
--- a/src/main/java/org/onap/clamp/policy/PolicyOperation.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 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.policy;
-
-import java.io.IOException;
-import java.util.Set;
-
-import org.onap.clamp.clds.config.ClampProperties;
-import org.onap.clamp.policy.microservice.MicroServicePolicy;
-import org.onap.clamp.util.HttpConnectionManager;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-
-@Component
-public class PolicyOperation {
- protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyOperation.class);
- protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
- public static final String POLICY_MSTYPE_PROPERTY_NAME = "policy.ms.type";
- public static final String POLICY_ONAPNAME_PROPERTY_NAME = "policy.onap.name";
- public static final String POLICY_BASENAME_PREFIX_PROPERTY_NAME = "policy.base.policyNamePrefix";
- public static final String POLICY_OP_NAME_PREFIX_PROPERTY_NAME = "policy.op.policyNamePrefix";
- public static final String POLICY_MS_NAME_PREFIX_PROPERTY_NAME = "policy.ms.policyNamePrefix";
- public static final String POLICY_OP_TYPE_PROPERTY_NAME = "policy.op.type";
- public static final String POLICY_GUARD_SUFFIX = "_Guard";
- public static final String POLICY_URL_PROPERTY_NAME = "clamp.config.policy.url";
- public static final String POLICY_URL_SUFFIX = "/versions/1.0.0/policies";
- public static final String POLICY_USER_NAME = "clamp.config.policy.userName";
- public static final String POLICY_PASSWORD = "clamp.config.policy.password";
-
- public static final String TOSCA_DEF_VERSION = "tosca_definitions_version";
- public static final String TOSCA_DEF_VERSION_VALUE = "tosca_simple_yaml_1_0_0";
- public static final String TEMPLATE = "topology_template";
- public static final String POLICIES = "policies";
- public static final String MS_TYPE = "type";
- public static final String MS_VERSION = "version";
- public static final String MS_VERSION_VALUE = "1.0.0";
- public static final String MS_METADATA = "metadata";
- public static final String MS_POLICY_ID = "policy_id";
- public static final String MS_PROPERTIES = "properties";
- public static final String MS_policy = "tca_policy";
-
- private final ClampProperties refProp;
- private final HttpConnectionManager httpConnectionManager;
-
- @Autowired
- public PolicyOperation(ClampProperties refProp, HttpConnectionManager httpConnectionManager) {
- this.refProp = refProp;
- this.httpConnectionManager = httpConnectionManager;
- }
-
- public void createMsPolicy(Set<MicroServicePolicy> policyList) throws IOException {
- // Get policy first? if exist delete???
- // push pdp group
- for (MicroServicePolicy msPolicy:policyList) {
- JsonObject payload = createMsPolicyPayload(msPolicy);
- String policyType = msPolicy.getModelType();
- String url = refProp.getStringValue(POLICY_URL_PROPERTY_NAME) + policyType + POLICY_URL_SUFFIX;
- String userName = refProp.getStringValue(POLICY_USER_NAME);
- String encodedPass = refProp.getStringValue(POLICY_PASSWORD);
- httpConnectionManager.doHttpRequest(url, "POST", payload.toString(), "application/json", "POLICY", userName, encodedPass);
- }
- }
-
- public void deleteMsPolicy(Set<MicroServicePolicy> policyList) throws IOException {
- for (MicroServicePolicy msPolicy:policyList) {
- String policyType = msPolicy.getModelType();
- String url = refProp.getStringValue(POLICY_URL_PROPERTY_NAME) + policyType + POLICY_URL_SUFFIX + "/" + msPolicy.getName();
- String userName = refProp.getStringValue(POLICY_USER_NAME);
- String encodedPass = refProp.getStringValue(POLICY_PASSWORD);
- httpConnectionManager.doHttpRequest(url, "POST", null, null, "POLICY", userName, encodedPass);
- }
- }
-
- private JsonObject createMsPolicyPayload(MicroServicePolicy microService) {
- JsonObject policyConfig = new JsonObject();
- policyConfig.add(MS_policy, microService.getProperties());
-
- JsonObject properties = new JsonObject();
- properties.add(MS_policy, policyConfig);
-
- JsonObject msPolicy = new JsonObject();
- msPolicy.addProperty(MS_TYPE, microService.getModelType());
- msPolicy.addProperty(MS_VERSION, MS_VERSION_VALUE);
- JsonObject metaData = new JsonObject();
- metaData.addProperty(MS_POLICY_ID, microService.getName());
- msPolicy.add(MS_METADATA, metaData);
- msPolicy.add(MS_PROPERTIES, properties);
-
- JsonObject msPolicyWithName = new JsonObject();
- msPolicyWithName.add(microService.getName(), msPolicy);
-
- JsonArray policyArray = new JsonArray();
- policyArray.add(msPolicyWithName);
-
- JsonObject template = new JsonObject();
- template.add(POLICIES, policyArray);
-
- JsonObject configPolicy = new JsonObject();
- configPolicy.addProperty(TOSCA_DEF_VERSION, TOSCA_DEF_VERSION_VALUE);
- configPolicy.add(TEMPLATE, template);
-
- return configPolicy;
- }
-
-}
diff --git a/src/main/java/org/onap/clamp/policy/PolicyService.java b/src/main/java/org/onap/clamp/policy/PolicyService.java
index 05785c045..ae15f86da 100644
--- a/src/main/java/org/onap/clamp/policy/PolicyService.java
+++ b/src/main/java/org/onap/clamp/policy/PolicyService.java
@@ -25,12 +25,12 @@ package org.onap.clamp.policy;
import java.util.List;
import java.util.Set;
+
import org.onap.clamp.loop.Loop;
public interface PolicyService<T extends Policy> {
- Set<T> updatePolicies(Loop loop,
- List<T> newMicroservicePolicies);
+ Set<T> updatePolicies(Loop loop, List<T> newPolicies);
boolean isExisting(String policyName);
}
diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java
index c2c60c9c0..332b20a07 100644
--- a/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java
+++ b/src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java
@@ -23,15 +23,20 @@
package org.onap.clamp.policy.microservice;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.annotations.Expose;
import java.io.Serializable;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@@ -39,11 +44,13 @@ import javax.persistence.Table;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
+import org.json.JSONObject;
import org.onap.clamp.clds.tosca.ToscaYamlToJsonConvertor;
import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
import org.onap.clamp.loop.Loop;
import org.onap.clamp.policy.Policy;
+import org.yaml.snakeyaml.Yaml;
@Entity
@Table(name = "micro_service_policies")
@@ -64,10 +71,6 @@ public class MicroServicePolicy implements Serializable, Policy {
private String modelType;
@Expose
- @Column(nullable = false, name = "blueprint_name")
- private String blueprintName;
-
- @Expose
@Type(type = "json")
@Column(columnDefinition = "json", name = "properties")
private JsonObject properties;
@@ -84,7 +87,7 @@ public class MicroServicePolicy implements Serializable, Policy {
@Column(columnDefinition = "json", name = "json_representation", nullable = false)
private JsonObject jsonRepresentation;
- @ManyToMany(mappedBy = "microServicePolicies")
+ @ManyToMany(mappedBy = "microServicePolicies", fetch = FetchType.EAGER)
private Set<Loop> usedByLoops = new HashSet<>();
public MicroServicePolicy() {
@@ -92,15 +95,22 @@ public class MicroServicePolicy implements Serializable, Policy {
}
/**
- * The constructor.
- * @param name The name of the MicroService
- * @param type The model type of the MicroService
- * @param blueprintName The name in the blueprint
- * @param policyTosca The policy Tosca of the MicroService
- * @param shared The flag indicate whether the MicroService is shared
- * @param usedByLoops The list of loops that uses this MicroService
+ * The constructor that create the json representation from the policyTosca
+ * using the ToscaYamlToJsonConvertor.
+ *
+ * @param name
+ * The name of the MicroService
+ * @param type
+ * The model type of the MicroService
+ * @param policyTosca
+ * The policy Tosca of the MicroService
+ * @param shared
+ * The flag indicate whether the MicroService is shared
+ * @param usedByLoops
+ * The list of loops that uses this MicroService
*/
- public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared, Set<Loop> usedByLoops, String blueprintName) {
+ public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared,
+ Set<Loop> usedByLoops) {
this.name = name;
this.modelType = modelType;
this.policyTosca = policyTosca;
@@ -108,28 +118,39 @@ public class MicroServicePolicy implements Serializable, Policy {
this.jsonRepresentation = JsonUtils.GSON_JPA_MODEL
.fromJson(new ToscaYamlToJsonConvertor(null).parseToscaYaml(policyTosca), JsonObject.class);
this.usedByLoops = usedByLoops;
- this.blueprintName = blueprintName;
+ }
+
+ private JsonObject createJsonFromPolicyTosca() {
+ Map<String, Object> map = new Yaml().load(this.getPolicyTosca());
+ JSONObject jsonObject = new JSONObject(map);
+ return new Gson().fromJson(jsonObject.toString(), JsonObject.class);
}
/**
- * The constructor.
- * @param name The name of the MicroService
- * @param type The model type of the MicroService
- * @param blueprintName The name in the blueprint
- * @param policyTosca The policy Tosca of the MicroService
- * @param shared The flag indicate whether the MicroService is shared
- * @param jsonRepresentation The UI representation in json format
- * @param usedByLoops The list of loops that uses this MicroService
+ * The constructor that does not make use of ToscaYamlToJsonConvertor but take
+ * the jsonRepresentation instead.
+ *
+ * @param name
+ * The name of the MicroService
+ * @param type
+ * The model type of the MicroService
+ * @param policyTosca
+ * The policy Tosca of the MicroService
+ * @param shared
+ * The flag indicate whether the MicroService is shared
+ * @param jsonRepresentation
+ * The UI representation in json format
+ * @param usedByLoops
+ * The list of loops that uses this MicroService
*/
- public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared, JsonObject jsonRepresentation,
- Set<Loop> usedByLoops, String blueprintName) {
+ public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared,
+ JsonObject jsonRepresentation, Set<Loop> usedByLoops) {
this.name = name;
this.modelType = modelType;
this.policyTosca = policyTosca;
this.shared = shared;
this.usedByLoops = usedByLoops;
this.jsonRepresentation = jsonRepresentation;
- this.blueprintName = blueprintName;
}
@Override
@@ -141,8 +162,8 @@ public class MicroServicePolicy implements Serializable, Policy {
return modelType;
}
- public String getBlueprintName() {
- return blueprintName;
+ void setModelType(String modelType) {
+ this.modelType = modelType;
}
public JsonObject getProperties() {
@@ -157,7 +178,7 @@ public class MicroServicePolicy implements Serializable, Policy {
return shared;
}
- public void setShared(Boolean shared) {
+ void setShared(Boolean shared) {
this.shared = shared;
}
@@ -165,7 +186,7 @@ public class MicroServicePolicy implements Serializable, Policy {
return policyTosca;
}
- public void setPolicyTosca(String policyTosca) {
+ void setPolicyTosca(String policyTosca) {
this.policyTosca = policyTosca;
}
@@ -174,7 +195,7 @@ public class MicroServicePolicy implements Serializable, Policy {
return jsonRepresentation;
}
- public void setJsonRepresentation(JsonObject jsonRepresentation) {
+ void setJsonRepresentation(JsonObject jsonRepresentation) {
this.jsonRepresentation = jsonRepresentation;
}
@@ -182,7 +203,7 @@ public class MicroServicePolicy implements Serializable, Policy {
return usedByLoops;
}
- public void setUsedByLoops(Set<Loop> usedBy) {
+ void setUsedByLoops(Set<Loop> usedBy) {
this.usedByLoops = usedBy;
}
@@ -216,4 +237,41 @@ public class MicroServicePolicy implements Serializable, Policy {
return true;
}
+ private String getMicroServicePropertyNameFromTosca(JsonObject object) {
+ return object.getAsJsonObject("policy_types").getAsJsonObject(this.modelType).getAsJsonObject("properties")
+ .keySet().toArray(new String[1])[0];
+ }
+
+ @Override
+ public String createPolicyPayload() {
+ JsonObject toscaJson = createJsonFromPolicyTosca();
+
+ JsonObject policyPayloadResult = new JsonObject();
+
+ policyPayloadResult.add("tosca_definitions_version", toscaJson.get("tosca_definitions_version"));
+
+ JsonObject topologyTemplateNode = new JsonObject();
+ policyPayloadResult.add("topology_template", topologyTemplateNode);
+
+ JsonArray policiesArray = new JsonArray();
+ topologyTemplateNode.add("policies", policiesArray);
+
+ JsonObject thisPolicy = new JsonObject();
+ policiesArray.add(thisPolicy);
+
+ JsonObject policyDetails = new JsonObject();
+ thisPolicy.add(this.getName(), policyDetails);
+ policyDetails.addProperty("type", this.getModelType());
+ policyDetails.addProperty("version", "1.0.0");
+
+ JsonObject policyMetadata = new JsonObject();
+ policyDetails.add("metadata", policyMetadata);
+ policyMetadata.addProperty("policy-id", this.getName());
+
+ JsonObject policyProperties = new JsonObject();
+ policyDetails.add("properties", policyProperties);
+ policyProperties.add(this.getMicroServicePropertyNameFromTosca(toscaJson), this.getProperties());
+ return new GsonBuilder().setPrettyPrinting().create().toJson(policyPayloadResult);
+ }
+
}
diff --git a/src/main/java/org/onap/clamp/policy/microservice/MicroservicePolicyService.java b/src/main/java/org/onap/clamp/policy/microservice/MicroservicePolicyService.java
index f95ad3b4e..59ddaa009 100644
--- a/src/main/java/org/onap/clamp/policy/microservice/MicroservicePolicyService.java
+++ b/src/main/java/org/onap/clamp/policy/microservice/MicroservicePolicyService.java
@@ -33,7 +33,6 @@ import org.onap.clamp.loop.Loop;
import org.onap.clamp.policy.PolicyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
@Service
public class MicroservicePolicyService implements PolicyService<MicroServicePolicy> {
@@ -46,7 +45,6 @@ public class MicroservicePolicyService implements PolicyService<MicroServicePoli
}
@Override
- @Transactional
public Set<MicroServicePolicy> updatePolicies(Loop loop, List<MicroServicePolicy> newMicroservicePolicies) {
return newMicroservicePolicies.stream().map(policy -> getAndUpdateMicroServicePolicy(loop, policy))
.collect(Collectors.toSet());
@@ -59,21 +57,24 @@ public class MicroservicePolicyService implements PolicyService<MicroServicePoli
/**
* Get and update the MicroService policy properties.
- * @param loop The loop
- * @param policy The new MicroService policy
+ *
+ * @param loop
+ * The loop
+ * @param policy
+ * The new MicroService policy
* @return The updated MicroService policy
*/
- @Transactional
public MicroServicePolicy getAndUpdateMicroServicePolicy(Loop loop, MicroServicePolicy policy) {
- return repository.findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop))
- .orElse(new MicroServicePolicy(policy.getName(), policy.getModelType(), policy.getPolicyTosca(), policy.getShared(),
- policy.getJsonRepresentation(), Sets.newHashSet(loop), policy.getBlueprintName()));
+ return repository
+ .save(repository.findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop))
+ .orElse(new MicroServicePolicy(policy.getName(), policy.getModelType(), policy.getPolicyTosca(),
+ policy.getShared(), policy.getJsonRepresentation(), Sets.newHashSet(loop))));
}
private MicroServicePolicy updateMicroservicePolicyProperties(MicroServicePolicy oldPolicy,
MicroServicePolicy newPolicy, Loop loop) {
oldPolicy.setProperties(newPolicy.getProperties());
- if (oldPolicy.getUsedByLoops().contains(loop)) {
+ if (!oldPolicy.getUsedByLoops().contains(loop)) {
oldPolicy.getUsedByLoops().add(loop);
}
return oldPolicy;
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 c1e075daa..b6b591db2 100644
--- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
+++ b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
@@ -23,24 +23,34 @@
package org.onap.clamp.policy.operational;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
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.Map;
+import java.util.Map.Entry;
import javax.persistence.Column;
-import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
+
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
import org.onap.clamp.loop.Loop;
import org.onap.clamp.policy.Policy;
+import org.yaml.snakeyaml.Yaml;
@Entity
@Table(name = "operational_policies")
@@ -66,14 +76,18 @@ public class OperationalPolicy implements Serializable, Policy {
private Loop loop;
public OperationalPolicy() {
- //Serialization
+ // Serialization
}
/**
* The constructor.
- * @param name The name of the operational policy
- * @param loop The loop that uses this operational policy
- * @param configurationsJson The operational policy property in the format of json
+ *
+ * @param name
+ * The name of the operational policy
+ * @param loop
+ * The loop that uses this operational policy
+ * @param configurationsJson
+ * The operational policy property in the format of json
*/
public OperationalPolicy(String name, Loop loop, JsonObject configurationsJson) {
this.name = name;
@@ -81,6 +95,7 @@ public class OperationalPolicy implements Serializable, Policy {
this.configurationsJson = configurationsJson;
}
+ @Override
public String getName() {
return name;
}
@@ -136,4 +151,48 @@ public class OperationalPolicy implements Serializable, Policy {
return true;
}
+ @Override
+ public String createPolicyPayload() {
+ JsonObject policyPayloadResult = new JsonObject();
+
+ policyPayloadResult.addProperty("tosca_definitions_version", "tosca_simple_yaml_1_0_0");
+
+ JsonObject topologyTemplateNode = new JsonObject();
+ policyPayloadResult.add("topology_template", topologyTemplateNode);
+
+ JsonArray policiesArray = new JsonArray();
+ topologyTemplateNode.add("policies", policiesArray);
+
+ JsonObject operationalPolicy = new JsonObject();
+ policiesArray.add(operationalPolicy);
+
+ JsonObject operationalPolicyDetails = new JsonObject();
+ operationalPolicy.add(this.name, operationalPolicyDetails);
+ operationalPolicyDetails.addProperty("type", "onap.policies.controlloop.Operational");
+ operationalPolicyDetails.addProperty("version", "1.0.0");
+
+ JsonObject metadata = new JsonObject();
+ operationalPolicyDetails.add("metadata", metadata);
+ metadata.addProperty("policy-id", this.name);
+
+ operationalPolicyDetails.add("properties", this.configurationsJson.get("operational_policy"));
+
+ Gson gson = new GsonBuilder().create();
+ Map<?, ?> jsonMap = gson.fromJson(gson.toJson(policyPayloadResult), Map.class);
+ return (new Yaml()).dump(jsonMap);
+ }
+
+ public List<String> createGuardPolicyPayloads() {
+ List<String> result = new ArrayList<>();
+
+ 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));
+ }
+ return result;
+ }
+
}
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html
index cf9382bf8..a53ad73d5 100644
--- a/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html
+++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html
@@ -110,7 +110,9 @@ label {
<select type="text" id="trigger_policy" name="trigger_policy"
class="form-control" ng-model="null_dump"
ng-init="initPolicySelect()"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
<label for="timeout" class="col-sm-3"
@@ -127,6 +129,13 @@ label {
checked="true" class="form-control">
</div>
</div>
+ <div class="form-group clearfix row">
+ <label class="col-sm-4 control-label" for="clname">ControlLoopName</label>
+ <div class="col-sm-8">
+ <input type="text" class="form-control" name="controlLoopName"
+ readonly="readonly" id="clname" ng-model="clname"/>
+ </div>
+ </div>
</div>
</form>
<div class="panel-heading" style="background-color: white;">
@@ -158,7 +167,8 @@ label {
<label class="col-sm-4 control-label" for="recipe">Recipe</label>
<div class="col-sm-8">
<select class="form-control" name="recipe" id="recipe"
- enableFilter="true" ng-click="updateGuardRecipe($event)">
+ enableFilter="true" ng-model="recipe" ng-click="updateGuardRecipe($event)">
+ <option value="">-- choose an option --</option>
<option value="Restart">Restart</option>
<option value="Rebuild">Rebuild</option>
<option value="Migrate">Migrate</option>
@@ -191,7 +201,8 @@ label {
<div class="form-group clearfix">
<label for="actor" class="col-sm-4 control-label"> Actor</label>
<div class="col-sm-8">
- <select class="form-control" id="actor" name="actor">
+ <select class="form-control" id="actor" name="actor" ng-click="updateGuardActor($event)" ng-model="actor">
+ <option value="">-- choose an option --</option>
<option value="APPC">APPC</option>
<option value="SO">SO</option>
<option value="VFC">VFC</option>
@@ -212,7 +223,9 @@ label {
<div class="col-sm-8">
<select class="form-control" id="success" name="success"
ng-model="null_dump"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
</div>
<div class="form-group clearfix">
@@ -221,7 +234,9 @@ label {
<div class="col-sm-8">
<select class="form-control" id="failure" name="failure"
ng-model="null_dump"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
</div>
<div class="form-group clearfix">
@@ -230,7 +245,9 @@ label {
<div class="col-sm-8">
<select class="form-control" id="failure_timeout"
name="failure_timeout" ng-model="null_dump"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
</div>
<div class="form-group clearfix">
@@ -239,7 +256,9 @@ label {
<div class="col-sm-8">
<select class="form-control" id="failure_retries"
name="failure_retries" ng-model="null_dump"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
</div>
<div class="form-group clearfix">
@@ -248,7 +267,9 @@ label {
<div class="col-sm-8">
<select class="form-control" id="failure_exception"
name="failure_exception" ng-model="null_dump"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
</div>
<div class="form-group clearfix">
@@ -257,7 +278,9 @@ label {
<div class="col-sm-8">
<select class="form-control" id="failure_guard"
name="failure_guard" ng-model="null_dump"
- ng-options="policy for policy in policy_ids track by policy"></select>
+ ng-options="policy for policy in policy_ids track by policy">
+ <option value="">-- choose an option --</option>
+ </select>
</div>
</div>
</form>
@@ -267,7 +290,8 @@ label {
<label for="type" class="col-sm-4 control-label"> Target
Type</label>
<div class="col-sm-8">
- <select class="form-control" name="type" id="type">
+ <select class="form-control" name="type" id="type"
+ ng-click="initTargetResourceId()" ng-model="type">
<option value="VFC">VFC</option>
<option value="VM">VM</option>
<option value="VNF">VNF</option>
@@ -279,10 +303,55 @@ label {
Target ResourceId</label>
<div class="col-sm-8">
<select class="form-control" name="resourceId" id="resourceId"
- enableFilter="true">
+ enableFilter="true" ng-click="changeTargetResourceId()"
+ ng-model="resourceId">
+ <option value=""></option>
+ <option value="Other:">Other:</option>
</select>
</div>
</div>
+ <div id="metadata">
+ <div class="form-group clearfix">
+ <label for="modelInvariantId" class="col-sm-4 control-label">
+ Model Invariant Id</label>
+ <div class="col-sm-8">
+ <input class="form-control" name="modelInvariantId"
+ id="modelInvariantId" readonly />
+ </div>
+ </div>
+ <div class="form-group clearfix">
+ <label for="modelVersionId" class="col-sm-4 control-label">
+ Model Version Id</label>
+ <div class="col-sm-8">
+ <input class="form-control" name="modelVersionId"
+ id="modelVersionId" readonly />
+ </div>
+ </div>
+ <div class="form-group clearfix">
+ <label for="modelName" class="col-sm-4 control-label">
+ Model Name</label>
+ <div class="col-sm-8">
+ <input class="form-control" name="modelName" id="modelName"
+ readonly />
+ </div>
+ </div>
+ <div class="form-group clearfix">
+ <label for="modelVersion" class="col-sm-4 control-label">
+ Model Version</label>
+ <div class="col-sm-8">
+ <input class="form-control" name="modelVersion"
+ id="modelVersion" readonly />
+ </div>
+ </div>
+ <div class="form-group clearfix">
+ <label for="modelCustomizationId" class="col-sm-4 control-label">
+ Model Customization Id</label>
+ <div class="col-sm-8">
+ <input class="form-control" name="modelCustomizationId"
+ id="modelCustomizationId" readonly />
+ </div>
+ </div>
+ </div>
</form>
<div class="form-group clearfix">
<label for="enableGuardPolicy" class="col-sm-4 control-label">
@@ -306,7 +375,7 @@ label {
title="Guard policy associated" style="border: 2px dotted gray;">
<div class="form-group clearfix">
- <label class="col-sm-4 control-label" for="id">ID</label>
+ <label class="col-sm-4 control-label" for="id">Guard Policy ID</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="id" id="id" />
</div>
@@ -315,7 +384,7 @@ label {
<label class="col-sm-4 control-label" for="recipe">Recipe</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="recipe"
- readonly="readonly" id="recipe" />
+ readonly="readonly" id="recipe"/>
</div>
</div>
<div class="form-group clearfix">
@@ -325,8 +394,13 @@ label {
readonly="readonly" id="clname" ng-model="clname"/>
</div>
</div>
-
-
+ <div class="form-group clearfix">
+ <label for="actor" class="col-sm-4 control-label">Actor</label>
+ <div class="col-sm-8">
+ <input type="text" class="form-control" name="actor"
+ readonly="readonly" id="actor" />
+ </div>
+ </div>
<div class="form-group clearfix">
<label for="guardTargets" class="col-sm-4 control-label">Guard
diff --git a/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js b/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js
index 5a1ac538b..4e8855eb0 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js
@@ -37,7 +37,8 @@ app
var allPolicies = {};
$scope.guardType = "GUARD_MIN_MAX";
$scope.number = 0;
- $scope.clname="";
+ $scope.clname = "";
+ $scope.guard_ids = [];
function getAllFormId() {
return Array.from(document.getElementsByClassName("formId"));
@@ -54,17 +55,7 @@ app
}
console.log("No active formId found !");
}
- function initTargetResourceId() {
- if (vf_Services !== null && vf_Services !== undefined) {
- // Set all the Resource Invariant UUID in the target resource ID
- // list (+Empty and other)
- Object.keys(vf_Services["shared"]["byVf"]).forEach(function(key) {
-
- $("#targetResourceId").append($('<option></option>').val(key).html(key));
- });
- }
- }
function add_one_more() {
console.log("add one more");
@@ -102,6 +93,7 @@ app
$(".formId").not($("#formId" + count)).css("display", "none");
addCustListen(count);
$("#formId" + count + " #id").val("new");
+ $("#formId" + count + " #clname").val($scope.clname);
return count;
}
function addCustListen(count) {
@@ -150,10 +142,11 @@ app
}
function savePolicyLocally() {
- var polForm = {}
- polForm = serializeElement($("#operationalPolicyHeaderForm"));
+ var polForm = {};
+ var clPolForm = {};
+ clPolForm = serializeElement($("#operationalPolicyHeaderForm"));
+ allPolicies['guard_policies'] = {};
var policiesArray = []
- allPolicies['guard_policies'] = [];
$.each($(".formId"), function() {
var policyProperties = serializeElement($("#" + this.id + " .policyProperties"));
@@ -161,9 +154,15 @@ app
policiesArray.push(policyProperties);
// Now get the Guard
if ($("#" + this.id + " #enableGuardPolicy").is(':checked')) {
- allPolicies['guard_policies'].push(serializeElement($("#" + this.id + " .guardProperties")));
+ var guardPolicyBody = serializeElement($("#" + this.id + " .guardProperties"));
+ var guardPolicyId = guardPolicyBody['id'];
+ delete guardPolicyBody['id'];
+
+ allPolicies['guard_policies'][guardPolicyId] = guardPolicyBody;
+ $scope.guard_ids.push(guardPolicyId);
}
});
+ polForm['controlLoop'] = clPolForm;
polForm['policies'] = policiesArray;
allPolicies['operational_policy'] = polForm;
}
@@ -183,7 +182,7 @@ app
// Set the header
$.each($('#operationalPolicyHeaderForm').find('.form-control'), function() {
- $(this).val(allPolicies['operational_policy'][this.id]);
+ $(this).val(allPolicies['operational_policy']['controlLoop'][this.id]);
});
// Set the sub-policies
$.each(allPolicies['operational_policy']['policies'], function(opPolicyElemIndex, opPolicyElemValue) {
@@ -198,13 +197,14 @@ app
$("#go_properties_tab" + formNum).text(
allPolicies['operational_policy']['policies'][opPolicyElemIndex]['id']);
// Check if there is a guard set for it
- $.each(allPolicies['guard_policies'], function(guardElemIndex, guardElemValue) {
+ $.each(allPolicies['guard_policies'], function(guardElemId, guardElemValue) {
if (guardElemValue.recipe === $($("#formId" + formNum + " #recipe")[0]).val()) {
// Found one, set all guard prop
$.each($('.guardProperties').find('.form-control'), function(guardPropElemIndex,guardPropElemValue) {
+ guardElemValue['id'] = guardElemId;
$("#formId"+formNum+" .guardProperties").find("#"+guardPropElemValue.id).val(
- allPolicies['guard_policies'][guardElemIndex][guardPropElemValue.id]);
+ guardElemValue[guardPropElemValue.id]);
});
// And finally enable the flag
$("#formId" + formNum + " #enableGuardPolicy").prop("checked", true);
@@ -212,6 +212,107 @@ app
});
});
}
+
+ $scope.initTargetResourceId = function() {
+
+ var recipe = $(event.target).val();
+
+ var type = $(event.target).val();
+
+ $("#modelName").val("");
+ $("#modelInvariantId").val("");
+ $("#modelVersionId").val("");
+ $("#modelVersion").val("");
+ $("#modelCustomizationId").val("");
+ $('#resourceId').empty();
+ $("#resourceId")
+ .append(
+ $('<option></option>').val("")
+ .html(""));
+ $("#resourceId").append(
+ $('<option></option>').val("Other:")
+ .html("Other:"));
+ if (type == "VM" || type == "" || type == "VNF" ) {
+ $("#metadata *").prop('disabled',true);
+ }
+
+ var resourceVnf = getResourceDetailsProperty();
+ if (type == "VNF"
+ && (null !== resourceVnf || undefined !== resourceVnf)) {
+ for ( var prop in resourceVnf) {
+ var name = resourceVnf[prop]["name"];
+ $("#resourceId").append(
+ $('<option></option>')
+ .val(name).html(name));
+ }
+
+ }
+ var resourceVfc = getResourceDetailsVfcProperty();
+ if (type == "VFC"
+ && (null !== resourceVfc || undefined !== resourceVfc)) {
+ if (recipe == 'VF Module Create'
+ || recipe == 'VF Module Delete') {
+ for ( var prop in resourceVfc) {
+ if (resourceVfc[prop]["isBase"] == false) {
+ var name = resourceVfc[prop]["name"];
+ $("#resourceId").append(
+ $('<option></option>')
+ .val(name)
+ .html(name));
+ }
+ }
+ }
+ else
+ {
+ for ( var prop in resourceVfc) {
+ var name = resourceVfc[prop]["name"];
+ $("#resourceId").append(
+ $('<option></option>')
+ .val(name).html(name));
+ }
+ }
+ }
+ }
+
+ $scope.changeTargetResourceId = function() {
+ $("#modelName").val("");
+ $("#modelInvariantId").val("");
+ $("#modelVersionId").val("");
+ $("#modelVersion").val("");
+ $("#modelCustomizationId").val("");
+ var resourceVfc = getResourceDetailsVfcProperty();
+ var type = $("#type").val();
+ var recipe = $("#recipe").val();
+ vfBaseName = $(event.target).val();
+ if (type == "VFC"
+ && (null !== resourceVfc || undefined !== resourceVfc)
+ && (recipe == 'VF Module Create' || recipe == 'VF Module Delete')) {
+ for ( var prop in resourceVfc) {
+ var name = resourceVfc[prop]["name"];
+ if (name == vfBaseName) {
+ var vfModuleModelName = resourceVfc[prop]["name"];
+ $("#modelName").val(
+ vfModuleModelName);
+ var vfModuleModelInvariantUUID = resourceVfc[prop]["invariantUUID"];
+ $("#modelInvariantId").val(
+ vfModuleModelInvariantUUID);
+ var vfModuleModelUUID = resourceVfc[prop]["UUID"];
+ $("#modelVersionId").val(
+ vfModuleModelUUID);
+ var vfModuleModelVersion = resourceVfc[prop]["version"];
+ $("#modelVersion").val(
+ vfModuleModelVersion);
+ var vfModuleModelCustomizationUUID = resourceVfc[prop]["customizationUUID"];
+ $("#modelCustomizationId")
+ .val(
+ vfModuleModelCustomizationUUID);
+ }
+ }
+ }
+ else {
+ $("#metadata *").prop('disabled',true);
+ }
+ }
$scope.changeGuardPolicyType = function() {
@@ -258,13 +359,20 @@ app
add_new_policy();
}
$("#savePropsBtn").click(function(event) {
-
console.log("save properties triggered");
savePolicyLocally();
+ for(var i = 0; i <= $scope.guard_ids.length; i++) {
+ for(var j = i; j <= $scope.guard_ids.length; j++) {
+ if(i != j && $scope.guard_ids[i] == $scope.guard_ids[j]) {
+ // duplacated guard policy id exist
+ alert("The guard policy ID should be unique.");
+ return;
+ }
+ }
+ }
angular.element(document.getElementById('formSpan')).scope().submitForm(allPolicies);
$("#close_button").click();
});
- initTargetResourceId();
});
}
$scope.init();
@@ -274,6 +382,12 @@ app
// Get the second recipe (guard one) and update it
$($("#formId" + formNum + " #recipe")[1]).val($(event.target).val());
}
+ $scope.updateGuardActor = function(event) {
+
+ var formNum = $(event.target).closest('.formId').attr('id').substring(6);
+ // Get the second actor (guard one) and update it
+ $($("#formId" + formNum + " #actor")[1]).val($(event.target).val());
+ }
// When we change the name of a policy
$scope.updateTabLabel = function(event) {
@@ -302,4 +416,4 @@ app
});
};
- } ]); \ No newline at end of file
+ } ]);
diff --git a/src/main/resources/META-INF/resources/designer/scripts/propertyController.js b/src/main/resources/META-INF/resources/designer/scripts/propertyController.js
index 2b32f4d26..75c64f308 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/propertyController.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/propertyController.js
@@ -72,7 +72,9 @@ function getMsProperty(type) {
var msProperties = cl_props["microServicePolicies"];
for (p in msProperties) {
if (msProperties[p]["name"] == type) {
- return JSON.parse(JSON.stringify(msProperties[p]["properties"]));
+ if (msProperties[p]["properties"] !== null && msProperties[p]["properties"] !== undefined) {
+ return JSON.parse(JSON.stringify(msProperties[p]["properties"]));
+ }
}
}
return null;
@@ -82,7 +84,7 @@ function getMsUI(type) {
var msProperties = cl_props["microServicePolicies"];
for (p in msProperties) {
if (msProperties[p]["name"] == type) {
- return JSON.parse(JSON.stringify(msProperties[p]["jsonRepresentation"]));
+ return JSON.parse(JSON.stringify(msProperties[p]["jsonRepresentation"]));
}
}
return null;
@@ -111,4 +113,13 @@ function getDeploymentStatusURL() {
function setDeploymentStatusURL(deploymentStatusURL) {
cl_props["dcaeDeploymentStatusUrl"] = deploymentStatusURL;
}
-module.exports = { getOperationalPolicyProperty,getGlobalProperty,getMsProperty,getMsUI,getLastUpdatedStatus,getDeploymentID,getDeploymentStatusURL }; \ No newline at end of file
+
+function getResourceDetailsProperty() {
+ return cl_props["modelPropertiesJson"]["resourceDetails"]["VF"];
+}
+
+function getResourceDetailsVfcProperty() {
+ return cl_props["modelPropertiesJson"]["resourceDetails"]["VFC"];
+}
+
+module.exports = { getOperationalPolicyProperty,getGlobalProperty,getMsProperty,getMsUI,getLastUpdatedStatus,getDeploymentID,getDeploymentStatusURL,getResourceDetailsProperty,getResourceDetailsVfcProperty }; \ No newline at end of file
diff --git a/src/main/resources/application-noaaf.properties b/src/main/resources/application-noaaf.properties
index 82b2a283f..84e97ea30 100644
--- a/src/main/resources/application-noaaf.properties
+++ b/src/main/resources/application-noaaf.properties
@@ -135,7 +135,7 @@ clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-
#
#
# Configuration Settings for Policy Engine Components
-clamp.config.policy.url=http://localhost:8085/
+clamp.config.policy.url=http://policy.api.simpledemo.onap.org:8081/policy/api/v1
clamp.config.policy.userName=test
clamp.config.policy.password=test
clamp.config.policy.pdpUrl1=http://policy.api.simpledemo.onap.org:8081/pdp/ , testpdp, alpha123
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 02acf184b..b1077d382 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -150,7 +150,7 @@ clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-
#
#
# Configuration Settings for Policy Engine Components
-clamp.config.policy.url=http://policy.api.simpledemo.onap.org:8081/pdp/
+clamp.config.policy.url=http://policy.api.simpledemo.onap.org:8081/policy/api/v1
clamp.config.policy.userName=test
clamp.config.policy.password=test
clamp.config.policy.pdpUrl1=http://policy.api.simpledemo.onap.org:8081/pdp/ , testpdp, alpha123
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 f339d5d70..c17595e18 100644
--- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -1,94 +1,147 @@
-<rests xmlns="http://camel.apache.org/schema/spring" >
- <rest >
- <get uri="/v2/loop/getAllNames"
- outType="java.lang.String[]"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
- <to uri="bean:org.onap.clamp.loop.LoopController?method=getLoopNames()" />
- </route>
- </get>
- <get uri="/v2/loop/{loopName}"
- outType="org.onap.clamp.loop.Loop"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
- <to uri="bean:org.onap.clamp.loop.LoopController?method=getLoop(${header.loopName})" />
- </route>
- </get>
- <get uri="/v2/loop/svgRepresentation/{loopName}"
- outType="java.lang.String"
- produces="application/xml">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
- <to uri="bean:org.onap.clamp.loop.LoopController?method=getSVGRepresentation(${header.loopName})" />
- </route>
- </get>
+<rests xmlns="http://camel.apache.org/schema/spring">
+ <rest>
+ <get
+ uri="/v2/loop/getAllNames"
+ outType="java.lang.String[]"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+ <to
+ uri="bean:org.onap.clamp.loop.LoopController?method=getLoopNames()" />
+ </route>
+ </get>
+ <get
+ uri="/v2/loop/{loopName}"
+ outType="org.onap.clamp.loop.Loop"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+ <to
+ uri="bean:org.onap.clamp.loop.LoopController?method=getLoop(${header.loopName})" />
+ </route>
+ </get>
+ <get
+ uri="/v2/loop/svgRepresentation/{loopName}"
+ outType="java.lang.String"
+ produces="application/xml">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+ <to
+ uri="bean:org.onap.clamp.loop.LoopController?method=getSVGRepresentation(${header.loopName})" />
+ </route>
+ </get>
- <post uri="/v2/loop/updateGlobalProperties/{loopName}"
- type="com.google.gson.JsonObject"
- consumes="application/json"
- outType="org.onap.clamp.loop.Loop"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.loop.LoopController?method=updateGlobalPropertiesJson(${header.loopName},${body})" />
- </route>
- </post>
- <post uri="/v2/loop/updateOperationalPolicies/{loopName}"
- type="com.google.gson.JsonArray"
- consumes="application/json"
- outType="org.onap.clamp.loop.Loop"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.loop.LoopController?method=updateOperationalPolicies(${header.loopName},${body})" />
- </route>
- </post>
- <post uri="/v2/loop/updateMicroservicePolicy/{loopName}"
- type="org.onap.clamp.policy.microservice.MicroServicePolicy"
- consumes="application/json"
- outType="org.onap.clamp.policy.microservice.MicroServicePolicy"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.loop.LoopController?method=updateMicroservicePolicy(${header.loopName},${body})" />
- </route>
- </post>
- <put uri="/v2/loop/deployLoop/{loopName}"
- outType="org.onap.clamp.loop.Loop"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deployLoop(*,${header.loopName})" />
- </route>
- </put>
- <put uri="/v2/loop/undeployLoop/{loopName}"
- outType="org.onap.clamp.loop.Loop"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=unDeployLoop(${header.loopName})" />
- </route>
- </put>
- <put uri="/v2/loop/submit/{loopName}">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=submitMsPolicies(${header.loopName})" />
- <!-- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=submitOpPolicy(${header.loopName})" />-->
- <!--<to uri="bean:org.onap.clamp.operation.LoopOperation?method=submitGuardPolicy(${header.loopName})" /> -->
- </route>
- </put>
- <put uri="/v2/loop/delete/{loopName}"
- outType="org.onap.clamp.loop.Loop"
- produces="application/json">
- <route>
- <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteMsPolicies(${header.loopName})" />
- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteOpPolicy(${header.loopName})" />
- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteGuardPolicy(${header.loopName})" />
- </route>
- </put>
- </rest>
+ <post
+ uri="/v2/loop/updateGlobalProperties/{loopName}"
+ type="com.google.gson.JsonObject"
+ consumes="application/json"
+ outType="org.onap.clamp.loop.Loop"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+ <to
+ uri="bean:org.onap.clamp.loop.LoopController?method=updateGlobalPropertiesJson(${header.loopName},${body})" />
+ </route>
+ </post>
+ <post
+ uri="/v2/loop/updateOperationalPolicies/{loopName}"
+ type="com.google.gson.JsonArray"
+ consumes="application/json"
+ outType="org.onap.clamp.loop.Loop"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+ <to
+ uri="bean:org.onap.clamp.loop.LoopController?method=updateOperationalPolicies(${header.loopName},${body})" />
+ </route>
+ </post>
+ <post
+ uri="/v2/loop/updateMicroservicePolicy/{loopName}"
+ type="org.onap.clamp.policy.microservice.MicroServicePolicy"
+ consumes="application/json"
+ outType="org.onap.clamp.policy.microservice.MicroServicePolicy"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+ <to
+ uri="bean:org.onap.clamp.loop.LoopController?method=updateMicroservicePolicy(${header.loopName},${body})" />
+ </route>
+ </post>
+ <put
+ uri="/v2/loop/deployLoop/{loopName}"
+ outType="org.onap.clamp.loop.Loop"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+ <to
+ uri="bean:org.onap.clamp.operation.LoopOperation?method=deployLoop(*,${header.loopName})" />
+ </route>
+ </put>
+ <put
+ uri="/v2/loop/undeployLoop/{loopName}"
+ outType="org.onap.clamp.loop.Loop"
+ produces="application/json">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+ <to
+ uri="bean:org.onap.clamp.operation.LoopOperation?method=unDeployLoop(${header.loopName})" />
+ </route>
+ </put>
+ <put uri="/v2/loop/submit/{loopName}">
+ <route>
+ <setBody>
+ <simple>${header.loopName}</simple>
+ </setBody>
+ <log
+ loggingLevel="INFO"
+ message="Loop name received: ${body}"></log>
+ <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">
+ <simple>${header.LoopObject.getMicroServicePolicies()}
+ </simple>
+ <setHeader headerName="HttpQueryException">
+ <simple resultType="java.lang.Boolean">false</simple>
+ </setHeader>
+ <to uri="direct:delete-micro-service"/>
+
+ <setHeader headerName="HttpQueryException">
+ <simple resultType="java.lang.Boolean">true</simple>
+ </setHeader>
+ <setBody>
+ <simple>${body.createPolicyPayload()}</simple>
+ </setBody>
+ <to uri="direct:create-micro-service"/>
+
+ </split>
+ </route>
+ </put>
+ <put
+ uri="/v2/loop/delete/{loopName}">
+ <route>
+ <to
+ uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+ <to
+ uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteMsPolicies(${header.loopName})" />
+ <to
+ uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteOpPolicy(${header.loopName})" />
+ <to
+ uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteGuardPolicy(${header.loopName})" />
+ </route>
+ </put>
+ </rest>
</rests>
diff --git a/src/main/resources/clds/camel/routes/flexible-flow.xml b/src/main/resources/clds/camel/routes/flexible-flow.xml
index 2103b4acf..b8244990b 100644
--- a/src/main/resources/clds/camel/routes/flexible-flow.xml
+++ b/src/main/resources/clds/camel/routes/flexible-flow.xml
@@ -1,61 +1,117 @@
<routes xmlns="http://camel.apache.org/schema/spring">
- <route id="submit">
- <from uri="direct:processSubmit" />
- <choice>
- <when>
- <simple> ${exchangeProperty.actionCd} == 'SUBMIT' || ${exchangeProperty.actionCd} == 'RESUBMIT'</simple>
- <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
- <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
- <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
- <delay>
- <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?method=addEvent(*,'COMPLETED')" />
- </when>
- <when>
- <simple> ${exchangeProperty.actionCd} == 'DELETE'</simple>
- <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
- <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDeleteDelegate" />
- <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDeleteDelegate" />
- <delay>
- <constant>30000</constant>
- </delay>
- <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.ModelDeleteDelegate" />
- <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
- </when>
- <when>
- <simple> ${exchangeProperty.actionCd} == 'UPDATE'</simple>
- <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
- <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
- <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
- <delay>
- <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?method=addEvent(*,'COMPLETED')" />
- </when>
- <when>
- <simple> ${exchangeProperty.actionCd} == 'STOP'</simple>
- <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
- <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?method=addEvent(*,'COMPLETED')" />
- </when>
- <when>
- <simple> ${exchangeProperty.actionCd} == 'RESTART'</simple>
- <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
- <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?method=addEvent(*,'COMPLETED')" />
- </when>
- </choice>
- </route>
+ <route id="submit">
+ <from uri="direct:processSubmit" />
+ <choice>
+ <when>
+ <simple> ${exchangeProperty.actionCd} == 'SUBMIT' ||
+ ${exchangeProperty.actionCd} == 'RESUBMIT'
+ </simple>
+ <to
+ uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+ <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
+ <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
+ <delay>
+ <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?method=addEvent(*,'COMPLETED')" />
+ </when>
+ <when>
+ <simple> ${exchangeProperty.actionCd} == 'DELETE'</simple>
+ <to
+ uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+ <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDeleteDelegate" />
+ <to
+ uri="bean:org.onap.clamp.clds.client.HolmesPolicyDeleteDelegate" />
+ <delay>
+ <constant>30000</constant>
+ </delay>
+ <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.ModelDeleteDelegate" />
+ <to
+ uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
+ </when>
+ <when>
+ <simple> ${exchangeProperty.actionCd} == 'UPDATE'</simple>
+ <to
+ uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+ <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
+ <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
+ <delay>
+ <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?method=addEvent(*,'COMPLETED')" />
+ </when>
+ <when>
+ <simple> ${exchangeProperty.actionCd} == 'STOP'</simple>
+ <to
+ uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+ <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?method=addEvent(*,'COMPLETED')" />
+ </when>
+ <when>
+ <simple> ${exchangeProperty.actionCd} == 'RESTART'</simple>
+ <to
+ uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+ <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?method=addEvent(*,'COMPLETED')" />
+ </when>
+ </choice>
+ </route>
+ <route id="delete-micro-service">
+ <from uri="direct:delete-micro-service" />
+
+ <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>
+ </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}" />
+
+ </route>
+ <route id="create-micro-service">
+ <from uri="direct:create-micro-service" />
+
+ <setHeader headerName="CamelHttpMethod">
+ <constant>POST</constant>
+ </setHeader>
+ <setHeader headerName="CamelHttpUri">
+ <simple>{{clamp.config.policy.url}}/policyTypes/${body.getModelType()}/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>
+ <toD
+ uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryException}" />
+ </route>
</routes> \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java
index fbe6e63ca..93d71663e 100644
--- a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java
+++ b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java
@@ -163,7 +163,8 @@ public class BlueprintParserTest {
@Test
public void fallBackToOneMicroServiceTCATest() {
- MicroService tcaMS = new MicroService(BlueprintParser.TCA, "", "", "", "");
+ MicroService tcaMS = new MicroService(BlueprintParser.TCA, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "", "",
+ "");
List<MicroService> expected = Collections.singletonList(tcaMS);
List<MicroService> actual = new BlueprintParser().fallbackToOneMicroService(microServiceBlueprintOldStyleTCA);
@@ -173,7 +174,8 @@ public class BlueprintParserTest {
@Test
public void fallBackToOneMicroServiceHolmesTest() {
- MicroService holmesMS = new MicroService(BlueprintParser.HOLMES, "", "", "", "");
+ MicroService holmesMS = new MicroService(BlueprintParser.HOLMES, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "",
+ "", "");
List<MicroService> expected = Collections.singletonList(holmesMS);
List<MicroService> actual = new BlueprintParser()
diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java
index 1fe3ff3d9..17e27d519 100644
--- a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java
+++ b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java
@@ -22,12 +22,13 @@
*
*/
-
package org.onap.clamp.clds.sdc.controller.installer;
import com.google.gson.JsonObject;
+
import java.io.IOException;
import java.io.InputStream;
+
import org.apache.commons.io.IOUtils;
import org.assertj.core.api.Assertions;
import org.junit.Before;
@@ -38,7 +39,6 @@ import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.onap.clamp.clds.client.DcaeInventoryServices;
import org.onap.clamp.clds.config.sdc.BlueprintParserFilesConfiguration;
-import org.onap.clamp.clds.dao.CldsDao;
import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
import org.onap.clamp.clds.service.CldsService;
import org.onap.clamp.clds.service.CldsTemplateService;
@@ -83,64 +83,54 @@ public class CsarInstallerImplTest {
private BlueprintArtifact artifact;
/**
- * Set up method.
- * throws: Exception
+ * Set up method. throws: Exception
*/
@Before
public void setUp() throws Exception {
String dceaBlueprint = ResourceFileUtil.getResourceAsString("tosca/dcea_blueprint.yml");
artifact = prepareBlueprintArtifact(dceaBlueprint);
- csarInstaller = new CsarInstallerImpl(applicationContext, new CldsDao(), new CldsTemplateService(),
- cldsService, dcaeInventoryServices, new XslTransformer());
+ csarInstaller = new CsarInstallerImpl(applicationContext, null, new CldsTemplateService(), cldsService,
+ dcaeInventoryServices, new XslTransformer());
}
@Test
public void shouldReturnInputParametersFromBlueprint() {
- //given
+ // given
String expectedBlueprintInputsText = "{\"aaiEnrichmentHost\":\"aai.onap.svc.cluster.local\""
- + ",\"aaiEnrichmentPort\":\"8443\""
- + ",\"enableAAIEnrichment\":true"
- + ",\"dmaap_host\":\"message-router\""
- + ",\"dmaap_port\":\"3904\""
- + ",\"enableRedisCaching\":false"
- + ",\"redisHosts\":\"dcae-redis:6379\""
- + ",\"tag_version\":"
- + "\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0\""
- + ",\"consul_host\":\"consul-server\""
- + ",\"consul_port\":\"8500\",\"cbs_host\":\"{\\\"test\\\":"
- + "{\\\"test\\\":\\\"test\\\"}}\",\"cbs_port\":\"10000\""
- + ",\"external_port\":\"32010\",\"policy_id\":\"AUTO_GENERATED_POLICY_ID_AT_SUBMIT\"}";
+ + ",\"aaiEnrichmentPort\":\"8443\"" + ",\"enableAAIEnrichment\":true" + ",\"dmaap_host\":\"message-router\""
+ + ",\"dmaap_port\":\"3904\"" + ",\"enableRedisCaching\":false" + ",\"redisHosts\":\"dcae-redis:6379\""
+ + ",\"tag_version\":"
+ + "\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0\""
+ + ",\"consul_host\":\"consul-server\"" + ",\"consul_port\":\"8500\",\"cbs_host\":\"{\\\"test\\\":"
+ + "{\\\"test\\\":\\\"test\\\"}}\",\"cbs_port\":\"10000\""
+ + ",\"external_port\":\"32010\",\"policy_id\":\"AUTO_GENERATED_POLICY_ID_AT_SUBMIT\"}";
JsonObject expectedBlueprintInputs = JsonUtils.GSON.fromJson(expectedBlueprintInputsText, JsonObject.class);
- //when
+ // when
String parametersInJson = csarInstaller.getAllBlueprintParametersInJson(artifact);
- //then
+ // then
Assertions.assertThat(JsonUtils.GSON.fromJson(parametersInJson, JsonObject.class))
- .isEqualTo(expectedBlueprintInputs);
+ .isEqualTo(expectedBlueprintInputs);
}
@Test
public void shouldReturnBuildModelName() throws SdcArtifactInstallerException {
- //given
- String expectedModelName = "CLAMP_test_name_"
- + "vtest_service_version_"
- + "test_resource_instance_name_"
- + "test_artifact_name";
- prepareMockCsarHandler("name", "test_name",
- "test_service_version");
+ // given
+ String expectedModelName = "CLAMP_test_name_" + "vtest_service_version_" + "test_resource_instance_name_"
+ + "test_artifact_name";
+ prepareMockCsarHandler("name", "test_name", "test_service_version");
Mockito.when(resourceInstance.getResourceInstanceName()).thenReturn("test_resource_instance_name");
- //when
+ // when
String actualModelName = CsarInstallerImpl.buildModelName(csarHandler, artifact);
- //then
+ // then
Assertions.assertThat(actualModelName).isEqualTo(expectedModelName);
}
@Test
public void shouldReturnRightMapping() throws SdcArtifactInstallerException, IOException {
- //given
- String input = "[{\"blueprintKey\":\"tca_k8s\","
- + "\"dcaeDeployable\":false,"
- + "\"files\":{\"svgXmlFilePath\":\"samplePath\",\"bpmnXmlFilePath\":\"samplePath\"}}]";
+ // given
+ String input = "[{\"blueprintKey\":\"tca_k8s\"," + "\"dcaeDeployable\":false,"
+ + "\"files\":{\"svgXmlFilePath\":\"samplePath\",\"bpmnXmlFilePath\":\"samplePath\"}}]";
BlueprintParserFilesConfiguration filesConfiguration = new BlueprintParserFilesConfiguration();
filesConfiguration.setBpmnXmlFilePath("samplePath");
filesConfiguration.setSvgXmlFilePath("samplePath");
@@ -149,10 +139,10 @@ public class CsarInstallerImplTest {
Mockito.when(applicationContext.getResource(Mockito.any(String.class))).thenReturn(resource);
Mockito.when(resource.getInputStream()).thenReturn(inputStream);
csarInstaller.loadConfiguration();
- //when
+ // when
BlueprintParserFilesConfiguration configuration = csarInstaller.searchForRightMapping(artifact);
- //then
+ // then
Assertions.assertThat(configuration.getBpmnXmlFilePath()).isEqualTo("samplePath");
Assertions.assertThat(configuration.getSvgXmlFilePath()).isEqualTo("samplePath");
}
@@ -167,7 +157,7 @@ public class CsarInstallerImplTest {
}
private void prepareMockCsarHandler(String metadataNameMockInput, String metadataNameMockOutput,
- String serviceVersion) {
+ String serviceVersion) {
Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcCsarHelper);
Mockito.when(sdcCsarHelper.getServiceMetadata()).thenReturn(metadata);
Mockito.when(metadata.getValue(metadataNameMockInput)).thenReturn(metadataNameMockOutput);
diff --git a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java
index 2578f68ed..0cadef9ae 100644
--- a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java
+++ b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java
@@ -36,6 +36,7 @@ import javax.transaction.Transactional;
import org.apache.commons.lang3.RandomStringUtils;
import org.json.JSONException;
+import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
@@ -47,6 +48,7 @@ import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.onap.sdc.api.notification.IArtifactInfo;
import org.onap.sdc.api.notification.INotificationData;
import org.onap.sdc.api.notification.IResourceInstance;
import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
@@ -55,6 +57,7 @@ import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
import org.onap.sdc.toscaparser.api.elements.Metadata;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@@ -63,7 +66,7 @@ import org.springframework.test.context.junit4.SpringRunner;
@ActiveProfiles(profiles = "clamp-default,clamp-default-user,clamp-sdc-controller-new")
public class CsarInstallerItCase {
- private static final String CSAR_ARTIFACT_NAME = "example/sdc/service-Simsfoimap0112.csar";
+ private static final String CSAR_ARTIFACT_NAME = "example/sdc/service-Vloadbalancerms-csar.csar";
private static final String INVARIANT_SERVICE_UUID = "4cc5b45a-1f63-4194-8100-cd8e14248c92";
private static final String INVARIANT_RESOURCE1_UUID = "07e266fc-49ab-4cd7-8378-ca4676f1b9ec";
private static final String INVARIANT_RESOURCE2_UUID = "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad";
@@ -129,8 +132,9 @@ public class CsarInstallerItCase {
// Create helper based on real csar to test policy yaml and global properties
// set
SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
+ String path = Thread.currentThread().getContextClassLoader().getResource(CSAR_ARTIFACT_NAME).getFile();
ISdcCsarHelper sdcHelper = factory
- .getSdcCsarHelper(Thread.currentThread().getContextClassLoader().getResource(CSAR_ARTIFACT_NAME).getFile());
+ .getSdcCsarHelper(path);
Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcHelper);
// Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper);
@@ -141,6 +145,24 @@ public class CsarInstallerItCase {
@Test
@Transactional
+ public void testGetPolicyModelYaml() throws IOException, SdcToscaParserException, CsarHandlerException {
+ INotificationData notificationData = Mockito.mock(INotificationData.class);
+ IArtifactInfo serviceArtifacts = Mockito.mock(IArtifactInfo.class);
+ Mockito.when(serviceArtifacts.getArtifactType()).thenReturn("TOSCA_CSAR");
+ List<IArtifactInfo> serviceArtifactsList = new ArrayList<>();
+ serviceArtifactsList.add(serviceArtifacts);
+ Mockito.when(notificationData.getServiceArtifacts()).thenReturn(serviceArtifactsList);
+
+ CsarHandler csarHandler = new CsarHandler(notificationData, "", "");
+ csarHandler.setFilePath(Thread.currentThread().getContextClassLoader()
+ .getResource(CSAR_ARTIFACT_NAME).getFile());
+ Optional<String> testyaml = csarHandler.getPolicyModelYaml();
+ Assert.assertEquals(testyaml, Optional.ofNullable(ResourceFileUtil
+ .getResourceAsString("example/sdc/expected-result/policy-data.yaml")));
+ }
+
+ @Test
+ @Transactional
public void testIsCsarAlreadyDeployedTca() throws SdcArtifactInstallerException, SdcToscaParserException,
CsarHandlerException, IOException, InterruptedException, PolicyModelException {
String generatedName = RandomStringUtils.randomAlphanumeric(5);
diff --git a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java b/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java
index 9d07415bc..a935808ab 100644
--- a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java
+++ b/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java
@@ -30,8 +30,8 @@ import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import java.time.Instant;
-
import java.util.HashSet;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.onap.clamp.clds.Application;
@@ -83,19 +83,16 @@ public class LoopRepositoriesItCase {
return loop;
}
- private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, String policyTosca,
- String jsonProperties, boolean shared) {
+ private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation,
+ String policyTosca, String jsonProperties, boolean shared) {
MicroServicePolicy µService = new MicroServicePolicy(name, modelType, policyTosca, shared,
- gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>(), "");
+ gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>());
µService.setProperties(new Gson().fromJson(jsonProperties, JsonObject.class));
return µService;
}
- private LoopLog getLoopLog(LogType type, String message) {
- LoopLog log = new LoopLog();
- log.setLogType(type);
- log.setMessage(message);
- return log;
+ private LoopLog getLoopLog(LogType type, String message, Loop loop) {
+ return new LoopLog(message, type, loop);
}
@Test
@@ -105,10 +102,11 @@ public class LoopRepositoriesItCase {
"123456789", "https://dcaetest.org", "UUID-blueprint");
OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest");
loopTest.addOperationalPolicy(opPolicy);
- MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", "{\"configtype\":\"json\"}",
- "YamlContent", "{\"param1\":\"value1\"}", true);
+ MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "",
+ "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+ "{\"param1\":\"value1\"}", true);
loopTest.addMicroServicePolicy(microServicePolicy);
- LoopLog loopLog = getLoopLog(LogType.INFO, "test message");
+ LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest);
loopTest.addLog(loopLog);
// Attemp to save into the database the entire loop
diff --git a/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java b/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java
index 9a44d41bc..23723386b 100644
--- a/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java
+++ b/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java
@@ -21,14 +21,17 @@
*
*/
-
package org.onap.clamp.loop;
import static org.assertj.core.api.Assertions.assertThat;
import com.google.gson.JsonObject;
+
import java.util.Set;
import java.util.stream.Collectors;
+
+import javax.transaction.Transactional;
+
import org.assertj.core.util.Lists;
import org.junit.After;
import org.junit.Test;
@@ -39,10 +42,9 @@ import org.onap.clamp.policy.microservice.MicroServicePolicy;
import org.onap.clamp.policy.operational.OperationalPolicy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.transaction.annotation.Transactional;
+import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringJUnit4ClassRunner.class)
+@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class LoopServiceTestItCase {
@@ -61,18 +63,19 @@ public class LoopServiceTestItCase {
}
@Test
+ @Transactional
public void shouldCreateEmptyLoop() {
- //given
+ // given
String loopBlueprint = "blueprint";
String loopSvg = "representation";
Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, loopBlueprint, loopSvg);
testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
testLoop.setLastComputedState(LoopState.DESIGN);
- //when
+ // when
Loop actualLoop = loopService.saveOrUpdateLoop(testLoop);
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop).isEqualTo(loopsRepository.findById(actualLoop.getName()).get());
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
@@ -83,81 +86,77 @@ public class LoopServiceTestItCase {
}
@Test
+ @Transactional
public void shouldAddOperationalPolicyToLoop() {
- //given
+ // given
saveTestLoopToDb();
- JsonObject confJson = JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class);
- String policyName = "policyName";
- OperationalPolicy operationalPolicy = new OperationalPolicy(policyName, null, confJson);
+ OperationalPolicy operationalPolicy = new OperationalPolicy("policyName", null,
+ JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
- //when
- Loop actualLoop = loopService
- .updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(operationalPolicy));
+ // when
+ Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME,
+ Lists.newArrayList(operationalPolicy));
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
Set<OperationalPolicy> savedPolicies = actualLoop.getOperationalPolicies();
assertThat(savedPolicies).hasSize(1);
- assertThat(savedPolicies)
- .usingElementComparatorIgnoringFields("loop")
- .contains(operationalPolicy);
+ assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop").contains(operationalPolicy);
OperationalPolicy savedPolicy = savedPolicies.iterator().next();
assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME);
}
@Test
+ @Transactional
public void shouldAddMicroservicePolicyToLoop() {
- //given
+ // given
saveTestLoopToDb();
- JsonObject confJson = JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class);
- String policyName = "policyName";
- String policyTosca = "policyTosca";
- MicroServicePolicy microServicePolicy = new MicroServicePolicy(policyName, "", policyTosca, false, confJson, null, "");
+ MicroServicePolicy microServicePolicy = new MicroServicePolicy("policyName", "",
+ "tosca_definitions_version: tosca_simple_yaml_1_0_0", false,
+ JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null);
- //when
- Loop actualLoop = loopService
- .updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(microServicePolicy));
+ // when
+ Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME,
+ Lists.newArrayList(microServicePolicy));
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
Set<MicroServicePolicy> savedPolicies = actualLoop.getMicroServicePolicies();
assertThat(savedPolicies).hasSize(1);
assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops")
.containsExactly(microServicePolicy);
- assertThat(savedPolicies).extracting("usedByLoops")
- .hasSize(1);
+ assertThat(savedPolicies).extracting("usedByLoops").hasSize(1);
}
@Test
@Transactional
public void shouldCreateNewMicroservicePolicyAndUpdateJsonRepresentationOfOldOne() {
- //given
+ // given
saveTestLoopToDb();
- String firstPolicyName = "firstPolicyName";
- JsonObject newJsonRepresentation = JsonUtils.GSON.fromJson("{}", JsonObject.class);
- String secondPolicyName = "secondPolicyName";
- String secondPolicyTosca = "secondPolicyTosca";
- MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy(firstPolicyName, "", "policyTosca",
- false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, "");
- loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy));
- MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy(secondPolicyName, "", secondPolicyTosca, true,
- newJsonRepresentation, null, "");
+ MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", "", "", false,
+ JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null);
+ loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy));
+ MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("secondPolicyName", "",
+ "tosca_definitions_version: tosca_simple_yaml_1_0_0", true, JsonUtils.GSON.fromJson("{}", JsonObject.class),
+ null);
- //when
+ // when
firstMicroServicePolicy.setProperties(JsonUtils.GSON.fromJson("{\"name1\":\"value1\"}", JsonObject.class));
Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME,
Lists.newArrayList(firstMicroServicePolicy, secondMicroServicePolicy));
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
Set<MicroServicePolicy> savedPolicies = actualLoop.getMicroServicePolicies();
assertThat(savedPolicies).hasSize(2);
+ assertThat(savedPolicies).contains(firstMicroServicePolicy);
+ assertThat(savedPolicies).contains(secondMicroServicePolicy);
assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops")
.containsExactlyInAnyOrder(firstMicroServicePolicy, secondMicroServicePolicy);
@@ -170,26 +169,24 @@ public class LoopServiceTestItCase {
}
@Test
+ @Transactional
public void shouldRemoveOldMicroservicePolicyIfNotInUpdatedList() {
- //given
+ // given
saveTestLoopToDb();
- JsonObject jsonRepresentation = JsonUtils.GSON.fromJson("{}", JsonObject.class);
- String firstPolicyName = "firstPolicyName";
- String secondPolicyName = "policyName";
- String secondPolicyTosca = "secondPolicyTosca";
- MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy(firstPolicyName, "", "policyTosca",
- false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, "");
+ MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", "",
+ "\"tosca_definitions_version: tosca_simple_yaml_1_0_0\"", false,
+ JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null);
loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy));
- MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy(secondPolicyName, "", secondPolicyTosca, true,
- jsonRepresentation, null, "");
+ MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("policyName", "", "secondPolicyTosca",
+ true, JsonUtils.GSON.fromJson("{}", JsonObject.class), null);
- //when
- Loop actualLoop = loopService
- .updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(secondMicroServicePolicy));
+ // when
+ Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME,
+ Lists.newArrayList(secondMicroServicePolicy));
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
Set<MicroServicePolicy> savedPolicies = actualLoop.getMicroServicePolicies();
@@ -202,82 +199,77 @@ public class LoopServiceTestItCase {
@Test
@Transactional
public void shouldCreateNewOperationalPolicyAndUpdateJsonRepresentationOfOldOne() {
- //given
+ // given
saveTestLoopToDb();
- String firstPolicyName = "firstPolicyName";
JsonObject newJsonConfiguration = JsonUtils.GSON.fromJson("{}", JsonObject.class);
- String secondPolicyName = "secondPolicyName";
- OperationalPolicy firstOperationalPolicy = new OperationalPolicy(firstPolicyName, null,
+
+ OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null,
JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy));
- OperationalPolicy secondOperationalPolicy = new OperationalPolicy(secondPolicyName, null, newJsonConfiguration);
+ OperationalPolicy secondOperationalPolicy = new OperationalPolicy("secondPolicyName", null,
+ newJsonConfiguration);
- //when
+ // when
firstOperationalPolicy.setConfigurationsJson(newJsonConfiguration);
Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME,
Lists.newArrayList(firstOperationalPolicy, secondOperationalPolicy));
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
Set<OperationalPolicy> savedPolicies = actualLoop.getOperationalPolicies();
assertThat(savedPolicies).hasSize(2);
assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop")
.containsExactlyInAnyOrder(firstOperationalPolicy, secondOperationalPolicy);
- Set<String> policiesLoops = Lists.newArrayList(savedPolicies).stream()
- .map(OperationalPolicy::getLoop)
- .map(Loop::getName)
- .collect(Collectors.toSet());
- assertThat(policiesLoops)
- .containsExactly(EXAMPLE_LOOP_NAME);
+ Set<String> policiesLoops = Lists.newArrayList(savedPolicies).stream().map(OperationalPolicy::getLoop)
+ .map(Loop::getName).collect(Collectors.toSet());
+ assertThat(policiesLoops).containsExactly(EXAMPLE_LOOP_NAME);
}
@Test
+ @Transactional
public void shouldRemoveOldOperationalPolicyIfNotInUpdatedList() {
- //given
+ // given
saveTestLoopToDb();
- JsonObject jsonRepresentation = JsonUtils.GSON.fromJson("{}", JsonObject.class);
- String firstPolicyName = "firstPolicyName";
- String secondPolicyName = "policyName";
- OperationalPolicy firstOperationalPolicy = new OperationalPolicy(firstPolicyName, null,
+ OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null,
JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy));
- OperationalPolicy secondOperationalPolicy = new OperationalPolicy(secondPolicyName, null, jsonRepresentation);
+ OperationalPolicy secondOperationalPolicy = new OperationalPolicy("policyName", null,
+ JsonUtils.GSON.fromJson("{}", JsonObject.class));
- //when
- Loop actualLoop = loopService
- .updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(secondOperationalPolicy));
+ // when
+ Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME,
+ Lists.newArrayList(secondOperationalPolicy));
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
Set<OperationalPolicy> savedPolicies = actualLoop.getOperationalPolicies();
assertThat(savedPolicies).hasSize(1);
- assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop")
- .containsExactly(secondOperationalPolicy);
+ assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop").containsExactly(secondOperationalPolicy);
OperationalPolicy savedPolicy = savedPolicies.iterator().next();
assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME);
}
@Test
+ @Transactional
public void shouldCreateModelPropertiesAndUpdateJsonRepresentationOfOldOne() {
- //given
+ // given
saveTestLoopToDb();
String expectedJson = "{\"test\":\"test\"}";
JsonObject baseGlobalProperites = JsonUtils.GSON.fromJson("{}", JsonObject.class);
JsonObject updatedGlobalProperites = JsonUtils.GSON.fromJson(expectedJson, JsonObject.class);
loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, baseGlobalProperites);
- //when
- Loop actualLoop = loopService
- .updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, updatedGlobalProperites);
+ // when
+ Loop actualLoop = loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, updatedGlobalProperites);
- //then
+ // then
assertThat(actualLoop).isNotNull();
assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
JsonObject returnedGlobalProperties = actualLoop.getGlobalPropertiesJson();
diff --git a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java
index 1c218977d..0e03e1b06 100644
--- a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java
+++ b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java
@@ -33,11 +33,11 @@ import java.util.HashSet;
import java.util.Random;
import org.junit.Test;
+import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.loop.log.LogType;
import org.onap.clamp.loop.log.LoopLog;
import org.onap.clamp.policy.microservice.MicroServicePolicy;
import org.onap.clamp.policy.operational.OperationalPolicy;
-import org.onap.clamp.clds.util.JsonUtils;
public class LoopToJsonTest {
@@ -58,19 +58,17 @@ public class LoopToJsonTest {
return loop;
}
- private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, String policyTosca,
- String jsonProperties, boolean shared) {
+ private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation,
+ String policyTosca, String jsonProperties, boolean shared) {
MicroServicePolicy µService = new MicroServicePolicy(name, modelType, policyTosca, shared,
- gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>(), "");
+ gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>());
µService.setProperties(new Gson().fromJson(jsonProperties, JsonObject.class));
return µService;
}
- private LoopLog getLoopLog(LogType type, String message) {
- LoopLog log = new LoopLog();
- log.setLogType(type);
- log.setMessage(message);
+ private LoopLog getLoopLog(LogType type, String message, Loop loop) {
+ LoopLog log = new LoopLog(message, type, loop);
log.setId(Long.valueOf(new Random().nextInt()));
return log;
}
@@ -81,10 +79,11 @@ public class LoopToJsonTest {
"123456789", "https://dcaetest.org", "UUID-blueprint");
OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest");
loopTest.addOperationalPolicy(opPolicy);
- MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", "{\"configtype\":\"json\"}",
- "YamlContent", "{\"param1\":\"value1\"}", true);
+ MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "",
+ "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+ "{\"param1\":\"value1\"}", true);
loopTest.addMicroServicePolicy(microServicePolicy);
- LoopLog loopLog = getLoopLog(LogType.INFO, "test message");
+ LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest);
loopTest.addLog(loopLog);
String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest);
@@ -94,7 +93,7 @@ public class LoopToJsonTest {
assertNotNull(loopTestDeserialized);
assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest, "svgRepresentation", "blueprint");
- //svg and blueprint not exposed so wont be deserialized
+ // svg and blueprint not exposed so wont be deserialized
assertThat(loopTestDeserialized.getBlueprint()).isEqualTo(null);
assertThat(loopTestDeserialized.getSvgRepresentation()).isEqualTo(null);
diff --git a/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java b/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java
new file mode 100644
index 000000000..c511f3415
--- /dev/null
+++ b/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.policy.microservice;
+
+import com.google.gson.JsonObject;
+
+import java.io.IOException;
+import java.util.HashSet;
+
+import org.junit.Test;
+import org.onap.clamp.clds.util.JsonUtils;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+public class MicroServicePayloadTest {
+
+ @Test
+ public void testPayloadConstruction() throws IOException {
+ MicroServicePolicy policy = new MicroServicePolicy("testPolicy", "onap.policy.monitoring.cdap.tca.hi.lo.app",
+ ResourceFileUtil.getResourceAsString("tosca/tosca_example.yaml"), false, new HashSet<>());
+ policy.setProperties(JsonUtils.GSON.fromJson(
+ ResourceFileUtil.getResourceAsString("tosca/micro-service-policy-properties.json"), JsonObject.class));
+ JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/micro-service-policy-payload.json"),
+ policy.createPolicyPayload(), false);
+ }
+}
diff --git a/src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java b/src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java
new file mode 100644
index 000000000..1f57422c5
--- /dev/null
+++ b/src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.policy.microservice;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.onap.clamp.policy.operational.OperationalPolicy;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+public class OperationalPolicyPayloadTest {
+
+ @Test
+ public void testOperationalPolicyPayloadConstruction() throws IOException {
+ JsonObject jsonConfig = new GsonBuilder().create().fromJson(
+ ResourceFileUtil.getResourceAsString("tosca/operational-policy-properties.json"), JsonObject.class);
+ OperationalPolicy policy = new OperationalPolicy("testPolicy", null, jsonConfig);
+ assertThat(policy.createPolicyPayload())
+ .isEqualTo(ResourceFileUtil.getResourceAsString("tosca/operational-policy-payload.yaml"));
+ }
+
+ @Test
+ public void testGuardPolicyPayloadConstruction() throws IOException {
+ JsonObject jsonConfig = new GsonBuilder().create().fromJson(
+ ResourceFileUtil.getResourceAsString("tosca/operational-policy-properties.json"), JsonObject.class);
+ OperationalPolicy policy = new OperationalPolicy("testPolicy", null, jsonConfig);
+
+ List<String> guardsList = policy.createGuardPolicyPayloads();
+
+ JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/guard1-policy-payload.json"),
+ guardsList.get(0), false);
+
+ JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/guard2-policy-payload.json"),
+ guardsList.get(1), false);
+ }
+}
diff --git a/src/test/resources/example/sdc/blueprint-dcae/tca.yaml b/src/test/resources/example/sdc/blueprint-dcae/tca.yaml
index 0ab831712..b1659073a 100644
--- a/src/test/resources/example/sdc/blueprint-dcae/tca.yaml
+++ b/src/test/resources/example/sdc/blueprint-dcae/tca.yaml
@@ -17,6 +17,7 @@ node_templates:
properties:
policy_id:
get_input: policy_id
+ policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
cdap_host_host:
type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
properties:
diff --git a/src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml b/src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml
index f73119fb6..55901368b 100644
--- a/src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml
+++ b/src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml
@@ -166,4 +166,5 @@ node_templates:
properties:
policy_id:
get_input: policy_id
+ policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
diff --git a/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml b/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
index 0ab831712..b1659073a 100644
--- a/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
+++ b/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
@@ -17,6 +17,7 @@ node_templates:
properties:
policy_id:
get_input: policy_id
+ policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
cdap_host_host:
type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
properties:
diff --git a/src/test/resources/example/sdc/expected-result/policy-data.yaml b/src/test/resources/example/sdc/expected-result/policy-data.yaml
new file mode 100644
index 000000000..7f2c4847b
--- /dev/null
+++ b/src/test/resources/example/sdc/expected-result/policy-data.yaml
@@ -0,0 +1,2008 @@
+#
+# 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.
+#
+tosca_definitions_version: tosca_simple_yaml_1_1
+imports:
+- data.yml
+policy_types:
+ tosca.policies.Root:
+ description: The TOSCA Policy Type all other TOSCA Policy Types derive from
+ tosca.policies.Placement:
+ derived_from: tosca.policies.Root
+ description: The TOSCA Policy Type definition that is used to govern placement of TOSCA nodes or groups of nodes.
+ tosca.policies.Scaling:
+ derived_from: tosca.policies.Root
+ description: The TOSCA Policy Type definition that is used to govern scaling of TOSCA nodes or groups of nodes.
+ tosca.policies.Update:
+ derived_from: tosca.policies.Root
+ description: The TOSCA Policy Type definition that is used to govern update of TOSCA nodes or groups of nodes.
+ tosca.policies.Performance:
+ derived_from: tosca.policies.Root
+ description: The TOSCA Policy Type definition that is used to declare performance requirements for TOSCA nodes or groups of nodes.
+ org.openecomp.policies.placement.Antilocate:
+ derived_from: tosca.policies.Placement
+ description: My placement policy for separation based upon container type value
+ properties:
+ name:
+ type: string
+ description: The name of the policy
+ required: false
+ status: SUPPORTED
+ container_type:
+ type: string
+ description: container type
+ required: false
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - host
+ - region
+ - compute
+ org.openecomp.policies.placement.Colocate:
+ derived_from: tosca.policies.Placement
+ description: Keep associated nodes (groups of nodes) based upon affinity value
+ properties:
+ name:
+ type: string
+ description: The name of the policy
+ required: false
+ status: SUPPORTED
+ affinity:
+ type: string
+ description: affinity
+ required: true
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - host
+ - region
+ - compute
+ org.openecomp.policies.placement.valet.Diversity:
+ derived_from: tosca.policies.Placement
+ description: Valet Diversity
+ properties:
+ level:
+ type: string
+ description: diversity
+ required: false
+ default: host
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - host
+ - rack
+ org.openecomp.policies.placement.valet.Exclusivity:
+ derived_from: tosca.policies.Placement
+ description: Valet Exclusivity
+ properties:
+ level:
+ type: string
+ description: exclusivity
+ required: false
+ default: host
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - host
+ - rack
+ org.openecomp.policies.placement.valet.Affinity:
+ derived_from: tosca.policies.Placement
+ description: Valet Affinity
+ properties:
+ level:
+ type: string
+ description: affinity
+ required: false
+ default: host
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - host
+ - rack
+ org.openecomp.policies.scaling.Fixed:
+ derived_from: tosca.policies.Scaling
+ properties:
+ quantity:
+ description: the exact number of instances to keep up
+ type: integer
+ required: true
+ org.openecomp.policies.External:
+ derived_from: tosca.policies.Root
+ description: externally managed policy (for example, type="network assignment", source="Policy Manager", name="route target")
+ properties:
+ source:
+ type: string
+ description: The name of the server that exposes the policy with predefined type and name.
+ required: false
+ type:
+ type: string
+ description: The type (category) of the policy same as it is defined in the source.
+ required: false
+ name:
+ type: string
+ description: The name of the policy, that related to specific type, same as it is defined in the source.
+ required: false
+ tosca.policies.Monitoring:
+ derived_from: tosca.policies.Root
+ description: A base policy type for all policies that governs monitoring provisioning
+ onap.policy.monitoring.cdap.tca.hi.lo.app:
+ derived_from: tosca.policies.Monitoring
+ version: 1.0.0
+ properties:
+ tca_policy:
+ type: map
+ description: TCA Policy JSON
+ entry_schema:
+ type: onap.datatypes.monitoring.tca_policy
+data_types:
+ tosca.datatypes.Root:
+ description: The TOSCA root Data Type all other TOSCA base Data Types derive from
+ integer:
+ derived_from: tosca.datatypes.Root
+ string:
+ derived_from: tosca.datatypes.Root
+ boolean:
+ derived_from: tosca.datatypes.Root
+ float:
+ derived_from: tosca.datatypes.Root
+ list:
+ derived_from: tosca.datatypes.Root
+ map:
+ derived_from: tosca.datatypes.Root
+ json:
+ derived_from: tosca.datatypes.Root
+ scalar-unit:
+ derived_from: tosca.datatypes.Root
+ scalar-unit.size:
+ derived_from: scalar-unit
+ scalar-unit.time:
+ derived_from: scalar-unit
+ scalar-unit.frequency:
+ derived_from: scalar-unit
+ tosca.datatypes.Credential:
+ derived_from: tosca.datatypes.Root
+ properties:
+ protocol:
+ type: string
+ required: false
+ token_type:
+ type: string
+ default: password
+ token:
+ type: string
+ keys:
+ type: map
+ required: false
+ entry_schema:
+ type: string
+ user:
+ type: string
+ required: false
+ org.openecomp.datatypes.PortMirroringConnectionPointDescription:
+ derived_from: tosca.datatypes.Root
+ properties:
+ nf_naming_code:
+ type: string
+ nfc_naming_code:
+ type: string
+ network_role:
+ type: string
+ pps_capacity:
+ type: string
+ nf_type:
+ type: string
+ description: deprecated
+ nfc_type:
+ type: string
+ description: deprecated
+ tosca.datatypes.TimeInterval:
+ derived_from: tosca.datatypes.Root
+ properties:
+ start_time:
+ type: timestamp
+ required: true
+ end_time:
+ type: timestamp
+ required: true
+ tosca.datatypes.network.NetworkInfo:
+ derived_from: tosca.datatypes.Root
+ properties:
+ network_name:
+ type: string
+ network_id:
+ type: string
+ addresses:
+ type: list
+ entry_schema:
+ type: string
+ tosca.datatypes.network.PortInfo:
+ derived_from: tosca.datatypes.Root
+ properties:
+ port_name:
+ type: string
+ port_id:
+ type: string
+ network_id:
+ type: string
+ mac_address:
+ type: string
+ addresses:
+ type: list
+ entry_schema:
+ type: string
+ tosca.datatypes.network.PortDef:
+ derived_from: integer
+ constraints:
+ - in_range:
+ - 1
+ - 65535
+ tosca.datatypes.network.PortSpec:
+ derived_from: tosca.datatypes.Root
+ properties:
+ protocol:
+ type: string
+ required: true
+ default: tcp
+ constraints:
+ - valid_values:
+ - udp
+ - tcp
+ - igmp
+ target:
+ type: tosca.datatypes.network.PortDef
+ target_range:
+ type: range
+ constraints:
+ - in_range:
+ - 1
+ - 65535
+ source:
+ type: tosca.datatypes.network.PortDef
+ source_range:
+ type: range
+ constraints:
+ - in_range:
+ - 1
+ - 65535
+ org.openecomp.datatypes.heat.network.AddressPair:
+ derived_from: tosca.datatypes.Root
+ description: MAC/IP address pairs
+ properties:
+ mac_address:
+ type: string
+ description: MAC address
+ required: false
+ status: SUPPORTED
+ ip_address:
+ type: string
+ description: IP address
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.network.subnet.HostRoute:
+ derived_from: tosca.datatypes.Root
+ description: Host route info for the subnet
+ properties:
+ destination:
+ type: string
+ description: The destination for static route
+ required: false
+ status: SUPPORTED
+ nexthop:
+ type: string
+ description: The next hop for the destination
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.network.AllocationPool:
+ derived_from: tosca.datatypes.Root
+ description: The start and end addresses for the allocation pool
+ properties:
+ start:
+ type: string
+ description: Start address for the allocation pool
+ required: false
+ status: SUPPORTED
+ end:
+ type: string
+ description: End address for the allocation pool
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.network.neutron.Subnet:
+ derived_from: tosca.datatypes.Root
+ description: A subnet represents an IP address block that can be used for assigning IP addresses to virtual instances
+ properties:
+ tenant_id:
+ type: string
+ description: The ID of the tenant who owns the network
+ required: false
+ status: SUPPORTED
+ enable_dhcp:
+ type: boolean
+ description: Set to true if DHCP is enabled and false if DHCP is disabled
+ required: false
+ default: true
+ status: SUPPORTED
+ ipv6_address_mode:
+ type: string
+ description: IPv6 address mode
+ required: false
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - dhcpv6-stateful
+ - dhcpv6-stateless
+ - slaac
+ ipv6_ra_mode:
+ type: string
+ description: IPv6 RA (Router Advertisement) mode
+ required: false
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - dhcpv6-stateful
+ - dhcpv6-stateless
+ - slaac
+ value_specs:
+ type: map
+ description: Extra parameters to include in the request
+ required: false
+ default: {}
+ status: SUPPORTED
+ entry_schema:
+ type: string
+ allocation_pools:
+ type: list
+ description: The start and end addresses for the allocation pools
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.network.AllocationPool
+ subnetpool:
+ type: string
+ description: The name or ID of the subnet pool
+ required: false
+ status: SUPPORTED
+ dns_nameservers:
+ type: list
+ description: A specified set of DNS name servers to be used
+ required: false
+ default: []
+ status: SUPPORTED
+ entry_schema:
+ type: string
+ host_routes:
+ type: list
+ description: The gateway IP address
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.network.subnet.HostRoute
+ ip_version:
+ type: integer
+ description: The gateway IP address
+ required: false
+ default: 4
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - '4'
+ - '6'
+ name:
+ type: string
+ description: The name of the subnet
+ required: false
+ status: SUPPORTED
+ prefixlen:
+ type: integer
+ description: Prefix length for subnet allocation from subnet pool
+ required: false
+ status: SUPPORTED
+ constraints:
+ - greater_or_equal: 0
+ cidr:
+ type: string
+ description: The CIDR
+ required: false
+ status: SUPPORTED
+ gateway_ip:
+ type: string
+ description: The gateway IP address
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.novaServer.network.PortExtraProperties:
+ derived_from: tosca.datatypes.Root
+ description: Nova server network expand properties for port
+ properties:
+ port_security_enabled:
+ type: boolean
+ description: Flag to enable/disable port security on the port
+ required: false
+ status: SUPPORTED
+ mac_address:
+ type: string
+ description: MAC address to give to this port
+ required: false
+ status: SUPPORTED
+ admin_state_up:
+ type: boolean
+ description: The administrative state of this port
+ required: false
+ default: true
+ status: SUPPORTED
+ qos_policy:
+ type: string
+ description: The name or ID of QoS policy to attach to this port
+ required: false
+ status: SUPPORTED
+ allowed_address_pairs:
+ type: list
+ description: Additional MAC/IP address pairs allowed to pass through the port
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.network.AddressPair
+ binding:vnic_type:
+ type: string
+ description: The vnic type to be bound on the neutron port
+ required: false
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - macvtap
+ - direct
+ - normal
+ value_specs:
+ type: map
+ description: Extra parameters to include in the request
+ required: false
+ default: {}
+ status: SUPPORTED
+ entry_schema:
+ type: string
+ org.openecomp.datatypes.heat.novaServer.network.AddressInfo:
+ derived_from: tosca.datatypes.network.NetworkInfo
+ description: Network addresses with corresponding port id
+ properties:
+ port_id:
+ type: string
+ description: Port id
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.neutron.port.FixedIps:
+ derived_from: tosca.datatypes.Root
+ description: subnet/ip_address
+ properties:
+ subnet:
+ type: string
+ description: Subnet in which to allocate the IP address for this port
+ required: false
+ status: SUPPORTED
+ ip_address:
+ type: string
+ description: IP address desired in the subnet for this port
+ required: false
+ status: SUPPORTED
+ subnet_id:
+ type: string
+ description: Subnet in which to allocate the IP address for this port
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.FileInfo:
+ derived_from: tosca.datatypes.Root
+ description: Heat File Info
+ properties:
+ file:
+ type: string
+ description: The required URI string (relative or absolute) which can be used to locate the file
+ required: true
+ status: SUPPORTED
+ file_type:
+ type: string
+ description: The type of the file
+ required: true
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - base
+ - env
+ - volume
+ - network
+ org.openecomp.datatypes.heat.contrail.network.rule.PortPairs:
+ derived_from: tosca.datatypes.Root
+ description: source and destination port pairs
+ properties:
+ start_port:
+ type: string
+ description: Start port
+ required: false
+ status: SUPPORTED
+ end_port:
+ type: string
+ description: End port
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrail.network.rule.Rule:
+ derived_from: tosca.datatypes.Root
+ description: policy rule
+ properties:
+ src_ports:
+ type: list
+ description: Source ports
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs
+ protocol:
+ type: string
+ description: Protocol
+ required: false
+ status: SUPPORTED
+ dst_addresses:
+ type: list
+ description: Destination addresses
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork
+ apply_service:
+ type: string
+ description: Service to apply
+ required: false
+ status: SUPPORTED
+ dst_ports:
+ type: list
+ description: Destination ports
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs
+ src_addresses:
+ type: list
+ description: Source addresses
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork
+ direction:
+ type: string
+ description: Direction
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrail.network.rule.RuleList:
+ derived_from: tosca.datatypes.Root
+ description: list of policy rules
+ properties:
+ policy_rule:
+ type: list
+ description: Contrail network rule
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrail.network.rule.Rule
+ org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork:
+ derived_from: tosca.datatypes.Root
+ description: source and destination addresses
+ properties:
+ virtual_network:
+ type: string
+ description: Virtual network
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.network.neutron.SecurityRules.Rule:
+ derived_from: tosca.datatypes.Root
+ description: Rules Pairs
+ properties:
+ remote_group_id:
+ type: string
+ description: The remote group ID to be associated with this security group rule
+ required: false
+ status: SUPPORTED
+ protocol:
+ type: string
+ description: The protocol that is matched by the security group rule
+ required: false
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - tcp
+ - udp
+ - icmp
+ ethertype:
+ type: string
+ description: Ethertype of the traffic
+ required: false
+ default: IPv4
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - IPv4
+ - IPv6
+ port_range_max:
+ type: integer
+ description: 'The maximum port number in the range that is matched by the
+ security group rule. '
+ required: false
+ status: SUPPORTED
+ constraints:
+ - in_range:
+ - 0
+ - 65535
+ remote_ip_prefix:
+ type: string
+ description: The remote IP prefix (CIDR) to be associated with this security group rule
+ required: false
+ status: SUPPORTED
+ remote_mode:
+ type: string
+ description: Whether to specify a remote group or a remote IP prefix
+ required: false
+ default: remote_ip_prefix
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - remote_ip_prefix
+ - remote_group_id
+ direction:
+ type: string
+ description: The direction in which the security group rule is applied
+ required: false
+ default: ingress
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - egress
+ - ingress
+ port_range_min:
+ type: integer
+ description: The minimum port number in the range that is matched by the security group rule.
+ required: false
+ status: SUPPORTED
+ constraints:
+ - in_range:
+ - 0
+ - 65535
+ org.openecomp.datatypes.heat.substitution.SubstitutionFiltering:
+ derived_from: tosca.datatypes.Root
+ description: Substitution Filter
+ properties:
+ substitute_service_template:
+ type: string
+ description: Substitute Service Template
+ required: true
+ status: SUPPORTED
+ index_value:
+ type: integer
+ description: Index value of the substitution service template runtime instance
+ required: false
+ default: 0
+ status: SUPPORTED
+ constraints:
+ - greater_or_equal: 0
+ count:
+ type: string
+ description: Count
+ required: false
+ default: 1
+ status: SUPPORTED
+ scaling_enabled:
+ type: boolean
+ description: Indicates whether service scaling is enabled
+ required: false
+ default: true
+ status: SUPPORTED
+ mandatory:
+ type: boolean
+ description: Mandatory
+ required: false
+ default: true
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence:
+ derived_from: tosca.datatypes.Root
+ description: network policy refs data sequence
+ properties:
+ network_policy_refs_data_sequence_major:
+ type: integer
+ description: Network Policy ref data sequence Major
+ required: false
+ status: SUPPORTED
+ network_policy_refs_data_sequence_minor:
+ type: integer
+ description: Network Policy ref data sequence Minor
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefData:
+ derived_from: tosca.datatypes.Root
+ description: network policy refs data
+ properties:
+ network_policy_refs_data_sequence:
+ type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence
+ description: Network Policy ref data sequence
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet:
+ derived_from: tosca.datatypes.Root
+ description: Network Ipam Ref Data Subnet
+ properties:
+ network_ipam_refs_data_ipam_subnets_subnet_ip_prefix_len:
+ type: string
+ description: Network ipam refs data ipam subnets ip prefix len
+ required: false
+ status: SUPPORTED
+ network_ipam_refs_data_ipam_subnets_subnet_ip_prefix:
+ type: string
+ description: Network ipam refs data ipam subnets ip prefix
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList:
+ derived_from: tosca.datatypes.Root
+ description: Network Ipam Ref Data Subnet List
+ properties:
+ network_ipam_refs_data_ipam_subnets_subnet:
+ type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet
+ description: Network ipam refs data ipam subnets
+ required: false
+ status: SUPPORTED
+ network_ipam_refs_data_ipam_subnets_addr_from_start:
+ type: string
+ description: Network ipam refs data ipam subnets addr from start
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.IpamRefData:
+ derived_from: tosca.datatypes.Root
+ description: Network Ipam Ref Data
+ properties:
+ network_ipam_refs_data_ipam_subnets:
+ type: list
+ description: Network ipam refs data ipam subnets
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList
+ org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork:
+ derived_from: tosca.datatypes.Root
+ description: source addresses
+ properties:
+ network_policy_entries_policy_rule_src_addresses_virtual_network:
+ type: string
+ description: Source addresses Virtual network
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork:
+ derived_from: tosca.datatypes.Root
+ description: destination addresses
+ properties:
+ network_policy_entries_policy_rule_dst_addresses_virtual_network:
+ type: string
+ description: Destination addresses Virtual network
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs:
+ derived_from: tosca.datatypes.Root
+ description: destination port pairs
+ properties:
+ network_policy_entries_policy_rule_dst_ports_start_port:
+ type: string
+ description: Start port
+ required: false
+ status: SUPPORTED
+ network_policy_entries_policy_rule_dst_ports_end_port:
+ type: string
+ description: End port
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs:
+ derived_from: tosca.datatypes.Root
+ description: source port pairs
+ properties:
+ network_policy_entries_policy_rule_src_ports_start_port:
+ type: string
+ description: Start port
+ required: false
+ status: SUPPORTED
+ network_policy_entries_policy_rule_src_ports_end_port:
+ type: string
+ description: End port
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList:
+ derived_from: tosca.datatypes.Root
+ description: Action List
+ properties:
+ network_policy_entries_policy_rule_action_list_simple_action:
+ type: string
+ description: Simple Action
+ required: false
+ status: SUPPORTED
+ network_policy_entries_policy_rule_action_list_apply_service:
+ type: list
+ description: Apply Service
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: string
+ org.openecomp.datatypes.heat.contrailV2.network.rule.Rule:
+ derived_from: tosca.datatypes.Root
+ description: policy rule
+ properties:
+ network_policy_entries_policy_rule_dst_addresses:
+ type: list
+ description: Destination addresses
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork
+ network_policy_entries_policy_rule_dst_ports:
+ type: list
+ description: Destination ports
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs
+ network_policy_entries_policy_rule_protocol:
+ type: string
+ description: Protocol
+ required: false
+ status: SUPPORTED
+ network_policy_entries_policy_rule_src_addresses:
+ type: list
+ description: Source addresses
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork
+ network_policy_entries_policy_rule_direction:
+ type: string
+ description: Direction
+ required: false
+ status: SUPPORTED
+ network_policy_entries_policy_rule_src_ports:
+ type: list
+ description: Source ports
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs
+ network_policy_entries_policy_rule_action_list:
+ type: org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList
+ description: Action list
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.network.rule.RuleList:
+ derived_from: tosca.datatypes.Root
+ description: list of policy rules
+ properties:
+ network_policy_entries_policy_rule:
+ type: list
+ description: Contrail network rule
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.network.rule.Rule
+ org.openecomp.datatypes.heat.network.contrail.port.StaticRoute:
+ derived_from: tosca.datatypes.Root
+ description: static route
+ properties:
+ prefix:
+ type: string
+ description: Route prefix
+ required: false
+ status: SUPPORTED
+ next_hop:
+ type: string
+ description: Next hop
+ required: false
+ status: SUPPORTED
+ next_hop_type:
+ type: string
+ description: Next hop type
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.network.contrail.AddressPair:
+ derived_from: tosca.datatypes.Root
+ description: Address Pair
+ properties:
+ address_mode:
+ type: string
+ description: Address mode active-active or active-standy
+ required: false
+ status: SUPPORTED
+ constraints:
+ - valid_values:
+ - active-active
+ - active-standby
+ prefix:
+ type: string
+ description: IP address prefix
+ required: false
+ status: SUPPORTED
+ mac_address:
+ type: string
+ description: Mac address
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.network.contrail.InterfaceData:
+ derived_from: tosca.datatypes.Root
+ description: Interface Data
+ properties:
+ static_routes:
+ type: list
+ description: An ordered list of static routes to be added to this interface
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.network.contrail.port.StaticRoute
+ virtual_network:
+ type: string
+ description: Virtual Network for this interface
+ required: true
+ status: SUPPORTED
+ allowed_address_pairs:
+ type: list
+ description: List of allowed address pair for this interface
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.network.contrail.AddressPair
+ ip_address:
+ type: string
+ description: IP for this interface
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.machine.interface.Properties:
+ derived_from: tosca.datatypes.Root
+ description: Virtual Machine Interface Properties.
+ properties:
+ virtual_machine_interface_properties_service_interface_type:
+ type: string
+ description: Service Interface Type.
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.Root:
+ derived_from: tosca.datatypes.Root
+ description: |
+ The ECOMP root Data Type all other Data Types derive from
+ properties:
+ supplemental_data:
+ type: map
+ entry_schema:
+ description: |
+ A placeholder for missing properties that would be included in future ecomp model versions. fromat <key>:<value>
+ type: string
+ org.openecomp.datatypes.AssignmentRequirements:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ is_required:
+ description: |
+ "true" indicates that assignment is required
+ type: boolean
+ default: false
+ required: true
+ count:
+ description: number of assignments required
+ type: integer
+ required: false
+ org.openecomp.datatypes.network.SubnetAssignments:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ ip_network_address_plan:
+ type: string
+ required: false
+ description: Reference to EIPAM, VLAN or other address plan ID used to assign subnets to this network
+ dhcp_enabled:
+ type: boolean
+ required: false
+ description: \"true\" indicates the network has 1 or more policies
+ ip_version:
+ type: integer
+ constraints:
+ - valid_values:
+ - 4
+ - 6
+ required: true
+ description: The IP version of the subnet
+ cidr_mask:
+ type: integer
+ required: true
+ description: The default subnet CIDR mask
+ min_subnets_count:
+ type: integer
+ default: 1
+ required: true
+ description: Quantity of subnets that must be initially assigned
+ org.openecomp.datatypes.network.IPv4SubnetAssignments:
+ derived_from: org.openecomp.datatypes.network.SubnetAssignments
+ properties:
+ use_ipv4:
+ type: boolean
+ required: true
+ description: Indicates IPv4 subnet assignments
+ org.openecomp.datatypes.network.IPv6SubnetAssignments:
+ derived_from: org.openecomp.datatypes.network.SubnetAssignments
+ properties:
+ use_ipv6:
+ type: boolean
+ required: true
+ description: Indicates IPv6 subnet assignments
+ org.openecomp.datatypes.network.NetworkAssignments:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ ecomp_generated_network_assignment:
+ type: boolean
+ required: true
+ default: false
+ description: |
+ \"true\" indicates that the network assignments will be auto-generated by ECOMP \"false\" indicates operator-supplied Network assignments file upload is required (e.g. VID will present prompt to operator to upload operator-supplied Network assignments file).
+ is_shared_network:
+ type: boolean
+ required: true
+ description: \"true\" means this network is shared by multiple Openstack tenants
+ is_external_network:
+ type: boolean
+ required: true
+ default: false
+ description: |
+ \"true\" means this Contrail external network
+ ipv4_subnet_default_assignment:
+ type: org.openecomp.datatypes.network.IPv4SubnetAssignments
+ required: true
+ description: IPv4 defualt subnet assignments
+ ipv6_subnet_default_assignment:
+ type: org.openecomp.datatypes.network.IPv6SubnetAssignments
+ required: true
+ description: IPv6 defualt subnet assignments
+ related_networks:
+ type: list
+ required: false
+ description: Related Networks List.
+ entry_schema:
+ type: org.openecomp.datatypes.network.RelatedNetworksAssignments
+ is_trunked:
+ type: boolean
+ required: true
+ description: \"true\" indicates that network is trunked
+ default: false
+ org.openecomp.datatypes.network.ProviderNetwork:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ is_provider_network:
+ type: boolean
+ required: true
+ description: \"true\" indicates that this a Neutron provider type of network
+ physical_network_name:
+ type: string
+ required: false
+ constraints:
+ - valid_values:
+ - Physnet41
+ - Physnet42
+ - Physnet43
+ - Physnet44
+ - Physnet21
+ - Physnet22
+ - sriovnet1
+ - sriovnet2
+ - oam
+ description: |
+ Identifies the NUMA processor cluster to which this physical network interface belongs. NUMA instance correlates to the first digit of the Physical Network Name suffix (e.g. \"01\" = NUMA 0, \"11\" = NUMA 1)
+ numa:
+ type: string
+ required: false
+ constraints:
+ - valid_values:
+ - NUMA 0
+ - NUMA 1
+ description: |
+ PNIC instance within the NUMA processor cluster PNIC Instance correlates to the second digit of the Physical Network Name suffix (e.g. "01" = PNIC 1, "02" = "PNIC 2)
+ pnic_instance:
+ type: integer
+ required: false
+ description: PNIC instance within the NUMA processor cluster
+ org.openecomp.datatypes.network.NetworkFlows:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ is_network_policy:
+ type: boolean
+ required: false
+ default: false
+ description: \"true\" indicates the network has 1 or more policies
+ network_policy:
+ type: string
+ required: false
+ description: 'Identifies the specific Cloud network policy that must be applied
+ to this network (source: from Policy Manager).'
+ is_bound_to_vpn:
+ type: boolean
+ required: false
+ default: false
+ description: \"true\" indicates the network has 1 or more vpn bindings
+ vpn_binding:
+ type: string
+ required: false
+ description: 'Identifies the specific VPN Binding entry in A&AI that must
+ be applied when creating this network (source: A&AI)'
+ org.openecomp.datatypes.network.VlanRequirements:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ vlan_range_plan:
+ type: string
+ required: true
+ description: reference to a vlan range plan
+ vlan_type:
+ type: string
+ required: true
+ constraints:
+ - valid_values:
+ - c-tag
+ - s-tag
+ description: identifies the vlan type (e.g., c-tag)
+ vlan_count:
+ type: integer
+ required: true
+ description: identifies the number of vlan tags to assign to the CP from the plan
+ org.openecomp.datatypes.network.IpRequirements:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ ip_version:
+ type: integer
+ required: true
+ constraints:
+ - valid_values:
+ - 4
+ - 6
+ ip_count:
+ description: identifies the number of ip address to assign to the CP from the plan
+ type: integer
+ required: false
+ floating_ip_count:
+ type: integer
+ required: false
+ subnet_role:
+ type: string
+ required: false
+ assingment_method:
+ type: string
+ required: true
+ constraints:
+ - valid_values:
+ - fixed
+ - dhcp
+ dhcp_enabled:
+ type: boolean
+ required: false
+ ip_count_required:
+ description: identifies the number of ip address to assign to the CP from the plan
+ type: org.openecomp.datatypes.AssignmentRequirements
+ required: false
+ floating_ip_count_required:
+ type: org.openecomp.datatypes.AssignmentRequirements
+ required: false
+ ip_address_plan_name:
+ type: string
+ required: false
+ vrf_name:
+ type: string
+ required: false
+ org.openecomp.datatypes.network.MacAssignments:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ mac_range_plan:
+ type: string
+ required: true
+ description: reference to a MAC address range plan
+ mac_count:
+ type: integer
+ required: true
+ description: identifies the number of MAC addresses to assign to the CP from the plan
+ org.openecomp.datatypes.EcompHoming:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ ecomp_selected_instance_node_target:
+ type: boolean
+ required: true
+ default: false
+ description: |
+ \"true\" indicates that the target deployment node for this instance will be auto-selected by ECOMP \"false\" indicates operator-supplied instance target deployment node required (e.g. VID will present a prompt to operator and collect the operator-selected target node for the deployment of this Network instance).
+ homing_policy:
+ type: string
+ required: false
+ description: Referenc to a service level homing policy that ECOMP will use for instance deployment target node
+ instance_node_target:
+ type: string
+ required: false
+ description: Instance target deployment node
+ org.openecomp.datatypes.EcompNaming:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ ecomp_generated_naming:
+ type: boolean
+ required: true
+ default: true
+ description: |
+ \"true\" indicates that the name for the instance will be auto-generated by ECOMP. \"false\" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+ naming_policy:
+ type: string
+ required: false
+ description: Referenc to naming policy that ECOMP will use when the name is auto-generated
+ org.openecomp.datatypes.network.MacRequirements:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ mac_range_plan:
+ description: reference to a MAC address range plan
+ type: string
+ required: false
+ mac_count:
+ description: identifies the number of MAC addresses to assign to the CP from the plan
+ type: integer
+ required: false
+ mac_count_required:
+ description: identifies the number of MAC addresses to assign to the CP from the plan
+ type: org.openecomp.datatypes.AssignmentRequirements
+ org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp:
+ derived_from: tosca.datatypes.Root
+ description: Virtual Machine Sub Interface Address Pair IP.
+ properties:
+ ip_prefix:
+ type: string
+ description: IP Prefix.
+ required: false
+ status: SUPPORTED
+ ip_prefix_len:
+ type: integer
+ description: IP Prefix Len.
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.MacAddress:
+ derived_from: tosca.datatypes.Root
+ description: Virtual Machine Sub Interface Mac Address.
+ properties:
+ mac_address:
+ type: list
+ description: Mac Addresses List.
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: string
+ org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.Properties:
+ derived_from: tosca.datatypes.Root
+ description: Virtual Machine Sub Interface VLAN Properties.
+ properties:
+ sub_interface_vlan_tag:
+ type: string
+ description: Sub Interface VLAN Tag.
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair:
+ derived_from: tosca.datatypes.Root
+ description: Virtual Machine Sub Interface Address Pair.
+ properties:
+ address_mode:
+ type: string
+ description: Address Mode.
+ required: false
+ status: SUPPORTED
+ ip:
+ type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp
+ description: IP.
+ required: false
+ status: SUPPORTED
+ mac:
+ type: string
+ description: Mac.
+ required: false
+ status: SUPPORTED
+ org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairs:
+ derived_from: tosca.datatypes.Root
+ description: Virtual Machine Sub Interface Address Pairs.
+ properties:
+ allowed_address_pair:
+ type: list
+ description: Addresses pair List.
+ required: false
+ status: SUPPORTED
+ entry_schema:
+ type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair
+ org.openecomp.datatypes.Naming:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ ecomp_generated_naming:
+ description: |
+ "true" indicates that the name for the instance will be auto-generated by ECOMP. "false" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+ type: boolean
+ default: true
+ required: true
+ naming_policy:
+ description: Reference to naming policy that ECOMP will use when the name is auto-generated
+ type: string
+ required: false
+ instance_name:
+ description: indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+ type: string
+ required: false
+ org.openecomp.datatypes.flavors.ComputeFlavor:
+ derived_from: tosca.datatypes.Root
+ properties:
+ num_cpus:
+ type: integer
+ disk_size:
+ type: scalar-unit.size
+ mem_size:
+ type: scalar-unit.size
+ org.openecomp.datatypes.flavors.LicenseFlavor:
+ derived_from: tosca.datatypes.Root
+ properties:
+ feature_group_uuid:
+ type: string
+ org.openecomp.datatypes.flavors.VendorInfo:
+ derived_from: tosca.datatypes.Root
+ properties:
+ manufacturer_reference_number:
+ type: string
+ vendor_model:
+ type: string
+ org.openecomp.datatypes.flavors.DeploymentFlavor:
+ derived_from: tosca.datatypes.Root
+ properties:
+ sp_part_number:
+ type: string
+ vendor_info:
+ type: org.openecomp.datatypes.flavors.VendorInfo
+ compute_flavor:
+ type: org.openecomp.datatypes.flavors.ComputeFlavor
+ license_flavor:
+ type: org.openecomp.datatypes.flavors.LicenseFlavor
+ required: false
+ org.openecomp.datatypes.ImageInfo:
+ derived_from: tosca.datatypes.Root
+ properties:
+ software_version:
+ type: string
+ file_name:
+ type: string
+ file_hash:
+ type: string
+ description: checksum/signature
+ file_hash_type:
+ type: string
+ required: false
+ default: md5
+ org.openecomp.datatypes.network.RelatedNetworksAssignments:
+ derived_from: org.openecomp.datatypes.Root
+ properties:
+ related_network_role:
+ type: string
+ description: The network role of the related network, sharing provider network.
+ required: false
+ tosca.datatypes.nfv.VnfcConfigurableProperties:
+ derived_from: tosca.datatypes.Root
+ properties:
+ additional_vnfc_configurable_properties:
+ type: map
+ entry_schema:
+ type: string
+ required: false
+ tosca.datatypes.nfv.RequestedAdditionalCapability:
+ derived_from: tosca.datatypes.Root
+ properties:
+ support_mandatory:
+ type: boolean
+ required: true
+ min_requested_additional_capability_version:
+ type: string
+ required: false
+ preferred_requested_additional_capability_version:
+ type: string
+ required: false
+ requested_additional_capability_name:
+ type: string
+ required: true
+ target_performance_parameters:
+ type: map
+ entry_schema:
+ type: string
+ required: true
+ tosca.datatypes.nfv.VirtualMemory:
+ derived_from: tosca.datatypes.Root
+ properties:
+ virtual_mem_size:
+ type: scalar-unit.size
+ required: true
+ virtual_mem_oversubscription_policy:
+ type: string
+ required: false
+ vdu_memory_requirements:
+ type: map
+ entry_schema:
+ type: string
+ required: false
+ numa_enabled:
+ type: boolean
+ required: false
+ tosca.datatypes.nfv.VirtualCpuPinning:
+ derived_from: tosca.datatypes.Root
+ properties:
+ cpu_pinning_policy:
+ type: string
+ constraints:
+ - valid_values:
+ - static
+ - dynamic
+ required: false
+ cpu_pinning_map:
+ type: map
+ entry_schema:
+ type: string
+ required: false
+ tosca.datatypes.nfv.VirtualCpu:
+ derived_from: tosca.datatypes.Root
+ properties:
+ cpu_architecture:
+ type: string
+ required: false
+ num_virtual_cpu:
+ type: integer
+ required: true
+ virtual_cpu_clock:
+ type: scalar-unit.frequency
+ required: false
+ virtual_cpu_oversubscription_policy:
+ type: string
+ required: false
+ vdu_cpu_requirements:
+ type: map
+ entry_schema:
+ type: string
+ required: false
+ virtual_cpu_pinning:
+ type: tosca.datatypes.nfv.VirtualCpuPinning
+ required: false
+ tosca.datatypes.nfv.LogicalNodeData:
+ derived_from: tosca.datatypes.Root
+ properties:
+ logical_node_requirements:
+ type: map
+ entry_schema:
+ type: string
+ required: false
+ tosca.datatypes.nfv.VirtualNetworkInterfaceRequirements:
+ derived_from: tosca.datatypes.Root
+ properties:
+ name:
+ type: string
+ required: false
+ description:
+ type: string
+ required: false
+ support_mandatory:
+ type: boolean
+ required: true
+ requirement:
+ type: string
+ required: false
+ network_interface_requirements:
+ type: map
+ entry_schema:
+ type: string
+ required: true
+ nic_io_requirements:
+ type: tosca.datatypes.nfv.LogicalNodeData
+ required: false
+ tosca.datatypes.nfv.injectFile:
+ derived_from: tosca.datatypes.Root
+ properties:
+ source_path:
+ type: string
+ required: true
+ dest_path:
+ type: string
+ required: true
+ tosca.datatypes.nfv.L2AddressData:
+ derived_from: tosca.datatypes.Root
+ properties:
+ mac_address_assignment:
+ type: boolean
+ required: true
+ address:
+ type: string
+ required: false
+ tosca.datatypes.nfv.L3AddressData:
+ derived_from: tosca.datatypes.Root
+ properties:
+ ip_address_assignment:
+ type: boolean
+ required: true
+ floating_ip_activated:
+ type: boolean
+ required: true
+ ip_address_type:
+ type: string
+ required: false
+ constraints:
+ - valid_values:
+ - ipv4
+ - ipv6
+ number_of_ip_address:
+ type: integer
+ required: false
+ fixed_ip_address:
+ type: list
+ entry_schema:
+ type: string
+ required: false
+ tosca.datatypes.nfv.AddressData:
+ properties:
+ address_type:
+ constraints:
+ - valid_values:
+ - mac_address
+ - ip_address
+ type: string
+ required: true
+ l2_address_data:
+ required: false
+ type: tosca.datatypes.nfv.L2AddressData
+ l3_address_data:
+ required: false
+ type: tosca.datatypes.nfv.L3AddressData
+ tosca.datatypes.nfv.ConnectivityType:
+ derived_from: tosca.datatypes.Root
+ properties:
+ layer_protocol:
+ type: string
+ required: true
+ constraints:
+ - valid_values:
+ - ethernet
+ - mpls
+ - odu2
+ - ipv4
+ - ipv6
+ - pseudo_wire
+ flow_pattern:
+ type: string
+ required: false
+ constraints:
+ - valid_values:
+ - Line
+ - Tree
+ - Mesh
+ tosca.datatypes.nfv.VlFlavour:
+ derived_from: tosca.datatypes.Root
+ properties:
+ flavourId:
+ type: string
+ tosca.datatypes.nfv.ext.AddressPairs:
+ properties:
+ ip:
+ type: string
+ required: false
+ mac:
+ type: string
+ required: false
+ tosca.datatypes.nfv.ext.FloatingIP:
+ properties:
+ external_network:
+ type: string
+ required: false
+ ip_address:
+ type: string
+ required: false
+ tosca.datatypes.nfv.ext.LocationInfo:
+ properties:
+ availability_zone:
+ type: string
+ required: false
+ vimid:
+ type: integer
+ required: false
+ tenant:
+ type: string
+ required: false
+ tosca.datatypes.nfv.ext.HostRouteInfo:
+ properties:
+ destination:
+ type: string
+ required: false
+ nexthop:
+ type: string
+ required: false
+ tosca.datatypes.nfv.ext.InjectData:
+ properties:
+ file_name:
+ type: string
+ required: false
+ file_data:
+ type: string
+ required: false
+ tosca.datatypes.nfv.ext.zte.WatchDog:
+ properties:
+ enable_delay:
+ type: integer
+ required: false
+ action:
+ type: string
+ required: false
+ tosca.datatypes.nfv.ext.LocalAffinityOrAntiAffinityRule:
+ properties:
+ scope:
+ type: string
+ required: false
+ affinity_antiaffinity:
+ type: string
+ required: false
+ tosca.datatypes.nfv.VduProfile:
+ derived_from: tosca.datatypes.Root
+ properties:
+ min_number_of_instances:
+ type: integer
+ required: true
+ max_number_of_instances:
+ type: integer
+ required: true
+ watchdog:
+ type: string
+ required: true
+ vmBootUpTimeOut:
+ type: integer
+ required: false
+ tosca.datatypes.nfv.LinkBitRateRequirements:
+ derived_from: tosca.datatypes.Root
+ properties:
+ root:
+ type: integer
+ required: true
+ leaf:
+ type: integer
+ required: true
+ tosca.datatypes.nfv.Qos:
+ derived_from: tosca.datatypes.Root
+ properties:
+ latency:
+ type: integer
+ required: true
+ packet_delay_variation:
+ type: integer
+ required: true
+ packet_loss_ratio:
+ type: float
+ constraints:
+ - in_range:
+ - 0.0
+ - 1.0
+ required: false
+ tosca.datatypes.nfv.VlProfile:
+ derived_from: tosca.datatypes.Root
+ properties:
+ max_bit_rate_requirements:
+ type: tosca.datatypes.nfv.LinkBitRateRequirements
+ required: true
+ min_bit_rate_requirements:
+ type: tosca.datatypes.nfv.LinkBitRateRequirements
+ required: true
+ qos:
+ type: tosca.datatypes.nfv.Qos
+ required: false
+ initiationParameters:
+ type: map
+ entry_schema:
+ type: string
+ required: false
+ cidr:
+ type: string
+ required: false
+ networkName:
+ type: string
+ required: false
+ startIp:
+ type: string
+ required: false
+ endIp:
+ type: string
+ required: false
+ gatewayIp:
+ type: string
+ required: false
+ segmentationId:
+ type: integer
+ required: false
+ physicalNetwork:
+ type: string
+ required: false
+ networkType:
+ type: string
+ required: false
+ constraints:
+ - valid_values:
+ - VLAN
+ - VXLAN
+ dhcpEnabled:
+ type: boolean
+ required: false
+ vlanTransparent:
+ type: boolean
+ required: false
+ tosca.datatypes.nfv.VduLevel:
+ derived_from: tosca.datatypes.Root
+ properties:
+ number_of_instances:
+ type: integer
+ required: true
+ tosca.datatypes.nfv.ScaleInfo:
+ derived_from: tosca.datatypes.Root
+ properties:
+ scaleLevel:
+ type: integer
+ required: true
+ tosca.datatypes.nfv.ScaleAspect:
+ derived_from: tosca.datatypes.Root
+ properties:
+ name:
+ type: string
+ required: true
+ description:
+ type: string
+ required: true
+ associated_group:
+ type: string
+ required: false
+ max_scale_level:
+ type: integer
+ required: true
+ tosca.datatypes.nfv.InstantiationLevel:
+ derived_from: tosca.datatypes.Root
+ properties:
+ description:
+ type: string
+ required: true
+ vdu_levels:
+ type: map
+ required: true
+ entry_schema:
+ type: tosca.datatypes.nfv.VduLevel
+ scale_info:
+ type: map
+ required: false
+ entry_schema:
+ type: tosca.datatypes.nfv.ScaleInfo
+ tosca.datatypes.nfv.VnfScaleOperationConfiguration:
+ derived_from: tosca.datatypes.Root
+ properties:
+ scaling_by_more_than_one_step_supported:
+ type: boolean
+ tosca.datatypes.nfv.VnfScaleToLevelOperationConfiguration:
+ derived_from: tosca.datatypes.Root
+ properties:
+ arbitrary_target_levels_supported:
+ type: boolean
+ tosca.datatypes.nfv.VnfHealOperationConfiguration:
+ derived_from: tosca.datatypes.Root
+ properties:
+ causes:
+ type: list
+ entry_schema:
+ type: string
+ tosca.datatypes.nfv.VnfTerminateOperationConfiguration:
+ derived_from: tosca.datatypes.Root
+ properties:
+ min_graceful_termination_timeout:
+ type: integer
+ max_recommended_graceful_termination_timeout:
+ type: integer
+ tosca.datatypes.nfv.VnfOperateOperationConfiguration:
+ derived_from: tosca.datatypes.Root
+ properties:
+ min_graceful_termination_timeout:
+ type: integer
+ max_recommended_graceful_termination_timeout:
+ type: integer
+ tosca.datatypes.nfv.VnfLcmOperationsConfiguration:
+ derived_from: tosca.datatypes.Root
+ properties:
+ scale:
+ type: tosca.datatypes.nfv.VnfScaleOperationConfiguration
+ scale_to_level:
+ type: tosca.datatypes.nfv.VnfScaleToLevelOperationConfiguration
+ heal:
+ type: tosca.datatypes.nfv.VnfHealOperationConfiguration
+ terminate:
+ type: tosca.datatypes.nfv.VnfTerminateOperationConfiguration
+ operate:
+ type: tosca.datatypes.nfv.VnfOperateOperationConfiguration
+ tosca.datatypes.nfv.CpProtocolData:
+ derived_from: tosca.datatypes.Root
+ properties:
+ asscociated_layer_protocol:
+ type: string
+ constraints:
+ - valid_values:
+ - ethernet
+ - mpls
+ - odu2
+ - ipv4
+ - ipv6
+ - pseudo-wire
+ required: true
+ address_data:
+ type: tosca.datatypes.nfv.AddressData
+ required: false
+ tosca.datatypes.nfv.VnfConfigurableProperties:
+ derived_from: tosca.datatypes.Root
+ properties:
+ is_autoscale_enabled:
+ type: boolean
+ required: false
+ is_autoheal_enabled:
+ type: boolean
+ required: false
+ tosca.datatypes.nfv.VnfInfoModifiableAttributesExtensions:
+ derived_from: tosca.datatypes.Root
+ properties:
+ description:
+ type: string
+ required: false
+ tosca.datatypes.nfv.VnfInfoModifiableAttributesMetadata:
+ derived_from: tosca.datatypes.Root
+ properties:
+ description:
+ type: string
+ required: false
+ tosca.datatypes.nfv.VnfInfoModifiableAttributes:
+ derived_from: tosca.datatypes.Root
+ properties:
+ extensions:
+ type: tosca.datatypes.nfv.VnfInfoModifiableAttributesExtensions
+ required: false
+ metadata:
+ type: tosca.datatypes.nfv.VnfInfoModifiableAttributesMetadata
+ required: false
+ onap.datatypes.monitoring.metricsPerEventName:
+ derived_from: tosca.datatypes.Root
+ properties:
+ controlLoopSchemaType:
+ constraints:
+ - valid_values:
+ - VM
+ - VNF
+ description: Specifies Control Loop Schema Type for the event Name e.g. VNF, VM
+ required: true
+ type: string
+ eventName:
+ description: Event name to which thresholds need to be applied
+ required: true
+ type: string
+ policyName:
+ description: TCA Policy Scope Name
+ required: true
+ type: string
+ policyScope:
+ description: TCA Policy Scope
+ required: true
+ type: string
+ policyVersion:
+ description: TCA Policy Scope Version
+ required: true
+ type: string
+ thresholds:
+ description: Thresholds associated with eventName
+ entry_schema:
+ type: onap.datatypes.monitoring.thresholds
+ required: true
+ type: list
+ onap.datatypes.monitoring.tca_policy:
+ derived_from: tosca.datatypes.Root
+ properties:
+ domain:
+ constraints:
+ - equal: measurementsForVfScaling
+ default: measurementsForVfScaling
+ description: Domain name to which TCA needs to be applied
+ required: true
+ type: string
+ metricsPerEventName:
+ description: Contains eventName and threshold details that need to be applied to given eventName
+ entry_schema:
+ type: onap.datatypes.monitoring.metricsPerEventName
+ required: true
+ type: list
+ onap.datatypes.monitoring.thresholds:
+ derived_from: tosca.datatypes.Root
+ properties:
+ closedLoopControlName:
+ description: Closed Loop Control Name associated with the threshold
+ required: true
+ type: string
+ closedLoopEventStatus:
+ constraints:
+ - valid_values:
+ - ONSET
+ - ABATED
+ description: Closed Loop Event Status of the threshold
+ required: true
+ type: string
+ direction:
+ constraints:
+ - valid_values:
+ - LESS
+ - LESS_OR_EQUAL
+ - GREATER
+ - GREATER_OR_EQUAL
+ - EQUAL
+ description: Direction of the threshold
+ required: true
+ type: string
+ fieldPath:
+ constraints:
+ - valid_values:
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait
+ - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage
+ - $.event.measurementsForVfScalingFields.meanRequestLatency
+ - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered
+ - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached
+ - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured
+ - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree
+ - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed
+ - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value
+ description: Json field Path as per CEF message which needs to be analyzed for TCA
+ required: true
+ type: string
+ severity:
+ constraints:
+ - valid_values:
+ - CRITICAL
+ - MAJOR
+ - MINOR
+ - WARNING
+ - NORMAL
+ description: Threshold Event Severity
+ required: true
+ type: string
+ thresholdValue:
+ description: Threshold value for the field Path inside CEF message
+ required: true
+ type: integer
+ version:
+ description: Version number associated with the threshold
+ required: true
+ type: string
diff --git a/src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar b/src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar
new file mode 100755
index 000000000..b3479ba96
--- /dev/null
+++ b/src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar
Binary files differ
diff --git a/src/test/resources/tosca/guard1-policy-payload.json b/src/test/resources/tosca/guard1-policy-payload.json
new file mode 100644
index 000000000..bacf174fe
--- /dev/null
+++ b/src/test/resources/tosca/guard1-policy-payload.json
@@ -0,0 +1,16 @@
+{
+ "policy-id": "guard1",
+ "contents": {
+ "recipe": "Rebuild",
+ "actor": "SO",
+ "clname": "testloop",
+ "guardTargets": ".*",
+ "minGuard": "3",
+ "maxGuard": "7",
+ "limitGuard": "",
+ "timeUnitsGuard": "",
+ "timeWindowGuard": "",
+ "guardActiveStart": "00:00:01-05:00",
+ "guardActiveEnd": "23:59:01-05:00"
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/tosca/guard2-policy-payload.json b/src/test/resources/tosca/guard2-policy-payload.json
new file mode 100644
index 000000000..89f7ec89c
--- /dev/null
+++ b/src/test/resources/tosca/guard2-policy-payload.json
@@ -0,0 +1,16 @@
+{
+ "policy-id": "guard2",
+ "contents": {
+ "recipe": "Migrate",
+ "actor": "SO",
+ "clname": "testloop",
+ "guardTargets": ".*",
+ "minGuard": "1",
+ "maxGuard": "2",
+ "limitGuard": "",
+ "timeUnitsGuard": "",
+ "timeWindowGuard": "",
+ "guardActiveStart": "00:00:01-05:00",
+ "guardActiveEnd": "23:59:01-05:00"
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/tosca/micro-service-policy-payload.json b/src/test/resources/tosca/micro-service-policy-payload.json
new file mode 100644
index 000000000..01d6d275c
--- /dev/null
+++ b/src/test/resources/tosca/micro-service-policy-payload.json
@@ -0,0 +1,41 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+ "topology_template": {
+ "policies": [
+ {
+ "testPolicy": {
+ "type": "onap.policy.monitoring.cdap.tca.hi.lo.app",
+ "version": "1.0.0",
+ "metadata": {
+ "policy-id": "testPolicy"
+ },
+ "properties": {
+ "tca_policy": {
+ "domain": "measurementsForVfScaling",
+ "metricsPerEventName": [
+ {
+ "policyVersion": "1.0.0",
+ "thresholds": [
+ {
+ "severity": "CRITICAL",
+ "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta",
+ "thresholdValue": 1,
+ "closedLoopEventStatus": "ONSET",
+ "closedLoopControlName": "test",
+ "version": "1.0.0",
+ "direction": "LESS"
+ }
+ ],
+ "policyName": "test",
+ "controlLoopSchemaType": "VM",
+ "policyScope": "test",
+ "eventName": "test"
+ }
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/tosca/micro-service-policy-properties.json b/src/test/resources/tosca/micro-service-policy-properties.json
new file mode 100644
index 000000000..6baa32942
--- /dev/null
+++ b/src/test/resources/tosca/micro-service-policy-properties.json
@@ -0,0 +1,23 @@
+{
+ "domain": "measurementsForVfScaling",
+ "metricsPerEventName": [
+ {
+ "policyVersion": "1.0.0",
+ "thresholds": [
+ {
+ "severity": "CRITICAL",
+ "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta",
+ "thresholdValue": 1,
+ "closedLoopEventStatus": "ONSET",
+ "closedLoopControlName": "test",
+ "version": "1.0.0",
+ "direction": "LESS"
+ }
+ ],
+ "policyName": "test",
+ "controlLoopSchemaType": "VM",
+ "policyScope": "test",
+ "eventName": "test"
+ }
+ ]
+}
diff --git a/src/test/resources/tosca/operational-policy-payload.yaml b/src/test/resources/tosca/operational-policy-payload.yaml
new file mode 100644
index 000000000..68116b00b
--- /dev/null
+++ b/src/test/resources/tosca/operational-policy-payload.yaml
@@ -0,0 +1,31 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+topology_template:
+ policies:
+ - testPolicy:
+ type: onap.policies.controlloop.Operational
+ version: 1.0.0
+ metadata: {policy-id: testPolicy}
+ properties:
+ controlLoop: {controlLoopName: control loop, version: 2.0.0, trigger_policy: new1,
+ timeout: '30', abatement: 'true'}
+ policies:
+ - id: new1
+ recipe: Rebuild
+ retry: '10'
+ timeout: '20'
+ actor: SO
+ payload: test
+ success: new2
+ failure: new2
+ failure_timeout: new2
+ failure_retries: new2
+ failure_exception: new2
+ failure_guard: new2
+ target: {type: VFC, resourceTargetId: test}
+ - id: new2
+ recipe: Migrate
+ retry: '30'
+ timeout: '40'
+ actor: SDNC
+ payload: test
+ target: {type: VFC, resourceTargetId: test}
diff --git a/src/test/resources/tosca/operational-policy-properties.json b/src/test/resources/tosca/operational-policy-properties.json
new file mode 100644
index 000000000..503616593
--- /dev/null
+++ b/src/test/resources/tosca/operational-policy-properties.json
@@ -0,0 +1,71 @@
+{
+ "guard_policies": {
+ "guard1":{
+ "recipe": "Rebuild",
+ "actor": "SO",
+ "clname": "testloop",
+ "guardTargets": ".*",
+ "minGuard": "3",
+ "maxGuard": "7",
+ "limitGuard": "",
+ "timeUnitsGuard": "",
+ "timeWindowGuard": "",
+ "guardActiveStart": "00:00:01-05:00",
+ "guardActiveEnd": "23:59:01-05:00"
+ },
+ "guard2":{
+ "recipe": "Migrate",
+ "actor": "SO",
+ "clname": "testloop",
+ "guardTargets": ".*",
+ "minGuard": "1",
+ "maxGuard": "2",
+ "limitGuard": "",
+ "timeUnitsGuard": "",
+ "timeWindowGuard": "",
+ "guardActiveStart": "00:00:01-05:00",
+ "guardActiveEnd": "23:59:01-05:00"
+ }
+ },
+ "operational_policy": {
+ "controlLoop": {
+ "controlLoopName": "control loop",
+ "version": "2.0.0",
+ "trigger_policy": "new1",
+ "timeout": "30",
+ "abatement": "true"
+ },
+ "policies": [
+ {
+ "id": "new1",
+ "recipe": "Rebuild",
+ "retry": "10",
+ "timeout": "20",
+ "actor": "SO",
+ "payload": "test",
+ "success": "new2",
+ "failure": "new2",
+ "failure_timeout": "new2",
+ "failure_retries": "new2",
+ "failure_exception": "new2",
+ "failure_guard": "new2",
+ "target": {
+ "type": "VFC",
+ "resourceTargetId": "test"
+ }
+ },
+ {
+ "id": "new2",
+ "recipe": "Migrate",
+ "retry": "30",
+ "timeout": "40",
+ "actor": "SDNC",
+ "payload": "test",
+ "target": {
+ "type": "VFC",
+ "resourceTargetId": "test"
+ }
+ }
+ ]
+ }
+}