package org.onap.clamp.policy;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+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.UnsupportedEncodingException;
-
+import java.util.Map;
import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
-
+import javax.persistence.Transient;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
+import org.json.JSONObject;
import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
import org.onap.clamp.loop.common.AuditEntity;
import org.onap.clamp.loop.template.LoopElementModel;
+import org.onap.clamp.loop.template.PolicyModel;
+import org.yaml.snakeyaml.Yaml;
@MappedSuperclass
-@TypeDefs({ @TypeDef(name = "json", typeClass = StringJsonUserType.class) })
+@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)})
public abstract class Policy extends AuditEntity {
+ @Transient
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(Policy.class);
+
@Expose
@Type(type = "json")
@Column(columnDefinition = "json", name = "json_representation", nullable = false)
@Column(columnDefinition = "json", name = "configurations_json")
private JsonObject configurationsJson;
+ /**
+ * This attribute can be null when the user add a policy on the loop instance, not the template.
+ * When null, It therefore indicates that this policy is not by default in the loop template.
+ */
@Expose
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "loop_element_model_id")
@Column(name = "pdp_group")
private String pdpGroup;
- public abstract String createPolicyPayload() throws UnsupportedEncodingException;
+ @Expose
+ @Column(name = "pdp_sub_group")
+ private String pdpSubgroup;
+
+ @Expose
+ @ManyToOne(fetch = FetchType.EAGER)
+ @JoinColumns({@JoinColumn(name = "policy_model_type", referencedColumnName = "policy_model_type"),
+ @JoinColumn(name = "policy_model_version", referencedColumnName = "version")})
+ private PolicyModel policyModel;
+
+ private JsonObject createJsonFromPolicyTosca() {
+ Map<String, Object> map =
+ new Yaml().load(this.getPolicyModel() != null ? this.getPolicyModel().getPolicyModelTosca() : "");
+ JSONObject jsonObject = new JSONObject(map);
+ return new Gson().fromJson(jsonObject.toString(), JsonObject.class);
+ }
+
+ private String getModelPropertyNameFromTosca(JsonObject object, String policyModelType) {
+ return object.getAsJsonObject("policy_types").getAsJsonObject(policyModelType)
+ .getAsJsonObject(
+ "properties")
+ .keySet().toArray(new String[1])[0];
+ }
+
+ /**
+ * This method create the policy payload that must be sent to PEF.
+ *
+ * @return A String containing the payload
+ * @throws UnsupportedEncodingException In case of failure
+ */
+ public String createPolicyPayload() throws UnsupportedEncodingException {
+ 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.getPolicyModel().getPolicyModelType());
+ policyDetails.addProperty("version", this.getPolicyModel().getVersion());
+
+ 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.getModelPropertyNameFromTosca(toscaJson, this.getPolicyModel().getPolicyModelType()),
+ this.getConfigurationsJson());
+ String policyPayload = new GsonBuilder().setPrettyPrinting().create().toJson(policyPayloadResult);
+ logger.info("Policy payload: " + policyPayload);
+ return policyPayload;
+ }
+
/**
* Name getter.
- *
+ *
* @return the name
*/
public abstract String getName();
/**
* Name setter.
- *
*/
public abstract void setName(String name);
/**
* jsonRepresentation getter.
- *
+ *
* @return the jsonRepresentation
*/
public JsonObject getJsonRepresentation() {
/**
* jsonRepresentation setter.
- *
+ *
* @param jsonRepresentation The jsonRepresentation to set
*/
public void setJsonRepresentation(JsonObject jsonRepresentation) {
this.jsonRepresentation = jsonRepresentation;
}
+ /**
+ * policyModel getter.
+ *
+ * @return the policyModel
+ */
+ public PolicyModel getPolicyModel() {
+ return policyModel;
+ }
+
+ /**
+ * policyModel setter.
+ *
+ * @param policyModel The new policyModel
+ */
+ public void setPolicyModel(PolicyModel policyModel) {
+ this.policyModel = policyModel;
+ }
+
/**
* configurationsJson getter.
- *
+ *
* @return The configurationsJson
*/
public JsonObject getConfigurationsJson() {
/**
* configurationsJson setter.
- *
+ *
* @param configurationsJson the configurationsJson to set
*/
public void setConfigurationsJson(JsonObject configurationsJson) {
/**
* loopElementModel getter.
- *
+ *
* @return the loopElementModel
*/
public LoopElementModel getLoopElementModel() {
/**
* loopElementModel setter.
- *
+ *
* @param loopElementModel the loopElementModel to set
*/
public void setLoopElementModel(LoopElementModel loopElementModel) {
/**
* pdpGroup getter.
- *
+ *
* @return the pdpGroup
*/
public String getPdpGroup() {
/**
* pdpGroup setter.
- *
+ *
* @param pdpGroup the pdpGroup to set
*/
public void setPdpGroup(String pdpGroup) {
this.pdpGroup = pdpGroup;
}
+ /**
+ * pdpSubgroup getter.
+ *
+ * @return the pdpSubgroup
+ */
+ public String getPdpSubgroup() {
+ return pdpSubgroup;
+ }
+
+ /**
+ * pdpSubgroup setter.
+ *
+ * @param pdpSubgroup the pdpSubgroup to set
+ */
+ public void setPdpSubgroup(String pdpSubgroup) {
+ this.pdpSubgroup = pdpSubgroup;
+ }
+
/**
* Generate the policy name.
*
* @return The generated policy name
*/
public static String generatePolicyName(String policyType, String serviceName, String serviceVersion,
- String resourceName, String blueprintFilename) {
+ String resourceName, String blueprintFilename) {
StringBuilder buffer = new StringBuilder(policyType).append("_").append(serviceName).append("_v")
.append(serviceVersion).append("_").append(resourceName).append("_")
.append(blueprintFilename.replaceAll(".yaml", ""));