Merge "Remove sphinxcontrib-*diag"

This commit is contained in:
Zuul 2024-12-07 21:42:08 +00:00 committed by Gerrit Code Review
commit 5e61915ba1
394 changed files with 6478 additions and 6542 deletions

View File

@ -3,9 +3,6 @@
# process, which may cause wedges in the gate later.
sphinx>=2.0.0,!=2.1.0 # BSD
openstackdocstheme>=2.2.1 # Apache-2.0
pillow===9.5.0
pillow===11.0.0
sphinxcontrib-actdiag # BSD
sphinxcontrib-blockdiag # BSD
sphinxcontrib-nwdiag # BSD
sphinxcontrib-seqdiag # BSD
sphinxcontrib-mermaid # BSD

View File

@ -28,10 +28,6 @@ import datetime
extensions = [
'sphinx.ext.todo',
'sphinx.ext.viewcode',
'sphinxcontrib.blockdiag',
'sphinxcontrib.actdiag',
'sphinxcontrib.seqdiag',
'sphinxcontrib.nwdiag',
'sphinxcontrib.mermaid',
'openstackdocstheme',
]

View File

@ -405,59 +405,7 @@ The following diagram shows the rolling update using coordinateVNF script.
Sequence for Rolling update operation
.. seqdiag::
seqdiag {
node_width = 80;
edge_length = 100;
"Client"
"Tacker-server"
"Tacker-conductor"
"VnfLcmDriver"
"InfraDriver"
"CoordinateVNF script"
"VIM (OpenStack)"
"VNF"
"EM"
"Client" -> "Tacker-server"
[label = "1. POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/change_vnfpkg"];
"Client" <-- "Tacker-server"
[label = "Response 202 Accepted"];
"Tacker-server" ->> "Tacker-conductor"
[label = "2. ChangeCurrentVNFPackage"];
"Tacker-conductor" -> "VnfLcmDriver"
[label = "change_vnfpkg"];
"VnfLcmDriver" -> "InfraDriver"
[label = "3. change_vnfpkg_process"];
"InfraDriver" -> "VIM (OpenStack)"
[label = "4. Get stack resource to update"];
"InfraDriver" <-- "VIM (OpenStack)"
[label = ""];
"InfraDriver" -> "VIM (OpenStack)"
[label = "5. update_stack"];
"InfraDriver" <-- "VIM (OpenStack)"
[label = ""];
"InfraDriver" -> "CoordinateVNF script"
[label = "6. CoordinateVNF"];
"CoordinateVNF script" -> "VNF"
[label = "7. Coordinate resource"];
"CoordinateVNF script" <-- "VNF"
[label = ""];
"CoordinateVNF script" -> "EM"
[label = "8. Coordination request"];
"CoordinateVNF script" <-- "EM"
[label = "Coordination result"];
"InfraDriver" <-- "CoordinateVNF script"
[label = ""];
"InfraDriver" -> "InfraDriver"
[label = "9. Repeat steps 5 through 8 for each VNFC"];
"VnfLcmDriver" <-- "InfraDriver"
[label = ""];
"Tacker-conductor" <-- "VnfLcmDriver"
[label = ""];
}
.. image:: ./add-sample-coordination/01.png
#. The Client sends a ChangeCurrentVNFPackage request to the "Individual VNF instance" resource.

View File

@ -0,0 +1,52 @@
seqdiag {
node_width = 80;
edge_length = 100;
"Client"
"Tacker-server"
"Tacker-conductor"
"VnfLcmDriver"
"InfraDriver"
"CoordinateVNF script"
"VIM (OpenStack)"
"VNF"
"EM"
"Client" -> "Tacker-server"
[label = "1. POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/change_vnfpkg"];
"Client" <-- "Tacker-server"
[label = "Response 202 Accepted"];
"Tacker-server" ->> "Tacker-conductor"
[label = "2. ChangeCurrentVNFPackage"];
"Tacker-conductor" -> "VnfLcmDriver"
[label = "change_vnfpkg"];
"VnfLcmDriver" -> "InfraDriver"
[label = "3. change_vnfpkg_process"];
"InfraDriver" -> "VIM (OpenStack)"
[label = "4. Get stack resource to update"];
"InfraDriver" <-- "VIM (OpenStack)"
[label = ""];
"InfraDriver" -> "VIM (OpenStack)"
[label = "5. update_stack"];
"InfraDriver" <-- "VIM (OpenStack)"
[label = ""];
"InfraDriver" -> "CoordinateVNF script"
[label = "6. CoordinateVNF"];
"CoordinateVNF script" -> "VNF"
[label = "7. Coordinate resource"];
"CoordinateVNF script" <-- "VNF"
[label = ""];
"CoordinateVNF script" -> "EM"
[label = "8. Coordination request"];
"CoordinateVNF script" <-- "EM"
[label = "Coordination result"];
"InfraDriver" <-- "CoordinateVNF script"
[label = ""];
"InfraDriver" -> "InfraDriver"
[label = "9. Repeat steps 5 through 8 for each VNFC"];
"VnfLcmDriver" <-- "InfraDriver"
[label = ""];
"Tacker-conductor" <-- "VnfLcmDriver"
[label = ""];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -84,23 +84,7 @@ pass them to policy checker when calling.
The flow of a policy check in API process to support enhanced Tacker policy.
.. seqdiag::
seqdiag {
Client -> Keystonemiddleware [label = "request"];
Keystonemiddleware -> "API Process" [label = "1. Request with user info"];
"API Process" -> TackerDB [label = "2. Get the accessed \nresources from the TackerDB"]
"API Process" <-- TackerDB [label = "return the accessed\n resources"];
"API Process" -> "API Process" [label = "3. Get required \nresource \nattributes \nfrom accessed \nresources"];
"API Process" -> Context [label = "4. Invoke policy check function with accessed resource\n attributes"];
Context -> Context [label = "5. Convert special \nroles to user\n attributes"];
Context -> oslo.policy [label = "6. Invoke policy enforcer\n with resource attributes\n and user attributes"];
Context <-- oslo.policy;
"API Process" <-- Context;
=== 7. Operate the accessed resource. ===
Keystonemiddleware <-- "API Process" [label = "response"];
Client <-- Keystonemiddleware [label = "response"];
}
.. image:: ./enhance-tacker-policy/01.png
Step 3 is specialized and needs to be implemented by each API process by itself.
The other steps are common or already exist for all API processes to be changed:
@ -275,22 +259,7 @@ list operation.
The flow of a policy filter in API process to support enhanced Tacker policy.
.. seqdiag::
seqdiag {
Client -> Keystonemiddleware [label = "request"];
Keystonemiddleware -> "API Process" [label = "1. Request with user info"];
"API Process" -> Context [label = "2. Invoke policy check\n function without resource \nattributes"];
"API Process" <-- Context;
"API Process" -> TackerDB [label = "3. Get the accessed resources from the database"];
"API Process" <-- TackerDB [label = "return accessed resources"];
"API Process" -> Context [label = "4. Get user attributes"];
Context -> Context [label = "5. Convert special \nroles to user\n attributes"];
"API Process" <-- Context [label = "return user attributes"];
"API Process" -> "API Process" [label = "6. Filter the list\n operation results \nbased on policy\n rules"];
Keystonemiddleware <-- "API Process" [label = "7. Return the filtered\n result to user"];
Client <-- Keystonemiddleware [label = "response"];
}
.. image:: ./enhance-tacker-policy/02.png
Step 6 is specialized and needs to be implemented by each API process by itself.
The other steps are common or already exist steps for all API processes to be

View File

@ -0,0 +1,16 @@
seqdiag {
Client -> Keystonemiddleware [label = "request"];
Keystonemiddleware -> "API Process" [label = "1. Request with user info"];
"API Process" -> TackerDB [label = "2. Get the accessed \nresources from the TackerDB"]
"API Process" <-- TackerDB [label = "return the accessed\n resources"];
"API Process" -> "API Process" [label = "3. Get required \nresource \nattributes \nfrom accessed \nresources"];
"API Process" -> Context [label = "4. Invoke policy check function with accessed resource\n attributes"];
Context -> Context [label = "5. Convert special \nroles to user\n attributes"];
Context -> oslo.policy [label = "6. Invoke policy enforcer\n with resource attributes\n and user attributes"];
Context <-- oslo.policy;
"API Process" <-- Context;
=== 7. Operate the accessed resource. ===
Keystonemiddleware <-- "API Process" [label = "response"];
Client <-- Keystonemiddleware [label = "response"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,15 @@
seqdiag {
Client -> Keystonemiddleware [label = "request"];
Keystonemiddleware -> "API Process" [label = "1. Request with user info"];
"API Process" -> Context [label = "2. Invoke policy check\n function without resource \nattributes"];
"API Process" <-- Context;
"API Process" -> TackerDB [label = "3. Get the accessed resources from the database"];
"API Process" <-- TackerDB [label = "return accessed resources"];
"API Process" -> Context [label = "4. Get user attributes"];
Context -> Context [label = "5. Convert special \nroles to user\n attributes"];
"API Process" <-- Context [label = "return user attributes"];
"API Process" -> "API Process" [label = "6. Filter the list\n operation results \nbased on policy\n rules"];
Keystonemiddleware <-- "API Process" [label = "7. Return the filtered\n result to user"];
Client <-- Keystonemiddleware [label = "response"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -86,34 +86,7 @@ until there are no more candidates.
1) Flowchart of availability zone reselection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. blockdiag::
blockdiag {
orientation = portrait;
edge_layout = flowchart;
create [shape=flowchart.condition,label='stack create/update'];
start [shape=beginpoint];
lin [shape=flowchart.loopin,label='stack create/update\nin other AZ'];
recreate [shape=flowchart.condition,label='stack create/update'];
lout [shape=flowchart.loopout,label='no more AZ\ncandidates'];
failure [shape=endpoint,label='end'];
success [shape=endpoint,label='end'];
class none [shape=none];
n [class=none];
start -> create [label='NFVO AZ']
create -> lin [label=error]
lin -> recreate [label='other AZ']
recreate -> lout [label='error']
lout -> failure [label='failure'];
create -> success;
recreate -> n [dir=none]
n -> success [label='success'];
}
.. image:: ./enhance_placement_process/01.png
The procedure consists of the following steps as illustrated in above
flow:

View File

@ -0,0 +1,27 @@
blockdiag {
orientation = portrait;
edge_layout = flowchart;
create [shape=flowchart.condition,label='stack create/update'];
start [shape=beginpoint];
lin [shape=flowchart.loopin,label='stack create/update\nin other AZ'];
recreate [shape=flowchart.condition,label='stack create/update'];
lout [shape=flowchart.loopout,label='no more AZ\ncandidates'];
failure [shape=endpoint,label='end'];
success [shape=endpoint,label='end'];
class none [shape=none];
n [class=none];
start -> create [label='NFVO AZ']
create -> lin [label=error]
lin -> recreate [label='other AZ']
recreate -> lout [label='error']
lout -> failure [label='failure'];
create -> success;
recreate -> n [dir=none]
n -> success [label='success'];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -36,53 +36,7 @@ In current implementation, onboarding process are as follows.
The sequence of the process is as follows.
.. seqdiag::
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. PUT /vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Backend Storage"
[label = "3. Upload CSAR file"]
"Tacker-server" <- "Backend Storage"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "4. Send a rpc message of 'Upload VNF Package from content' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "5. Send a request to download the CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = "Download the CSAR file from Backend Storage to the local file system"]
"Tacker-conductor 1" -> "DB"
[label = "6. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}
.. image:: ./support-multi-conductors-onboarding/01.png
- when receiving the "POST /vnfpkgm/v1/vnf_packages/{vnf_package_id}
/package_content/upload_from_uri" request.
@ -106,53 +60,7 @@ The sequence of the process is as follows.
The sequence of the process is as follows.
.. seqdiag::
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. POST /vnfpkgm/v1/vnf_packages/{vnf_package_id}/package_content/upload_from_uri"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "3. Send a rpc message of 'Upload VNF Package from uri' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "4. Upload CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "5. Send a request to download the CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = "Download the CSAR file from Backend Storage to the local file system"]
"Tacker-conductor 1" -> "DB"
[label = "6. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}
.. image:: ./support-multi-conductors-onboarding/02.png
.. note:: Configurations of a backend storage are defined in
``[glance_store]`` section in ``tacker.conf``.
@ -211,89 +119,7 @@ We would change the process of onboarding as follows.
#. The Tacker-conductor that sends a message to all Tacker-conductors
updates the onboardingState to "ONBOARDED".
.. seqdiag::
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. PUT /vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Backend Storage"
[label = "3. Upload CSAR file"]
"Tacker-server" <- "Backend Storage"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "4. Send a rpc message of 'Upload VNF Package from content' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Messaging Queue"
[label = "5. sends a rpc message to download the CSAR file with fanout=True"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 2"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 2" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 2" <- "Backend Storage"
[label = ""]
"Tacker-conductor 3" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 3" <- "Backend Storage"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 2"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" <- "Messaging Queue"
[label = ""]
"Tacker-conductor 1" -> "DB"
[label = "7. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}
.. image:: ./support-multi-conductors-onboarding/03.png
- when receiving the "POST /vnfpkgm/v1/vnf_packages/{vnf_package_id}/
package_content/upload_from_uri" request.
@ -318,89 +144,7 @@ We would change the process of onboarding as follows.
#. The Tacker-conductor that sends a message to all Tacker-conductors
updates the onboardingState to "ONBOARDED".
.. seqdiag::
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. POST /vnfpkgm/v1/vnf_packages/{vnf_package_id}/package_content/upload_from_uri"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "3. Send a rpc message of 'Upload VNF Package from uri' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "4. Upload CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 1" -> "Messaging Queue"
[label = "5. sends a rpc message to download the CSAR file with fanout=True"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 2"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 2" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 2" <- "Backend Storage"
[label = ""]
"Tacker-conductor 3" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 3" <- "Backend Storage"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 2"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" <- "Messaging Queue"
[label = ""]
"Tacker-conductor 1" -> "DB"
[label = "7. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}
.. image:: ./support-multi-conductors-onboarding/04.png
.. note:: If even one of the Tacker-conductor fails to download CSAR file,
the ``onboardingState`` is not being updated to "ONBOARDED".
@ -430,83 +174,7 @@ We would change the process of deleting VNF packages as follows.
#. All Tacker-conductors that get the message delete the file from
their local file system and return a result via rpc.
.. seqdiag::
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. DELETE /vnfpkgm/v1/vnf_packages/{vnf_package_id}"];
"Tacker-server" -> "DB"
[label = "2. Update the deleted flag to 1"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "3. Send a rpc message of 'Delete VNF Package' with fanout=False"]
Client <- "Tacker-server"
[label = "response 204 No Content"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "4. Delete CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 1" -> "Messaging Queue"
[label = "5. sends a rpc message to delete the file from local file system with fanout=True"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 2"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "6. Delete the CSAR file from local file system"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 2" -> "Backend Storage"
[label = "6. Delete the CSAR file from local file system"]
"Tacker-conductor 2" <- "Backend Storage"
[label = ""]
"Tacker-conductor 3" -> "Backend Storage"
[label = "6. Delete the CSAR file from local file system"]
"Tacker-conductor 3" <- "Backend Storage"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 2"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" <- "Messaging Queue"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}
.. image:: ./support-multi-conductors-onboarding/05.png
If a Tacker-conductor is newly added to the cluster,

View File

@ -0,0 +1,46 @@
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. PUT /vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Backend Storage"
[label = "3. Upload CSAR file"]
"Tacker-server" <- "Backend Storage"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "4. Send a rpc message of 'Upload VNF Package from content' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "5. Send a request to download the CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = "Download the CSAR file from Backend Storage to the local file system"]
"Tacker-conductor 1" -> "DB"
[label = "6. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,46 @@
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. POST /vnfpkgm/v1/vnf_packages/{vnf_package_id}/package_content/upload_from_uri"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "3. Send a rpc message of 'Upload VNF Package from uri' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "4. Upload CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "5. Send a request to download the CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = "Download the CSAR file from Backend Storage to the local file system"]
"Tacker-conductor 1" -> "DB"
[label = "6. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,82 @@
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. PUT /vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Backend Storage"
[label = "3. Upload CSAR file"]
"Tacker-server" <- "Backend Storage"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "4. Send a rpc message of 'Upload VNF Package from content' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Messaging Queue"
[label = "5. sends a rpc message to download the CSAR file with fanout=True"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 2"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 2" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 2" <- "Backend Storage"
[label = ""]
"Tacker-conductor 3" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 3" <- "Backend Storage"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 2"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" <- "Messaging Queue"
[label = ""]
"Tacker-conductor 1" -> "DB"
[label = "7. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -0,0 +1,82 @@
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. POST /vnfpkgm/v1/vnf_packages/{vnf_package_id}/package_content/upload_from_uri"];
"Tacker-server" -> "DB"
[label = "2. Update onboardingState to UPLOADING"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "3. Send a rpc message of 'Upload VNF Package from uri' with fanout=False"]
Client <- "Tacker-server"
[label = "response 202 Accepted"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "4. Upload CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 1" -> "Messaging Queue"
[label = "5. sends a rpc message to download the CSAR file with fanout=True"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 2"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 2" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 2" <- "Backend Storage"
[label = ""]
"Tacker-conductor 3" -> "Backend Storage"
[label = "6. Download the CSAR file to local file system"]
"Tacker-conductor 3" <- "Backend Storage"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 2"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" <- "Messaging Queue"
[label = ""]
"Tacker-conductor 1" -> "DB"
[label = "7. Update onboardingState to ONBOARDED"]
"Tacker-conductor 1" <- "DB"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -0,0 +1,76 @@
seqdiag {
node_width = 80; edge_length = 100;
"Client" "DB" "Tacker-server" "Backend Storage" "Messaging Queue" "Tacker-conductor 1" "Tacker-conductor 2" "Tacker-conductor 3"
Client -> "Tacker-server"
[label = "1. DELETE /vnfpkgm/v1/vnf_packages/{vnf_package_id}"];
"Tacker-server" -> "DB"
[label = "2. Update the deleted flag to 1"]
"Tacker-server" <- "DB"
[label = ""]
"Tacker-server" -> "Messaging Queue"
[label = "3. Send a rpc message of 'Delete VNF Package' with fanout=False"]
Client <- "Tacker-server"
[label = "response 204 No Content"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "4. Delete CSAR file"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 1" -> "Messaging Queue"
[label = "5. sends a rpc message to delete the file from local file system with fanout=True"]
"Messaging Queue" -> "Tacker-conductor 1"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 2"
[label = ""]
"Messaging Queue" -> "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" -> "Backend Storage"
[label = "6. Delete the CSAR file from local file system"]
"Tacker-conductor 1" <- "Backend Storage"
[label = ""]
"Tacker-conductor 2" -> "Backend Storage"
[label = "6. Delete the CSAR file from local file system"]
"Tacker-conductor 2" <- "Backend Storage"
[label = ""]
"Tacker-conductor 3" -> "Backend Storage"
[label = "6. Delete the CSAR file from local file system"]
"Tacker-conductor 3" <- "Backend Storage"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 2"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 3"
[label = ""]
"Tacker-conductor 1" <- "Messaging Queue"
[label = ""]
"Messaging Queue" <- "Tacker-conductor 1"
[label = ""]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -137,34 +137,7 @@ Flow of initializing PostgreSQL as Tacker DB backend
The following sequence diagram describes initializing PostgreSQL as Tacker DB backend.
.. seqdiag::
seqdiag {
node_width = 80;
edge_length = 100;
"Client"
"Tacker"
"tacker-db-manage"
"PostgreSQL"
"Client" -> "PostgreSQL"
[label = "1. Creates Tacker DB and user"];
"Client" <-- "PostgreSQL"
[label = "Created"];
"Client" -> "Tacker"
[label = "2. Request to execute tacker-db-manage"];
"Tacker" -> "tacker-db-manage"
[label = "3. Execute tacker-db-manage"];
"tacker-db-manage" -> "PostgreSQL"
[label = "4. Update Tacker DB for PostgreSQL"];
"PostgreSQL" --> "tacker-db-manage"
[label = "Updated"];
"tacker-db-manage" --> "Tacker"
[label = ""];
"Tacker" --> "Client"
[label = "Succeeded"];
}
.. image:: ./support-tacker-db-manage-postgresql/01.png
#. The Client creates Tacker DB and user in PostgreSQL.
#. The Client requests Tacker to execute tacker-db-manage

View File

@ -0,0 +1,27 @@
seqdiag {
node_width = 80;
edge_length = 100;
"Client"
"Tacker"
"tacker-db-manage"
"PostgreSQL"
"Client" -> "PostgreSQL"
[label = "1. Creates Tacker DB and user"];
"Client" <-- "PostgreSQL"
[label = "Created"];
"Client" -> "Tacker"
[label = "2. Request to execute tacker-db-manage"];
"Tacker" -> "tacker-db-manage"
[label = "3. Execute tacker-db-manage"];
"tacker-db-manage" -> "PostgreSQL"
[label = "4. Update Tacker DB for PostgreSQL"];
"PostgreSQL" --> "tacker-db-manage"
[label = "Updated"];
"tacker-db-manage" --> "Tacker"
[label = ""];
"Tacker" --> "Client"
[label = "Succeeded"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -236,72 +236,7 @@ The following sequence diagrams describes
the Client's processing flow for Tacker to AutoScale
by PM threshold.
.. seqdiag::
seqdiag {
node_width = 90;
edge_length = 100;
"Client"
"External Monitoring Tool"
"Prometheus-Plugin"
"Tacker-server"
"Tacker-conductor"
"VnfPmDriverV2"
"Tacker DB"
"Client" -> "Tacker-server"
[label = "1. Create a threshold"];
"Tacker-server" -> "Tacker-server"
[label = "Get the callback_uri in the threshold"];
"Tacker-server" -> "Client"
[label = "Send a GET request to the callback_uri in the Client."];
"Tacker-server" <-- "Client"
[label = "Response 204 No Content"];
"Tacker-server" -> "Tacker DB"
[label = "Save the subscription to DB"];
"Tacker-server" <-- "Tacker DB"
"Tacker-server" -> "Prometheus-Plugin"
[label = "2. Set a threshold to Prometheus-Plugin"];
"Prometheus-Plugin" -> "Prometheus-Plugin"
[label = "Convert to Prometheus format"];
"Prometheus-Plugin" -> "External Monitoring Tool"
[label = "Set a threshold"];
"Prometheus-Plugin" <-- "External Monitoring Tool"
"Tacker-server" <-- "Prometheus-Plugin"
"Tacker-server" -> "Tacker DB"
[label = "Save a threshold to DB"];
"Tacker-server" <-- "Tacker DB"
"Client" <-- "Tacker-server"
[label = "Response 201 Created"];
"External Monitoring Tool" -> "Prometheus-Plugin"
[label = "3. Send event to the specified URI"];
"Prometheus-Plugin" -> "Prometheus-Plugin"
[label = "4. Check items of prometheus_plugin from cfg.CONF.tacker", note = "If prometheus_plugin is False, asynchronous task is over"];
"Prometheus-Plugin" -> "Tacker DB"
[label = "5. Find the corresponding resource from the DB"];
"Prometheus-Plugin" <-- "Tacker DB"
"Prometheus-Plugin" -> "Prometheus-Plugin"
[label = "6. Evaluate a threshold crossing condition.", note = "If it does not match, the processing ends"];
"Prometheus-Plugin" -> "Tacker DB"
[label = "Update the corresponding resource from the DB"];
"Prometheus-Plugin" <-- "Tacker DB"
"Prometheus-Plugin" -> "VnfPmDriverV2"
[label = "7. execute VnfPmDriverV2"];
"VnfPmDriverV2" -> "Client"
[label = "8. Send a Notify Threshold event request to the Client"];
"VnfPmDriverV2" <-- "Client"
[label = "Response 204 No Content"];
"Prometheus-Plugin" <-- "VnfPmDriverV2"
"Client" -> "Client"
[label = "9. Get VNFC information from the notification.", note = "If no information is returned, the processing is over"];
"Client" -> "Tacker-server"
[label = "10. Scale"];
"Tacker-server" -> "Tacker-conductor"
[label = "11. Trigger asynchronous task", note = "The same with the default scale operation"];
"Client" <-- "Tacker-server"
[label = "Response 202 Accepted"];
}
.. image:: ./support-threshold-pm-interface/01.png
#. The Client sends a request to create a threshold to the Tacker.
After Tacker receives the threshold, it will get the callback_uri in it.

View File

@ -0,0 +1,65 @@
seqdiag {
node_width = 90;
edge_length = 100;
"Client"
"External Monitoring Tool"
"Prometheus-Plugin"
"Tacker-server"
"Tacker-conductor"
"VnfPmDriverV2"
"Tacker DB"
"Client" -> "Tacker-server"
[label = "1. Create a threshold"];
"Tacker-server" -> "Tacker-server"
[label = "Get the callback_uri in the threshold"];
"Tacker-server" -> "Client"
[label = "Send a GET request to the callback_uri in the Client."];
"Tacker-server" <-- "Client"
[label = "Response 204 No Content"];
"Tacker-server" -> "Tacker DB"
[label = "Save the subscription to DB"];
"Tacker-server" <-- "Tacker DB"
"Tacker-server" -> "Prometheus-Plugin"
[label = "2. Set a threshold to Prometheus-Plugin"];
"Prometheus-Plugin" -> "Prometheus-Plugin"
[label = "Convert to Prometheus format"];
"Prometheus-Plugin" -> "External Monitoring Tool"
[label = "Set a threshold"];
"Prometheus-Plugin" <-- "External Monitoring Tool"
"Tacker-server" <-- "Prometheus-Plugin"
"Tacker-server" -> "Tacker DB"
[label = "Save a threshold to DB"];
"Tacker-server" <-- "Tacker DB"
"Client" <-- "Tacker-server"
[label = "Response 201 Created"];
"External Monitoring Tool" -> "Prometheus-Plugin"
[label = "3. Send event to the specified URI"];
"Prometheus-Plugin" -> "Prometheus-Plugin"
[label = "4. Check items of prometheus_plugin from cfg.CONF.tacker", note = "If prometheus_plugin is False, asynchronous task is over"];
"Prometheus-Plugin" -> "Tacker DB"
[label = "5. Find the corresponding resource from the DB"];
"Prometheus-Plugin" <-- "Tacker DB"
"Prometheus-Plugin" -> "Prometheus-Plugin"
[label = "6. Evaluate a threshold crossing condition.", note = "If it does not match, the processing ends"];
"Prometheus-Plugin" -> "Tacker DB"
[label = "Update the corresponding resource from the DB"];
"Prometheus-Plugin" <-- "Tacker DB"
"Prometheus-Plugin" -> "VnfPmDriverV2"
[label = "7. execute VnfPmDriverV2"];
"VnfPmDriverV2" -> "Client"
[label = "8. Send a Notify Threshold event request to the Client"];
"VnfPmDriverV2" <-- "Client"
[label = "Response 204 No Content"];
"Prometheus-Plugin" <-- "VnfPmDriverV2"
"Client" -> "Client"
[label = "9. Get VNFC information from the notification.", note = "If no information is returned, the processing is over"];
"Client" -> "Tacker-server"
[label = "10. Scale"];
"Tacker-server" -> "Tacker-conductor"
[label = "11. Trigger asynchronous task", note = "The same with the default scale operation"];
"Client" <-- "Tacker-server"
[label = "Response 202 Accepted"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -154,43 +154,7 @@ Sequence for operation
The following describes the processing flow of the Tacker after
the External Monitoring Tool sends the alert.
.. seqdiag::
seqdiag {
node_width = 150;
edge_length = 160;
"External Monitoring Tool"
"Prometheus Plugin"
"Vnflcm Controller"
"Vnflcm Driver"
"Tacker DB"
"External Monitoring Tool" -> "Prometheus Plugin"
[label = "1. POST /alert/auto_healing"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "2. Check if this API is enabled in Prometheus Plugin"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "3. Check the status of the received alert"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "4. Check if this alert is for AutoHeal"];
"Prometheus Plugin" -> "Tacker DB"
[label = "5. Find the corresponding resource from the DB"];
"Prometheus Plugin" <-- "Tacker DB"
[label = "vnf_instance"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "6. Check whether the resource has AutoHeal enabled"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "7. Check vnfc_info_id in vnf_instance"];
"Prometheus Plugin" -> "Vnflcm Controller"
[label = "8. Call the internal Heal function"];
"Vnflcm Controller" -> "Vnflcm Driver"
[label = "9. Trigger asynchronous task", note = "The same with the default Heal operation"];
"Prometheus Plugin" <-- "Vnflcm Controller"
[label = "Response 202 Accepted"];
"External Monitoring Tool" <-- "Prometheus Plugin"
[label = "Response 204 No Content"];
}
.. image:: ./vnfm-autoheal-and-autoscale/01.png
#. As an External Monitoring Tool, Prometheus monitors specified resources
through user-defined rules. When the data monitored by Prometheus matches
@ -330,45 +294,7 @@ Sequence for operation
The following describes the processing flow of
the Tacker after the External Monitoring Tool sends the alert.
.. seqdiag::
seqdiag {
node_width = 150;
edge_length = 160;
"External Monitoring Tool"
"Prometheus Plugin"
"Vnflcm Controller"
"Vnflcm Driver"
"Tacker DB"
"External Monitoring Tool" -> "Prometheus Plugin"
[label = "1. POST /alert/auto_scaling"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "2. Check if this API is enabled in Prometheus Plugin"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "3. Check the status of the received alert"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "4. Check if this alert is for AutoScale"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "5. Check that the received alert contains a valid type of Scale"];
"Prometheus Plugin" -> "Tacker DB"
[label = "6. Find the corresponding resource from the DB"];
"Prometheus Plugin" <-- "Tacker DB"
[label = "vnf_instance"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "7. Check whether the resource has AutoScale enabled"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "8. Check aspect_id in vnf_instance"];
"Prometheus Plugin" -> "Vnflcm Controller"
[label = "9. Call the internal Scale function"];
"Vnflcm Controller" -> "Vnflcm Driver"
[label = "10. Trigger asynchronous task", note = "The same with the default Scale operation"];
"Prometheus Plugin" <-- "Vnflcm Controller"
[label = "Response 202 Accepted"];
"External Monitoring Tool" <-- "Prometheus Plugin"
[label = "Response 204 No Content"];
}
.. image:: ./vnfm-autoheal-and-autoscale/02.png
#. As an External Monitoring Tool, Prometheus monitors specified resources
through user-defined rules. When the data monitored by Prometheus matches

View File

@ -0,0 +1,36 @@
seqdiag {
node_width = 150;
edge_length = 160;
"External Monitoring Tool"
"Prometheus Plugin"
"Vnflcm Controller"
"Vnflcm Driver"
"Tacker DB"
"External Monitoring Tool" -> "Prometheus Plugin"
[label = "1. POST /alert/auto_healing"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "2. Check if this API is enabled in Prometheus Plugin"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "3. Check the status of the received alert"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "4. Check if this alert is for AutoHeal"];
"Prometheus Plugin" -> "Tacker DB"
[label = "5. Find the corresponding resource from the DB"];
"Prometheus Plugin" <-- "Tacker DB"
[label = "vnf_instance"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "6. Check whether the resource has AutoHeal enabled"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "7. Check vnfc_info_id in vnf_instance"];
"Prometheus Plugin" -> "Vnflcm Controller"
[label = "8. Call the internal Heal function"];
"Vnflcm Controller" -> "Vnflcm Driver"
[label = "9. Trigger asynchronous task", note = "The same with the default Heal operation"];
"Prometheus Plugin" <-- "Vnflcm Controller"
[label = "Response 202 Accepted"];
"External Monitoring Tool" <-- "Prometheus Plugin"
[label = "Response 204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,38 @@
seqdiag {
node_width = 150;
edge_length = 160;
"External Monitoring Tool"
"Prometheus Plugin"
"Vnflcm Controller"
"Vnflcm Driver"
"Tacker DB"
"External Monitoring Tool" -> "Prometheus Plugin"
[label = "1. POST /alert/auto_scaling"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "2. Check if this API is enabled in Prometheus Plugin"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "3. Check the status of the received alert"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "4. Check if this alert is for AutoScale"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "5. Check that the received alert contains a valid type of Scale"];
"Prometheus Plugin" -> "Tacker DB"
[label = "6. Find the corresponding resource from the DB"];
"Prometheus Plugin" <-- "Tacker DB"
[label = "vnf_instance"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "7. Check whether the resource has AutoScale enabled"];
"Prometheus Plugin" -> "Prometheus Plugin"
[label = "8. Check aspect_id in vnf_instance"];
"Prometheus Plugin" -> "Vnflcm Controller"
[label = "9. Call the internal Scale function"];
"Vnflcm Controller" -> "Vnflcm Driver"
[label = "10. Trigger asynchronous task", note = "The same with the default Scale operation"];
"Prometheus Plugin" <-- "Vnflcm Controller"
[label = "Response 202 Accepted"];
"External Monitoring Tool" <-- "Prometheus Plugin"
[label = "Response 204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -125,55 +125,13 @@ of authentication credentials in VNF LCM operations under consideration.
The following is a flow of Instantiation of a VNF instance
with barbican under consideration.
.. seqdiag::
seqdiag {
Client; NFVO; tacker-server; tacker-conductor; VnfLcmDriver; TackerDB; Barbican;
Client -> "tacker-server"
[label = "POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/instantiate"];
Client <-- "tacker-server" [label = "202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trigger asynchronous task"];
NFVO <- "tacker-conductor" [label = "POST /grants"];
NFVO --> "tacker-conductor" [label = "201 Created"];
"tacker-conductor" -> "tacker-conductor" [label = "encrypt auth credentials"];
"tacker-conductor" -> "Barbican" [label = "register the encryption key"];
"tacker-conductor" <-- "Barbican" [label = "200 Successful Request"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "TackerDB" [label = "store encrypted auth credentials"];
"tacker-conductor" <-- "TackerDB" [label = ""];
}
.. image:: ./support-external-keymanager/01.png
The following is a flow of Termination of a VNF instance
with barbican.
.. seqdiag::
seqdiag {
Client; NFVO; tacker-server; tacker-conductor; VnfLcmDriver; TackerDB; Barbican;
Client -> "tacker-server"
[label = "POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/terminate"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trigger asynchronous task"];
NFVO <- "tacker-conductor" [label = "POST /grants"];
NFVO --> "tacker-conductor" [label = "201 Created"];
"tacker-conductor" -> "TackerDB" [label = "load encrypted auth credentials"];
"tacker-conductor" <-- "TackerDB" [label = ""];
"tacker-conductor" -> "Barbican" [label = "get the encryption key"];
"tacker-conductor" <-- "Barbican" [label = "200 Successful Request"];
"tacker-conductor" -> "tacker-conductor" [label = "decrypt the encrypted auth credentials"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "Barbican" [label = "delete the encryption key"];
"tacker-conductor" <-- "Barbican" [label = "204 No Content"];
}
.. image:: ./support-external-keymanager/02.png
Add configuration options

View File

@ -0,0 +1,20 @@
seqdiag {
Client; NFVO; tacker-server; tacker-conductor; VnfLcmDriver; TackerDB; Barbican;
Client -> "tacker-server"
[label = "POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/instantiate"];
Client <-- "tacker-server" [label = "202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trigger asynchronous task"];
NFVO <- "tacker-conductor" [label = "POST /grants"];
NFVO --> "tacker-conductor" [label = "201 Created"];
"tacker-conductor" -> "tacker-conductor" [label = "encrypt auth credentials"];
"tacker-conductor" -> "Barbican" [label = "register the encryption key"];
"tacker-conductor" <-- "Barbican" [label = "200 Successful Request"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "TackerDB" [label = "store encrypted auth credentials"];
"tacker-conductor" <-- "TackerDB" [label = ""];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,22 @@
seqdiag {
Client; NFVO; tacker-server; tacker-conductor; VnfLcmDriver; TackerDB; Barbican;
Client -> "tacker-server"
[label = "POST /vnflcm/v2/vnf_instances/{vnfInstanceId}/terminate"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trigger asynchronous task"];
NFVO <- "tacker-conductor" [label = "POST /grants"];
NFVO --> "tacker-conductor" [label = "201 Created"];
"tacker-conductor" -> "TackerDB" [label = "load encrypted auth credentials"];
"tacker-conductor" <-- "TackerDB" [label = ""];
"tacker-conductor" -> "Barbican" [label = "get the encryption key"];
"tacker-conductor" <-- "Barbican" [label = "200 Successful Request"];
"tacker-conductor" -> "tacker-conductor" [label = "decrypt the encrypted auth credentials"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "Barbican" [label = "delete the encryption key"];
"tacker-conductor" <-- "Barbican" [label = "204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -83,47 +83,17 @@ with the conductor via the following interface VimMonitor:
sequence diagram for register vim:
.. seqdiag::
seqdiag {
user -> nfvoplugin [label = "register_vim"];
nfvoplugin -> nfvoplugin [label = "generate workflow with auto generated action id"];
nfvoplugin -> nfvoplugin [label = "update vim with monitor action id"];
nfvoplugin -> mistral [label = "run the workflow"];
mistral_vim_monitor_action -> conductor [label = "update_vim"]
}
.. image:: ./mistral_vim_monitor/01.png
sequence diagram for de-register vim:
.. seqdiag::
seqdiag {
user -> nfvoplugin [label = "de_register_vim"];
nfvoplugin -> nfvoplugin [label = "remove monitor workflow"];
nfvoplugin -> nfvoplugin [label = "remove vim from db"];
mistral_vim_monitor_action -> conductor [label = "update_vim"];
mistral_vim_monitor_action <-- conductor [label = "replies with bad_action"];
mistral_vim_monitor_action -> mistral_vim_monitor_action [label = "exit"];
}
.. image:: ./mistral_vim_monitor/02.png
sequence diagram for update vim with auth url change:
.. seqdiag::
seqdiag {
user -> nfvoplugin [label = "update_vim"];
nfvoplugin -> nfvoplugin [label = "remove old monitor workflow"];
nfvoplugin -> nfvoplugin [label = "generate workflow with auto generated action uuid"];
nfvoplugin -> nfvoplugin [label = "update vim with monitor action uuid"];
nfvoplugin -> mistral [label = "run the workflow"];
new_mistral_vim_monitor_action -> conductor [label = "update_vim"]
new_mistral_vim_monitor_action <-- conductor
old_mistral_vim_monitor_action -> conductor [label = "update_vim"]
old_mistral_vim_monitor_action <-- conductor [label = "replies with bad_action"];
old_mistral_vim_monitor_action -> old_mistral_vim_monitor_action [label = "exit"];
}
.. image:: ./mistral_vim_monitor/03.png
Alternatives

View File

@ -0,0 +1,8 @@
seqdiag {
user -> nfvoplugin [label = "register_vim"];
nfvoplugin -> nfvoplugin [label = "generate workflow with auto generated action id"];
nfvoplugin -> nfvoplugin [label = "update vim with monitor action id"];
nfvoplugin -> mistral [label = "run the workflow"];
mistral_vim_monitor_action -> conductor [label = "update_vim"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,9 @@
seqdiag {
user -> nfvoplugin [label = "de_register_vim"];
nfvoplugin -> nfvoplugin [label = "remove monitor workflow"];
nfvoplugin -> nfvoplugin [label = "remove vim from db"];
mistral_vim_monitor_action -> conductor [label = "update_vim"];
mistral_vim_monitor_action <-- conductor [label = "replies with bad_action"];
mistral_vim_monitor_action -> mistral_vim_monitor_action [label = "exit"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,13 @@
seqdiag {
user -> nfvoplugin [label = "update_vim"];
nfvoplugin -> nfvoplugin [label = "remove old monitor workflow"];
nfvoplugin -> nfvoplugin [label = "generate workflow with auto generated action uuid"];
nfvoplugin -> nfvoplugin [label = "update vim with monitor action uuid"];
nfvoplugin -> mistral [label = "run the workflow"];
new_mistral_vim_monitor_action -> conductor [label = "update_vim"]
new_mistral_vim_monitor_action <-- conductor
old_mistral_vim_monitor_action -> conductor [label = "update_vim"]
old_mistral_vim_monitor_action <-- conductor [label = "replies with bad_action"];
old_mistral_vim_monitor_action -> old_mistral_vim_monitor_action [label = "exit"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -112,14 +112,7 @@ happened on the monitored vnf, for example the VNF was scaled, and was respawned
Sequence diagram for create VNF:
.. seqdiag::
seqdiag {
user -> vnfmplugin [label = "create_vnf with monitor_policies property"];
vnfmplugin -> vnfmplugin [label = "generate workflow with auto generated action id"];
vnfmplugin -> vnfmplugin [label = "update vnf with monitor action id"];
vnfmplugin -> mistral [label = "run the workflow to start vnf_policy_monitor"];
}
.. image:: ./mistral_vnf_monitor_policies/01.png
Monitor policy is divided into two parts: policy monitor and policy action. Policy monitor,
such as ping and http_ping is implemented as mistral task action. Policy action will
@ -128,13 +121,7 @@ be run in tacker conductor.
Each VNF with monitor policies will have a workflow generated, and will be kept as meta
information of VNF instance so that they can be managed.
.. seqdiag::
seqdiag {
=== loop according to monitor policy ===
vnf_policy_monitor -> conductor [label = "execute_policy_action"]
conductor -> policy_action [label = "execute_action" ]
}
.. image:: ./mistral_vnf_monitor_policies/02.png
The mistral workflow action will be run once the workflow is started. The action will do
its job according to monitor policy. When policy action is needed, the monitor action will
@ -146,11 +133,7 @@ such as respawn, log etc.
If the policy action needs to update the vnf_policy_monitor, it will notify vnf_policy_monitor
the change.
.. seqdiag::
seqdiag {
conductor -> vnf_policy_monitor [label = "update action job via RPC"]
}
.. image:: ./mistral_vnf_monitor_policies/03.png
If conductor finds the action is obsolete, it will return bad_action to vnf_policy_monitor,
then the vnf_policy_monitor will exit.
@ -164,25 +147,12 @@ VDUs.
Sequence diagram for deleting VNF:
.. seqdiag::
seqdiag {
user -> vnfmplugin [label = "delete_vnf with monitor_policies property"];
vnfmplugin -> vnfmplugin [label = "get workflow with action id for the VNF"];
vnfmplugin -> mistral [label = "delete workflow and its execution"];
vnfmplugin -> vnf_policy_monitor [label = "kill action job via RPC"]
}
.. image:: ./mistral_vnf_monitor_policies/04.png
Sequence diagram for scale VNF:
.. seqdiag::
seqdiag {
user -> vnfmplugin [label = "scale_vnf with monitor_policies property"];
vnfmplugin -> vnfmplugin [label = "get workflow with action id for the VNF"];
vnfmplugin -> vnf_policy_monitor [label = "update action job via RPC"]
}
.. image:: ./mistral_vnf_monitor_policies/05.png
Alternatives

View File

@ -0,0 +1,7 @@
seqdiag {
user -> vnfmplugin [label = "create_vnf with monitor_policies property"];
vnfmplugin -> vnfmplugin [label = "generate workflow with auto generated action id"];
vnfmplugin -> vnfmplugin [label = "update vnf with monitor action id"];
vnfmplugin -> mistral [label = "run the workflow to start vnf_policy_monitor"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -0,0 +1,6 @@
seqdiag {
=== loop according to monitor policy ===
vnf_policy_monitor -> conductor [label = "execute_policy_action"]
conductor -> policy_action [label = "execute_action" ]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,4 @@
seqdiag {
conductor -> vnf_policy_monitor [label = "update action job via RPC"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,7 @@
seqdiag {
user -> vnfmplugin [label = "delete_vnf with monitor_policies property"];
vnfmplugin -> vnfmplugin [label = "get workflow with action id for the VNF"];
vnfmplugin -> mistral [label = "delete workflow and its execution"];
vnfmplugin -> vnf_policy_monitor [label = "kill action job via RPC"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -0,0 +1,6 @@
seqdiag {
user -> vnfmplugin [label = "scale_vnf with monitor_policies property"];
vnfmplugin -> vnfmplugin [label = "get workflow with action id for the VNF"];
vnfmplugin -> vnf_policy_monitor [label = "update action job via RPC"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -36,7 +36,7 @@ Some notes about using this template:
* If you would like to provide a diagram with your spec, text representations
are preferred. http://asciiflow.com/ is a very nice tool to assist with
making ascii diagrams. blockdiag and mermaid are another tools.
making ascii diagrams. mermaid is another tools.
These are described below.
If you require an image (screenshot) for your BP, attaching that to the BP
and checking it in is also accepted. However, text representations are
@ -51,63 +51,6 @@ asciiflow::
| +-----+ +--------+ |
+----------+ +-----------+ +----------+
blockdiag
.. blockdiag::
blockdiag sample {
a -> b -> c;
}
actdiag
.. actdiag::
actdiag {
write -> convert -> image
lane user {
label = "User"
write [label = "Writing reST"];
image [label = "Get diagram IMAGE"];
}
lane actdiag {
convert [label = "Convert reST to Image"];
}
}
nwdiag
.. nwdiag::
nwdiag {
network dmz {
address = "210.x.x.x/24"
web01 [address = "210.x.x.1"];
web02 [address = "210.x.x.2"];
}
network internal {
address = "172.x.x.x/24";
web01 [address = "172.x.x.1"];
web02 [address = "172.x.x.2"];
db01;
db02;
}
}
seqdiag
.. seqdiag::
seqdiag {
browser -> webserver [label = "GET /index.html"];
browser <-- webserver;
browser -> webserver [label = "POST /blog/comment"];
webserver -> database [label = "INSERT comment"];
webserver <-- database;
browser <-- webserver;
}
mermaid Flowchart

View File

@ -168,19 +168,7 @@ transions of these three states.
Flow of uploading of VNF package content
----------------------------------------
.. seqdiag::
seqdiag {
Consumer -> NFVO [label = "1. PUT .../vnf_packages/{vnfPkgId} package_content (VNF Package file)"];
NFVO -> tosca-parser [label = "Parse the CSAR zip file"]
NFVO <- tosca-parser [label = "Parsed CSAR successfully"]
Consumer <- NFVO [label = "2. 202 Accepted"];
NFVO -> NFVO [label = "NFVO continues processing VNF package"]
NFVO -> NFVO [label = "Set VNF package
onboardingState=ONBOARDED,
operationalState=ENABLED and
usageState=NOT_IN_USE"]
}
.. image:: ./vnf_package_support/01.png
Precondition: The individual VNF package resource has been created with
the value of "onboardingState" attribute equals to "CREATED".

View File

@ -0,0 +1,12 @@
seqdiag {
Consumer -> NFVO [label = "1. PUT .../vnf_packages/{vnfPkgId} package_content (VNF Package file)"];
NFVO -> tosca-parser [label = "Parse the CSAR zip file"]
NFVO <- tosca-parser [label = "Parsed CSAR successfully"]
Consumer <- NFVO [label = "2. 202 Accepted"];
NFVO -> NFVO [label = "NFVO continues processing VNF package"]
NFVO -> NFVO [label = "Set VNF package
onboardingState=ONBOARDED,
operationalState=ENABLED and
usageState=NOT_IN_USE"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -57,13 +57,7 @@ The operations provided through this interface are:
1) Flow of creation of a VNF instance resource
----------------------------------------------
.. seqdiag::
seqdiag {
Consumer -> VNFM [label = "1. POST .../vnf_instances"];
VNFM -->> VNFM [label = "2. Create VNF instance resource"];
Consumer <- VNFM [label = "3. 201 Created"];
}
.. image:: ./etsi-nfv-sol-rest-api-for-VNF-deployment/01.png
The procedure consists of the following steps as illustrated in above sequence:
@ -89,42 +83,7 @@ been created in "NOT_INSTANTIATED" state.
2) Flow of Instantiation of a VNF instance
------------------------------------------
.. seqdiag::
seqdiag {
Client -> WSGIMiddleware [label = "instantiate VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver [label = "instantiate_vnf(vnf_instance,
instantiate_vnf_request)"];
VnfLcmDriver --> ToscaParser [label = "read csar"];
VnfLcmDriver <-- ToscaParser [label = "tosca object"];
VnfLcmDriver -->> VnfLcmDriver [label = "get VNFD, prepare resource request"];
VnfLcmDriver --> OpenstackDriver [label = "1. pre_instantiate_vnf(resources)"];
OpenstackDriver --> Glance [label = "createImage"]
OpenstackDriver <-- Glance [label = "image created"]
VnfLcmDriver <-- OpenstackDriver [label = " resource created"];
VnfLcmDriver --> OpenstackDriver [label = "instantiate_vnf(vnf_instance,
instantiate_vnf_request, vnfd_dict, resource_list)"];
OpenstackDriver --> HeatClient [label = "create Heat Client"];
OpenstackDriver <-- HeatClient [label = "Heat Client"];
OpenstackDriver --> TranslateTemplate [label = "convert Tosca to HOT"];
TranslateTemplate --> ToscaParser [label = "get tosca template"];
TranslateTemplate <-- ToscaParser [label = "tosca template"];
TranslateTemplate --> HeatTranslator [label = "Tosca to HOT"];
TranslateTemplate <-- HeatTranslator [label = "HOT"];
TranslateTemplate --> ToscaUtil [label = "post processing HOT using
resource info and instantiateVnf request"];
TranslateTemplate <-- ToscaUtil [label = "HOT"];
OpenstackDriver <-- TranslateTemplate [label = "HOT"];
OpenstackDriver --> Heat [label = "2. create stack"];
OpenstackDriver <-- Heat [label = "stack created"];
VnfLcmDriver <-- OpenstackDriver [label = "return stack id"];
VnfLcmDriver -->> VnfLcmDriver [label = "3 update DB"];
TackerConductor <-- VnfLcmDriver [label = "instantiation completed"];
}
.. image:: ./etsi-nfv-sol-rest-api-for-VNF-deployment/02.png
The procedure consists of the following steps as illustrated in above sequence:
@ -151,28 +110,7 @@ The procedure consists of the following steps as illustrated in above sequence:
Precondition: VNF instance in "INSTANTIATED" state.
.. seqdiag::
seqdiag {
Client -> WSGIMiddleware [label = "1. HEAL VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver [label = "heal_vnf(vnf_instance, heal_vnf_request)"];
VnfLcmDriver --> OpenstackDriver [label = "heal_vnf(vnf_instance, vim_connection_info,heal_vnf_request)"];
OpenstackDriver --> Heat [label = "2. Mark resource unhealthy"];
OpenstackDriver <-- Heat;
OpenstackDriver --> Heat [label = "3. update stack"];
OpenstackDriver <-- Heat [label = "stack updated"];
VnfLcmDriver <-- OpenstackDriver;
VnfLcmDriver --> OpenstackDriver [label = "post_heal_vnf(vnf_instance, vim_connection_info,heal_vnf_request)"];
OpenstackDriver --> Heat [label = "4. get updated resource data"];
OpenstackDriver <-- Heat [label = "resources"];
VnfLcmDriver <-- OpenstackDriver;
VnfLcmDriver -->> VnfLcmDriver [label = "5. update DB"];
TackerConductor <-- VnfLcmDriver [label = "request successfully completed"];
}
.. image:: ./etsi-nfv-sol-rest-api-for-VNF-deployment/03.png
The procedure consists of the following steps as illustrated in above sequence:
@ -188,23 +126,7 @@ Postcondition: VNF instance in "INSTANTIATED" state, and healed.
4) Flow of Termination of a VNF instance
----------------------------------------
.. seqdiag::
seqdiag {
Client -> WSGIMiddleware [label = "Terminate VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver [label = "terminate_vnf(vnf_instance, terminate_vnf_request)"];
VnfLcmDriver --> OpenstackDriver [label = "terminate_vnf(vnf_instance, terminate_vnf_request, resource_list)"];
OpenstackDriver --> Heat [label = "1. delete stack"];
OpenstackDriver <-- Heat [label = "stack deleted"];
OpenstackDriver --> Glance [label = "2. delete images"]
OpenstackDriver <-- Glance [label = "images deleted"]
VnfLcmDriver <-- OpenstackDriver [label = "resources removed"];
TackerConductor <-- VnfLcmDriver [label = "request successfully completed"];
TackerConductor -->> TackerConductor [label = "update DB"];
}
.. image:: ./etsi-nfv-sol-rest-api-for-VNF-deployment/04.png
The procedure consists of the following steps as illustrated in above sequence:
@ -220,13 +142,7 @@ Postcondition: "instantiationState" should be set to "NOT_INSTANTIATED".
Precondition: VNF instance in NOT_INSTANTIATED state.
.. seqdiag::
seqdiag {
Consumer -> VNFM [label = "1.DELETE .../vnf_instances/{vnfInstanceId}"];
VNFM -->> VNFM [label = "2. Delete VNF instance resource"];
Consumer <- VNFM [label = "3. 204 No content"];
}
.. image:: ./etsi-nfv-sol-rest-api-for-VNF-deployment/05.png
The procedure consists of the following steps as illustrated in above sequence:

View File

@ -0,0 +1,6 @@
seqdiag {
Consumer -> VNFM [label = "1. POST .../vnf_instances"];
VNFM -->> VNFM [label = "2. Create VNF instance resource"];
Consumer <- VNFM [label = "3. 201 Created"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,35 @@
seqdiag {
Client -> WSGIMiddleware [label = "instantiate VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver [label = "instantiate_vnf(vnf_instance,
instantiate_vnf_request)"];
VnfLcmDriver --> ToscaParser [label = "read csar"];
VnfLcmDriver <-- ToscaParser [label = "tosca object"];
VnfLcmDriver -->> VnfLcmDriver [label = "get VNFD, prepare resource request"];
VnfLcmDriver --> OpenstackDriver [label = "1. pre_instantiate_vnf(resources)"];
OpenstackDriver --> Glance [label = "createImage"]
OpenstackDriver <-- Glance [label = "image created"]
VnfLcmDriver <-- OpenstackDriver [label = " resource created"];
VnfLcmDriver --> OpenstackDriver [label = "instantiate_vnf(vnf_instance,
instantiate_vnf_request, vnfd_dict, resource_list)"];
OpenstackDriver --> HeatClient [label = "create Heat Client"];
OpenstackDriver <-- HeatClient [label = "Heat Client"];
OpenstackDriver --> TranslateTemplate [label = "convert Tosca to HOT"];
TranslateTemplate --> ToscaParser [label = "get tosca template"];
TranslateTemplate <-- ToscaParser [label = "tosca template"];
TranslateTemplate --> HeatTranslator [label = "Tosca to HOT"];
TranslateTemplate <-- HeatTranslator [label = "HOT"];
TranslateTemplate --> ToscaUtil [label = "post processing HOT using
resource info and instantiateVnf request"];
TranslateTemplate <-- ToscaUtil [label = "HOT"];
OpenstackDriver <-- TranslateTemplate [label = "HOT"];
OpenstackDriver --> Heat [label = "2. create stack"];
OpenstackDriver <-- Heat [label = "stack created"];
VnfLcmDriver <-- OpenstackDriver [label = "return stack id"];
VnfLcmDriver -->> VnfLcmDriver [label = "3 update DB"];
TackerConductor <-- VnfLcmDriver [label = "instantiation completed"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -0,0 +1,21 @@
seqdiag {
Client -> WSGIMiddleware [label = "1. HEAL VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver [label = "heal_vnf(vnf_instance, heal_vnf_request)"];
VnfLcmDriver --> OpenstackDriver [label = "heal_vnf(vnf_instance, vim_connection_info,heal_vnf_request)"];
OpenstackDriver --> Heat [label = "2. Mark resource unhealthy"];
OpenstackDriver <-- Heat;
OpenstackDriver --> Heat [label = "3. update stack"];
OpenstackDriver <-- Heat [label = "stack updated"];
VnfLcmDriver <-- OpenstackDriver;
VnfLcmDriver --> OpenstackDriver [label = "post_heal_vnf(vnf_instance, vim_connection_info,heal_vnf_request)"];
OpenstackDriver --> Heat [label = "4. get updated resource data"];
OpenstackDriver <-- Heat [label = "resources"];
VnfLcmDriver <-- OpenstackDriver;
VnfLcmDriver -->> VnfLcmDriver [label = "5. update DB"];
TackerConductor <-- VnfLcmDriver [label = "request successfully completed"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,16 @@
seqdiag {
Client -> WSGIMiddleware [label = "Terminate VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver [label = "terminate_vnf(vnf_instance, terminate_vnf_request)"];
VnfLcmDriver --> OpenstackDriver [label = "terminate_vnf(vnf_instance, terminate_vnf_request, resource_list)"];
OpenstackDriver --> Heat [label = "1. delete stack"];
OpenstackDriver <-- Heat [label = "stack deleted"];
OpenstackDriver --> Glance [label = "2. delete images"]
OpenstackDriver <-- Glance [label = "images deleted"]
VnfLcmDriver <-- OpenstackDriver [label = "resources removed"];
TackerConductor <-- VnfLcmDriver [label = "request successfully completed"];
TackerConductor -->> TackerConductor [label = "update DB"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,6 @@
seqdiag {
Consumer -> VNFM [label = "1.DELETE .../vnf_instances/{vnfInstanceId}"];
VNFM -->> VNFM [label = "2. Delete VNF instance resource"];
Consumer <- VNFM [label = "3. 204 No content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -55,23 +55,7 @@ Instantiation procedure with LCM operation user data
As an example, VNF instantiation procedure using LCM operation user data is
described below.
.. seqdiag::
seqdiag {
Client -> VNFMplugin [label = "Request InstantiateVNF"];
VNFMplugin -> VNFMplugin [label = "Decide instantiation method"];
VNFMplugin -> NFVOplugin [label = "Get VNF package"];
VNFMplugin <<- NFVOplugin [label = "VNFD, baseHOT,
LCM operation user data"];
VNFMplugin -> Glance [label = "Create image"];
VNFMplugin <<- Glance [label = "ImageId"];
VNFMplugin -> LCMOperationUserData [label = "Call LCM operation user data"];
VNFMplugin <<- LCMOperationUserData [label = "key-value parameters"];
VNFMplugin -> Heat [label = "Create stack with key-value
parameters and baseHOT"];
VNFMplugin <<- Heat;
Client <<- VNFMplugin;
}
.. image:: ./lcm-operation-with-lcm-operation-user-data/01.png
Instantiating VNF, as illustrated in above sequence diagram, consists of
following steps.

View File

@ -0,0 +1,16 @@
seqdiag {
Client -> VNFMplugin [label = "Request InstantiateVNF"];
VNFMplugin -> VNFMplugin [label = "Decide instantiation method"];
VNFMplugin -> NFVOplugin [label = "Get VNF package"];
VNFMplugin <<- NFVOplugin [label = "VNFD, baseHOT,
LCM operation user data"];
VNFMplugin -> Glance [label = "Create image"];
VNFMplugin <<- Glance [label = "ImageId"];
VNFMplugin -> LCMOperationUserData [label = "Call LCM operation user data"];
VNFMplugin <<- LCMOperationUserData [label = "key-value parameters"];
VNFMplugin -> Heat [label = "Create stack with key-value
parameters and baseHOT"];
VNFMplugin <<- Heat;
Client <<- VNFMplugin;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -293,47 +293,7 @@ dependency.
Following sequence diagram describes the components involved and the flow of
CNF instantiation:
.. seqdiag::
seqdiag {
node_width = 100;
edge_length = 115;
Client -> WSGIMiddleware [label =
"POST /vnflcm/v1/vnf_instances"];
Client <-- WSGIMiddleware [label = "200 Success"];
Client -> WSGIMiddleware [label =
"POST /vnflcm/v1/vnf_instances/{id}/instantiate"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
NFVOPlugin;
WSGIMiddleware -> VnfLcmDriver [label = "Trigger asynchronous task "];
VnfLcmDriver --> NFVOPlugin [label = "get VNF Package"];
VnfLcmDriver <-- NFVOPlugin;
VnfLcmDriver -->> VnfLcmDriver [label = "create VIM connection object"];
VnfLcmDriver -> KubernetesDriver [label = "pre_instantiation_vnf()"];
KubernetesDriver -->> KubernetesDriver [label = "No Action"];
VnfLcmDriver <-- KubernetesDriver;
VnfLcmDriver --> KubernetesDriver [label =
"instantiate_vnf()"];
KubernetesDriver --> KubernetesDriver [label = "1 create()"]
VnfLcmDriver <-- KubernetesDriver [label = "instance_id"];
VnfLcmDriver --> KubernetesDriver [label ="create_wait()"];
KubernetesDriver -> KubernetesPythonClient [label =
"check deployment status"];
KubernetesPythonClient -> Kubernetes [label = "get deployment status"];
KubernetesPythonClient <-- Kubernetes [label = "status"];
KubernetesDriver <-- KubernetesPythonClient;
VnfLcmDriver <-- KubernetesDriver;
VnfLcmDriver -> KubernetesDriver [label = "post_vnf_instantiation()"];
KubernetesDriver -->> KubernetesDriver[label =
"2. Update DB for VNFC resources[TBD]"];
VnfLcmDriver <-- KubernetesDriver;
}
.. image:: ./container-network-function/01.png
#. ``create()`` method will get instantiation request and VNF package path as
@ -354,25 +314,7 @@ CNF instantiation:
Following sequence diagram shows operation of ``create()`` method in
Kubernetes infra driver:
.. seqdiag::
seqdiag {
node_width = 100;
edge_length = 115;
KubernetesDriver --> KubernetesUtil [label =
"1. cnf_to_kube_objects(\ncnf_def_dict)"];
KubernetesDriver <-- KubernetesUtil [label =
"Kubernetes model\nobjects"];
KubernetesDriver --> KubernetesPythonClient [label =
"2. call client APIs for each\nmodel object"];
KubernetesPythonClient --> Kubernetes [label =
"deploy kubernetes\nobjects"];
KubernetesPythonClient <-- Kubernetes [label = "deployed objects info"];
KubernetesDriver <-- KubernetesPythonClient [label =
"3. deployed objects info"];
KubernetesDriver -->> KubernetesDriver [label = "prepare\ninstance id"];
}
.. image:: ./container-network-function/02.png
#. Definitions extracted from Kubernetes object YAML files will be translated
into Kubernetes model objects [#kubernetes-model-objects]_. KubernetesUtils
@ -429,40 +371,7 @@ CNF termination
---------------
Following sequence diagram shows flow of termination of CNF.
.. seqdiag::
seqdiag {
node_width = 100;
edge_length = 115;
Client -> WSGIMiddleware [label = "Terminate VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver
[label = "terminate_vnf(vnf_instance, terminate_vnf_request)"];
VnfLcmDriver --> KubernetesDriver
[label = "delete(context, instance_id, access_info)"];
KubernetesDriver -->> KubernetesDriver
[label = "get deployment infromation"];
KubernetesDriver --> KubernetesPythonClient [label = "delete deployment"];
KubernetesPythonClient --> Kubernetes [label = "delete deployment"];
KubernetesPythonClient <-- Kubernetes [label = "deployment deleted"];
KubernetesDriver <-- KubernetesPythonClient;
VnfLcmDriver <-- KubernetesDriver;
VnfLcmDriver --> KubernetesDriver
[label = "delete_wait(context, instance_id, access_info)"];
KubernetesDriver --> KubernetesPythonClient
[label = "get deployment status"];
KubernetesPythonClient --> Kubernetes [label = "get deployment status"];
KubernetesPythonClient <-- Kubernetes [label = "deployment status"];
KubernetesDriver <-- KubernetesPythonClient
[label = "deployment status(deleted)"];
VnfLcmDriver <-- KubernetesDriver [label = "resources removed"];
TackerConductor <-- VnfLcmDriver
[label = "request successfully completed"];
TackerConductor -->> TackerConductor [label = "update DB"];
}
.. image:: ./container-network-function/03.png
Current implementation of Kubernetes driver handles limited objects such as
Service, Deployment, HorizontalPodAutoscaler etc. Since this spec introduces

View File

@ -0,0 +1,40 @@
seqdiag {
node_width = 100;
edge_length = 115;
Client -> WSGIMiddleware [label =
"POST /vnflcm/v1/vnf_instances"];
Client <-- WSGIMiddleware [label = "200 Success"];
Client -> WSGIMiddleware [label =
"POST /vnflcm/v1/vnf_instances/{id}/instantiate"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
NFVOPlugin;
WSGIMiddleware -> VnfLcmDriver [label = "Trigger asynchronous task "];
VnfLcmDriver --> NFVOPlugin [label = "get VNF Package"];
VnfLcmDriver <-- NFVOPlugin;
VnfLcmDriver -->> VnfLcmDriver [label = "create VIM connection object"];
VnfLcmDriver -> KubernetesDriver [label = "pre_instantiation_vnf()"];
KubernetesDriver -->> KubernetesDriver [label = "No Action"];
VnfLcmDriver <-- KubernetesDriver;
VnfLcmDriver --> KubernetesDriver [label =
"instantiate_vnf()"];
KubernetesDriver --> KubernetesDriver [label = "1 create()"]
VnfLcmDriver <-- KubernetesDriver [label = "instance_id"];
VnfLcmDriver --> KubernetesDriver [label ="create_wait()"];
KubernetesDriver -> KubernetesPythonClient [label =
"check deployment status"];
KubernetesPythonClient -> Kubernetes [label = "get deployment status"];
KubernetesPythonClient <-- Kubernetes [label = "status"];
KubernetesDriver <-- KubernetesPythonClient;
VnfLcmDriver <-- KubernetesDriver;
VnfLcmDriver -> KubernetesDriver [label = "post_vnf_instantiation()"];
KubernetesDriver -->> KubernetesDriver[label =
"2. Update DB for VNFC resources[TBD]"];
VnfLcmDriver <-- KubernetesDriver;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,18 @@
seqdiag {
node_width = 100;
edge_length = 115;
KubernetesDriver --> KubernetesUtil [label =
"1. cnf_to_kube_objects(\ncnf_def_dict)"];
KubernetesDriver <-- KubernetesUtil [label =
"Kubernetes model\nobjects"];
KubernetesDriver --> KubernetesPythonClient [label =
"2. call client APIs for each\nmodel object"];
KubernetesPythonClient --> Kubernetes [label =
"deploy kubernetes\nobjects"];
KubernetesPythonClient <-- Kubernetes [label = "deployed objects info"];
KubernetesDriver <-- KubernetesPythonClient [label =
"3. deployed objects info"];
KubernetesDriver -->> KubernetesDriver [label = "prepare\ninstance id"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,33 @@
seqdiag {
node_width = 100;
edge_length = 115;
Client -> WSGIMiddleware [label = "Terminate VNF"];
WSGIMiddleware -->> WSGIMiddleware [label = "request validation"];
Client <-- WSGIMiddleware [label = "202 Accepted"];
WSGIMiddleware -> TackerConductor [label = "Trigger asynchronous task"];
TackerConductor --> VnfLcmDriver
[label = "terminate_vnf(vnf_instance, terminate_vnf_request)"];
VnfLcmDriver --> KubernetesDriver
[label = "delete(context, instance_id, access_info)"];
KubernetesDriver -->> KubernetesDriver
[label = "get deployment infromation"];
KubernetesDriver --> KubernetesPythonClient [label = "delete deployment"];
KubernetesPythonClient --> Kubernetes [label = "delete deployment"];
KubernetesPythonClient <-- Kubernetes [label = "deployment deleted"];
KubernetesDriver <-- KubernetesPythonClient;
VnfLcmDriver <-- KubernetesDriver;
VnfLcmDriver --> KubernetesDriver
[label = "delete_wait(context, instance_id, access_info)"];
KubernetesDriver --> KubernetesPythonClient
[label = "get deployment status"];
KubernetesPythonClient --> Kubernetes [label = "get deployment status"];
KubernetesPythonClient <-- Kubernetes [label = "deployment status"];
KubernetesDriver <-- KubernetesPythonClient
[label = "deployment status(deleted)"];
VnfLcmDriver <-- KubernetesDriver [label = "resources removed"];
TackerConductor <-- VnfLcmDriver
[label = "request successfully completed"];
TackerConductor -->> TackerConductor [label = "update DB"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -44,56 +44,7 @@ For backward compatibility, VNFM supports following features:
1-1) Flow of Create VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client; NFVO; tacker-server; tacker-conductor;
Client -> "tacker-server" [label = "POST /vnf_instances/"];
"tacker-server" ->> "tacker-server"
[label = "Create VNF instance resource"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package list process{filter}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package vnfd process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label =
"GET /vnf_packages/{vnfPkgId}/vnfd
with 'Accept' header contains 'text/plain'"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VNFD contents"];
"tacker-server" <<- "tacker-conductor" [label = "(VNFD)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VNFD)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package artifact process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with artifact file"];
"tacker-server" <<- "tacker-conductor" [label = "(artifact file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
Client <- "tacker-server" [label = " Resonse 201 Created(vnfPkgId)"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}
.. image:: ./enhancement_enhance-vnf-lcm-api-support/01.png
VNFM sends a GET request filtered by "vnfdId" to NFVO in order to query
@ -113,86 +64,21 @@ in the payload body.
1-2) Flow of Query VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_instantces/{vnfInstanceId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
}
.. image:: ./enhancement_enhance-vnf-lcm-api-support/02.png
VNFM returns a "200 OK" response that includes "vnfPkgId" in the payload body.
1-3) Flow of List VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_instantces"];
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
}
.. image:: ./enhancement_enhance-vnf-lcm-api-support/03.png
VNFM returns a "200 OK" response that includes "vnfPkgId" in the payload body.
1-4) Flow of Modify VNF Request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. seqdiag::
seqdiag {
Client; NFVO; tacker-server; tacker-conductor;
Client -> "tacker-server"
[label = "PATCH /vnf_instances/{vnfInstanceId} (vnfPkgId)"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "execute Individual vnf_package process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo , vnfPkgId)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package vnfd process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label =
"GET /vnf_packages/{vnfPkgId}/vnfd
with 'Accept' header contains 'text/plain'"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VNFD contents"];
"tacker-server" <<- "tacker-conductor" [label = "(VNFD)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VNFD)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package artifact process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with artifact file"];
"tacker-server" <<- "tacker-conductor" [label = "(artifact file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (PROCESSING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" ->> "tacker-conductor" [label = "VNF Modification"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
.. image:: ./enhancement_enhance-vnf-lcm-api-support/04.png
Client sends a modify VNF Information request which includes "vnfPkgId"

View File

@ -0,0 +1,49 @@
seqdiag {
Client; NFVO; tacker-server; tacker-conductor;
Client -> "tacker-server" [label = "POST /vnf_instances/"];
"tacker-server" ->> "tacker-server"
[label = "Create VNF instance resource"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package list process{filter}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package vnfd process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label =
"GET /vnf_packages/{vnfPkgId}/vnfd
with 'Accept' header contains 'text/plain'"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VNFD contents"];
"tacker-server" <<- "tacker-conductor" [label = "(VNFD)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VNFD)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package artifact process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with artifact file"];
"tacker-server" <<- "tacker-conductor" [label = "(artifact file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
Client <- "tacker-server" [label = " Resonse 201 Created(vnfPkgId)"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,5 @@
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_instantces/{vnfInstanceId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -0,0 +1,5 @@
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_instantces"];
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -0,0 +1,55 @@
seqdiag {
Client; NFVO; tacker-server; tacker-conductor;
Client -> "tacker-server"
[label = "PATCH /vnf_instances/{vnfInstanceId} (vnfPkgId)"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "execute Individual vnf_package process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo , vnfPkgId)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package vnfd process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label =
"GET /vnf_packages/{vnfPkgId}/vnfd
with 'Accept' header contains 'text/plain'"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with VNFD contents"];
"tacker-server" <<- "tacker-conductor" [label = "(VNFD)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VNFD)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package artifact process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}"];
NFVO --> "tacker-conductor" [label = "Response 200 OK with artifact file"];
"tacker-server" <<- "tacker-conductor" [label = "(artifact file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (PROCESSING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" ->> "tacker-conductor" [label = "VNF Modification"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -78,72 +78,13 @@ operation normally while it is terminated.
When the rollback operation is executed during VNF instantiation, VNFM
removes all VMs and resources.
.. seqdiag::
seqdiag {
node_width = 105;
edge_length = 130;
Client -> "tacker-server"
[label = "POST /vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLING_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"VnfLcmDriver" -> "openstackDriver" [label = "execute openstackDriver"];
"openstackDriver" -> "heat" [label = "delete stack"];
"openstackDriver" <-- "heat" [label = ""];
"VnfLcmDriver" <-- "openstackDriver" [label = ""];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLED_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
.. image:: ./support-etsi-nfv-based-errorhandling/01.png
When the rollback operation is executed for Scale-out, VNFM deletes all VMs
and resources specified in the middle of Scale-out operation.
.. seqdiag::
seqdiag {
node_width = 72;
edge_length = 100;
Client -> "tacker-server"
[label = "POST /vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLING_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" -> "MgmtDriver" [label = "execute MgmtDriver"];
"MgmtDriver" -> vnf [label = "VNF Configuration"];
"MgmtDriver" <-- vnf [label = ""];
"tacker-conductor" <-- "MgmtDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"VnfLcmDriver" -> "openstackDriver" [label = "execute openstackDriver"];
"openstackDriver" -> "heat" [label = "resourse signal"];
"openstackDriver" -> "heat" [label = "update stack"];
"openstackDriver" <-- "heat" [label = ""];
"VnfLcmDriver" <-- "openstackDriver" [label = ""];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLED_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
.. image:: ./support-etsi-nfv-based-errorhandling/02.png
User needs to separately implement Rollback sub-operation by VNF Configuration.

View File

@ -0,0 +1,27 @@
seqdiag {
node_width = 105;
edge_length = 130;
Client -> "tacker-server"
[label = "POST /vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLING_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"VnfLcmDriver" -> "openstackDriver" [label = "execute openstackDriver"];
"openstackDriver" -> "heat" [label = "delete stack"];
"openstackDriver" <-- "heat" [label = ""];
"VnfLcmDriver" <-- "openstackDriver" [label = ""];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLED_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,32 @@
seqdiag {
node_width = 72;
edge_length = 100;
Client -> "tacker-server"
[label = "POST /vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLING_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" -> "MgmtDriver" [label = "execute MgmtDriver"];
"MgmtDriver" -> vnf [label = "VNF Configuration"];
"MgmtDriver" <-- vnf [label = ""];
"tacker-conductor" <-- "MgmtDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"VnfLcmDriver" -> "openstackDriver" [label = "execute openstackDriver"];
"openstackDriver" -> "heat" [label = "resourse signal"];
"openstackDriver" -> "heat" [label = "update stack"];
"openstackDriver" <-- "heat" [label = ""];
"VnfLcmDriver" <-- "openstackDriver" [label = ""];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLED_BACK)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -49,45 +49,21 @@ The operation provided through the interfaces are:
* Register subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " POST /subscriptions"];
"tacker-server" -> "tacker-server"
[label = " generate subscription_id (uuid)"];
Client <-- "tacker-server" [label = " Resonse 201 Created"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/01.png
* Delete subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server"
[label = " DELETE /subscriptions/{subscriptionId}"];
Client <-- "tacker-server" [label = " Resonse 204 No Content"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/02.png
* Show subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /subscriptions/{subscriptionId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/03.png
* List subscription
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /subscriptions"];
"tacker-server" -> "tacker-server" [label = "request validation"];
Client <-- "tacker-server" [label = " Resonse 200 OK"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/04.png
* VNFM holds the Callback URL sent by consumer via "Subscription API"
@ -126,90 +102,17 @@ related to VNF lifecycle management.
* Heal VNF
* Terminate VNF
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "LCM Operation Request"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (STARTING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
NFVO <- "tacker-conductor" [label = "POST /grants"];
NFVO --> "tacker-conductor" [label = "201 Created"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (PROCESSING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute MgmtDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/05.png
* Modify VNF
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "LCM Operation Request"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (PROCESSING)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute MgmtDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (COMPLETED)"];
Client --> "tacker-conductor" [label = "Response: 204 No Content"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/06.png
* Rollback
.. seqdiag::
seqdiag {
node_width = 100;
edge_length = 160;
Client -> "tacker-server"
[label = "POST /vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback"];
Client <-- "tacker-server" [label = "Response 202 Accepted"];
"tacker-server" -> "tacker-conductor"
[label = "trriger asynchronous task"];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLING_BACK)"];
Client --> "tacker-conductor"
[label = "Response: 204 No Content"];
"tacker-conductor" -> "MgmtDriver" [label = "execute MgmtDriver"];
"tacker-conductor" <-- "MgmtDriver" [label = ""];
"tacker-conductor" -> "VnfLcmDriver" [label = "execute VnfLcmDriver"];
"tacker-conductor" <-- "VnfLcmDriver" [label = ""];
"tacker-conductor" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor"
[label = "POST {callback URI} (ROLLED_BACK)"];
Client --> "tacker-conductor"
[label = "Response: 204 No Content"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/07.png
4) Flow of VNF instance resource with notification
@ -217,53 +120,12 @@ related to VNF lifecycle management.
* CereateVNFRequest
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "POST /vnf_instances/"];
"tacker-server" ->> "tacker-server"
[label = "Create VNF instance resource"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package list process{filter}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/ with attribute filter(vnfdId)"];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VnfPkgInfo"];
"tacker-server" <<- "tacker-conductor" [label = "(VnfPkgInfo)"];
"tacker-server" ->> "tacker-server"
[label = "Update VNF instance resource(VnfPkgInfo)"];
"tacker-server" -> "tacker-conductor"
[label = "execute vnf_package content process{vnfPkgId}"];
NFVO <- "tacker-conductor"
[label = "GET /vnf_packages/{vnfPkgId}/package_content "];
NFVO --> "tacker-conductor"
[label = "Response 200 OK with VNF package file"];
"tacker-server" <<- "tacker-conductor"
[label = "(VNF package content file)"];
"tacker-server" ->> "tacker-server"
[label = "Store received package file"];
Client <-- "tacker-server" [label = " Resonse 201 Created"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/08.png
* DeleteVNFRequest
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = "DELETE /vnf_instances/{vnfInstanceId} "];
"tacker-server" ->> "tacker-server"
[label = "Delete VNF instance resource"];
Client <-- "tacker-server" [label = " Resonse 204 No Content"];
"tacker-server" ->> "tacker-conductor"
[label = "execute notification process"];
Client <- "tacker-conductor" [label = "POST {callback URI}"];
Client --> "tacker-conductor" [label = "Responce 204 No Content"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/09.png
5Flow of Getting Operation Status
@ -271,12 +133,7 @@ related to VNF lifecycle management.
Operation status can be obtained from VNFM.
.. seqdiag::
seqdiag {
Client -> "tacker-server" [label = " GET /vnf_lcm_op_occs/{vnfLcmOpOccId}"];
Client <-- "tacker-server" [label = " Resonse 200 OK"];
}
.. image:: ./support-notification-api-based-on-etsi-nfv-sol/10.png
* The transmission source node specifies the vnfLcmOpOccId issued at the time

View File

@ -0,0 +1,7 @@
seqdiag {
Client -> "tacker-server" [label = " POST /subscriptions"];
"tacker-server" -> "tacker-server"
[label = " generate subscription_id (uuid)"];
Client <-- "tacker-server" [label = " Resonse 201 Created"];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Some files were not shown because too many files have changed in this diff Show More