import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+
import java.io.IOException;
+import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
+
import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.clds.util.ResourceFileUtil;
import org.onap.clamp.loop.service.Service;
private static final EELFLogger logger =
EELFManager.getInstance().getLogger(OperationalPolicyRepresentationBuilder.class);
+ public static final String PROPERTIES = "properties";
+ public static final String TYPE = "type";
+ public static final String TYPE_LIST = "list";
+
/**
* This method generates the operational policy json representation that will be
* used by ui for rendering. It uses the model (VF and VFModule) defined in the
jsonSchema.get("properties").getAsJsonObject()
.get("operational_policy").getAsJsonObject().get("properties").getAsJsonObject().get("policies")
.getAsJsonObject().get("items").getAsJsonObject().get("properties").getAsJsonObject().get("target")
- .getAsJsonObject().get("anyOf").getAsJsonArray().addAll(createAnyOfArray(modelJson));
+ .getAsJsonObject().get("anyOf").getAsJsonArray().addAll(createAnyOfArray(modelJson, true));
// update CDS recipe and payload information to schema
JsonArray actors = jsonSchema.get("properties").getAsJsonObject()
for (JsonElement actor : actors) {
if ("CDS".equalsIgnoreCase(actor.getAsJsonObject().get("title").getAsString())) {
- actor.getAsJsonObject().get("properties").getAsJsonObject().get("type").getAsJsonObject()
+ actor.getAsJsonObject().get("properties").getAsJsonObject().get("recipe").getAsJsonObject()
.get("anyOf").getAsJsonArray()
- .addAll(createAnyOfArrayForCdsRecipe(modelJson.getResourceDetails()));
+ .addAll(createAnyOfArrayForCdsRecipe(modelJson));
}
}
return jsonSchema;
} catch (IOException e) {
- logger.error("Unable to generate the json schema because of an exception",e);
+ logger.error("Unable to generate the json schema because of an exception", e);
return new JsonObject();
}
}
return property;
}
- private static JsonArray createVnfSchema(Service modelService) {
+ private static JsonArray createVnfSchema(Service modelService, boolean generateType) {
JsonArray vnfSchemaArray = new JsonArray();
JsonObject modelVnfs = modelService.getResourceByType("VF");
JsonObject vnfOneOfSchema = new JsonObject();
vnfOneOfSchema.addProperty("title", "VNF" + "-" + entry.getKey());
JsonObject properties = new JsonObject();
- properties.add("type", createSchemaProperty("Type", "string", "VNF", "True", null));
+ if (generateType) {
+ properties.add("type", createSchemaProperty("Type", "string", "VNF", "True", null));
+ }
properties.add("resourceID", createSchemaProperty("Resource ID", "string",
modelVnfs.get(entry.getKey()).getAsJsonObject().get("name").getAsString(), "True", null));
return vnfSchemaArray;
}
- private static JsonArray createVfModuleSchema(Service modelService) {
+ private static JsonArray createBlankEntry() {
+ JsonArray result = new JsonArray();
+ JsonObject blankObject = new JsonObject();
+ blankObject.addProperty("title", "User defined");
+ blankObject.add("properties", new JsonObject());
+ result.add(blankObject);
+ return result;
+ }
+
+ private static JsonArray createVfModuleSchema(Service modelService, boolean generateType) {
JsonArray vfModuleOneOfSchemaArray = new JsonArray();
JsonObject modelVfModules = modelService.getResourceByType("VFModule");
JsonObject vfModuleOneOfSchema = new JsonObject();
vfModuleOneOfSchema.addProperty("title", "VFMODULE" + "-" + entry.getKey());
JsonObject properties = new JsonObject();
- properties.add("type", createSchemaProperty("Type", "string", "VFMODULE", "True", null));
+ if (generateType) {
+ properties.add("type", createSchemaProperty("Type", "string", "VFMODULE", "True", null));
+ }
properties.add("resourceID",
createSchemaProperty("Resource ID", "string",
modelVfModules.get(entry.getKey()).getAsJsonObject().get("vfModuleModelName").getAsString(),
return vfModuleOneOfSchemaArray;
}
- private static JsonArray createAnyOfArray(Service modelJson) {
+ /**
+ * Create an anyOf array of possible structure we may have for Target.
+ *
+ * @param modelJson The service object
+ * @return A JsonArray with everything inside
+ */
+ public static JsonArray createAnyOfArray(Service modelJson, boolean generateType) {
JsonArray targetOneOfStructure = new JsonArray();
- targetOneOfStructure.addAll(createVnfSchema(modelJson));
- targetOneOfStructure.addAll(createVfModuleSchema(modelJson));
+ // First entry must be user defined
+ targetOneOfStructure.addAll(createBlankEntry());
+ targetOneOfStructure.addAll(createVnfSchema(modelJson, generateType));
+ targetOneOfStructure.addAll(createVfModuleSchema(modelJson, generateType));
return targetOneOfStructure;
}
- private static JsonArray createAnyOfArrayForCdsRecipe(JsonObject resourceDetails) {
+ private static JsonArray createAnyOfArrayForCdsRecipe(Service modelJson) {
JsonArray anyOfStructure = new JsonArray();
- anyOfStructure.addAll(createAnyOfCdsRecipe(resourceDetails.getAsJsonObject("VF")));
- anyOfStructure.addAll(createAnyOfCdsRecipe(resourceDetails.getAsJsonObject("PNF")));
+ anyOfStructure.addAll(createAnyOfCdsRecipe(modelJson.getResourceDetails().getAsJsonObject("VF")));
+ anyOfStructure.addAll(createAnyOfCdsRecipe(modelJson.getResourceDetails().getAsJsonObject("PNF")));
return anyOfStructure;
}
JsonObject controllerProperties = entry.getValue().getAsJsonObject()
.getAsJsonObject("controllerProperties");
- if (controllerProperties != null) {
+ if (controllerProperties != null && controllerProperties.getAsJsonObject("workflows") != null) {
JsonObject workflows = controllerProperties.getAsJsonObject("workflows");
for (Entry<String, JsonElement> workflowsEntry : workflows.entrySet()) {
JsonObject obj = new JsonObject();
obj.addProperty("title", workflowsEntry.getKey());
+ obj.addProperty("type", "object");
obj.add("properties", createPayloadProperty(workflowsEntry.getValue().getAsJsonObject(),
- controllerProperties));
+ controllerProperties, workflowsEntry.getKey()));
schemaArray.add(obj);
}
return schemaArray;
}
- private static JsonObject createPayloadProperty(JsonObject workFlow, JsonObject controllerProperties) {
- JsonObject type = new JsonObject();
- type.addProperty("title", "Payload (YAML)");
- type.addProperty("type", "string");
- type.addProperty("default", createDefaultStringForPayload(workFlow, controllerProperties));
- type.addProperty("format", "textarea");
+ private static JsonObject createPayloadProperty(JsonObject workFlow,
+ JsonObject controllerProperties, String workFlowName) {
+ JsonObject payload = new JsonObject();
+ payload.addProperty("title", "Payload");
+ payload.addProperty("type", "object");
+ payload.add("properties", createInputPropertiesForPayload(workFlow,
+ controllerProperties));
JsonObject properties = new JsonObject();
- properties.add("type", type);
+ properties.add("recipe", createRecipeForCdsWorkflow(workFlowName));
+ properties.add("payload", payload);
return properties;
}
- private static String createDefaultStringForPayload(JsonObject workFlow, JsonObject controllerProperties) {
- String artifactName = controllerProperties.get("sdnc_model_name").toString();
- String artifactVersion = controllerProperties.get("sdnc_model_version").toString();
- String data = workFlow.getAsJsonObject("inputs").toString();
- StringBuilder builder = new StringBuilder("'").append("artifact_name : ").append(artifactName).append("\n")
- .append("artifact_version : ").append(artifactVersion).append("\n")
- .append("mode : async").append("\n")
- .append("data : ").append("'").append("\\").append("'").append(data).append("\\").append("'")
- .append("'");
- return builder.toString();
+ private static JsonObject createRecipeForCdsWorkflow(String workflow) {
+ JsonObject recipe = new JsonObject();
+ recipe.addProperty("title", "recipe");
+ recipe.addProperty("type", "string");
+ recipe.addProperty("default", workflow);
+ JsonObject options = new JsonObject();
+ options.addProperty("hidden", true);
+ recipe.add("options", options);
+ return recipe;
+ }
+
+ /**
+ * Returns the properties of payload based on the cds work flows.
+ *
+ * @param workFlow cds work flows to update payload
+ * @param controllerProperties cds properties to get blueprint name and
+ * version
+ * @return returns the properties of payload
+ */
+ public static JsonObject createInputPropertiesForPayload(JsonObject workFlow,
+ JsonObject controllerProperties) {
+ String artifactName = controllerProperties.get("sdnc_model_name").getAsString();
+ String artifactVersion = controllerProperties.get("sdnc_model_version").getAsString();
+ JsonObject inputs = workFlow.getAsJsonObject("inputs");
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("artifact_name", createSchemaProperty(
+ "artifact name", "string", artifactName, "True", null));
+ jsonObject.add("artifact_version", createSchemaProperty(
+ "artifact version", "string", artifactVersion, "True", null));
+ jsonObject.add("mode", createCdsInputProperty(
+ "mode", "string", "async" ,null));
+ jsonObject.add("data", createDataProperty(inputs));
+ return jsonObject;
+ }
+
+ private static JsonObject createDataProperty(JsonObject inputs) {
+ JsonObject data = new JsonObject();
+ data.addProperty("title", "data");
+ JsonObject dataObj = new JsonObject();
+ addDataFields(inputs, dataObj);
+ data.add(PROPERTIES, dataObj);
+ return data;
+ }
+
+ private static void addDataFields(JsonObject inputs,
+ JsonObject dataObj) {
+ Set<Map.Entry<String, JsonElement>> entrySet = inputs.entrySet();
+ for (Map.Entry<String, JsonElement> entry : entrySet) {
+ String key = entry.getKey();
+ JsonObject inputProperty = inputs.getAsJsonObject(key);
+ if (inputProperty.get(TYPE) == null) {
+ addDataFields(entry.getValue().getAsJsonObject(), dataObj);
+ } else {
+ dataObj.add(entry.getKey(),
+ createCdsInputProperty(key,
+ inputProperty.get(TYPE).getAsString(),
+ null,
+ entry.getValue().getAsJsonObject()));
+ }
+ }
+ }
+
+ private static JsonObject createCdsInputProperty(String title,
+ String type,
+ String defaultValue,
+ JsonObject cdsProperty) {
+ JsonObject property = new JsonObject();
+ property.addProperty("title", title);
+
+ if (TYPE_LIST.equalsIgnoreCase(type)) {
+ property.addProperty(TYPE, "array");
+ if (cdsProperty.get(PROPERTIES) != null) {
+ JsonObject dataObject = new JsonObject();
+ addDataFields(cdsProperty.get(PROPERTIES).getAsJsonObject(),
+ dataObject);
+ JsonObject listProperties = new JsonObject();
+ listProperties.add(PROPERTIES, dataObject);
+ property.add("items", listProperties);
+ }
+ } else {
+ property.addProperty(TYPE, type);
+ }
+
+ if (defaultValue != null) {
+ property.addProperty("default", defaultValue);
+ }
+ return property;
}
}