* ================================================================================
* Copyright (C) 2019 AT&T Intellectual Property. All rights
* reserved.
+ * Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import com.google.gson.annotations.Expose;
-
import java.io.IOException;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
-
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
-
-import org.hibernate.annotations.Type;
+import org.apache.commons.lang3.RandomStringUtils;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
+import org.onap.clamp.clds.tosca.update.ToscaConverterWithDictionarySupport;
import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
import org.onap.clamp.loop.Loop;
+import org.onap.clamp.loop.service.Service;
+import org.onap.clamp.loop.template.LoopElementModel;
import org.onap.clamp.loop.template.PolicyModel;
import org.onap.clamp.policy.Policy;
import org.yaml.snakeyaml.DumperOptions;
@Entity
@Table(name = "operational_policies")
-@TypeDefs({ @TypeDef(name = "json", typeClass = StringJsonUserType.class) })
-public class OperationalPolicy implements Serializable, Policy {
+@TypeDefs({@TypeDef(name = "json", typeClass = StringJsonUserType.class)})
+public class OperationalPolicy extends Policy implements Serializable {
/**
* The serial version ID.
*/
@Column(nullable = false, name = "name", unique = true)
private String name;
- @Expose
- @Type(type = "json")
- @Column(columnDefinition = "json", name = "configurations_json")
- private JsonObject configurationsJson;
-
- @Expose
- @Type(type = "json")
- @Column(columnDefinition = "json", name = "json_representation", nullable = false)
- private JsonObject jsonRepresentation;
-
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "loop_id", nullable = false)
private Loop loop;
- @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;
-
+ /**
+ * Constructor for serialization.
+ */
public OperationalPolicy() {
- // 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 jsonRepresentation The jsonObject defining the json schema
+ * @param policyModel The policy model associated if any, can be null
+ * @param loopElementModel The loop element from which this instance is supposed to be created
+ * @param pdpGroup The Pdp Group info
+ * @param pdpSubgroup The Pdp Subgroup info
*/
- public OperationalPolicy(String name, Loop loop, JsonObject configurationsJson) {
+ public OperationalPolicy(String name, JsonObject configurationsJson,
+ JsonObject jsonRepresentation, PolicyModel policyModel,
+ LoopElementModel loopElementModel, String pdpGroup, String pdpSubgroup) {
this.name = name;
- this.loop = loop;
- this.configurationsJson = configurationsJson;
- LegacyOperationalPolicy.preloadConfiguration(this.configurationsJson, loop);
- try {
- this.jsonRepresentation = OperationalPolicyRepresentationBuilder
- .generateOperationalPolicySchema(loop.getModelService());
- } catch (JsonSyntaxException | IOException | NullPointerException e) {
- logger.error("Unable to generate the operational policy Schema ... ", e);
- this.jsonRepresentation = new JsonObject();
- }
- }
+ this.setPolicyModel(policyModel);
+ this.setConfigurationsJson(configurationsJson);
+ this.setPdpGroup(pdpGroup);
+ this.setPdpSubgroup(pdpSubgroup);
+ this.setLoopElementModel(loopElementModel);
+ this.setJsonRepresentation(jsonRepresentation);
- @Override
- public String getName() {
- return name;
}
- public void setLoop(Loop loopName) {
- this.loop = loopName;
+ /**
+ * Create an operational policy from a loop element model.
+ *
+ * @param loop The parent loop
+ * @param service The loop service
+ * @param loopElementModel The loop element model
+ * @param toscaConverter The tosca converter that must be used to create the Json representation
+ * @throws IOException In case of issues with the legacy files (generated from resource files
+ */
+ public OperationalPolicy(Loop loop, Service service, LoopElementModel loopElementModel,
+ ToscaConverterWithDictionarySupport toscaConverter) throws IOException {
+ this(Policy.generatePolicyName("OPERATIONAL", service.getName(), service.getVersion(),
+ RandomStringUtils.randomAlphanumeric(3), RandomStringUtils.randomAlphanumeric(3)), new JsonObject(),
+ new JsonObject(), loopElementModel.getPolicyModels().first(), loopElementModel, null, null);
+ this.setLoop(loop);
+ this.setJsonRepresentation(generateJsonRepresentation(this, toscaConverter));
}
- public Loop getLoop() {
- return loop;
+ /**
+ * Create an operational policy from a policy model.
+ *
+ * @param loop The parent loop
+ * @param service The loop service
+ * @param policyModel The policy model
+ * @param toscaConverter The tosca converter that must be used to create the Json representation
+ * @throws IOException In case of issues with the legacy files (generated from resource files
+ */
+ public OperationalPolicy(Loop loop, Service service, PolicyModel policyModel,
+ ToscaConverterWithDictionarySupport toscaConverter) throws IOException {
+ this(Policy.generatePolicyName("OPERATIONAL", service.getName(), service.getVersion(),
+ RandomStringUtils.randomAlphanumeric(3), RandomStringUtils.randomAlphanumeric(3)), new JsonObject(),
+ new JsonObject(), policyModel, null, null, null);
+ this.setLoop(loop);
+ this.setJsonRepresentation(generateJsonRepresentation(this, toscaConverter));
}
- public JsonObject getConfigurationsJson() {
- return configurationsJson;
+ /**
+ * This method can generate a Json representation (json schema) for an operational policy.
+ * This is mainly to support a legacy case and a generic case.
+ *
+ * @param operationalPolicy The operational policy
+ * @param toscaConverter The tosca converter
+ * @return The Json Object with Json schema
+ */
+ public static JsonObject generateJsonRepresentation(OperationalPolicy operationalPolicy,
+ ToscaConverterWithDictionarySupport toscaConverter)
+ throws IOException {
+ JsonObject jsonReturned = new JsonObject();
+ if (operationalPolicy.getPolicyModel() == null) {
+ return new JsonObject();
+ }
+ if (operationalPolicy.isLegacy()) {
+ // Op policy Legacy case
+ LegacyOperationalPolicy.preloadConfiguration(jsonReturned, operationalPolicy.loop);
+ jsonReturned = OperationalPolicyRepresentationBuilder
+ .generateOperationalPolicySchema(operationalPolicy.loop.getModelService());
+ }
+ else {
+ // Generic Case
+ jsonReturned = toscaConverter.convertToscaToJsonSchemaObject(
+ operationalPolicy.getPolicyModel().getPolicyModelTosca(),
+ operationalPolicy.getPolicyModel().getPolicyModelType());
+ }
+
+ return jsonReturned;
}
- public void setConfigurationsJson(JsonObject configurationsJson) {
- this.configurationsJson = configurationsJson;
+ public void setLoop(Loop loopName) {
+ this.loop = loopName;
}
- /**
- * policyModel getter.
- *
- * @return the policyModel
- */
- public PolicyModel getPolicyModel() {
- return policyModel;
+ public Loop getLoop() {
+ return loop;
}
- /**
- * policyModel setter.
- *
- * @param policyModel the policyModel to set
- */
- public void setPolicyModel(PolicyModel policyModel) {
- this.policyModel = policyModel;
+ @Override
+ public String getName() {
+ return name;
}
/**
* name setter.
- *
+ *
* @param name the name to set
*/
+ @Override
public void setName(String name) {
this.name = name;
}
- @Override
- public JsonObject getJsonRepresentation() {
- return jsonRepresentation;
- }
-
- void setJsonRepresentation(JsonObject jsonRepresentation) {
- this.jsonRepresentation = jsonRepresentation;
- }
-
@Override
public int hashCode() {
final int prime = 31;
if (other.name != null) {
return false;
}
- } else if (!name.equals(other.name)) {
+ }
+ else if (!name.equals(other.name)) {
return false;
}
return true;
}
+ public Boolean isLegacy() {
+ return (this.getPolicyModel() != null) && this.getPolicyModel().getPolicyModelType().contains("legacy");
+ }
+
/**
* Create policy Yaml from json defined here.
- *
+ *
* @return A string containing Yaml
*/
public String createPolicyPayloadYaml() {
metadata.addProperty("policy-id", this.name);
operationalPolicyDetails.add("properties", LegacyOperationalPolicy
- .reworkPayloadAttributes(this.configurationsJson.get("operational_policy").deepCopy()));
+ .reworkActorAttributes(this.getConfigurationsJson().get("operational_policy").deepCopy()));
DumperOptions options = new DumperOptions();
options.setIndent(2);
@Override
public String createPolicyPayload() throws UnsupportedEncodingException {
- // Now using the legacy payload fo Dublin
- JsonObject payload = new JsonObject();
- payload.addProperty("policy-id", this.getName());
- payload.addProperty("content", URLEncoder.encode(LegacyOperationalPolicy.createPolicyPayloadYamlLegacy(
- this.configurationsJson.get("operational_policy")), StandardCharsets.UTF_8.toString()));
- String opPayload = new GsonBuilder().setPrettyPrinting().create().toJson(payload);
- logger.info("Operational policy payload: " + opPayload);
- return opPayload;
+ if (isLegacy()) {
+ // Now using the legacy payload fo Dublin
+ JsonObject payload = new JsonObject();
+ payload.addProperty("policy-id", this.getName());
+ payload.addProperty("content",
+ URLEncoder.encode(
+ LegacyOperationalPolicy
+ .createPolicyPayloadYamlLegacy(
+ this.getConfigurationsJson().get("operational_policy")),
+ StandardCharsets.UTF_8.toString()));
+ String opPayload = new GsonBuilder().setPrettyPrinting().create().toJson(payload);
+ logger.info("Operational policy payload: " + opPayload);
+ return opPayload;
+ }
+ else {
+ return super.createPolicyPayload();
+ }
}
/**
public Map<String, String> createGuardPolicyPayloads() {
Map<String, String> result = new HashMap<>();
- JsonElement guardsList = this.getConfigurationsJson().get("guard_policies");
- if (guardsList != null) {
- for (JsonElement guardElem : guardsList.getAsJsonArray()) {
- result.put(guardElem.getAsJsonObject().get("policy-id").getAsString(),
- new GsonBuilder().create().toJson(guardElem));
+ if (this.getConfigurationsJson() != null) {
+ JsonElement guardsList = this.getConfigurationsJson().get("guard_policies");
+ if (guardsList != null) {
+ for (JsonElement guardElem : guardsList.getAsJsonArray()) {
+ result.put(guardElem.getAsJsonObject().get("policy-id").getAsString(),
+ new GsonBuilder().create().toJson(guardElem));
+ }
}
}
logger.info("Guard policy payload: " + result);
}
/**
- * Regenerate the Operational Policy Json Representation.
- *
- */
+ * Regenerate the Operational Policy Json Representation.
+ */
public void updateJsonRepresentation() {
try {
- this.jsonRepresentation = OperationalPolicyRepresentationBuilder
- .generateOperationalPolicySchema(loop.getModelService());
+ this.setJsonRepresentation(
+ OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(loop.getModelService()));
} catch (JsonSyntaxException | IOException | NullPointerException e) {
logger.error("Unable to generate the operational policy Schema ... ", e);
- this.jsonRepresentation = new JsonObject();
+ this.setJsonRepresentation(new JsonObject());
}
}
}