2  * Copyright © 2017-2018 AT&T Intellectual Property.
 
   3  * Modifications Copyright © 2018 IBM.
 
   5  * Licensed under the Apache License, Version 2.0 (the "License");
 
   6  * you may not use this file except in compliance with the License.
 
   7  * You may obtain a copy of the License at
 
   9  *     http://www.apache.org/licenses/LICENSE-2.0
 
  11  * Unless required by applicable law or agreed to in writing, software
 
  12  * distributed under the License is distributed on an "AS IS" BASIS,
 
  13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  14  * See the License for the specific language governing permissions and
 
  15  * limitations under the License.
 
  17 @file:Suppress("unused")
 
  19 package org.onap.ccsdk.apps.controllerblueprints.core.data
 
  21 import com.fasterxml.jackson.annotation.JsonIgnore
 
  22 import com.fasterxml.jackson.annotation.JsonProperty
 
  23 import com.fasterxml.jackson.annotation.JsonPropertyOrder
 
  24 import com.fasterxml.jackson.databind.JsonNode
 
  25 import io.swagger.annotations.ApiModelProperty
 
  30  * @author Brinda Santh
 
  32 open class EntityType {
 
  34     var id: String? = null
 
  35     var description: String? = null
 
  36     var version: String = "1.0.0"
 
  37     var metadata: MutableMap<String, String>? = null
 
  38     @get:JsonProperty("derived_from")
 
  39     lateinit var derivedFrom: String
 
  40     var attributes: MutableMap<String, AttributeDefinition>? = null
 
  41     var properties: MutableMap<String, PropertyDefinition>? = null
 
  45  5.3.2 tosca.datatypes.Credential
 
  46  The Credential type is a complex TOSCA data Type used when describing
 
  47  authorization credentials used to access network accessible resources.
 
  51     var id: String? = null
 
  52     var protocol: String? = null
 
  53     @get:JsonProperty("token_type")
 
  54     lateinit var tokenType: String
 
  55     lateinit var token: String
 
  56     var keys: MutableMap<String, String>? = null
 
  57     lateinit var user: String
 
  61 3.5.2 Constraint clause
 
  62 A constraint clause defines an operation along with one or more compatible values that can be used to define a constraint on a property or parameter’s allowed values when it is defined in a TOSCA Service Template or one of its entities.
 
  64 class ConstraintClause {
 
  65     @get:JsonProperty("equal")
 
  66     var equal: JsonNode? = null
 
  67     @get:JsonProperty("greater_than")
 
  68     var greaterThan: Any? = null
 
  69     @get:JsonProperty("greater_or_equal")
 
  70     var greaterOrEqual: Any? = null
 
  71     @get:JsonProperty("less_than")
 
  72     var lessThan: Any? = null
 
  73     @get:JsonProperty("less_or_equal")
 
  74     var lessOrEqual: Any? = null
 
  75     @get:JsonProperty("in_range")
 
  76     var inRange: Any? = null
 
  77     @get:JsonProperty("valid_values")
 
  78     var validValues: MutableList<JsonNode>? = null
 
  79     @get:JsonProperty("length")
 
  80     var length: Any? = null
 
  81     @get:JsonProperty("min_length")
 
  82     var minLength: Any? = null
 
  83     @get:JsonProperty("max_length")
 
  84     var maxLength: Any? = null
 
  85     var pattern: String? = null
 
  86     var schema: String? = null
 
  90 3.5.4 Node Filter definition
 
  91 A node filter definition defines criteria for selection of a TOSCA Node Template based upon the template’s property values, capabilities and capability properties.
 
  94 class NodeFilterDefinition {
 
  95     var properties: MutableMap<String, PropertyDefinition>? = null
 
  96     var capabilities: MutableList<String>? = null
 
 100 3.5.5 Repository definition
 
 101  A repository definition defines a named external repository which contains deployment
 
 102  and implementation artifacts that are referenced within the TOSCA Service Template.
 
 104 class RepositoryDefinition {
 
 106     var id: String? = null
 
 107     var description: String? = null
 
 108     lateinit var url: String
 
 109     var credential: Credential? = null
 
 114 3.5.6 Artifact definition
 
 115 An artifact definition defines a named, typed file that can be associated with Node Type
 
 116 or Node Template and used by orchestration engine to facilitate deployment and implementation of interface operations.
 
 118 class ArtifactDefinition {
 
 120     var id: String? = null
 
 121     lateinit var type: String
 
 122     lateinit var file: String
 
 123     var repository: String? = null
 
 124     var description: String? = null
 
 125     @get:JsonProperty("deploy_Path")
 
 126     var deployPath: String? = null
 
 127     var properties: MutableMap<String, JsonNode>? = null
 
 132 3.5.7 Import definition
 
 133 An import definition is used within a TOSCA Service Template to locate and uniquely name
 
 134 another TOSCA Service Template file which has type and template definitions to be imported (included)
 
 135 and referenced within another Service Template.
 
 137 class ImportDefinition {
 
 139     var id: String? = null
 
 140     lateinit var file: String
 
 141     var repository: String? = null
 
 142     @get:JsonProperty("namespace_uri")
 
 143     var namespaceUri: String? = null
 
 144     @get:JsonProperty("namespace_prefix")
 
 145     var namespacePrefix: String? = null
 
 149 3.5.8 Property definition A property definition defines a named, typed value and related data that can be associated with an
 
 150 entity defined in this specification (e.g., Node Types, Relationship Types, Capability Types, etc.).
 
 151 Properties are used by template authors to provide input values to TOSCA entities which indicate their “desired state” when they are
 
 152 instantiated. The value of a property can be retrieved using the get_property function within TOSCA Service Templates.
 
 154 class PropertyDefinition {
 
 156     var id: String? = null
 
 157     var description: String? = null
 
 158     var required: Boolean? = null
 
 159     lateinit var type: String
 
 160     @get:JsonProperty("default")
 
 161     var defaultValue: JsonNode? = null
 
 162     var status: String? = null
 
 163     var constraints: MutableList<ConstraintClause>? = null
 
 164     @get:JsonProperty("entry_schema")
 
 165     var entrySchema: EntrySchema? = null
 
 166     @get:ApiModelProperty(notes = "Property Value, It may be raw JSON or primitive data type values")
 
 167     var value: JsonNode? = null
 
 172 3.5.10 Attribute definition
 
 174 An attribute definition defines a named, typed value that can be associated with an entity defined in this
 
 175 specification (e.g., a Node, Relationship or Capability Type).  Specifically, it is used to expose the
 
 176 “actual state” of some property of a TOSCA entity after it has been deployed and instantiated
 
 177 (as set by the TOSCA orchestrator). Attribute values can be retrieved via the get_attribute function
 
 178 from the instance model and used as values to other entities within TOSCA Service Templates.
 
 181 class AttributeDefinition {
 
 183     var id: String? = null
 
 184     var description: String? = null
 
 185     var required: Boolean? = null
 
 186     lateinit var type: String
 
 187     @JsonProperty("default")
 
 188     var defaultValue: JsonNode? = null
 
 189     var status: String? = null
 
 190     var constraints: MutableList<ConstraintClause>? = null
 
 191     @JsonProperty("entry_schema")
 
 192     var entrySchema: EntrySchema? = null
 
 196 3.5.13 Operation definition
 
 197 An operation definition defines a named function or procedure that can be bound to an implementation artifact (e.g., a script).
 
 199 class OperationDefinition {
 
 201     var id: String? = null
 
 202     var description: String? = null
 
 203     var implementation: Implementation? = null
 
 204     var inputs: MutableMap<String, PropertyDefinition>? = null
 
 205     var outputs: MutableMap<String, PropertyDefinition>? = null
 
 208 class Implementation {
 
 209     lateinit var primary: String
 
 210     var dependencies: MutableList<String>? = null
 
 214 3.5.14 Interface definition
 
 215 An interface definition defines a named interface that can be associated with a Node or Relationship Type
 
 217 class InterfaceDefinition {
 
 219     var id: String? = null
 
 220     var type: String? = null
 
 221     var operations: MutableMap<String, OperationDefinition>? = null
 
 222     var inputs: MutableMap<String, PropertyDefinition>? = null
 
 226 3.5.15 Event Filter definition
 
 227 An event filter definition defines criteria for selection of an attribute, for the purpose of monitoring it, within a TOSCA entity, or one its capabilities.
 
 229 class EventFilterDefinition {
 
 231     var id: String? = null
 
 232     lateinit var node: String
 
 233     var requirement: String? = null
 
 234     var capability: String? = null
 
 238 3.5.16 Trigger definition TODO
 
 239 A trigger definition defines the event, condition and action that is used to “trigger” a policy it is associated with.
 
 241 class TriggerDefinition {
 
 243     var id: String? = null
 
 244     var description: String? = null
 
 245     @get:JsonProperty("event_type")
 
 246     lateinit var eventType: String
 
 247     @get:JsonProperty("target_filter")
 
 248     var targetFilter: EventFilterDefinition? = null
 
 249     var condition: ConditionClause? = null
 
 250     var constraint: ConditionClause? = null
 
 251     var method: String? = null
 
 252     lateinit var action: String
 
 256     3.5.17 Workflow activity definition
 
 257     A workflow activity defines an operation to be performed in a TOSCA workflow. Activities allows to:
 
 258     · Delegate the workflow for a node expected to be provided         by the orchestrator
 
 259     · Set the state of a node
 
 260     · Call an operation        defined on a TOSCA interface of a node, relationship or group
 
 261     · Inline another workflow defined in the topology (to allow reusability)
 
 264     var delegate: String? = null
 
 265     @get:JsonProperty("set_state")
 
 266     var setState: String? = null
 
 267     @get:JsonProperty("call_operation")
 
 268     var callOperation: String? = null
 
 269     var inlines: ArrayList<String>? = null
 
 273 3.5.20 Workflow precondition definition
 
 274 A workflow condition can be used as a filter or precondition to check if a workflow can be processed or not based on the state of the instances of a TOSCA topology deployment. When not met, the workflow will not be triggered.
 
 276 class PreConditionDefinition {
 
 278     var id: String? = null
 
 279     lateinit var target: String
 
 280     @get:JsonProperty("target_relationship")
 
 281     lateinit var targetRelationship: String
 
 282     lateinit var condition: ArrayList<ConditionClause>
 
 286 3.5.21 Workflow step definition
 
 287 A workflow step allows to define one or multiple sequenced activities in a workflow and how they are connected to other steps in the workflow. They are the building blocks of a declarative workflow.
 
 291     var id: String? = null
 
 292     var description: String? = null
 
 293     var target: String? = null
 
 294     @JsonProperty("target_relationship")
 
 295     var targetRelationship: String? = null
 
 296     @JsonProperty("operation_host")
 
 297     var operationHost: String? = null
 
 298     var activities: ArrayList<Activity>? = null
 
 299     @get:JsonProperty("on_success")
 
 300     var onSuccess: ArrayList<String>? = null
 
 301     @get:JsonProperty("on_failure")
 
 302     var onFailure: ArrayList<String>? = null
 
 306 3.6.2 Capability definition
 
 307 A capability definition defines a named, typed set of data that can be associated with Node Type or Node Template to describe a transparent capability or feature of the software component the node describes.
 
 310 class CapabilityDefinition {
 
 312     var id: String? = null
 
 313     lateinit var type: String
 
 314     var description: String? = null
 
 315     var properties: MutableMap<String, PropertyDefinition>? = null
 
 316     @get:JsonProperty("valid_source_types")
 
 317     var validSourceTypes: MutableList<String>? = null
 
 318     var occurrences: MutableList<Any>? = null
 
 322 3.6.3 Requirement definition
 
 323 The Requirement definition describes a named requirement (dependencies) of a TOSCA Node Type or Node template which needs to be fulfilled by a matching Capability definition declared by another TOSCA modelable entity.  The requirement definition may itself include the specific name of the fulfilling entity (explicitly) or provide an abstract type, along with additional filtering characteristics, that a TOSCA orchestrator can use to fulfill the capability at runtime (implicitly).
 
 325 class RequirementDefinition {
 
 327     var id: String? = null
 
 328     var description: String? = null
 
 329     var capability: String? = null
 
 330     var node: String? = null
 
 331     var relationship: String? = null
 
 332     var occurrences: MutableList<Any>? = null
 
 337 An Artifact Type is a reusable entity that defines the type of one or more files that are used to define implementation or deployment artifacts that are referenced by nodes or relationships on their operations.
 
 339 class ArtifactType : EntityType() {
 
 340     @get:JsonProperty("mime_type")
 
 341     var mimeType: String? = null
 
 342     @get:JsonProperty("file_ext")
 
 343     var fileExt: MutableList<String>? = null
 
 349 A Data Type definition defines the schema for new named datatypes in TOSCA.
 
 352 class DataType : EntityType() {
 
 353     var constraints: MutableList<ConstraintClause>? = null
 
 358 A Node Type is a reusable entity that defines the type of one or more Node Templates. As such, a Node Type defines the structure of observable properties via a Properties Definition, the Requirements and Capabilities of the node as well as its supported interfaces.
 
 362 class NodeType : EntityType() {
 
 363     var capabilities: MutableMap<String, CapabilityDefinition>? = null
 
 364     var requirements: MutableMap<String, RequirementDefinition>? = null
 
 365     var interfaces: MutableMap<String, InterfaceDefinition>? = null
 
 366     var artifacts: MutableMap<String, ArtifactDefinition>? = null
 
 370 3.6.8 Requirement Type
 
 371 A Requirement Type is a reusable entity that describes a kind of requirement that a Node Type can declare to expose.  The TOSCA Simple Profile seeks to simplify the need for declaring specific Requirement Types from nodes and instead rely upon nodes declaring their features sets using TOSCA Capability Types along with a named Feature notation.
 
 374 class RequirementType : EntityType() {
 
 375     var requirements: MutableMap<String, RequirementDefinition>? = null
 
 376     var capabilities: MutableMap<String, CapabilityDefinition>? = null
 
 377     var interfaces: MutableMap<String, InterfaceDefinition>? = null
 
 378     var artifacts: MutableMap<String, ArtifactDefinition>? = null
 
 382 3.6.10 Relationship Type
 
 383 A Relationship Type is a reusable entity that defines the type of one or more relationships between Node Types or Node Templates.
 
 386 class RelationshipType : EntityType() {
 
 387     var interfaces: MutableMap<String, InterfaceDefinition>? = null
 
 388     @get:JsonProperty("valid_target_types")
 
 389     var validTargetTypes: ArrayList<String>? = null
 
 394 A Group Type defines logical grouping types for nodes, typically for different management purposes.
 
 395 Groups can effectively be viewed as logical nodes that are not part of the physical deployment topology
 
 396  of an application, yet can have capabilities and the ability to attach policies and interfaces
 
 397  that can be applied (depending on the group type) to its member nodes.
 
 400 class GroupType : EntityType() {
 
 401     var members: MutableList<String>? = null
 
 402     var requirements: ArrayList<RequirementDefinition>? = null
 
 403     var capabilities: MutableMap<String, CapabilityDefinition>? = null
 
 404     var interfaces: MutableMap<String, InterfaceDefinition>? = null
 
 410     A Policy Type defines a type of requirement that affects or governs an application or service’s
 
 411     topology at some stage of its lifecycle, but is not explicitly part of the topology itself
 
 412     (i.e., it does not prevent the application or service from being deployed or run if it did not exist).
 
 414 class PolicyType : EntityType() {
 
 415     lateinit var targets: MutableList<String>
 
 419 3.7.1 Capability assignment
 
 420 A capability assignment allows node template authors to assign values to properties and attributes for a named capability definition that is part of a Node Template’s type definition.
 
 422 class CapabilityAssignment {
 
 424     var id: String? = null
 
 425     var attributes: MutableMap<String, JsonNode>? = null
 
 426     var properties: MutableMap<String, JsonNode>? = null
 
 430 3.7.4 Relationship Template
 
 431 A Relationship Template specifies the occurrence of a manageable relationship between node templates as part of an application’s topology model that is defined in a TOSCA Service Template.  A Relationship template is an instance of a specified Relationship Type and can provide customized properties, constraints or operations which override the defaults provided by its Relationship Type and its implementations.
 
 433 class GroupDefinition {
 
 435     var id: String? = null
 
 436     lateinit var type: String
 
 437     var description: String? = null
 
 438     var metadata: MutableMap<String, String>? = null
 
 439     var properties: MutableMap<String, JsonNode>? = null
 
 440     var members = ArrayList<String>()
 
 441     var interfaces: MutableMap<String, InterfaceDefinition>? = null
 
 445 3.7.6 Policy definition
 
 446 A policy definition defines a policy that can be associated with a TOSCA topology or top-level entity definition (e.g., group definition, node template, etc.).
 
 448 class PolicyDefinition {
 
 450     var id: String? = null
 
 451     lateinit var type: String
 
 452     var description: String? = null
 
 453     var metadata: MutableMap<String, String>? = null
 
 454     var properties: MutableMap<String, JsonNode>? = null
 
 455     var targets: MutableList<String>? = null
 
 460 3.8 Topology Template definition
 
 461 This section defines the topology template of a cloud application. The main ingredients of the topology template are node templates representing components of the application and relationship templates representing links between the components. These elements are defined in the nested node_templates section and the nested relationship_templates sections, respectively.  Furthermore, a topology template allows for defining input parameters, output parameters as well as grouping of node templates.
 
 463 class TopologyTemplate {
 
 465     var id: String? = null
 
 466     var description: String? = null
 
 467     var inputs: MutableMap<String, PropertyDefinition>? = null
 
 468     @get:JsonProperty("node_templates")
 
 469     var nodeTemplates: MutableMap<String, NodeTemplate>? = null
 
 470     @get:JsonProperty("relationship_templates")
 
 471     var relationshipTemplates: MutableMap<String, RelationshipTemplate>? = null
 
 472     var policies: MutableMap<String, PolicyDefinition>? = null
 
 473     var outputs: MutableMap<String, PropertyDefinition>? = null
 
 474     @get:JsonProperty("substitution_mappings")
 
 475     var substitutionMappings: Any? = null
 
 476     var workflows: MutableMap<String, Workflow>? = null
 
 479 class SubstitutionMapping {
 
 480     @get:JsonProperty("node_type")
 
 481     lateinit var nodeType: String
 
 482     lateinit var capabilities: ArrayList<String>
 
 483     lateinit var requirements: ArrayList<String>
 
 487     lateinit var type: String
 
 488     var constraints: MutableList<ConstraintClause>? = null
 
 491 class InterfaceAssignment {
 
 493     var id: String? = null
 
 494     var operations: MutableMap<String, OperationAssignment>? = null
 
 495     var inputs: MutableMap<String, JsonNode>? = null
 
 500 A Node Template specifies the occurrence of a manageable software component as part of an application’s topology model which is defined in a TOSCA Service Template.  A Node template is an instance of a specified Node Type and can provide customized properties, constraints or operations which override the defaults provided by its Node Type and its implementations.
 
 503 open class NodeTemplate {
 
 505     var id: String? = null
 
 506     var description: String? = null
 
 507     lateinit var type: String
 
 508     var metadata: MutableMap<String, String>? = null
 
 509     var directives: MutableList<String>? = null
 
 510     //@get:JsonSerialize(using = PropertyDefinitionValueSerializer::class)
 
 511     var properties: MutableMap<String, JsonNode>? = null
 
 512     var attributes: MutableMap<String, JsonNode>? = null
 
 513     var capabilities: MutableMap<String, CapabilityAssignment>? = null
 
 514     var requirements: MutableMap<String, RequirementAssignment>? = null
 
 515     var interfaces: MutableMap<String, InterfaceAssignment>? = null
 
 516     var artifacts: MutableMap<String, ArtifactDefinition>? = null
 
 517     @get:JsonProperty("node_filter")
 
 518     var nodeFilter: NodeFilterDefinition? = null
 
 519     var copy: String? = null
 
 522 class OperationAssignment {
 
 524     var id: String? = null
 
 525     var description: String? = null
 
 526     var implementation: Implementation? = null
 
 527     var inputs: MutableMap<String, JsonNode>? = null
 
 528     var outputs: MutableMap<String, JsonNode>? = null
 
 532 3.7.4 Relationship Template
 
 533 A Relationship Template specifies the occurrence of a manageable relationship between node templates as part of an application’s topology model that is defined in a TOSCA Service Template.  A Relationship template is an instance of a specified Relationship Type and can provide customized properties, constraints or operations which override the defaults provided by its Relationship Type and its implementations.
 
 536 class RelationshipTemplate {
 
 537     var type: String? = null
 
 538     var description: String? = null
 
 539     var metadata: MutableMap<String, String>? = null
 
 540     var properties: MutableMap<String, PropertyDefinition>? = null
 
 541     var attributes: MutableMap<String, JsonNode>? = null
 
 542     var interfaces: MutableMap<String, InterfaceDefinition>? = null
 
 543     var copy: String? = null
 
 547 3.7.2 Requirement assignment
 
 548 A Requirement assignment allows template authors to provide either concrete names of TOSCA templates or provide abstract selection criteria for providers to use to find matching TOSCA templates that are used to fulfill a named requirement’s declared TOSCA Node Type.
 
 551 class RequirementAssignment {
 
 553     var id: String? = null
 
 554     var capability: String? = null
 
 555     var node: String? = null
 
 556     //Relationship Type or Relationship Template
 
 557     var relationship: String? = null
 
 563     var id: String? = null
 
 564     var description: String? = null
 
 565     var steps: MutableMap<String, Step>? = null
 
 566     var preconditions: ArrayList<PreConditionDefinition>? = null
 
 567     var inputs: MutableMap<String, PropertyDefinition>? = null
 
 571 class ConditionClause {
 
 572     var and: ArrayList<MutableMap<String, Any>>? = null
 
 573     var or: ArrayList<MutableMap<String, Any>>? = null
 
 574     @get:JsonProperty("assert")
 
 575     var assertConditions: ArrayList<MutableMap<String, Any>>? = null
 
 579 3.9 Service Template definition
 
 580 A TOSCA Service Template (YAML) document contains element definitions of building blocks for cloud application, or complete models of cloud applications. This section describes the top-level structural elements (TOSCA keynames) along with their grammars, which are allowed to appear in a TOSCA Service Template document.
 
 583 @JsonPropertyOrder(value = ["toscaDefinitionsVersion", "description", "metadata", "imports", "dsl_definitions",
 
 585 class ServiceTemplate : Cloneable {
 
 587     var id: String? = null
 
 588     @get:JsonProperty("tosca_definitions_version")
 
 589     var toscaDefinitionsVersion: String = "controller_blueprint_1_0_0"
 
 590     var metadata: MutableMap<String, String>? = null
 
 591     var description: String? = null
 
 592     @get:JsonProperty("dsl_definitions")
 
 593     var dslDefinitions: MutableMap<String, JsonNode>? = null
 
 594     var repositories: MutableMap<String, RepositoryDefinition>? = null
 
 595     var imports: MutableList<ImportDefinition>? = null
 
 596     @get:JsonProperty("artifact_types")
 
 597     var artifactTypes: MutableMap<String, ArtifactType>? = null
 
 598     @get:JsonProperty("data_types")
 
 599     var dataTypes: MutableMap<String, DataType>? = null
 
 600     @get:JsonProperty("relationship_types")
 
 601     var relationshipTypes: MutableMap<String, RelationshipType>? = null
 
 602     @get:JsonProperty("node_types")
 
 603     var nodeTypes: MutableMap<String, NodeType>? = null
 
 604     @get:JsonProperty("policy_types")
 
 605     var policyTypes: MutableMap<String, PolicyType>? = null
 
 606     @get:JsonProperty("topology_template")
 
 607     var topologyTemplate: TopologyTemplate? = null
 
 609     override public fun clone(): ServiceTemplate {
 
 610         return super.clone() as ServiceTemplate
 
 614 class ToscaMetaData {
 
 615     lateinit var toscaMetaFileVersion: String
 
 616     lateinit var csarVersion: String
 
 617     lateinit var createdBy: String
 
 618     lateinit var entityDefinitions: String
 
 619     var templateTags: String? = null