From c78136bd23f96c2c79d66f8494f914a3405f2876 Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Fri, 26 Apr 2024 09:53:55 +0100 Subject: [PATCH] Update Participant Simulator docs Issue-ID: POLICY-4971 Change-Id: I4bb4ff00414ec1de935ed2bed3b50b4f7a0212d3 Signed-off-by: FrancescoFioraEst --- docs/clamp/acm/acm-participant-guide.rst | 104 +- docs/clamp/acm/acm-user-guide.rst | 6 +- .../acm/design-impl/participants/participants.rst | 1 + .../design-impl/participants/sim-participant.rst | 42 + .../participants/swagger/participant-sim.json | 1028 +++++++++++++------- docs/clamp/acm/draw.io/acm-participant-sim.drawio | 305 ++++++ .../acm/images/participants/sim-participant.png | Bin 0 -> 98976 bytes 7 files changed, 1154 insertions(+), 332 deletions(-) create mode 100644 docs/clamp/acm/design-impl/participants/sim-participant.rst create mode 100644 docs/clamp/acm/draw.io/acm-participant-sim.drawio create mode 100644 docs/clamp/acm/images/participants/sim-participant.png diff --git a/docs/clamp/acm/acm-participant-guide.rst b/docs/clamp/acm/acm-participant-guide.rst index a98e66b8..b4ca885d 100644 --- a/docs/clamp/acm/acm-participant-guide.rst +++ b/docs/clamp/acm/acm-participant-guide.rst @@ -194,6 +194,108 @@ Any new functionality in the future will be wrapped by this class. Default implementation are supported for the methods: lock, unlock, update, migrate, delete, prime, deprime, handleRestartComposition and handleRestartInstance. +Methods: deploy, undeploy, lock, unlock and delete + compositionElement: + ====================== ======================================= + **field** **description** + ====================== ======================================= + compositionId composition definition Id + elementDefinitionId composition definition element Id + inProperties composition definition in-properties + outProperties composition definition out-properties + ====================== ======================================= + instanceElement: + ============================== =========================== + **field** **description** + ============================== =========================== + instanceId instance id + elementId instance element id + toscaServiceTemplateFragment policies and policy types + inProperties instance in-properties + outProperties instance out-properties + ============================== =========================== + +Method: update + compositionElement: + ====================== ======================================= + **field** **description** + ====================== ======================================= + compositionId composition definition Id + elementDefinitionId composition definition element Id + inProperties composition definition in-properties + outProperties composition definition out-properties + ====================== ======================================= + instanceElement: + ============================== ================================================ + **field** **description** + ============================== ================================================ + instanceId instance id + elementId instance element id + toscaServiceTemplateFragment + inProperties instance in-properties **(before the update)** + outProperties instance out-properties + ============================== ================================================ + instanceElementUpdated: + ============================== ====================================== + **field** **description** + ============================== ====================================== + instanceId instance id + elementId instance element id + toscaServiceTemplateFragment + inProperties instance in-properties **(updated)** + outProperties instance out-properties + ============================== ====================================== + +Methods: prime, deprime + composition: + ====================== =================================================================== + **field** **description** + ====================== =================================================================== + compositionId composition definition Id + inProperties composition definition in-properties for each definition element + outProperties composition definition out-properties for each definition element + ====================== =================================================================== + +Method: migrate + compositionElement: + ====================== ======================================= + **field** **description** + ====================== ======================================= + compositionId composition definition Id + elementDefinitionId composition definition element Id + inProperties composition definition in-properties + outProperties composition definition out-properties + ====================== ======================================= + compositionElementTarget: + ====================== ============================================== + **field** **description** + ====================== ============================================== + compositionId composition definition target Id + elementDefinitionId composition definition target element Id + inProperties composition definition target in-properties + outProperties composition definition target out-properties + ====================== ============================================== + instanceElement: + ============================== =================================================== + **field** **description** + ============================== =================================================== + instanceId instance id + elementId instance element id + toscaServiceTemplateFragment + inProperties instance in-properties **(before the migration)** + outProperties instance out-properties + ============================== =================================================== + instanceElementMigrate: + ============================== ====================================== + **field** **description** + ============================== ====================================== + instanceId instance id + elementId instance element id + toscaServiceTemplateFragment + inProperties instance in-properties **(updated)** + outProperties instance out-properties + ============================== ====================================== + APIs to invoke -------------- ParticipantIntermediaryApi: @@ -665,4 +767,4 @@ error scenarios in the participant with the suitable approach. Tips: If the participant tries to undeploy an element which doesn’t exist in the system any more (due to various other external factors), -it could update the element state to ‘undeployed’ using the Intermediary api. \ No newline at end of file +it could update the element state to ‘undeployed’ using the Intermediary api. diff --git a/docs/clamp/acm/acm-user-guide.rst b/docs/clamp/acm/acm-user-guide.rst index faab7e61..3c56f906 100644 --- a/docs/clamp/acm/acm-user-guide.rst +++ b/docs/clamp/acm/acm-user-guide.rst @@ -418,7 +418,7 @@ The Json below is an example of configuration: Update and send composition outProperites ----------------------------------------- -Data like useState operationalState and outProperites could be updated any time using the following endpoint: +Composition Definition outProperites could be updated any time using the following endpoint: .. code-block:: bash @@ -454,7 +454,7 @@ could be read using the following endpoint: Update and send useState operationalState and instance outProperites -------------------------------------------------------------------- -Data like useState operationalState and outProperites could be updated any time using the following endpoint: +AC instance data like useState operationalState and outProperites could be updated any time using the following endpoint: .. code-block:: bash @@ -466,7 +466,7 @@ The Json below is an example of update, where {{instanceId}} is the UUID of the { "outProperties": { - "Opresult": true, + "result": true, "list": [ {"id": 1 }, {"id": 2 } diff --git a/docs/clamp/acm/design-impl/participants/participants.rst b/docs/clamp/acm/design-impl/participants/participants.rst index 6b12b7c4..254d80c7 100644 --- a/docs/clamp/acm/design-impl/participants/participants.rst +++ b/docs/clamp/acm/design-impl/participants/participants.rst @@ -38,3 +38,4 @@ The detailed implementation of the CLAMP Participant ecosystem is described on t a1pms-participant kserve-participant policy-framework-participant + sim-participant diff --git a/docs/clamp/acm/design-impl/participants/sim-participant.rst b/docs/clamp/acm/design-impl/participants/sim-participant.rst new file mode 100644 index 00000000..96683a6a --- /dev/null +++ b/docs/clamp/acm/design-impl/participants/sim-participant.rst @@ -0,0 +1,42 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. + +.. _clamp-acm-sim-participant: + +Simulator Participant +##################### + +This can be used for simulation testing purpose when there are no actual frameworks or a full deployment. +Typically the Simulator Participant can be used with other Simulator participants with different supported element types. +Once the microservice is up, the Simulator participants can be used to test CLAMP runtime and intermediary library. +It supports the message Broker Kafka. + +.. image:: ../../images/participants/sim-participant.png + +Supported Element Types +----------------------- +Supported Element Types for Simulator participant will be used to define a whatever participant Element Definition Types in tosca template. +Participant Supported Element Types is defined in Simulator participant application.yaml. +The example below shows how to mock the HTTP participant: + +.. code-block:: YAML + + participantSupportedElementTypes: + - + typeName: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + typeVersion: 1.0.0 + +Supported participant Interactions: +----------------------------------- +The Simulator participant interacts with ACM Runtime on the northbound via Message Broker. It interacts with tester via Rest Api. + +The communication for the Automation Composition updates and state change requests are sent from the ACM Runtime to the participant via Message Broker. +The tester can invoke the appropriate endpoint of the participant to change the behavior of how the participant should replay to ACM runtime. + +Participant Simulator API +========================= + +This API allows a Participant Simulator to be started and run for test purposes. + +:download:`Download Policy Participant Simulator API Swagger ` + +.. swaggerv2doc:: swagger/participant-sim.json diff --git a/docs/clamp/acm/design-impl/participants/swagger/participant-sim.json b/docs/clamp/acm/design-impl/participants/swagger/participant-sim.json index b258f85a..3be2d348 100644 --- a/docs/clamp/acm/design-impl/participants/swagger/participant-sim.json +++ b/docs/clamp/acm/design-impl/participants/swagger/participant-sim.json @@ -1,117 +1,205 @@ { - "swagger": "2.0", + "openapi": "3.0.1", "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": {}, + "title": "ACM Mock Participant", + "description": "CLAMP Mock Participant API", "license": { "name": "Apache 2.0", "url": "http://www.apache.org/licenses/LICENSE-2.0" } }, + "externalDocs": { + "description": "CLAMP Automation Composition Management Documentation", + "url": "https://docs.onap.org/projects/onap-policy-parent/en/latest/clamp/clamp.html" + }, + "servers": [ + { + "url": "http://localhost:8084/onap/policy/clamp/acm/simparticipant", + "description": "Generated server url" + } + ], "paths": { - "/onap/participantsim/v2/elements": { - "put": { + "/v2/parameters": { + "get": { "tags": [ - "Clamp Automation Composition Participant Simulator API" - ], - "summary": "Updates simulated automation composition elements", - "description": "Updates simulated automation composition elements, returning the updated automation composition definition IDs", - "operationId": "updateUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/yaml" + "Simulator-participant-controller" ], + "summary": "Return all Parameters", + "description": "Return all the parameters configured in the Simulator Participant", + "operationId": "getConfig", "parameters": [ { - "in": "body", - "name": "body", - "description": "Body of a automation composition element", - "required": true, + "name": "X-onap-RequestId", + "in": "header", + "description": "RequestID for http transaction", + "required": false, "schema": { - "$ref": "#/definitions/AutomationCompositionElementReq", - "originalRef": "AutomationCompositionElementReq" + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK, reutrns a serialised instance of [SimConfig](https://github.com/onap/policy-clamp/blob/master/participant/participant-impl/policy-clamp-participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/model/SimConfig.java)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + } } }, + "401": { + "description": "Authorization Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "Simulator-participant-controller" + ], + "summary": "change the parameters", + "description": "Change the parameters the behaviour of the Simulator Participant", + "operationId": "setConfig", + "parameters": [ { "name": "X-ONAP-RequestID", "in": "header", "description": "RequestID for http transaction", "required": false, - "type": "string", - "format": "uuid" + "schema": { + "type": "string", + "format": "uuid" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/SimConfig" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/TypedSimpleResponse«AutomationCompositionElement»", - "originalRef": "TypedSimpleResponse«AutomationCompositionElement»" - } + "description": "OK, the parameters has been saved" }, - "201": { - "description": "Created" + "400": { + "description": "Bad Request" }, "401": { - "description": "Authentication Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "description": "Authorization Error" + }, + "500": { + "description": "Internal Server Error" + } + }, + "security": [ + { + "basicAuth": [] + } + ] + } + }, + "/v2/datas": { + "get": { + "tags": [ + "Simulator-participant-controller" + ], + "summary": "Query details of the requested internal datas", + "description": "Query details of the requested internal datas", + "operationId": "getDatas", + "parameters": [ + { + "name": "X-onap-RequestId", + "in": "header", + "description": "RequestID for http transaction", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Serialised instance of [InternalDatas](https://github.com/onap/policy-clamp/blob/master/participant/participant-impl/policy-clamp-participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/model/InternalDatas.java)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } } } }, - "403": { + "401": { "description": "Authorization Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } } } }, - "404": { - "description": "Not Found" - }, "500": { "description": "Internal Server Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } } } } @@ -120,114 +208,121 @@ { "basicAuth": [] } + ] + }, + "put": { + "tags": [ + "Simulator-participant-controller" ], - "x-interface info": { - "api-version": "1.0.0", - "last-mod-release": "Dublin" - } + "summary": "change the parameters", + "description": "Change the data of the Simulator Participant", + "operationId": "setData", + "parameters": [ + { + "name": "X-ONAP-RequestID", + "in": "header", + "description": "RequestID for http transaction", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InternalData" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK, the data has been saved" + }, + "400": { + "description": "Bad Request" + }, + "401": { + "description": "Authorization Error" + }, + "500": { + "description": "Internal Server Error" + } + }, + "security": [ + { + "basicAuth": [] + } + ] } }, - "/onap/participantsim/v2/elements/{name}/{version}": { + "/v2/compositiondatas": { "get": { "tags": [ - "Clamp Automation Composition Participant Simulator API" - ], - "summary": "Query details of the requested simulated automation composition elements", - "description": "Queries details of the requested simulated automation composition elements, returning all automation composition element details", - "operationId": "elementsUsingGET", - "produces": [ - "application/json", - "application/yaml" + "Simulator-participant-controller" ], + "summary": "Query details of the requested internal composition datas", + "description": "Query details of the requested internal composition datas", + "operationId": "getCompositionDatas", "parameters": [ { - "name": "name", - "in": "path", - "description": "Automation Composition element name", - "required": true, - "type": "string" - }, - { - "name": "version", - "in": "path", - "description": "Automation Composition element version", - "required": true, - "type": "string" - }, - { - "name": "X-ONAP-RequestID", + "name": "X-onap-RequestId", "in": "header", "description": "RequestID for http transaction", "required": false, - "type": "string", - "format": "uuid" + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/AutomationCompositionElementRes", - "originalRef": "AutomationCompositionElementRes" + "description": "Serialised instance of [InternalDatas](https://github.com/onap/policy-clamp/blob/master/participant/participant-impl/policy-clamp-participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/model/InternalDatas.java)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } } } }, "401": { - "description": "Authentication Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" - } - } - }, - "403": { "description": "Authorization Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } } } }, - "404": { - "description": "Not Found" - }, "500": { "description": "Internal Server Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InternalDatas" + } } } } @@ -236,113 +331,121 @@ { "basicAuth": [] } - ], - "x-interface info": { - "api-version": "1.0.0", - "last-mod-release": "Dublin" - } - } - }, - "/onap/participantsim/v2/participants": { + ] + }, "put": { "tags": [ - "Clamp Automation Composition Participant Simulator API" - ], - "summary": "Updates simulated participants", - "description": "Updates simulated participants, returning the updated automation composition definition IDs", - "operationId": "updateUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/yaml" + "Simulator-participant-controller" ], + "summary": "change the parameters", + "description": "Change the data of the Simulator Participant", + "operationId": "setCompositionData", "parameters": [ - { - "in": "body", - "name": "body", - "description": "Body of a participant", - "required": true, - "schema": { - "$ref": "#/definitions/ParticipantReq", - "originalRef": "ParticipantReq" - } - }, { "name": "X-ONAP-RequestID", "in": "header", "description": "RequestID for http transaction", "required": false, - "type": "string", - "format": "uuid" + "schema": { + "type": "string", + "format": "uuid" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InternalData" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/TypedSimpleResponse«Participant»", - "originalRef": "TypedSimpleResponse«Participant»" - } + "description": "OK, the data has been saved" }, - "201": { - "description": "Created" + "400": { + "description": "Bad Request" }, "401": { - "description": "Authentication Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "description": "Authorization Error" + }, + "500": { + "description": "Internal Server Error" + } + }, + "security": [ + { + "basicAuth": [] + } + ] + } + }, + "/v2/instances": { + "get": { + "tags": [ + "Simulator-participant-controller" + ], + "summary": "Query details of the requested automation composition instances", + "description": "Query details of the requested automation composition instances for the given automation composition definition ID, returning details of all its automation composition instances", + "operationId": "getAutomationCompositions", + "parameters": [ + { + "name": "X-onap-RequestId", + "in": "header", + "description": "RequestID for http transaction", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Serialised instance of [AutomationCompositions](https://github.com/onap/policy-clamp/blob/master/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationCompositions.java) containing a list of automation composition instances found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationCompositions" + } } } }, - "403": { + "401": { "description": "Authorization Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationCompositions" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/AutomationCompositions" + } } } }, - "404": { - "description": "Not Found" - }, "500": { "description": "Internal Server Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationCompositions" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/AutomationCompositions" + } } } } @@ -351,114 +454,77 @@ { "basicAuth": [] } - ], - "x-interface info": { - "api-version": "1.0.0", - "last-mod-release": "Dublin" - } + ] } }, - "/onap/participantsim/v2/participants/{name}/{version}": { + "/v2/instances/{instanceId}": { "get": { "tags": [ - "Clamp Automation Composition Participant Simulator API" - ], - "summary": "Query details of the requested simulated participants", - "description": "Queries details of the requested simulated participants, returning all participant details", - "operationId": "participantsUsingGET", - "produces": [ - "application/json", - "application/yaml" + "Simulator-participant-controller" ], + "summary": "Get automation composition instance details.", + "description": "Get details of the requested automation composition instance.", + "operationId": "getAutomationComposition", "parameters": [ { - "name": "name", + "name": "instanceId", "in": "path", - "description": "Participant name", + "description": "The UUID of the automation composition instance to get", "required": true, - "type": "string" - }, - { - "name": "version", - "in": "path", - "description": "Participant version", - "required": true, - "type": "string" + "schema": { + "type": "string", + "format": "uuid" + } }, { - "name": "X-ONAP-RequestID", + "name": "X-onap-RequestId", "in": "header", "description": "RequestID for http transaction", "required": false, - "type": "string", - "format": "uuid" + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/ParticipantRes", - "originalRef": "ParticipantRes" + "description": "Serialised instance of [AutomationComposition](https://github.com/onap/policy-clamp/blob/master/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationComposition.java) containing the automation composition instance", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationComposition" + } } } }, "401": { - "description": "Authentication Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" - } - } - }, - "403": { "description": "Authorization Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationComposition" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/AutomationComposition" + } } } }, - "404": { - "description": "Not Found" - }, "500": { "description": "Internal Server Error", - "headers": { - "X-LatestVersion": { - "type": "string" - }, - "X-PatchVersion": { - "type": "string" - }, - "X-MinorVersion": { - "type": "string" - }, - "X-ONAP-RequestID": { - "type": "string", - "format": "uuid" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationComposition" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/AutomationComposition" + } } } } @@ -467,12 +533,318 @@ { "basicAuth": [] } - ], - "x-interface info": { - "api-version": "1.0.0", - "last-mod-release": "Dublin" + ] + } + } + }, + "components": { + "schemas": { + "SimConfig": { + "type": "object", + "properties": { + "deploySuccess": { + "type": "boolean" + }, + "undeploySuccess": { + "type": "boolean" + }, + "lockSuccess": { + "type": "boolean" + }, + "unlockSuccess": { + "type": "boolean" + }, + "deleteSuccess": { + "type": "boolean" + }, + "updateSuccess": { + "type": "boolean" + }, + "migrateSuccess": { + "type": "boolean" + }, + "primeSuccess": { + "type": "boolean" + }, + "deprimeSuccess": { + "type": "boolean" + }, + "deployTimerMs": { + "type": "integer", + "format": "int32" + }, + "undeployTimerMs": { + "type": "integer", + "format": "int32" + }, + "lockTimerMs": { + "type": "integer", + "format": "int32" + }, + "unlockTimerMs": { + "type": "integer", + "format": "int32" + }, + "updateTimerMs": { + "type": "integer", + "format": "int32" + }, + "migrateTimerMs": { + "type": "integer", + "format": "int32" + }, + "deleteTimerMs": { + "type": "integer", + "format": "int32" + }, + "primeTimerMs": { + "type": "integer", + "format": "int32" + }, + "deprimeTimerMs": { + "type": "integer", + "format": "int32" + } + } + }, + "InternalData": { + "type": "object", + "properties": { + "intProperties": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "outProperties": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "compositionId": { + "type": "string", + "format": "uuid" + }, + "compositionDefinitionElementId": { + "$ref": "#/components/schemas/ToscaConceptIdentifier" + }, + "automationCompositionId": { + "type": "string", + "format": "uuid" + }, + "automationCompositionElementId": { + "type": "string", + "format": "uuid" + }, + "useState": { + "type": "string" + }, + "operationalState": { + "type": "string" + } + } + }, + "ToscaConceptIdentifier": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "AutomationComposition": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "derivedFrom": { + "type": "string" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "description": { + "type": "string" + }, + "instanceId": { + "type": "string", + "format": "uuid" + }, + "compositionId": { + "type": "string", + "format": "uuid" + }, + "compositionTargetId": { + "type": "string", + "format": "uuid" + }, + "restarting": { + "type": "boolean" + }, + "deployState": { + "type": "string", + "enum": [ + "DEPLOYED", + "DEPLOYING", + "UNDEPLOYED", + "UNDEPLOYING", + "DELETING", + "DELETED", + "UPDATING", + "MIGRATING" + ] + }, + "lockState": { + "type": "string", + "enum": [ + "LOCKED", + "LOCKING", + "UNLOCKED", + "UNLOCKING", + "NONE" + ] + }, + "elements": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/AutomationCompositionElement" + } + }, + "stateChangeResult": { + "type": "string", + "enum": [ + "NO_ERROR", + "FAILED", + "TIMEOUT" + ] + }, + "definedName": { + "type": "string" + }, + "definedVersion": { + "type": "string" + }, + "typeVersion": { + "type": "string" + }, + "key": { + "$ref": "#/components/schemas/ToscaEntityKey" + }, + "type": { + "type": "string" + } + } + }, + "AutomationCompositionElement": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "definition": { + "$ref": "#/components/schemas/ToscaConceptIdentifier" + }, + "participantId": { + "type": "string", + "format": "uuid" + }, + "restarting": { + "type": "boolean" + }, + "deployState": { + "type": "string", + "enum": [ + "DEPLOYED", + "DEPLOYING", + "UNDEPLOYED", + "UNDEPLOYING", + "DELETING", + "DELETED", + "UPDATING", + "MIGRATING" + ] + }, + "lockState": { + "type": "string", + "enum": [ + "LOCKED", + "LOCKING", + "UNLOCKED", + "UNLOCKING", + "NONE" + ] + }, + "operationalState": { + "type": "string" + }, + "useState": { + "type": "string" + }, + "description": { + "type": "string" + }, + "message": { + "type": "string" + }, + "properties": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "outProperties": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + } + }, + "AutomationCompositions": { + "type": "object", + "properties": { + "automationCompositionList": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AutomationComposition" + } + } + } + }, + "ToscaEntityKey": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "InternalDatas": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InternalData" + } + } } } } } -} \ No newline at end of file +} diff --git a/docs/clamp/acm/draw.io/acm-participant-sim.drawio b/docs/clamp/acm/draw.io/acm-participant-sim.drawio new file mode 100644 index 00000000..5bcab9c2 --- /dev/null +++ b/docs/clamp/acm/draw.io/acm-participant-sim.drawio @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/clamp/acm/images/participants/sim-participant.png b/docs/clamp/acm/images/participants/sim-participant.png new file mode 100644 index 0000000000000000000000000000000000000000..8ceabb16506becc870410a88d7b1d753f316d23d GIT binary patch literal 98976 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

9BchKhw>_@@qiE(mz$F@Scjh7F)hflx z|07g4l1U^NtwqIu=or>a+3U)|QCoW=el1mBH)*)7BVPFSR~qNf2w%%@Ga}>|P5o91 z%w_E(N0I2xq|wzP2GB4&EXK)Mwb1!SQD8Q#CyG{|2qai?;+&|)=5&%8ieVMzo+O#> z+?SJS-nj8`&*>5Y;d-2|$!asrTz|Ytuyvg0tEC3VlKJqonU{>VUwaal<%LYwFKF|R zv8M4OdKjpv=Q+KcGcFb{WP6C4n{VoTJA2xP$UZwN?E(kp2h+iAdV@&KVju93=( z&zOZxPC*+2A`bV}y~Aa>#O`s{qWCQgumEBoStSShjRv9@#(3M~q|`mqi?k;D@+Rr| zw8ImZI@BsnZ>xKGPBPM0)(-Wp>i^`Py$n*94{(&^vR=Y*K67_3>2J_4UYsmR_~<_M zcriT{TQmlNeejEJ;$WN_S9-~KPwBYc4SfuB8m~I;`EMLPobJ2ipi@Wm(6#IpJ_q+I z__?y)==gapi_FA~NAmTqjZXf5T+8BaV0!uBy1h)*<}CtyBhFwpPSAQ!v1&tZ&f;Qu z57w@b<7|R<*N5w*eryQ}4ybVm@v&!aD+2&vyMxPmV%nu2p&leRGy*rG^oov|cn#DU zsl;sB%h2|in7+-z=0|%~QrJs-;GS9I(4Ql%TYU;M({it+vpN7Awo8avZz|1<$9M|P zjF0q|V5#mZ+?`)apWZ7sz-W(+yepp+hU*nMo;i&Tgv2G2EAcU$4(7VRq<s7#0StNfEepodo9USwWBI4}$BKu0MvYfS`Jt+2p!@Ht8d#tX3@70kk6a6c ze)I%BGNL`DrnuEvqWF`dU3XC6xL2q3B6B|lW;J7JP;O6y=N`Lf1g$D-$7gxgUGBn3 zjq*`FtI{_zmmjA=|Z?D zWVk;?6Z^PdsEdVF~(cX5#|k zAA~YkEp`-tcKz12-X!M%&P%1g|NrX+0~YMVV}B;P#Kbs|XvA+i4`E#%YvIMEC