aboutsummaryrefslogtreecommitdiffstats
path: root/docs/developer_info
diff options
context:
space:
mode:
Diffstat (limited to 'docs/developer_info')
-rw-r--r--docs/developer_info/BBUnderstanding.rst440
-rw-r--r--docs/developer_info/Cxf_Logging.rst210
-rw-r--r--docs/developer_info/Mso_Openstack_Adapter.rst796
-rw-r--r--docs/developer_info/developer_information.rst2
-rw-r--r--docs/developer_info/mso_adapter_restinterface.rst288
5 files changed, 1736 insertions, 0 deletions
diff --git a/docs/developer_info/BBUnderstanding.rst b/docs/developer_info/BBUnderstanding.rst
index 2aa7097ad9..6e96e5dca2 100644
--- a/docs/developer_info/BBUnderstanding.rst
+++ b/docs/developer_info/BBUnderstanding.rst
@@ -5,3 +5,443 @@
Building Block Understanding
============================
+UNDERSTANDING BUILDING BLOCKS USING MACRO FLOW
+----------------------------------------------
+
+
+
+There are basically 2 flows - macro , a la carte.
+
+In a la carte we manually will initiate each step for a process.
+
+In macro , the whole flow happens at a single click - like if we want to create a service, the flow will itself look whether there are vnfs, pnfs or networks in the service and it will be created and activated in the flow also.
+
+Thus these independent tasks like if vnf is present, then assign create and activate vnf are all taken up as individual building blocks and are only called on need basis.
+
+
+Each and every request will reach to the api handler first.
+
+API HANDLER( ServiceInstances.java )
+------------------------------------
+
+
+
+# 1. Rest call reaching SO Api handler with the input json - According to the below path it is mapped to the createServiceInstance function in ServiceInstances file.
+
+curl -v -H "Content-Type: application/json" -X POST --data @serviceinstance.json -u mso_admin:password1$ http://localhost:8080/onap/so/infra/serviceInstantiation/v7/serviceInstances.
+
+# 2. Herein a unique requestid is generated corresponding to every request, and is checked whether that particular requestid exists in request db (Happens in createServiceInstance in ServiceInstances).
+
+ a. http://request-db-adapter:8083/infraActiveRequests/requestid (GET), which will return a 404 if not exists.
+
+ b. CreateInstance is set to the action variable. Here the request scope is set to service from the inputjson - modelType.
+
+# 3. Running local validations on input json.
+
+# 4. create InfraActiveRequests, to store request details in request db adapter and as a payload to bpmn.
+
+ a. A new InfraActiveRequests object is created. And all the necessary information from the input is set to it.
+
+ b. Retrieving productFamilyName from the input json to put into requests db. http://aai/servicedesigncreation/services/service/{productfamilyid} (GET), which will return a 404 if not exists in aai. If service exists, then that service's serviceDescritiption is set as productfamilyName.
+
+ c. http://aai/cloudinfrastructure/cloudregions/cloudregion/cloudowner/{lcpCloudRegionId}/tenants/tenant/{tenantId} (GET), checks for whether the particular cloud configuration exists in aai, if not exists returns 404. If we are able to get, then the tenant's name derived from aai is set as tenantName.
+
+ d. serviceInstanceNamee is derived from requestInfo.instanceName and is set.
+
+ e. Request json is also set as RequestBody of InfraActiveRequests.
+
+# 5. Checks fro whether duplicate name exists.
+
+ a. version v[integer] is converted to the particular integer and stored.
+
+ b. Checks whether instance name already exists in with a POST request in http://request-db-adapter:8083/infraActiveRequests/checkInstanceNameDuplicate, with the data { instanceIdmap = null, instanceName = {instanceName} , instanceservice = service } . It checks for the current progress and if in progress it throws the particular status.
+
+# 6. Gets the orchestration url from the recipe table.
+
+ a. Checks whether the service already exists in catalogdb http://catalog-db-adapter:8082/service/{modelNameVersionId} (GET).
+
+ b. Checks the service recipe table with the modelNameVersionId and the action to be performed http://catalog-db-adapter:8082/serviceRecipe/search/findFirstByServiceModelUUIDAndAction?serviceModelUUID={modelNameVersionId}&action=createInstance . Returns a 404 if no recipe exists with the corresponding id.
+
+ c. As recipe corresponding to this doesn't exist, we try to get with a default value. This flow comes under generic resource flow so the default value is GR-API-DEFAULT. First we get service with this value http://catalog-db-adapter:8082/service/search/findFirstByModelNameOrderByModelVersionDesc?modelName=GR-API-DEFAULT (GET). It returns a service with modelUUID as d88da85c-d9e8-4f73-b837-3a72a431622b, and further can be used to get the recipe.
+
+ d. http://catalog-db-adapter:8082/serviceRecipe/search/findFirstByServiceModelUUIDAndAction?serviceModelUUID=d88da85c-d9e8-4f73-b837-3a72a431622b&action=createInstance (GET), gives a recipe which has a parameter "orchestrationUri" as "/mso/async/services/WorkflowActionBB".
+
+# 7. Updates the infraActiveRequests with the current request.
+ a. http://request-db-adapter:8083/infraActiveRequests/ (POST) with the data formed. And a 201 created response is received.
+
+# 8. Call the bpmn with a post call on orchestrationUri. The data to bpmn is prepared having parameters like
+ a. bpmnRequest - formed from input request.
+
+ b. vfModuleId, pnfCorrelationId, networkId, configurationId, vfModuleType, serviceInstanceId , serviceType are updated if present in the input json or else set to empty string.
+
+ c. apiVersion , requestId, aLaCarte = false (def), recipeTimeout = 180(def), requestAction= createInstance are all updated accordingly.
+
+ d. requestUri - v7/serviceInstances ,which is formed from the request url.
+
+
+# 9. A sync response is obtained on reaching bpmn like {"requestReferences":{"requestId":"c45702f7-3f08-4081-bc98-2f9f18b81607","instanceId":"cadca18f-9bff-44be-8910-ad29d342e91f","requestSelfLink":"http://159.138.57.166:30277/orchestrationRequests/v7/c45702f7-3f08-4081-bc98-2f9f18b81607"}}.
+
+
+
+
+
+
+BPMN
+-----
+
+
+Hits WorkflowActionBB.bpmn
+--------------------------
+
+.. image:: ../images/workflow.png
+
+
+# 1. RetrieveBBExecutionList - implemented in selectExecutionList in WorkflowAction.java
+
+a. resourcetype, resourceid are formed from matching the requestUri to a regex pattern matcher [pattern=[vV]\d+.*?(?:(?:/(?<type>vnfs|vfModules|networks|networkCollections|volumeGroups|serviceInstances|instanceGroups)(?:/(?<id>[^/]+))?)(?:/(?<action>[^/]+))?(?:/resume)?)] .
+
+b. Checks whether there is a service subscription with service instance name as {instanceName} correspoding to the customer in aai https://aai.onap:8443/aai/v19/business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances?depth=2&resultIndex=0&resultSize=1&service-instance-name={instanceName}. Returns 404 not found, if it doesnt exists then the id of that particular instance is taken and given as both the resourceid and serviceinstance id. If not present then a random value is generated, and is assigned same to both.
+
+c. Checks whether there is a service of the particular serviceInstanceId exists in aai. https://aai.onap:8443/aai/v19/nodes/service-instances/service-instance/{serviceInstanceId} , returns not found if it doesnt exist. If service with corresponding instance name already exists , then flowsToExecute is got by quering the requestdbadapter with the earlier request id. If not present, then only orchestrationflows are got, and later from that the flowsToExecute are found out.
+
+d. Get the particular service from catalogdb . http://so-catalog-db-adapter.onap:8082/service/{modelNameVersionId} (GET). Be sure that the service with this particular modelNameVersionId exists in catalogdb, because based on the services (like whether pnf, or vnf, or networkcollection) present in that particular service, which all bbs to execute are decided.
+
+e. This being a service, "service" is added to the resource list. And is checked upon for other resources like vnf and network, eg:
+
+ http://so-catalog-db-adapter.onap:8082/service/{modelNameVersionId}/vnfCustomizations (GET)
+ http://so-catalog-db-adapter.onap:8082/service/{modelNameVersionId}/collectionResourceCustomizations (GET)
+ http://so-catalog-db-adapter.onap:8082/service/{modelNameVersionId}/networkCustomizations (GET)
+ And depending on the reources in the service, the resources found is updated like
+ Found :Service - 1 Vnf - 0 Pnf - 0 VfModule - 0 VolumeGroup - 0 Network - 0 VirtualLink - 0 NetworkCollection - 0 Configuration - 0 InstanceGroup - 0
+
+f. Then the orchestration flows are get from the orchestration_flow_table depending on the cloudowner and request scope: http://so-catalog-db-adapter.onap:8082/northbound_request_ref_lookup/search/findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType action=createInstance&requestScope=Service&isALaCarte=false&cloudOwner={CloudOwner}&serviceType=%2A (GET) Here if present, then the orchestration flows are returned or else with default cloud owner, we try again
+
+http://so-catalog-db-adapter.onap:8082/northbound_request_ref_lookup/search/findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType?action=createInstance&requestScope=Service&isALaCarte=false&cloudOwner=DEFAULT&serviceType=%2A (GET)
+Here in northBoundRequest is returned which has the parameter orchestrationFlowList, that contains the link that will return the orchestration flows.
+
+"orchestrationFlowList" : { "href" : "http://so-catalog-db-adapter.onap:8082/northbound_request_ref_lookup/101/orchestrationFlowList"}
+
+Now we do a get on the orchestration flow link to get the set of orchestartion flows required
+http://so-catalog-db-adapter.onap:8082/northbound_request_ref_lookup/101/orchestrationFlowList.
+Here a set of 20 orchestration flows are returned under the action of Service-Macro-Create, each with a sequence no assigned sequentially in the given order
+AssignServiceInstanceBB,
+
+CreateNetworkCollectionBB,
+
+AssignNetworkBB,
+
+AssignVnfBB,
+
+AssignVolumeGroupBB,
+
+AssignVfModuleBB,
+
+ConfigAssignVnfBB,
+
+AssignPnfBB,
+
+WaitForPnfReadyBB,
+
+ActivatePnfBB,
+
+CreateNetworkBB,
+
+ActivateNetworkBB,
+
+CreateVolumeGroupBB,
+
+ActivateVolumeGroupBB,
+
+CreateVfModuleBB,
+
+ActivateVfModuleBB,
+
+ConfigDeployVnfBB,
+
+ActivateVnfBB,
+
+ActivateNetworkCollectionBB,
+
+ActivateServiceInstanceBB.
+
+
+.. image:: ../images/flowchart.png
+
+
+g. Flows to execute is determined by iterating through all the orchestartion flows and matching it with the found resources. It is merely a contains matching. In this particular as service was the only resource : List of BuildingBlocks to execute:AssignServiceInstanceBB, ActivateServiceInstanceBB.
+
+h. processing data is added to the requestdbadapter. Here the data is post to the requestdb as two different building blocks http://so-request-db-adapter.onap:8083/requestProcessingData.
+
+i. The already stored request details in request db is ammended like "lastModifiedBy" : "CamundaBPMN" , and status to in_progress with a put request.
+
+
+# 2. sendSyncAck - This was used to give an acknowledgement , with status code as 200, and requestId and resourceId is sent as content.
+
+
+# 3. Prevalidate the workflow
+
+
+# 4. SelectBB - implemented in selectBBin WorkflowActionBBTasks
+This is used to select the building block from the flows to execute depending on the sequence order.
+
+ a. Depending on the current sequence , the building block is selected from the flows to execute.
+
+ b. Execution variable, that is passed between the different building blocks as the payload is ammended as:
+
+ execution.setVariable("buildingBlock", buildingblockselected).
+
+ c. current sequence is incremented by 1, and updated in execution variable.
+
+ d. Depending on whether currentSequence is greater than flowsToExecute.size(), COMPLETED variable is either set to true or false.
+
+
+# 5. updateFlowStatistics - implemented in updateFlowStatistics in WorkflowActionBBTasks
+a. Depending on the current sequence no, the completed bb and next bb is got from the flows to execute. And these are mentioned in a statusMessage.
+b. Percentage progress is got from the total no of bbs
+c. These are ammended to the already present request in the request db
+
+# 6. Execute BB - calls the ExecuteBuildingBlock.bpmn
+
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+Hits ExecuteBuildingBlock.bpmn
+------------------------------
+
+.. image:: ../images/ExecuteBuildingBlock.png
+
+# 1. BBInputSetup - implemented in execute in BBInputSetup
+Here a generalbuildingblock is formed from executingbuildingblock after certain updations and validations.
+
+ a. lookupKeyMap is formed from the input , and a map is formed with serviceInstanceId, networkID, vnfID, pnfID, vfmoduleID, volumegroupID, configurationID, instancegroupID as the keys.
+
+ b. Depending on whether a la carte or macro , different flows are called. getGBBMacro is called in here.
+
+ c. In getGBBMacro , a valid customer is got with service subscription.(getCustomerAndServiceSubscription)
+
+ First a customer is got by get request on https://aai.onap:8443/aai/v19/business/customers/customer/{globalSubscriberId}
+
+ After that ServiceSubscription is got by doing a get request
+ https://aai.onap:8443/aai/v19/business/customers/customer/{globalSubscriberId}/service-subscriptions/service-subscription/service
+
+ If, the above request doesnt give any , then ServiceSubscription is fetched by first creating uri keys
+ https://aai.onap:8443/aai/v19/nodes/service-instances/service-instance/{resourceId}?format=pathed.
+ Then ServiceSubscription is got from the globalSubscriberId and the uri keys
+
+'Note': a valid customer and a corresponding ServiceSubscription must be present in the aai, for setting up the customer to gbuildingblock
+
+ d. project and owningEntity is updated from the input
+
+ e. service is got from the catalog db either by ModelVersionId or by ModelVersion and ModelInvariantId.
+
+ f. ServiceInstance is created from the above parameters, and this ServiceInstance is used in the preparation of general building block.
+
+ g. Depending on whether the current executing block name contains either of the network, or configuration, or network collection. A new instance of the corresponding type is created and is updated to the general building block (Happens in getGBBMacroNoUserParamsCreate)
+
+ h. This general building block is set to the gBuildingBlockExecution and gBBInput parameter of execution.
+
+
+# 2. StatusPolicy - implemented in validateOrchestrationStatus in OrchestrationStatusValidator. Input being gBuildingBlockExecution
+ a. orchestrationStatus is obtained after checking the resource type. We had updated the orchestrationStatus in the above step when a new service instance was created.
+ b. OrchestrationStatusStateTransitionDirective is got by doing a get call to the catlog db with the url as findOneByResourceTypeAndOrchestrationStatusAndTargetAction
+http://so-catalog-db-adapter.onap:8082/orchestrationStatusStateTransitionDirective/search/findOneByResourceTypeAndOrchestrationStatusAndTargetAction?resourceType=SERVICE&orchestrationStatus=PRECREATED&targetAction=ASSIGN
+ c. orchestrationStatusValidationResult parameter is set to execution variable from the OrchestrationStatusStateTransitionDirective.getFlowDirective() "flowDirective" : "CONTINUE"
+
+# 3. Prevalidate the gBuildingBlockExecution
+
+# 4. BB To Execute: Depending on which building block is to be executed, that particular bpmn is called .In this case, AssignServiceInstanceBB is called
+
+-------------------------------------------------------------------------------------------------------------------------
+
+Hits AssignServiceInstanceBB.bpmn
+---------------------------------
+
+.. image:: ../images/AssignServiceInstanceBB.png
+
+# 1. AAI create service subscription - implemented in createServiceSubscription of createAAITasks
+This method is used for creating and subscribing the service in A&AI
+
+ a. Customer is got from the general building block that was updated above
+
+ b. Here a serviceSubscriptionURI is formed by taking in the globalSubscriberId and the serviceType
+
+ c. If a service subscription for the particular customer doesnt exist in AAI, then a new subscription is created by taking in the serviceSubscriptionURI
+
+GET performed on uri:https://aai.onap:8443/aai/v19/business/customers/customer/slice1/service-subscriptions/service-subscription/service?
+{"results":[{"service-subscription":1}]}
+
+# 2. AAI create service instance - implemented in createServiceInstance of createAAITasks
+This method is used for creating the service instance in A&AI
+
+ a. Customer is got from the general building block that was updated above
+
+ b. A serviceInstanceURI is formed by taking in the globalSubscriberId, the serviceType and the service instance id
+
+ c. If the service instance in the particular path doesnt exist in AAI , then a new service instance is created by using the serviceInstanceURI
+
+GET to:https://aai.onap:8443/aai/v19/business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances/service-instance/2b955def-e536-40ee-84cb-3f06e3cc6d84?
+response: {"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances/service-instance/2b955def-e536-40ee-84cb-3f06e3cc6d84","Node Not Found:No Node of type service-instance found at: business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances/service-instance/2b955def-e536-40ee-84cb-3f06e3cc6d84","ERR.5.4.6114"]}}}
+
+Sending HTTP PUT to:https://aai.onap:8443/aai/v19/business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances/service-instance/2b955def-e536-40ee-84cb-3f06e3cc6d84
+with req body : {"service-instance-id":"2b955def-e536-40ee-84cb-3f06e3cc6d84","service-instance-name":"DEMO_123456","model-invariant-id":"944862ae-bb65-4429-8330-a6c9170d6672","model-version-id":"d88da85c-d9e8-4f73-b837-3a72a431622b","orchestration-status":"Inventoried"}
+
+# 3. AAI create project - implemented in createProject of createAAITasks
+This method is used for creation of the project A&AI. Here too it checks whether a project with a {projectName} exist in AAI . If not it creates one, and connects it to the service instance identified by the serviceInstanceId
+Sending HTTP PUT to:https://aai.onap:8443/aai/v19/business/projects/project/name%20of%20proj/relationship-list/relationship
+with req body: {"related-link":"/business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances/service-instance/2b955def-e536-40ee-84cb-3f06e3cc6d84"}
+
+# 4. AAI create owning entity - implemented in createOwningEntity of createAAITasks
+
+ a. OwningEntityId and OwningEntityName is extracted from the OwningEntity given in the input json
+
+ b. If both of them are null, then an exception is raised.
+
+ c. If only OwningEntityId is null, then whether the OwningEntityName is present in AAI is checked. If present then OwningEntityId is set by quering the OwningEntity from AAI. And then connect it to the service instance. If not present in the aai then a random id is generated and assigned to OwningEntityId. Then Owning entity is first created and then connected to the service instance
+
+ d. Depending on whether the owning entity is already present or not, either createOwningEntityandConnectServiceInstance is called, or connectOwningEntityandServiceInstanceis called.
+
+Sending HTTP PUT to:https://aai.onap:8443/aai/v19/business/owning-entities/owning-entity/owningEntityIdof%20owningEntity/relationship-list/relationship
+req body: {"related-link":"/business/customers/customer/slice1/service-subscriptions/service-subscription/service/service-instances/service-instance/2b955def-e536-40ee-84cb-3f06e3cc6d84"}
+
+# 5. SDNC Create Assign Request - implemented in assignServiceInstance of SDNCAssignTasks
+
+ a. Here first the requestContext, serviceInstance, customer are obtained from the general building block
+
+ b. Then a payload for the assignServiceInstance of the sdnc is formed by passing in the above parameters to the assignServiceInstance in sdncSIResources.
+
+ c. A new sdnc request is formed with the above thing as payload
+
+ d. This sdnc request is assigned to the SDNCRequest parameter of the execution variable
+
+.. code-block:: bash
+
+ {"input":{
+ "request-information" : {
+ "request-action" : "CreateServiceInstance",
+ "source" : "MSO",
+ "request-id" : "139636cd-4b69-4c3a-9e67-fed2c283baee"
+
+ },
+ "sdnc-request-header" : {
+
+ "svc-request-id" : "9bfe8cb0-bb8b-4dca-949d-2f2b51011b54",
+ "svc-action" : "assign"
+
+ },
+ "service-information" : {
+
+ "onap-model-information" : {
+ "model-name" : "GR-API-DEFAULT",
+ "model-version" : "1.0",
+ "model-uuid" : "d88da85c-d9e8-4f73-b837-3a72a431622b",
+ "model-invariant-uuid" : "944862ae-bb65-4429-8330-a6c9170d6672"
+
+ },
+ "subscription-service-type" : "service",
+ "service-id" : "2b955def-e536-40ee-84cb-3f06e3cc6d84",
+ "global-customer-id" : {global_customerid},
+ "service-instance-id" : "2b955def-e536-40ee-84cb-3f06e3cc6d84"
+
+ },
+ "service-request-input" : {
+
+ "service-input-parameters" : {
+ "param" : [ {
+ "name" : "some name",
+ "value" : "some value"
+
+ } ]
+
+ },
+ "service-instance-name" : {instance_name}
+ }
+ }}
+
+# 6. It calls another bpmn file - SDNCHandler.bpmn
+
+ a. Setup callback variables - Here mainly the correlator variable and the sdnc timeout variable is set
+
+ b. callSDNC - Here post call to sdnc client is done with the above prepared payload. And then isSDNCCompleted is set to the execution variable
+
+Both the above tasks are implemented in SDNCRequestTasks.
+http://sdnc-oam.onap:8282/restconf/operations/GENERIC-RESOURCE-API:service-topology-operation/
+
+# 7. AAI Update (svc instance)- implemented in th updateOrchestrationStatusAssignedService in AAIUpdateTasks
+ BPMN access method to update the status of Service to Assigned in AAI.
+ Here serviceInstance is obtained , then its orchestration status is changed to assigned and is updated in the AAI
+
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+Reaches back to ExecuteBuildingBlock.bpmn
+
+# 5. Post validate the generic building block
+
+# 6. Set Handling Code To Success - implemented in setHandlingStatusSuccess in ExecuteBuildingBlockRainyDay
+handling code is set to success for the execution variable
+
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+Reaches back to WorkflowActionBB.bpmn
+
+# 7. postProcessingExecuteBB
+If the building block excuted is ActivateVfModuleBB, then a postProcessingExecuteBBActivateVfModule needs to be executed
+
+Then again it is looped back to selectBB through a checkRetryStatus block.
+This block comes into play only if the handlingCode is retry, and the retry count is lesser than the maximum allowed no of retries, then the current sequence is again reduced by 1 , so that the same block is executed again.Request in the requestdb is updated with a setRetryStatusMessage, keeping an eye on the no of retries executed.
+
+
+And in this particular example ActivateServiceInstanceBB.bpmn is called next in the sequence.
+Here updateOrchestrationStatusActiveService is called, which is BPMN access method to update status of Service to Active in AAI. Here orchestrationStatus is set to active for the particular service instance and is updated in the AAI .
+
+# 8. updateRequestStatusToComplete is called if the "complete" flag is true
+ a. Here first the request is got from the requestDbclient http://request-db-adapter:8083/infraActiveRequests/requestid
+
+ b. Then a status message is formed as "Macro-" + resourceName + "-" + action + " request was executed correctly."
+
+ This status message is updated in the request as well as is set to finalStatusMessage of the execution variable
+
+ c. Other request parameters are updated
+
+ request.setEndTime(endTime);
+
+ request.setFlowStatus("Successfully completed all Building Blocks");
+
+ request.setProgress(Long.valueOf(100));
+
+ request.setRequestStatus("COMPLETE");
+
+ request.setLastModifiedBy("CamundaBPMN");
+
+ d. This new request parameters are updated by a put request to the requestDbclient
+
+
+
+
+Flow ends
+----------
+
+If there are other resources present along with the service : Eg :- Volumegroup.( These BBs wil be specifically called )
+
+1) AssignVolumeGroupBB :
+
+ a. genericvnfid and volumegroupid is obtained from the execution block.
+ b. volumegroup orchestrationstatus is set to assigned
+ c. a volume group of the above details is created in aai
+ d. connect volumegroup to this genericvnf
+ e. cloud configuration is got, and then the volumegroup is linked to tenant
+
+
+
+2) createVolumeGroupBB :
+
+ a. get the vf details according to Vf module id from sdnc.
+ b. vfmodulequeriedfromsdnc is set to the executionvariable.
+ c. createVolumeGroupRequest is formed with getCloudRegion, serviceinstance, genericVnf, volumegroup, sdncVfModuleQueryResponse.
+ d. calls vnfadapter, which in turn calls openstackadaptertask.
+ e. update heattask in the volumegroup and which is ammended in the aai.
+ f. orchestrationstatus for the volume group is set to created.
+
+
+3) ActivateVolumeGroupBB :
+
+ orchestrationstatus for the volume group is ammended to active.
+
diff --git a/docs/developer_info/Cxf_Logging.rst b/docs/developer_info/Cxf_Logging.rst
new file mode 100644
index 0000000000..ea2bbf56ce
--- /dev/null
+++ b/docs/developer_info/Cxf_Logging.rst
@@ -0,0 +1,210 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2020 Huawei Technologies Co., Ltd.
+
+CXF-logging:
+=============
+It is a logging framework from SO. Here basically we are having 2 interceptors which extends AbstractSoapInterceptor.
+
+SOAPLoggingInInterceptor:
++++++++++++++++++++++++++++
+
+* This interceptor is responsible for Capturing requestId , client ip address , invocation id, service name, instance id, entry timestamp , log timestamp, Elapsed time for each request and update the MDC logger with staus In-progress.
+
+SOAPLoggingOutInterceptor:
+++++++++++++++++++++++++++++
+* This interceptor is responsible for log timestamp , elapsed time for each request and checks for if there is any exception update the MDC loggers with 500 response code otherwise update the status as completed.
+
+
+cxf-logging Used By below components of SO:
+++++++++++++++++++++++++++++++++++++++++++++
+The cxf-logging framework is used by below components of so.
+
+mso-openstack-adapter.
+mso-requests-db-adapter.
+mso-sdnc-adapter.
+mso-infrastructure-bpmn.
+
+cxf-logging dependency for using in other components:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ <dependency>
+ <groupId>org.onap.so</groupId>
+ <artifactId>cxf-logging</artifactId>
+ <version>${project.version}</version>
+
+ </dependency>
+
+pom.xml:
++++++++++
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+
+ <groupId>org.onap.so</groupId>
+ <artifactId>so</artifactId>
+ <version>1.6.0-SNAPSHOT</version>
+
+ </parent>
+ <name>CXFLogging</name>
+ <description>Common CXF Logging Classes</description>
+ <dependencies>
+
+ <dependency>
+
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-rs-client</artifactId>
+ <version>${cxf.version}</version>
+
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-bindings-soap</artifactId>
+ <version>${cxf.version}</version>
+
+ </dependency>
+
+ <dependency>
+
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-transports-http</artifactId>
+ <version>${cxf.version}</version>
+
+ </dependency>
+
+ <dependency>
+
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+
+ </dependency>
+
+ <dependency>
+
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-ext</artifactId>
+
+ </dependency>
+
+ <dependency>
+
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+
+ </resource>
+
+ <resource>
+
+ <directory>src/main/java</directory>
+
+ <includes>
+
+ <include>*.java</include>
+
+ </includes>
+
+ </resource>
+
+ </resources>
+
+ </build>
+
+ <artifactId>cxf-logging</artifactId>
+
+</project>
+
+Configuration file:
+++++++++++++++++++++
+Here we can do configure the logger properties for the cxf-logging.
+
+<configuration>
+
+ <property name="p_tim" value="%d{&quot;yyyy-MM-dd'T'HH:mm:ss.SSSXXX&quot;, UTC}"/>
+
+ <property name="p_lvl" value="%level"/>
+
+ <property name="p_log" value="%logger"/>
+
+ <property name="p_mdc" value="%replace(%replace(%mdc){'\t','\\\\t'}){'\n', '\\\\n'}"/>
+
+ <property name="p_msg" value="%replace(%replace(%msg){'\t', '\\\\t'}){'\n','\\\\n'}"/>
+
+ <property name="p_exc" value="%replace(%replace(%rootException){'\t', '\\\\t'}){'\n','\\\\n'}"/>
+
+ <property name="p_mak" value="%replace(%replace(%marker){'\t', '\\\\t'}){'\n','\\\\n'}"/>
+
+ <property name="p_thr" value="%thread"/>
+
+ <property name="pattern" value="%nopexception${p_tim}\t${p_thr}\t${p_lvl}\t${p_log}\t${p_mdc}\t${p_msg}\t${p_exc}\t${p_mak}\t%n"/>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+
+ <encoder>
+
+ <pattern>${pattern}</pattern>
+
+ </encoder>
+
+ </appender>
+
+ <appender name="test"
+ class="org.onap.so.utils.TestAppender" />
+
+ <logger name="com.att.ecomp.audit" level="info" additivity="false">
+
+ <appender-ref ref="STDOUT" />
+
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="info" additivity="false">
+
+ <appender-ref ref="STDOUT" />
+
+ </logger>
+
+ <logger name="com.att.eelf.error" level="WARN" additivity="false">
+
+ <appender-ref ref="STDOUT" />
+
+ </logger>
+
+ <logger name="org.onap" level="${so.log.level:-DEBUG}" additivity="false">
+ <appender-ref ref="STDOUT" />
+
+ <appender-ref ref="test" />
+
+ </logger>
+
+ <logger name="org.flywaydb" level="DEBUG" additivity="false">
+ <appender-ref ref="STDOUT" />
+
+ </logger>
+
+ <logger name="ch.vorburger" level="WARN" additivity="false">
+ <appender-ref ref="STDOUT" />
+
+ </logger>
+
+ <root level="WARN">
+ <appender-ref ref="STDOUT" />
+ <appender-ref ref="test" />
+
+ </root>
+
+</configuration>
+
diff --git a/docs/developer_info/Mso_Openstack_Adapter.rst b/docs/developer_info/Mso_Openstack_Adapter.rst
new file mode 100644
index 0000000000..a8ca362537
--- /dev/null
+++ b/docs/developer_info/Mso_Openstack_Adapter.rst
@@ -0,0 +1,796 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2020 Huawei Technologies Co., Ltd.
+
+MSO-OPENSTACK-ADAPTER :
+=======================
+
+.. contents:: :depth: 3
+
+Cloud site operations
+++++++++++++++++++++++
+* Here we have 3 api's createCloudRegion, updateCloudRegion, deleteCloudRegion.
+
+1.Create Cloud site/Cloud region:
+
+Path: /v1/cloud-region
+
+Method Type: POST
+
+Request Body:
+*************
+{
+ "id": "MTN13",
+ "regionId": "mtn13",
+ "cloudVersion": "3.0",
+ "clli": "MDT13",
+ "platform": "testFlatform",
+ "orchestrator": "testOrchestrator",
+ "cloudifyId": "mtn13",
+ "cloudOwner": "testCloudOwner",
+
+ "identityService": {
+ "identityUrl": "testUrl",
+ "msoId": "admin",
+ "msoPass": "admin",
+ "projectDomainName": "testDomain",
+ "userDomainName": "testDomain",
+ "adminTenant": "test",
+ "memberRole": "test",
+ "tenantMetadata": "test",
+ "identityServerType": "test",
+ "identityAuthenticationType": "test",
+ "lastUpdatedBy": "test",
+ "created": "date",
+ "updated": "date"
+
+ },
+
+ "identityServiceId": "123",
+ "lastUpdatedBy": "test",
+ "created": "test",
+ "updated": "test",
+ "supportFabric": "true",
+ "uri": "test"
+
+}
+
+* In this api we can create cloud region and cloud site and saving in catalog db and in AAI.
+
+* This api requires cloud-region-id and cloudSite as inputs.
+
+* In createCloudRegion two steps are there.
+
+* CreateRegionInCatalogDb(cloudSite) :- here we are creating cloud region in catalogdb if it is not exists in db(cloud_sites).
+
+* CreateCloudRegionInAAI(cloudSite) :- mapping cloudSite into cloudregion , this cloudregion we are creating in AAI and create CloudRegion NetworkTechnology Relationship.
+
+2.Delete Cloud site:
+
+* Path:/v1/cloud-region/{cloud-region-id}/{cloud-owner}
+
+* Here we can delete Cloud site by cloud region id
+
+3.Update Cloud site:
+
+* Path:/v1/cloud-region/{cloud-region-id}/{cloud-owner}
+
+* Here we can update Cloud site by cloud region id
+
+Create Tenant in Cloud:
+++++++++++++++++++++++++
+
+Path: http://host:port/vnfs/rest/v1/tenants
+
+Method Type: POST
+
+Request Body:
+*************
+
+{
+"cloudSiteId": "DAN",
+"tenantName":"RAA_1",
+"failIfExists": true,
+"msoRequest": {
+"requestId": "ra1",
+"serviceInstanceId":"sa1"
+}
+}
+
+RESPONSE:
+**********
+
+{
+
+"cloudSiteId": "DAN",
+"tenantId": "128e10b9996d43a7874f19bbc4eb6749",
+"tenantCreated": true,
+"tenantRollback": {
+"tenantId": "128e10b9996d43a7874f19bbc4eb6749",
+"cloudId": "DAN", // RAA? cloudId instead of cloudSiteId
+"tenantCreated": true,
+"msoRequest": {
+"requestId": "ra1",
+"serviceInstanceId": "sa1"
+
+}
+}
+}
+
+Code Flow:
+
+* Call to MSO createTenant adapter then call to catalog db for cloud site info and from cloud site get IdentityServerType.
+* based on Cloud IdentityServerType it returns ORM or KEYSTONE Utils
+* Query for a tenant with the specified name in the given cloud. If the tenant exists, return an MsoTenant object. If not, return null.
+* Create a tenant with the specified name in the given cloud. If the tenant already exists, an Exception will be thrown. The MSO User will also be added to the "member" list of the new tenant to perform subsequent Nova/Heat commands in the tenant. If the MSO User association fails, the entire transaction will be rolled back.
+
+TaskServices
+++++++++++++++
+**1. CreateInventory**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryCreate.png
+
+Code Flow:
+
+* Get cloud site using cloud region id from catalog db.
+
+* Instantiate heat bridge client by passing required values.
+
+* Authenticate heat bridge client.
+
+* If authentication is success we are getting all stack resources(openstack servers. servers contains openstack images and flavours.)
+
+* From stack resources we are getting osServers/ compute resources.
+
+* CreatePserversAndPinterfacesIfNotPresentInAai --Transform Openstack Server object to AAI Pserver object. create pserver in AAI if it is not exist. and get openstackresource id's / ports -- transform ports to pinterface Object in AAI.
+
+* After extract osimages and os flavours from osservers.
+
+* After that transform osimages to AAI images and osflavours to AAI flavors and add to AAI.
+
+* Create Vservers in AAI and make relationships to AAI image, AAI flavor, AAI pserver, vf-module.
+
+* Add Vservers and Linterfaces to AAI--Transform port to Linterface and for that port Get Ip addresses and updateLInterfaceIps and updateLInterfaceVlan.
+
+* Finally update AAI.
+
+**2. AuditCreateStack**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryAddAudit.png
+
+Code Flow:
+
+* First we are capturing entry timestamp, MSO REQUESTID, Servicename/topic name,partnername as openstack adapter, invocation id is generating one random uuid.
+
+* After that getting auditInventory details from externalTask object
+
+* From auditInventory object we are getting cloud region,clowd owner,tenant id, heatstack name.these details we are passing to get AAIObjectAuditList.
+
+* Use cloudRegion, tenantId, heatStackName to get resources from Heat client.
+
+* To get resources we need heat client it means getting keystone url and token.
+
+* Get keystone url based on server type(keystone/keystonev3)
+
+* From resources object we are getting novaResources and resource groups and neutronPortDetails.
+
+* Create VserverSet by passing resources, novaResources, neutronPortDetails and setting up servers with ports to Set of Servers.
+
+* From resource groups we are getting Link(stackLink) from that link we are extracting resource path .if path is present we are Fetching nested Resource Stack Information.
+
+* audit all vservers,l-interfaces and sub l-interfaces. and checking in these vservers , l-interfaces and sub interfaces are existed or not in AAI.
+
+* If AAIObjectAuditList is present then we are setting audit type as create and Heat stack name to AAIObjectAuditList.
+
+* If Audit create success putting in variable to complete external task other wise sending exception.
+
+* If retrycount=1 sending error as retrycount exhausted.
+
+**3. AuditQueryStack**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryQueryAudit.png
+
+
+Code Flow:
+
+* Get AuditInventory details from external task.
+
+* Get AAIObjectAuditList from auditHeatStack by passing these parametersauditInventory.getCloudRegion(),auditInventory.getCloudOwner(), auditInventory.getTenantId(), auditInventory.getHeatStackName().
+
+* Fetching Top Level Stack Information.i.e get all the heat model resources.
+
+* From heat model resources get all OS::Nova::Servers and OS::Heat::ResourceGroups and neutronPortDetails.
+
+* Once u got all the stack info u create vserverset and add that vserverset to AAIObjectAuditList.
+
+* After add AAIObjectAuditList to requestdb if it is not exist in requestdb.
+
+* If it is success complete the external task.
+
+**4. AuditDeleteStack**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryDeleteAudit.png
+
+Code Flow:
+
+* Get AuditInventory details from external task
+
+* GetStackDataFromRequestDb usiing AuditInventory details.
+
+* Get RequestProcessingData from requestdb using auditInventory.getVfModuleId(),auditInventory.getHeatStackName(), "AuditStackData".
+
+* From RequestProcessingData get AAIObjectAuditList.
+
+* If AAIObjectAuditList is empty check vservers is exist or not in AAI and set that result as setDoesObjectExist(true/false).
+
+* Else Auditing Vservers based on vf module relationships--i.e based on genericVnfId and vfModuleName get all the vservers and create AAIObject and set setDoesObjectExist(true) and set that object to list.
+
+* After that set audit type as delete and heatstackname and check that audit create success or not.
+
+* If it is success complete the external task.
+
+**5. DeleteInventory**
+
+Flow Diagram:
+
+.. image :: ../images/DeleteInventory.png
+
+
+Code Flow:
+
+* Get CloudInformation from external task.
+
+* First get CloudSite details from catalog db by using regionid.
+
+* From CloudSite get CloudIdentity details.
+
+* Create a heatbridgeclient. and authenticate the heatbridge.
+
+* After that delete the VFmodule data using vnfid and vf moduleid.
+
+* Once delete success complete the external task.
+
+**6. StackService**
+
+Flow Diagram:
+
+.. image :: ../images/OpenstackAdapterInvoke.png
+
+
+Code Flow:
+
+* From external task getting openstackAdapterTaskRequest and adding to string(xmlRequest).
+
+* From xmlrequest we are getting requestType.
+
+1. If requestType is createVolumeGroupRequest then we are creating volume group.
+
+* Marshalling xmlRequest to CreateVolumeGroupRequest.
+
+* From CreateVolumeGroupRequest getting completeVnfVfModuleType.
+
+* After that we are creating vf module by passing required paremeters.
+
+* If request type Start with X then we are orchestrating a VNF - *NOT* a module!
+
+* RequestType start with Volume then then we are sending true as volume request.
+
+* Creating a VnfRollback object by passing required parameters.
+
+* If nestedStackId is not null we are getting nested heat stack(stack information).
+
+* If nested heat stack is not null we are getting that output and storing into nestedVolumeOutputs object.
+
+* If nestedBaseStackId is not null we are getting nestedBaseHeatStack information and setting output to nestedBaseHeatStack.
+
+* If modelCustomizationUuid is available then with that mcu we are getting VFModuleCustomization(vfmc);
+
+* If we get VFModuleCustomization then we are extracting VfModule.
+
+* If vf version is not null then we will get vnfresource by passing vnftype and vnfversion.
+
+* By here - we would have either a vf or vnfResource.
+
+* If vf module is not null we are geting vnfresource from vf and from this vnfresource we are getting minversionvnf and maxversionvnf.
+
+* If minversionvnf and maxversionvnf are not null we are checking cloudConfig is null or not, if cloudConfig is not null then we are getting cloud site intormation by passing cloud site id. once we get the cloud site details we are getting min and max cloud site versions.
+
+* By the time we get here - heatTemplateId and heatEnvtId should be populated (or null)
+
+* If it is old way we will get heatTemplate directly. else if vf module is not null then
+* If it is a volume request then we will get volumeheattemplate and volumeheatenvironment.
+* If it is not a volume request then we will get ModuleHeatTemplate and HeatEnvironment.
+
+* Once we get heat templates we are getting nestedtemplates.
+
+* Also add the files: for any get_files associated with this vnf_resource_id
+
+* Add ability to turn on adding get_files with volume requests (by property).
+
+* If it is not a volume request get heat files from vf module.
+
+* CheckRequiredParameters in MsoVnfAdapterImpl.CHECK_REQD_PARAMS.
+
+* Parse envt entries to see if reqd parameter is there (before used a simple grep
+
+* Only submit to openstack the parameters in the envt that are in the heat template
+
+* Convert what we got as inputs (Map<String, String>) to a Map<String, Object> - where the object matches the param type identified in the template This will also not copy over params that aren't identified in the template
+
+* Now simply add the outputs as we received them - no need to convert to string
+
+* Add in the volume stack outputs if applicable
+
+* Get all heat template parameters and add to list.
+
+* Check for missing parameters null or not.if no missing parameters we can proceed for next step.
+
+* Next create stack with all required values.
+
+* After creating add heat stackname to vfrollback and copy heatstack outputs to outputs value. so now vf module is created successfully.
+
+* After sending the response to create volume group.once it is created that response we are setting to VolumeGroup response object.
+
+2. If requestType is createVfModuleRequest then we are creating VfModule.
+
+* Marshalling xmlRequest to CreateVolumeGroupRequest.
+
+* From CreateVolumeGroupRequest getting completeVnfVfModuleType.
+
+* After that we are creating vf module by passing required paremeters.
+
+* If request type Start with X then we are orchestrating a VNF - *NOT* a module!
+
+* RequestType start with Volume then then we are sending true as volume request.
+
+* Creating a VnfRollback object by passing required parameters.
+
+* If nestedStackId is not null we are getting nested heat stack(stack information).
+
+* If nested heat stack is not null we are getting that output and storing into nestedVolumeOutputs object.
+
+* If nestedBaseStackId is not null we are getting nestedBaseHeatStack information and setting output to nestedBaseHeatStack.
+
+* If modelCustomizationUuid is available then with that mcu we are getting VFModuleCustomization(vfmc);
+
+* If we get VFModuleCustomization then we are extracting VfModule.
+
+* If vf version is not null then we will get vnfresource by passing vnftype and vnfversion.
+
+* By here - we would have either a vf or vnfResource.
+
+* If vf module is not null we are geting vnfresource from vf and from this vnfresource we are getting minversionvnf and maxversionvnf.
+
+* If minversionvnf and maxversionvnf are not null we are checking cloudConfig is null or not, if cloudConfig is not null then we are getting cloud site intormation by passing cloud site id. once we get the cloud site details we are getting min and max cloud site versions.
+
+* By the time we get here - heatTemplateId and heatEnvtId should be populated (or null)
+
+* If it is old way we will get heatTemplate directly. else if vf module is not null then
+
+* If it is a volume request then we will get volumeheattemplate and volumeheatenvironment.
+
+* If it is not a volume request then we will get ModuleHeatTemplate and HeatEnvironment.
+
+* Once we get heat templates we are getting nestedtemplates.
+
+* Also add the files: for any get_files associated with this vnf_resource_id
+
+* Add ability to turn on adding get_files with volume requests (by property).
+
+* If it is not a volume request get heat files from vf module.
+
+* CheckRequiredParameters in MsoVnfAdapterImpl.CHECK_REQD_PARAMS.
+
+* Parse envt entries to see if reqd parameter is there (before used a simple grep
+
+* Only submit to openstack the parameters in the envt that are in the heat template
+
+* Convert what we got as inputs (Map<String, String>) to a Map<String, Object> - where the object matches the param type identified in the template This will also not copy over params that aren't identified in the template
+
+* Now simply add the outputs as we received them - no need to convert to string
+
+* Add in the volume stack outputs if applicable
+
+* Get all heat template parameters and add to list.
+
+* Check for missing parameters null or not.if no missing parameters we can proceed for next step.
+
+* Next create stack with all required values.
+
+* After creating add heat stackname to vfrollback and copy heatstack outputs to outputs value. so now vf module is created successfully.
+
+3. If requestType is deleteVfModuleRequest then we are deleting VfModule .
+
+* Get stackinfo using msoHeatUtils by passing cloudSiteId, cloudOwner, tenantId, vnfName parameters.
+
+* After that using modelCustomizationUuid we are getting VFModuleCustomizaiton--VFModule--heattemplate.
+
+* After that we are callling msoHeatUtils.deleteStack to delete StackInfo once it deletes we are updating status as deleted using msoHeatUtils.updateResourceStatus.
+
+4. If requestType is deleteVolumeGroupRequest then we are deleting volume group.
+
+* Making DeleteVolumeGroupRequest by Unmarshalling xml request.
+
+* Getting stack information by passing stackName, cloudSiteId, tenantId.
+
+* If current stack is null then we confirm that heat status not found.
+
+* If current stack is not null then we are deleting the stack.
+
+* Once volumegroup is deleted we are setting the response to perticular response class.
+
+5. If requestType is createNetworkRequest then we are creating network.
+
+* Making CreateNetworkRequest by Unmarshalling xmlrequest.
+
+* Check request is contrailRequest or not if it is contrailRequest we are setting shared,external,routeTargets,fqdns,routeTable values else we are setting physicalNetworkName and vlans.
+
+* Now all the above required values we are passing to create network.
+
+* Build a default NetworkRollback object (if no actions performed).
+
+* Getting the cloud site by passing cloudsite id.
+
+* After we are doing a network check and Retrieve the Network Resource definition.
+
+* If modelCustomizationUuid null and networkType is not null based on networkType we are getting Network Resource.
+
+* If modelCustomizationUuid not null then based on modelCustomizationUuid we are getting NetworkResourceCustomization and from that we are getting Network Resource.
+
+* If NetworkResourceCustomization is null then based on modelCustomizationUuid we are getting CollectionNetworkResourceCustomization and from that we are getting Network Resource.
+
+* Even though Network Resource is null we are sending error Unable to get network resource with NetworkType.
+
+* From the network resource we are extracting mode and network type.
+
+* All Networks are orchestrated via HEAT or Neutron if it is other than that we are sending error.
+
+* After that we are checking network resorce min and max versions with cloud site version if version is not supported throwing error.
+
+* After that validating the network parameters that if any parameter is missing.
+
+* Once we Retrieve the Network Resource we are getting heat template and NetworkType from that.
+
+* From the heat template we are getting template and checking that template contains os3nw if it is contains making flag is true.
+
+* First, look up to see if the Network already exists (by name).For HEAT orchestration of networks, the stack name will always match the network name
+
+* If stack is already exist with the network name throw an error.
+
+* After that from stackinfo get network id and network fqdn and get outputs from Stackinfo.
+
+* After that get subnetIdMap based on one subnet_id output or multiples subnet_%aaid% outputs from Stackinfo outputs.
+
+* After that update the updateResourceStatus as exits in requestdb.
+
+* Now we are Ready to deploy the new Network and Build the common set of HEAT template parameters
+
+* Validate (and update) the input parameters against the DB definition
+
+* Shouldn't happen unless DB config is wrong, since all networks use same inputs and inputs were already validated.
+
+* If subnets are not null and template is os3template then mergesubnetsAIC3.
+
+* If subnets are not null and template is not os3template then merge subnets.
+
+* If policyFqdns are not null & os3template true then mergePolicyRefs.
+
+* After that deploy the network stack-- create stack and once stack is created save into stackinfo.
+
+* For Heat-based orchestration, the MSO-tracked network ID is the heat stack, and the neutronNetworkId is the network UUID returned in stack outputs.
+
+* After update the resource status like network created successfully.
+
+* After set response to CreateNetworkResponse object.
+
+
+6. If requestType is deleteNetworkRequest then we are deleting network.
+
+* Form a DeleteNetworkRequest by unmarshlling Xml request.
+
+* check for mandatory fields networkId, cloudSiteId, tenantId.
+
+* If it is there Retrieve the Network Resource definition.
+
+* After that get networkResource.from networkResource get heat template.
+
+* After that delete stackinfo udpate resource status as deleted.
+
+7. If requestType is updateNetworkRequest then we are updating Network.
+
+* Make UpdateNetworkRequest by unmarshalling xmlRequest.
+
+* Check the params contains key shared and external if it is contains get that shared and external keys.
+
+* Check the request is ContrailRequest or not, if it is ContrailRequest then get routeTargets , fqdns, routeTable from the actual request.
+
+* If it is not ContrailRequest then get the ProviderVlanNetwork details like physicalNetworkName and vlans.
+
+* Params to update network-req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getNetworkName(), physicalNetworkName,vlans, routeTargets, shared, external, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(), subnetIdMap, networkRollback.
+
+* Update Network adapter with Network using networkName, networkType,cloudSiteId, tenantId.
+
+* Capture execution time for metrics.
+
+* Build a default rollback object (no actions performed)
+
+* Get cloud site details from catalog db using cloud site id.
+
+* If cloud site is not present send the error message like CloudSite does not exist in MSO Configuration.
+
+* Getting the cloud site by passing cloudsite id.
+
+* After we are doing a network check and Retrieve the Network Resource definition.
+
+* If modelCustomizationUuid null and networkType is not null based on networkType we are getting Network Resource.
+
+* If modelCustomizationUuid not null then based on modelCustomizationUuid we are getting NetworkResourceCustomization and from that we are getting Network Resource.
+
+* If NetworkResourceCustomization is null then based on modelCustomizationUuid we are getting CollectionNetworkResourceCustomization and from that we are getting Network Resource.
+
+* Even though Network Resource is null we are sending error Unable to get network resource with NetworkType.
+
+* From the network resource we are extracting mode and network type.
+
+* All Networks are orchestrated via HEAT or Neutron if it is other than that we are sending error.
+
+* After that we are checking network resorce min and max versions with cloud site version if version is not supported throwing error.
+
+* After that validating the network parameters that if any parameter is missing.
+
+* Once we Retrieve the Network Resource we are getting heat template and NetworkType from that.
+
+* Use an MsoNeutronUtils for all Neutron commands
+
+* If Orchestaration mode is NEUTRON Verify that the Network exists and For Neutron-based orchestration, the networkId is the Neutron Network UUID.
+
+* Get NetworkInfo from cloud site using networkId, tenantId, cloudSiteId as params.
+
+* If NetworkInfo is null then throw the error message as Network is does not exist.
+
+* Update the network in cloud site which is in catalog db using cloudSiteId,tenantId,networkId, neutronNetworkType, physicalNetworkName, vlans as params.
+
+* Add the network ID and previously queried vlans to the rollback object.
+
+* Save previous parameters such as NetworkName,PhysicalNetwork,Vlans to the NetworkRollback.
+
+* If Orchestaration mode is HEAT then First, look up to see that the Network already exists. For Heat-based orchestration, the networkId is the network Stack ID.
+
+* Get StackInfo by querystack using cloudSiteId, CLOUD_OWNER, tenantId, networkName.
+
+* If StackInfo is null throw error as Network not found else continue the flow.
+
+* Get the previous parameters such as previousNetworkName and previousPhysicalNetwork for rollback from StackInfo.
+
+* Get the previous vlans from the heat params and Update Stack with Previous VLANS.
+
+* Now we are Ready to deploy the updated Network via Heat.
+
+* Get the HeatTemplate from NetworkResource and now we got HEAT Template from DB.
+
+* Now get the OS::ContrailV2::VirtualNetwork property from property file , if template contains os3nw set flag as true.
+
+* Build the common set of HEAT template parameters such as neutronNetworkType, networkName, physicalNetworkName, vlans, routeTargets, shared, external, os3template.
+
+* Validate and update the input parameters against the DB definition and Shouldn't happen unless DB config is wrong, since all networks use same inputs.
+
+* If subnets are not null and template is os3template then mergesubnetsAIC3.
+
+* If subnets are not null and template is not os3template then merge subnets.
+
+* If policyFqdns are not null & os3template true then mergePolicyRefs.
+
+* If routeTableFqdns are not null os3template not null then mergeRouteTableRefs using routeTableFqdns, stackParams as params.
+
+* Get outputs from StackInfo and if key is contains subnet and os3template not null then one subnet output expected else multiples subnet outputs allowed.
+
+* Reach this point if createStack is successful.Populate remaining rollback info and response parameters and save previous parameters.
+
+* Now Network successfully updated via HEAT.
+
+8. If requestType is rollbackNetworkRequest then we are doing rollbackNetwork.
+
+* Make RollbackNetworkRequest by unmarshalling xmlRequest.
+
+* Get NetworkRollback from RollbackNetworkRequest.
+
+* If pollForCompletion is null then set flag as true.
+
+* Get the elements of the VnfRollback object for easier access.
+
+* ROLLBACK Network using networkId, cloudSiteId, tenantId.
+
+* If NetworkCreated then use tenantId, CLOUD_OWNER, cloudSiteId, networkId, pollForCompletion, timeoutMinutes params to delete stack.
+
+* Once deletion is success set the response to RollbackNetworkResponse.
+
+* Once task stack service is success set the status completed for the external task.
+
+
+**7. PollService**
+
+Flow Diagram:
+
+.. image :: ../images/OpenstackAdapterPoller.png
+
+
+Code Flow:
+
+* Get openstackAdapterTaskRequest as xmlRequest from the the external task.
+
+* Get requestType from the xmlRequest.
+
+1. If request type is createVolumeGroupRequest then Execute External Task Rollback Service for Create Volume Group.
+
+* Create CreateVolumeGroupRequest by unmarshalling xmlRequest.
+
+* Use CloudSiteId, CloudOwner, TenantId,VolumeGroupName, MsoRequest ,pollStackStatus as params to delete vnf.
+
+* Call to openstack to delete vnf if it is success nothing to return if it is failure return failure exception.
+
+* Once it is success set the boolean flags pollRollbackStatus and status as true.
+
+2. If request type is createVfModuleRequest then Execute External Task Rollback Service for Create Vf Module.
+
+* Create CreateVfModuleRequest by unmarshalling xmlRequest.
+
+* Use CloudSiteId, CloudOwner, TenantId,VfModuleName, VnfId, VfModuleId, ModelCustomizationUuid,MsoRequest ,Holder as params to delete vf module.
+
+* Call to openstack to get the stack outputs.
+
+* If modelCustomizationUuid is not null then use as a param to get the VfModuleCustomization and from VfModuleCustomization get the vf module details.
+
+* Use tenantId, cloudOwner, cloudSiteId, vnfName, pollForCompletion, timeoutMinutes as params to delete the stack .once it is success update the resources.
+
+* Once it is success set the boolean flags pollRollbackStatus and status as true.
+
+3. If requestType is deleteVfModuleRequest then Execute External Task Poll Service for Delete Vf Module.
+
+* Create DeleteVfModuleRequest by unmarshalling xmlRequest.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+
+4. If requestType is deleteVolumeGroupRequest then Execute Execute External Task Poll Service for Delete Volume Group.
+
+* Create DeleteVfModuleRequest by unmarshalling xmlRequest.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+5. If requestType is deleteNetworkRequest then Execute External Task Poll Service for Delete Network.
+
+* Create DeleteVfModuleRequest by unmarshalling xmlRequest.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+6. If requestType is createNetworkRequest then get the PollRollbackStatus from the external task.
+
+* If pollRollbackStatus is true then Execute External Task Poll Service for Rollback Create Network.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+* If pollRollbackStatus is false then Execute External Task Poll Service for Create Network.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is CREATE_COMPLETE then Stack Creation completed successfully.
+
+7. If requestType is createNetworkRequest then Execute External Task Rollback Service for Create Network.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is UPDATE_COMPLETE then Stack Updation completed successfully.
+
+* Once task stack service is success set the status completed for the external task.
+
+**8. RollbackService**
+
+Flow Diagram:
+
+.. image :: ../images/OpenstackAdapterRollback.png
+
+
+Code Flow:
+
+* Get openstackAdapterTaskRequest as xmlRequest from the the external task.
+
+* Get requestType from the xmlRequest.
+
+1. If request type is createVolumeGroupRequest then Execute External Task Rollback Service for Create Volume Group.
+
+* Making DeleteVolumeGroupRequest by Unmarshalling xml request.
+
+* Getting stack information by passing stackName, cloudSiteId, tenantId.
+
+* If current stack is null then we confirm that heat status not found.
+
+* If current stack is not null then we are deleting the stack.
+
+* Once volumegroup is deleted we are setting the response to perticular response class.
+
+2. If request type is createVfModuleRequest then Execute External Task Rollback Service for Create Vf Module.
+
+* Get stackinfo using msoHeatUtils by passing cloudSiteId, cloudOwner, tenantId, vnfName parameters.
+
+* After that using modelCustomizationUuid we are getting VFModuleCustomizaiton--VFModule--heattemplate.
+
+* After that we are callling msoHeatUtils.deleteStack to delete StackInfo once it deletes we are updating status as deleted using msoHeatUtils.updateResourceStatus.
+
+* Once it is success set the boolean flags pollRollbackStatus and status as true.
+
+3. If request type is createNetworkRequest then Execute External Task Rollback Service for Create Network.
+
+* Form a DeleteNetworkRequest by unmarshlling Xml request.
+
+* Check for mandatory fields networkId, cloudSiteId, tenantId.
+
+* If it is there Retrieve the Network Resource definition.
+
+* After that get networkResource.from networkResource get heat template.
+
+* After that delete stackinfo udpate resource status as deleted.
+
+* Once task stack service is success set the status completed for the external task.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/developer_info/developer_information.rst b/docs/developer_info/developer_information.rst
index 570861345c..a060da60b0 100644
--- a/docs/developer_info/developer_information.rst
+++ b/docs/developer_info/developer_information.rst
@@ -20,5 +20,7 @@ SO Developer Information
BPMN_Subprocess_Process_Flows.rst
BPMN_Project_Deployment_Strategy.rst
BPMN-INFRA_Workflow_Understanding.rst
+ Mso_Openstack_Adapter.rst
+ Cxf_Logging.rst
instantiate/index.rst
FAQs.rst
diff --git a/docs/developer_info/mso_adapter_restinterface.rst b/docs/developer_info/mso_adapter_restinterface.rst
new file mode 100644
index 0000000000..49a9cadba4
--- /dev/null
+++ b/docs/developer_info/mso_adapter_restinterface.rst
@@ -0,0 +1,288 @@
+Mso-adapters-rest-interface
+---------------------------
+.. image:: ../images/module_structure.png
+
+It mainly contains the payload that is provided to different rest calls in SO
+
+Network
+--------
+# 1. Network contain beans( classes with multiple attributes and thier setters and getters) and their corresponding mappers which will be used by the network adapter of SO. Contrail networking is used for cloud network automation
+
+Beans
+-----
+ # a. ContrailPolicyRef : this class has following attribute
+ private ContrailPolicyRefSeq seq;
+
+ Usage: adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java- while creating network in openstack, network stack is created depending on stackParams. So if pFqdns(FQDN address object is used in order to use DNS names in firewall policies) are there in the inputrequest to createNetwork, then mergePolicyRefs method is called, where for each input pFqdns, a new ContrailPolicyRef is created and appended to a list. Then this is added as value to stackParams with policy_refsdata as key.
+
+ # b. ContrailPolicyRefSeq : Attributes are
+ private String major;
+
+ private String minor ;
+
+ Usage: adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java- As this is an attribute to the ContrailPolicyRef explained above. So when a new ContrailPolicyRef() is created in mergePolicyRefs method, correspondingly a new ContrailPolicyRefSeq should be created.
+
+ # c. ContrailSubnet – Its a subnetwork having attributes
+ private ContrailSubnetIp subnet = new ContrailSubnetIp();
+
+ private String defaultGateway;
+
+ private String subnetName;
+
+ private Boolean enableDhcp(dynamic host config);
+
+ private Boolean addrFromStart = true;
+
+ private List<ContrailSubnetPool> allocationPools = new ArrayList<>();
+
+ private ContrailSubnetHostRoutes hostRoutes = new ContrailSubnetHostRoutes();
+
+ Usage : adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java- While creating network mergeSubnetsAIC3 is called if a list of subnets are present. The subnets are mapped to ContrailSubnet using ContrailSubnetMapper, and then are added to the heat template and stackparams which are used for network creation in openstack.
+
+ # d. ContrailSubnetHostRoute : This is an attribute defined in contrailsubnet and has following attributes
+ private String prefix;
+
+ private String nextHop;
+
+ Usage : This is an attribute of ContrailSubnetHostRoutes , which is used within the contrailSubnet and thus is used in network creation and updation.
+
+ # e. ContrailSubnetHostRoutes : This class is used to store an list of ContrailSubnetHostRoute
+
+ private List<ContrailSubnetHostRoute> hostRoutes = new ArrayList<>();
+
+ Usage : attribute of contrailSubnet
+
+ # f. ContrailSubnetIp : attributes are
+ private String ipPrefix;
+
+ private String ipPrefixLen;
+
+ This class is used to store the cidr value , which is used as a interrouting table, taking as ipaddress/total no . Eg : 10.0.0.0/24 means starting ip is 10.0.0.0, and total no of ip address possible here is 256 (2^(32-24)), the last address being 10.0.0.255.
+
+ Usage : important attribute of contrailSubnet
+
+ # g. ContrailSubnetPool : attributes are starting and ending ip address of the subnet
+ private String start;
+
+ private String end;
+
+ Usage: a list of ContrailSubnetPool forms an important attribute of contrailSubnet
+
+Mappers
+-------
+
+ # a. ContrailSubnetMapper : It is used to map the inputsubnet to a contrailSubnet
+ public ContrailSubnetMapper(Subnet inputSubnet) {
+ this.inputSubnet = inputSubnet;
+
+ }
+
+ The map method within is used for the mapping. Here first a contrailSubnet is created, and depending on whether the subnet has name or id, the contrailSubnet’s name is initialized, then if it has cidr , then a contrailSubnetIp is created, and is added into it, which is then added to contrailSubnet created before. Depending on whether input has allocationpool or hostroutes, these are casted into ContrailSubnetPool and ContrailSubnetHostRoute using ContrailSubnetPoolMapper and ContrailSubnetPoolMapper respectively.
+
+ Usage: adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java :The subnets are mapped to ContrailSubnet using ContrailSubnetMapper, and then are added to the heat template and stackparams which are used for network creation
+
+ # b. ContrailSubnetPoolMapper : It is used to map the pool within the subnets to contrailSubnetPool. Used within contrailSubnetMapper. Here, the particular pool is added only if it has both the start and end ip address.
+
+ # c. ContrailSubnetHostRoute : It is used to map the host routes within the subnets to contrailSubnetHostRoute. Used within contrailSubnetMapper. Here, the particular host route is added if either of the next hop or ip prefix is defined.
+
+Network request
+---------------
+
+#2. Network request : It contains the payloads for different types of network requests
+
+ # a. ContrailNetwork :
+ private String shared = "false";
+
+ private String external = "false";
+
+ private List<RouteTarget> routeTargets;
+
+ private List<String> policyFqdns;
+
+ private List<String> routeTableFqdns;
+
+ Usage: contrailNetwork is an important attribute of CreateNetworkRequest, So is to be used where all the request to createNetwork is required.
+
+ # 1. adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tasks/orchestration/StackService.java : Here the input to createNetwork requires contrailNetwork parameter, so here it checks whether contrailNetwork is already present, if not a new is created.
+
+ # 2.bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java : Here in createNetworkRequestMapper, createNetworkRequest is formed where in buildContrailNetwork, a new contrailNetwork is created and initialized. This request is used to create a network and set the corresponding execution variable
+
+ # b. CreateNetworkError: It extends NetworkExceptionResponse. And is used when an error occurs during network creation
+
+ # c. NetworkExceptionResponse : it extends NetworkResponseCommon. Attributes are
+ private String message;
+
+ private MsoExceptionCategory category;
+
+ private Boolean rolledBack;
+
+ # d. NetworkResponseCommon: Attribute is
+ private String messageId;
+
+ # e. CreateNetworkRequest: extends NetworkRequestCommon
+ private String cloudSiteId;
+
+ private String tenantId;
+
+ private String networkId;
+
+ private String networkName;
+
+ private String networkType;
+
+ private String networkTypeVersion;
+
+ private String modelCustomizationUuid;
+
+ private String networkTechnology = "NEUTRON";
+
+ private List<Subnet> subnets;
+
+ private ProviderVlanNetwork providerVlanNetwork;
+
+ private ContrailNetwork contrailNetwork;
+
+ private Boolean failIfExists = false;
+
+ private Boolean backout = true;
+
+ private Map<String, String> networkParams = new HashMap<>();
+
+ private MsoRequest msoRequest = new MsoRequest();
+
+ private boolean contrailRequest;
+
+ Usage :
+ #1) bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIQueryTasks.java: Here in getNetworkVpnBinding, where VPN Binding data from AAI result is extracted. There in routeTargets is got, and is updated in the execution variable(“createNetworkRequest”).
+
+ #2)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterCreateTasks.java – Here in createnetwork returns a CreateNetworkRequest which is updated in execution variable(“networkAdapterRequest”)
+
+ #3)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetwork.java -
+ Here in createnetwork returns a CreateNetworkRequest which is updated in execution variable(“createNetworkRequest”)
+
+ #4) bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientImpl.java -Here createNetwork request is processed as a restclient post process with CreateNetworkRequest as input.
+
+ # f. CreateNetworkResponse : extends NetworkResponseCommon
+ private String networkId;
+
+ private String neutronNetworkId;
+
+ private String networkStackId;
+
+ private String networkFqdn;
+
+ private Boolean networkCreated;
+
+ private Map<String, String> subnetMap;
+
+ private NetworkRollback rollback = new NetworkRollback();
+
+ Usage:
+ #1)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java :here after the network is created, the l3 network is updated with those parameters which come from execution variable("createNetworkResponse")
+
+ #2)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterCreateTasks.java – depending on variable networkCreated of response, networkAdapterCreateRollback is set to true.
+
+ #3)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientImpl.java -Here createNetwork request is processed as a restclient post process with CreateNetworkRequest as input and CreateNetworkResponse as output
+
+ # g.DeleteNetworkError : extends NetworkExceptionResponse
+
+ # h. DeleteNetworkRequest:extends NetworkRequestCommon
+ private String cloudSiteId;
+
+ private String tenantId;
+
+ private String networkId;
+
+ private String networkStackId;
+
+ private String networkType;
+
+ private String modelCustomizationUuid;
+
+ private MsoRequest msoRequest = new MsoRequest();
+
+ Usage:
+ #1)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterDeleteTasks.java – deleteNetworkRequestMapper returns a DeleteNetworkRequest, which is set to the execution variable(“networkAdapterRequest”)
+
+ #2)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientImpl.java - Here deleteNetwork request is processed as a restclient delete process with DeleteNetworkRequest as input.
+
+ #3)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java – Here the deleteNetworkRequestMapper forms DeleteNetworkRequest object
+
+ Similarly others are also implemented and used
+
+.. image:: ../images/nwrest.png
+
+Sdnc request
+------------
+
+#3. Sdnc request -These are required by the mso-sdnc-adapter
+
+ # a. RequestInformation – This is an important parameter of SDNCServiceRequest. Thud is used during the conversion of SDNCServiceRequest to XMLstring.
+
+ # b. ServiceInformation – This stores the important information like serviceId, servicetype and SubscriberName. Its parameter of SDNCServiceRequest.
+
+ # c. SDNCErrorCommon – it extends SDNCResponseCommon .
+
+ Usage : adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/sdncrest/SDNCServiceRequestConnector.java – catching exception if any happens during request creation and a new SDNCErrorCommon is created.
+
+ # d. SDNCRequestCommon – SDNCServiceRequest extends SDNCRequestCommon. It has some attributes like bpNotificationUrl(Endpoint on which BPMN can receive notifications from the SDNC adapter), bpTimeout ans sdncrequestId.
+
+ # e. SDNCServiceRequest
+ Usage: adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/sdncrest/SDNCServiceRequestTask.java – Here the runRequest is happening, where we are posting this request using a restclient call with SDNCServiceRequest as input.
+
+ # f. SDNCServiceResponse and SDNCServiceError
+ Usage:adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/sdncrest/SDNCServiceRequestTask.java – Here if the above runRequest returns a 2xx response code then a corresponding SDNCServiceResponse is created and returned or else SDNCServiceError is created and returned
+
+Tenant request
+---------------
+
+#4. These provide classes to be used by the so-adapters.tenant.
+
+The operator of a cloud can present unchangeable networks to the users, or give users the option to create, delete, connect and generally manipulate networks. The latter type of networks is called “tenant networks”.
+
+Used in adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tenant/TenantAdapterRest.java
+
+The implementation and usage is similiar to the above classes
+
+.. image:: ../images/tenantrest.png
+
+VDU
+---
+
+#5. Vdu – these are used for the deployment and management of (cloud-agnostic) VDU . The abstract classes for instantiation of vdu, query vdu, delete vdu, update vdu are defined in here.
+
+These are implemented in adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/utils/MsoCloudifyUtils.java and adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
+
+Vnfrest
+-------
+
+#6. Vnfrest – These are used to manage vnfs and vgs.
+These are used in the project similiar to networkrest
+Foreg : Usage of DeleteVfModuleRequest:
+
+1)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterDeleteTasks.java – Here in deleteVfModuleRequestMapper creates a new DeleteVfModuleRequest, and is set to the execution variable(“VNFREST_REQUEST” ) and “deleteVfModuleRequest” execution variable is set true
+
+2)bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientImpl.java - Here a delete rest request is send
+
+.. image:: ../images/vnfrest.png
+
+
+OPENSTACK
+---------
+Openstack is classified into beans, exceptions, and mappers
+
+MAPPERS
+-------
+ # 1) JAXBContext: It is used to convert a object to xml(marshalling) and to convert xml to object (unmarshalling) . These marshalling and unmarshalling are overriden in the map adapters in mappers.
+
+ # 2)NetworkInfoMapper – used to Capture the data from a Neutron Network object and cast it into a networkInfo( present in beans of openstack). Here in vlan information is located depending on network.getProviderNetworkType() , and if not then the segments within the network is iterated and is checked for the same.
+ Usage: It is used in adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoNeutronUtils.java , where on createNetwork, queryNetwork and updateNetwork , the network is mapped by NetworkInfoMapper into networkInfo and returned.
+
+ # 3) StackInfoMapper – used to Capture the data from a Stack object and cast it into a stackInfo( present in beans of openstack).
+ Usage: It is used in adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils , where all createStack, queryStack, updateStack, deleteStack is done, a new instance of stackInfo is returned
+
+Exceptions
+----------
+These are set of msoexceptions provided, and would be used depending on what exception needs to be handled
+
+.. image:: ../images/msoexception.png