...
In the most of the cases, in tosca model template there is compatibility in field types. Only two types (java.util.Date and Boolean) are not compatible between Eclipse-Link and Hibernate.
Note about precision in DATETIME (https://mariadb.com/kb/en/datetime/): MariaDB can store microseconds with a precision between 0 and 6. If no microsecond precision is specified, then 0 is used by default.
Code Block | ||||
---|---|---|---|---|
| ||||
@Embeddable @Data public class ExampleKey implements Serializable { private static final long serialVersionUID = 1L; @Column(name = "name", length = 120) private String name; @Column(name = "version", length = 20) private String version; } @Entity @Table(name = "Example") @Data public class JpaExample implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId @VerifyKey @NotNull private ExampleKey key; @Column private Boolean primed; @Column(name = "timeStamp", precision = 3) @Temporal(TemporalType.TIMESTAMP) @NotNull private Date timeStamp; } |
...
MariaDB [controlloop]> select * from ExampleObjMap;
+---------------+---------+
| name | version |
+---------------+---------+
| ExampleObjMap | 1.0.0 |
+---------------+---------+
MariaDB [controlloop]> select * from Example;
+----------+---------+--------+-----------+
| name | version | primed | timeStamp |
+----------+---------+--------+-----------+
| example1 | 1.0.0 | NULL | NULL |
| example2 | 1.0.0 | NULL | NULL |
+----------+---------+--------+-----------+
MariaDB [controlloop]> select * from ExampleObjMap_Example;
+---------------+----------------+------------+---------------+--------------+
| parent_name | parent_version | child_name | child_version | examples_KEY |
+---------------+----------------+------------+---------------+--------------+
| ExampleObjMap | 1.0.0 | example1 | 1.0.0 | MyKey1 |
| ExampleObjMap | 1.0.0 | example2 | 1.0.0 | MyKey2 |
+---------------+----------------+------------+---------------+--------------+
Multi templates
Right now using Spring repositories it is possible to create more than one service template, as service templates in policy-models/tosca. It works in both Eclipse-Link and Hibernate.
How to create additional service template (just add different name and version into the yaml file):
Performance issue
Using current version, for each operation save/read/delete of the service template below, control-loop runtime application access to 14 tables and handles 51 rows.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
name: ToscaServiceTemplateSimple version: 1.0.1 tosca_definitions_version: tosca_simple_yaml_1_3 data_types: onap.datatypes.ToscaConceptIdentifier: derived_from: tosca.datatypes.Root properties: name: type: string required: true version: type: string required: true node_types: org.onap.policy.clamp.controlloop.Participant: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string requred: false org.onap.policy.clamp.controlloop.ControlLoopElement: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string requred: false participantType: type: onap.datatypes.ToscaConceptIdentifier requred: true startPhase: type: integer required: false constraints: - greater_or_equal: 0 metadata: common: true description: check wiki documentation about start phase stopped simultaneously org.onap.policy.clamp.controlloop.ControlLoop: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string requred: false elements: type: list required: true entry_schema: type: onap.datatypes.ToscaConceptIdentifier org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement: version: 1.0.1 derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement properties: chart: type: string required: true configs: type: list required: false requirements: type: string requred: false templates: type: list required: false entry_schema: values: type: string requred: true topology_template: node_templates: org.onap.k8s.controlloop.K8SControlLoopParticipant: version: 2.3.4 type: org.onap.policy.clamp.controlloop.Participant type_version: 1.0.1 description: Participant for K8S properties: provider: ONAP org.onap.domain.database.HelloWorld_K8SMicroserviceControlLoopElement: # Chart from any chart repository configured on helm client. version: 1.2.3 type: org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement type_version: 1.0.0 description: Control loop element for the K8S microservice for Hello World properties: provider: ONAP participantType: name: org.onap.k8s.controlloop.K8SControlLoopParticipant1 version: 2.3.4 chart: chartId: name: dummy version: 0.1.0 releaseName: test namespace: test org.onap.domain.database.PMSH_K8SMicroserviceControlLoopElement: # Chart from local file system version: 1.2.3 type: org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement type_version: 1.0.0 description: Control loop element for the K8S microservice for PMSH properties: provider: ONAP participantType: name: org.onap.k8s.controlloop.K8SControlLoopParticipant2 version: 2.3.4 startPhase: 1 chart: chartId: name: dcae-pmsh version: 8.0.0 namespace: onap releaseName: pmshms repository: repoName: chartmuseum protocol: http address: 10.152.183.120 port: 80 userName: onapinitializer password: demo123456! overrideParams: global.masterPassword: test org.onap.domain.database.Local_K8SMicroserviceControlLoopElement: # Chart installation without passing repository name version: 1.2.3 type: org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement type_version: 1.0.0 description: Control loop element for the K8S microservice for local chart properties: provider: ONAP participantType: name: org.onap.k8s.controlloop.K8SControlLoopParticipant version: 2.3.4 chart: chartId: name: nginx-ingress version: 0.9.1 releaseName: nginxms namespace: test repository: repoName: nginx-stable org.onap.domain.sample.GenericK8s_ControlLoopDefinition: version: 1.2.3 type: org.onap.policy.clamp.controlloop.ControlLoop type_version: 1.0.0 description: Control loop for Hello World properties: provider: ONAP elements: - name: org.onap.domain.database.HelloWorld_K8SMicroserviceControlLoopElement version: 1.2.3 - name: org.onap.domain.database.PMSH_K8SMicroserviceControlLoopElement version: 1.2.3 - name: org.onap.domain.database.Local_K8SMicroserviceControlLoopElement version: 1.2.3 |
Multi templates
Right now using Spring repositories it is possible to create more than one service template, as service templates in policy-models/tosca.
How to create additional service template (just add different name and version into the yaml file):
Code Block | ||||
---|---|---|---|---|
| ||||
name: ToscaServiceTemplateSimple version: 1.0.1 tosca_definitions_version: tosca_simple_yaml_1_3 ............................................ |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
MariaDB [controlloop]> select * from ToscaServiceTemplate; +-------------+-------------------------+-------------------+----------------------+----------------------------+---------+------------------------+---------------------+----------------------+------------------+------------------+----------------------+-----------------+--------------------+--------------------------+-----------------------+-----------------------------+-------------------------------+----------------------------------+---------------------------------+ | DESCRIPTION | TOSCADEFINITIONSVERSION | derived_from_name | derived_from_version | name | version | capabilityTypesVersion | capabilityTypesName | dataTypesName | dataTypesVersion | nodeTypesVersion | nodeTypesName | policyTypesName | policyTypesVersion | relationshipTypesVersion | relationshipTypesName | topologyTemplateLocalName | topologyTemplateParentKeyName | topologyTemplateParentKeyVersion | topologyTemplateParentLocalName | +-------------+-------------------------+-------------------+----------------------+----------------------------+---------+------------------------+---------------------+----------------------+------------------+------------------+----------------------+-----------------+--------------------+--------------------------+-----------------------+-----------------------------+-------------------------------+----------------------------------+---------------------------------+ | NULL | tosca_simple_yaml_1_3 | NULL | NULL | ToscaServiceTemplateSimple | 1.0.0 | NULL | NULL | ToscaDataTypesSimple | 1.0.0 | 1.0.0 | ToscaNodeTypesSimple | NULL | NULL | NULL | NULL | ToscaTopologyTemplateSimple | ToscaServiceTemplateSimple | 1.0.0 | NULL | | NULL | tosca_simple_yaml_1_3 | NULL | NULL | ToscaServiceTemplateSimple | 1.0.1 | NULL | NULL | ToscaDataTypesSimple | 1.0.0 | 1.0.0 | ToscaNodeTypesSimple | NULL | NULL | NULL | NULL | ToscaTopologyTemplateSimple | ToscaServiceTemplateSimple | 1.0.0 | NULL | +-------------+-------------------------+-------------------+----------------------+----------------------------+---------+------------------------+---------------------+----------------------+------------------+------------------+----------------------+-----------------+--------------------+--------------------------+-----------------------+-----------------------------+-------------------------------+----------------------------------+---------------------------------+ MariaDB [controlloop]> select * from ToscaNodeTemplates; +--------------------------+---------+ | name | version | +--------------------------+---------+ | ToscaNodeTemplatesSimple | 1.0.0 | +--------------------------+---------+ |
...
- Move to Hibernate with EclipseLink tables is probably possible.
- The presence of longblob types used to store whole objects is an issues, it is readable only by Java language or by any other language compatible with Java binary code. I am not sure if a db-migrator can handle that.
- Document databases store all information for a given object in a single instance in the database, and every stored object can be different from every other. Each operation save/read/delete of a service template, could be done using one access to a document. So, using Cassandra/MongoDB /Cassandra will solve all issues.
JpaRepository
and and CassandraRepository
/MongoRepository
extendCrudRepository
and expose the capabilities of the underlying persistence technology in addition to the rather generic persistence technology-agnostic interfaces like e.g.CrudRepository
.
...