...
Add dynamic participantId support and add database support,
Can a participant share the database with other replicas?
Shared database with same supported element Type: a composition will be connected to a specific participantId, so only one participant will do actions with this composition and his instances. But it can fetch all compositions that are sharing.
In a restarting scenario the participant will change the participantId, and it can still fetch compositions and instances. ACM-runtime decides who has to work with, and Participant will do actions based on the message.
Changes in Participant:
- UUID participantId will be generated in memory instead to fetch it in properties file.
- cosumerGroup will be empty (kafka configuration): any intermediary-participant will have unique Kafka queue, so they will receive same message that will be filtered by participantId.
- Add client support for no-sql database.
- Add no-sql database or mock for Unit Tests.
- Refactor CacheProvider to support insert/update, intermediary-participant can still use the cache in memory.
- Any new/change composition and instance will be saved in database.
- Refactor Participants that are using own cache in memory (Policy Participant saves policy and policy type in memory)
...
Distributed Coordinator ED (Etcd): Distributed systems use etcd as a consistent key-value store for configuration management, service discovery, and coordinating distributed work. Many organizations use etcd to implement production systems such as container schedulers, service discovery services, and distributed data storage.
- Document Database PG (PostgreSql)
- Key Value Database AG (Apache Geode): Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing.(https://geode.apache.org/docs/guide/114/getting_started/intro_to_clients.html) or (https://docs.spring.io/spring-boot-data-geode-build/1.7.5/reference/html5/).
- Key Value Database RD (Redis): RDB is NOT good if you need to minimize the chance of data loss in case Redis stops working.
- Wide Column Database CD (Apache Cassandra)
- Search Engine (Open Search): It supports Rest Api, https://opensearch.org/docs/latest/clients/java/
Open Search
Create a composition index
PUT https://{{address}}:9200/composition
Code Block | ||
---|---|---|
| ||
{
"settings": {
"index": {
"number_of_shards": 2,
"number_of_replicas": 1
}
},
"mappings": {
"properties": {
"id": {
"type": "text"
}
}
},
"aliases": {
"sample-alias1": {}
}
} |
Create a composition document
POST https://{{address}}:9200/composition/_doc/0da7f17d-68d4-47f3-9dbf-b380413c5fad
Code Block | ||||
---|---|---|---|---|
| ||||
{
"id": "0da7f17d-68d4-47f3-9dbf-b380413c5fad",
"data": {
"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
}
}
},
"org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest": {
"version": "1.0.0",
"derived_from": "tosca.datatypes.Root",
"properties": {
"restRequestId": {
"type": "onap.datatypes.ToscaConceptIdentifier",
"required": true,
"description": "The name and version of a REST request to be sent to a REST endpoint"
},
"httpMethod": {
"type": "string",
"required": true,
"constraints": [
{
"valid_values": [
"POST",
"PUT",
"GET",
"DELETE"
]
}
],
"description": "The REST method to use"
},
"path": {
"type": "string",
"required": true,
"description": "The path of the REST request relative to the base URL"
},
"body": {
"type": "string",
"required": false,
"description": "The body of the REST request for PUT and POST requests"
},
"expectedResponse": {
"type": "integer",
"required": true,
"constraints": [],
"description": "THe expected HTTP status code for the REST request"
}
}
},
"org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity": {
"version": "1.0.0",
"derived_from": "tosca.datatypes.Root",
"properties": {
"configurationEntityId": {
"type": "onap.datatypes.ToscaConceptIdentifier",
"required": true,
"description": "The name and version of a Configuration Entity to be handled by the HTTP Automation Composition Element"
},
"restSequence": {
"type": "list",
"entry_schema": {
"type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest",
"type_version": "1.0.0"
},
"description": "A sequence of REST commands to send to the REST endpoint"
}
}
}
},
"node_types": {
"org.onap.policy.clamp.acm.Participant": {
"version": "1.0.1",
"derived_from": "tosca.nodetypes.Root",
"properties": {
"provider": {
"type": "string",
"required": false
}
}
},
"org.onap.policy.clamp.acm.AutomationCompositionElement": {
"version": "1.0.1",
"derived_from": "tosca.nodetypes.Root",
"properties": {
"provider": {
"type": "string",
"required": false,
"metadata": {
"common": true
},
"description": "Specifies the organization that provides the automation composition element"
},
"startPhase": {
"type": "integer",
"required": false,
"constraints": [
{
"greater_or_equal": 0
}
],
"metadata": {
"common": true
},
"description": "A value indicating the start phase in which this automation composition element will be started, the first start phase is zero. Automation Composition Elements are started in their start_phase order and stopped in reverse start phase order. Automation Composition Elements with the same start phase are started and stopped simultaneously"
},
"uninitializedToPassiveTimeout": {
"type": "integer",
"required": false,
"constraints": [
{
"greater_or_equal": 0
}
],
"default": 60,
"metadata": {
"common": true
},
"description": "The maximum time in seconds to wait for a state chage from uninitialized to passive"
}
}
},
"org.onap.policy.clamp.acm.AutomationComposition": {
"version": "1.0.1",
"derived_from": "tosca.nodetypes.Root",
"properties": {
"provider": {
"type": "string",
"required": false,
"metadata": {
"common": true
},
"description": "Specifies the organization that provides the automation composition element"
},
"elements": {
"type": "list",
"required": true,
"metadata": {
"common": true
},
"entry_schema": {
"type": "onap.datatypes.ToscaConceptIdentifier"
},
"description": "Specifies a list of automation composition element definitions that make up this automation composition definition"
}
}
},
"org.onap.policy.clamp.acm.HttpAutomationCompositionElement": {
"version": "1.0.0",
"derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement",
"properties": {
"baseUrl": {
"type": "string",
"required": true,
"description": "The base URL to be prepended to each path, identifies the host for the REST endpoints."
},
"httpHeaders": {
"type": "map",
"required": false,
"entry_schema": {
"type": "string"
},
"description": "HTTP headers to send on REST requests"
},
"configurationEntities": {
"type": "map",
"required": true,
"entry_schema": {
"type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity",
"type_version": "1.0.0"
},
"description": "The connfiguration entities the Automation Composition Element is managing and their associated REST requests"
}
}
}
},
"topology_template": {
"node_templates": {
"org.onap.policy.clamp.acm.HttpParticipant": {
"version": "2.3.4",
"type": "org.onap.policy.clamp.acm.Participant",
"type_version": "1.0.1",
"description": "Participant for Http requests",
"properties": {
"provider": "ONAP"
}
},
"onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": {
"version": "1.2.3",
"type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement",
"type_version": "1.0.0",
"description": "Automation composition element for the http requests of AC Element Starter microservice",
"properties": {
"provider": "ONAP",
"uninitializedToPassiveTimeout": 180,
"startPhase": 0
}
},
"onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": {
"version": "1.2.3",
"type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement",
"type_version": "1.0.0",
"description": "Automation composition element for the http requests of AC Element Bridge microservice",
"properties": {
"provider": "ONAP",
"uninitializedToPassiveTimeout": 180,
"startPhase": 0
}
},
"onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": {
"version": "1.2.3",
"type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement",
"type_version": "1.0.0",
"description": "Automation composition element for the http requests of AC Element Sink microservice",
"properties": {
"provider": "ONAP",
"uninitializedToPassiveTimeout": 180,
"startPhase": 0
}
},
"onap.policy.clamp.ac.element.AutomationCompositionDefinition": {
"version": "1.2.3",
"type": "org.onap.policy.clamp.acm.AutomationComposition",
"type_version": "1.0.1",
"description": "Automation composition for Demp",
"properties": {
"provider": "ONAP",
"elements": [
{
"name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement",
"version": "1.2.3"
},
{
"name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement",
"version": "1.2.3"
},
{
"name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement",
"version": "1.2.3"
}
]
}
}
}
}
}
} |
Fetch a composition
GET https://{{address}}:9200/composition/_doc/0da7f17d-68d4-47f3-9dbf-b380413c5fad