Docs: Add API docs from swagger json file; Add user guide document
[pti/o2.git] / docs / user-guide.rst
diff --git a/docs/user-guide.rst b/docs/user-guide.rst
new file mode 100644 (file)
index 0000000..9a11012
--- /dev/null
@@ -0,0 +1,211 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. Copyright (C) 2021 Wind River Systems, Inc.
+
+O-Cloud O2 Service User Guide
+=============================
+
+This guide will introduce the process that make O2 interface work with
+SMO.
+
+-  Assume you have an O-Cloud O2 environment
+
+-  Discover O-Cloud inventory
+
+   -  O-Cloud auto discovery
+
+      After you installed the O-Cloud service, it will automatically
+      discover the INF through the parameters that you give from the
+      “*o2service-override.yaml*”
+
+      Below command can get the O-Cloud information
+
+      .. code:: shell
+
+         curl -X 'GET' \
+           'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/' \
+           -H 'accept: application/json'
+
+   -  Resource pool
+
+      One O-Cloud have one resource pool, all the resources that belong
+      to this O-Cloud will be organized into this resource pool
+
+      Get the resource pool information through this interface
+
+      .. code:: shell
+
+         curl -X 'GET' \
+           'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/resourcePools' \
+           -H 'accept: application/json'
+
+   -  Resource type
+
+      Resource type defined what type is the specified resource, like a
+      physical machine, memory, or CPU
+
+      Show all resource type
+
+      .. code:: shell
+
+         curl -X 'GET' \
+           'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/resourceTypes' \
+           -H 'accept: application/json'
+
+   -  Resource
+
+      Get the list of all resources, the value of *resourcePoolId* from
+      the result of resource pool interface
+
+      .. code:: shell
+
+         curl -X 'GET' \
+           "http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/resourcePools/${resourcePoolId}/resources" \
+           -H 'accept: application/json'
+
+      Get detail of one resource
+
+      .. code:: shell
+
+         curl -X 'GET' \
+           "http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/resourcePools/${resourcePoolId}/resources/${resourceId}" \
+           -H 'accept: application/json'
+
+   -  Deployment manager services endpoint
+
+      The Deployment Manager Service (DMS) that related to this IMS
+      information you can use below API to check
+
+      .. code:: shell
+
+         curl -X 'GET' \
+           'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/deploymentManagers' \
+           -H 'accept: application/json'
+
+-  Subscribe to the O-Cloud resource change notification
+
+   Assume you have a SMO, and the SMO have an API can be receive
+   callback request
+
+   -  Create subscription in O-Cloud IMS
+
+      .. code:: bash
+
+         curl -X 'POST' \
+           'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/subscriptions' \
+           -H 'accept: application/json' \
+           -H 'Content-Type: application/json' \
+           -d '{
+           "callback": "http://SMO/address/to/callback",
+           "consumerSubscriptionId": "<ConsumerIdHelpSmoToIdentify>",
+           "filter": "<ResourceTypeNameSplitByComma,EmptyToGetAll>"
+         }'
+
+   -  Handle resource change notification
+
+      When the SMO callback API get the notification that the resource
+      of O-Cloud changing, use the URL to get the latest resource
+      information to update its database
+
+-  Orchestrate CNF in helm chart
+
+   On this sample, we prepare a firewall chart to test the
+   orchestration.
+
+   We need to do some preparation to make the helm repo work and include
+   our firewall chart inside of the repository.
+
+      Get the DMS Id in the O-Cloud, and set it into bash environment
+
+      .. code:: bash
+
+         curl --location --request GET 'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/deploymentManagers'
+
+         export dmsId=`curl --location --request GET 'http://<OAM IP>:30205/o2ims_infrastructureInventory/v1/deploymentManagers' 2>/dev/null | jq .[].deploymentManagerId | xargs echo`
+
+      Using helm to deploy a chartmuseum to the INF
+
+      .. code:: bash
+
+         helm pull chartmuseum/chartmuseum # download chartmuseum-3.4.0.tgz to local
+         tar zxvf chartmuseum-3.4.0.tgz
+         cat <<EOF>chartmuseum-override.yaml
+         env:
+          open:
+            DISABLE_API: false
+         service:
+          type: NodePort
+          nodePort: 30330
+         EOF
+
+         helm install chartmuseumrepo chartmuseum/chartmuseum -f chartmuseum-override.yaml
+         kubectl get pods
+         Kubectl get services
+
+      Update the helm repo and add the chartmusem into the repository
+
+      .. code:: bash
+
+         helm repo add o2imsrepo http://${NODE_IP}:30330
+         helm repo update
+
+      Download the firewall chart and push it into the repository
+
+      .. code:: bash
+
+         git clone https://github.com/biny993/firewall-host-netdevice.git
+         tar -zcvf firewall-host-netdevice-1.0.0.tgz firewall-host-netdevice/
+         helm push firewall-host-netdevice-1.0.0.tgz o2imsrepo
+         helm repo update
+         helm search repo firewall
+
+   -  Create NfDeploymentDescriptor
+
+      .. code:: bash
+
+         curl --location --request POST "http://<OAM IP>:30205/o2dms/${dmsId}/O2dms_DeploymentLifecycle/NfDeploymentDescriptor" \
+         --header 'Content-Type: application/json' \
+         --data-raw '{
+           "name": "cfwdesc1",
+           "description": "demo nf deployment descriptor",
+           "artifactRepoUrl": "http://${NODE_IP}:30330",
+           "artifactName": "firewall-host-netdevice",
+           "inputParams": 
+           "{\n  \"image\": {\n    \"repository\": \"ubuntu\",\n    \"tag\": 18.04,\n    \"pullPolicy\": \"IfNotPresent\"\n  },\n  \"resources\": {\n    \"cpu\": 2,\n    \"memory\": \"2Gi\",\n    \"hugepage\": \"256Mi\",\n    \"unprotectedNetPortVpg\": \"veth11\",\n    \"unprotectedNetPortVfw\": \"veth12\",\n    \"unprotectedNetCidr\": \"10.10.1.0/24\",\n    \"unprotectedNetGwIp\": \"10.10.1.1\",\n    \"protectedNetPortVfw\": \"veth21\",\n    \"protectedNetPortVsn\": \"veth22\",\n    \"protectedNetCidr\": \"10.10.2.0/24\",\n    \"protectedNetGwIp\": \"10.10.2.1\",\n    \"vfwPrivateIp0\": \"10.10.1.1\",\n    \"vfwPrivateIp1\": \"10.10.2.1\",\n    \"vpgPrivateIp0\": \"10.10.1.2\",\n    \"vsnPrivateIp0\": \"10.10.2.2\"\n  }\n}",
+           "outputParams": "{\"output1\": 100}"
+         }'
+
+         curl --location --request GET "http://<OAM IP>:30205/o2dms/${dmsId}/O2dms_DeploymentLifecycle/NfDeploymentDescriptor"
+
+   -  Create NfDeployment
+
+      When you have an descriptor of deployment, you can create a
+      NfDeployment, it will trigger an event inside of the IMS/DMS, and
+      use the K8S API to create a real pod of the firewall sample
+
+      .. code:: bash
+
+         curl --location --request POST "http://<OAM IP>:30205/o2dms/${dmsId}/O2dms_DeploymentLifecycle/NfDeployment" \
+         --header 'Content-Type: application/json' \
+         --data-raw '{
+           "name": "cfw100",
+           "description": "demo nf deployment",
+           "descriptorId": "<Descriptor ID>",
+           "parentDeploymentId": ""
+         }'
+
+         curl --location --request GET "http://<OAM IP>:30205/o2dms/${dmsId}/O2dms_DeploymentLifecycle/NfDeployment"
+
+   -  Check pods of the firewall sample
+
+      .. code:: bash
+
+         kubectl get pods
+
+   -  Delete the deployment we just created
+
+      .. code:: shell
+
+         export NfDeploymentId=`curl --location --request GET 'http://<OAM IP>:30205/o2dms/${dmsId}/O2dms_DeploymentLifecycle/NfDeployment' 2>/dev/null | jq .[].id | xargs echo`
+
+         curl --location --request DELETE "http://<OAM IP>:30205/o2dms/${dmsId}/O2dms_DeploymentLifecycle/NfDeployment/${NfDeploymentId}"