Merge "Remove sphinxcontrib-*diag"
@ -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
|
||||
|
@ -28,10 +28,6 @@ import datetime
|
||||
extensions = [
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.viewcode',
|
||||
'sphinxcontrib.blockdiag',
|
||||
'sphinxcontrib.actdiag',
|
||||
'sphinxcontrib.seqdiag',
|
||||
'sphinxcontrib.nwdiag',
|
||||
'sphinxcontrib.mermaid',
|
||||
'openstackdocstheme',
|
||||
]
|
||||
|
@ -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.
|
||||
|
52
specs/2023.1/add-sample-coordination/01.diag
Normal 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 = ""];
|
||||
}
|
BIN
specs/2023.1/add-sample-coordination/01.png
Normal file
After Width: | Height: | Size: 30 KiB |
@ -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
|
||||
|
16
specs/2023.1/enhance-tacker-policy/01.diag
Normal 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"];
|
||||
}
|
BIN
specs/2023.1/enhance-tacker-policy/01.png
Normal file
After Width: | Height: | Size: 24 KiB |
15
specs/2023.1/enhance-tacker-policy/02.diag
Normal 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"];
|
||||
}
|
BIN
specs/2023.1/enhance-tacker-policy/02.png
Normal file
After Width: | Height: | Size: 21 KiB |
@ -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:
|
||||
|
27
specs/2023.1/enhance_placement_process/01.diag
Normal 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'];
|
||||
}
|
BIN
specs/2023.1/enhance_placement_process/01.png
Normal file
After Width: | Height: | Size: 16 KiB |
@ -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,
|
||||
|
46
specs/2023.1/support-multi-conductors-onboarding/01.diag
Normal 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 = ""]
|
||||
|
||||
}
|
BIN
specs/2023.1/support-multi-conductors-onboarding/01.png
Normal file
After Width: | Height: | Size: 24 KiB |
46
specs/2023.1/support-multi-conductors-onboarding/02.diag
Normal 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 = ""]
|
||||
|
||||
}
|
BIN
specs/2023.1/support-multi-conductors-onboarding/02.png
Normal file
After Width: | Height: | Size: 24 KiB |
82
specs/2023.1/support-multi-conductors-onboarding/03.diag
Normal 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 = ""]
|
||||
|
||||
}
|
BIN
specs/2023.1/support-multi-conductors-onboarding/03.png
Normal file
After Width: | Height: | Size: 37 KiB |
82
specs/2023.1/support-multi-conductors-onboarding/04.diag
Normal 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 = ""]
|
||||
|
||||
}
|
BIN
specs/2023.1/support-multi-conductors-onboarding/04.png
Normal file
After Width: | Height: | Size: 38 KiB |
76
specs/2023.1/support-multi-conductors-onboarding/05.diag
Normal 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 = ""]
|
||||
|
||||
}
|
BIN
specs/2023.1/support-multi-conductors-onboarding/05.png
Normal file
After Width: | Height: | Size: 35 KiB |
@ -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
|
||||
|
27
specs/2023.1/support-tacker-db-manage-postgresql/01.diag
Normal 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"];
|
||||
}
|
BIN
specs/2023.1/support-tacker-db-manage-postgresql/01.png
Normal file
After Width: | Height: | Size: 12 KiB |
@ -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.
|
||||
|
65
specs/2023.1/support-threshold-pm-interface/01.diag
Normal 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"];
|
||||
}
|
BIN
specs/2023.1/support-threshold-pm-interface/01.png
Normal file
After Width: | Height: | Size: 55 KiB |
@ -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
|
||||
|
36
specs/2023.1/vnfm-autoheal-and-autoscale/01.diag
Normal 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"];
|
||||
}
|
BIN
specs/2023.1/vnfm-autoheal-and-autoscale/01.png
Normal file
After Width: | Height: | Size: 24 KiB |
38
specs/2023.1/vnfm-autoheal-and-autoscale/02.diag
Normal 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"];
|
||||
}
|
BIN
specs/2023.1/vnfm-autoheal-and-autoscale/02.png
Normal file
After Width: | Height: | Size: 26 KiB |
@ -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
|
||||
|
20
specs/2023.2/support-external-keymanager/01.diag
Normal 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 = ""];
|
||||
|
||||
}
|
BIN
specs/2023.2/support-external-keymanager/01.png
Normal file
After Width: | Height: | Size: 22 KiB |
22
specs/2023.2/support-external-keymanager/02.diag
Normal 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"];
|
||||
|
||||
}
|
BIN
specs/2023.2/support-external-keymanager/02.png
Normal file
After Width: | Height: | Size: 25 KiB |
@ -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
|
||||
|
8
specs/pike/mistral_vim_monitor/01.diag
Normal 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"]
|
||||
}
|
BIN
specs/pike/mistral_vim_monitor/01.png
Normal file
After Width: | Height: | Size: 11 KiB |
9
specs/pike/mistral_vim_monitor/02.diag
Normal 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"];
|
||||
}
|
BIN
specs/pike/mistral_vim_monitor/02.png
Normal file
After Width: | Height: | Size: 10 KiB |
13
specs/pike/mistral_vim_monitor/03.diag
Normal 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"];
|
||||
}
|
BIN
specs/pike/mistral_vim_monitor/03.png
Normal file
After Width: | Height: | Size: 18 KiB |
@ -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
|
||||
|
7
specs/pike/mistral_vnf_monitor_policies/01.diag
Normal 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"];
|
||||
}
|
BIN
specs/pike/mistral_vnf_monitor_policies/01.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
6
specs/pike/mistral_vnf_monitor_policies/02.diag
Normal 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" ]
|
||||
}
|
BIN
specs/pike/mistral_vnf_monitor_policies/02.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
4
specs/pike/mistral_vnf_monitor_policies/03.diag
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
seqdiag {
|
||||
conductor -> vnf_policy_monitor [label = "update action job via RPC"]
|
||||
}
|
BIN
specs/pike/mistral_vnf_monitor_policies/03.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
7
specs/pike/mistral_vnf_monitor_policies/04.diag
Normal 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"]
|
||||
}
|
BIN
specs/pike/mistral_vnf_monitor_policies/04.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
6
specs/pike/mistral_vnf_monitor_policies/05.diag
Normal 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"]
|
||||
}
|
BIN
specs/pike/mistral_vnf_monitor_policies/05.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
@ -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
|
||||
|
||||
|
@ -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".
|
||||
|
12
specs/train/vnf_package_support/01.diag
Normal 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"]
|
||||
}
|
BIN
specs/train/vnf_package_support/01.png
Normal file
After Width: | Height: | Size: 12 KiB |
@ -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:
|
||||
|
||||
|
@ -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"];
|
||||
}
|
BIN
specs/ussuri/etsi-nfv-sol-rest-api-for-VNF-deployment/01.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
@ -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"];
|
||||
}
|
BIN
specs/ussuri/etsi-nfv-sol-rest-api-for-VNF-deployment/02.png
Normal file
After Width: | Height: | Size: 59 KiB |
@ -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"];
|
||||
|
||||
}
|
BIN
specs/ussuri/etsi-nfv-sol-rest-api-for-VNF-deployment/03.png
Normal file
After Width: | Height: | Size: 28 KiB |
@ -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"];
|
||||
}
|
BIN
specs/ussuri/etsi-nfv-sol-rest-api-for-VNF-deployment/04.png
Normal file
After Width: | Height: | Size: 25 KiB |
@ -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"];
|
||||
}
|
BIN
specs/ussuri/etsi-nfv-sol-rest-api-for-VNF-deployment/05.png
Normal file
After Width: | Height: | Size: 6.1 KiB |
@ -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.
|
||||
|
@ -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;
|
||||
}
|
BIN
specs/ussuri/lcm-operation-with-lcm-operation-user-data/01.png
Normal file
After Width: | Height: | Size: 20 KiB |
@ -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
|
||||
|
40
specs/victoria/container-network-function/01.diag
Normal 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;
|
||||
}
|
BIN
specs/victoria/container-network-function/01.png
Normal file
After Width: | Height: | Size: 36 KiB |
18
specs/victoria/container-network-function/02.diag
Normal 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"];
|
||||
}
|
BIN
specs/victoria/container-network-function/02.png
Normal file
After Width: | Height: | Size: 13 KiB |
33
specs/victoria/container-network-function/03.diag
Normal 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"];
|
||||
}
|
BIN
specs/victoria/container-network-function/03.png
Normal file
After Width: | Height: | Size: 33 KiB |
@ -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"
|
||||
|
@ -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"];
|
||||
}
|
BIN
specs/victoria/enhancement_enhance-vnf-lcm-api-support/01.png
Normal file
After Width: | Height: | Size: 41 KiB |
@ -0,0 +1,5 @@
|
||||
|
||||
seqdiag {
|
||||
Client -> "tacker-server" [label = " GET /vnf_instantces/{vnfInstanceId}"];
|
||||
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
|
||||
}
|
BIN
specs/victoria/enhancement_enhance-vnf-lcm-api-support/02.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
@ -0,0 +1,5 @@
|
||||
|
||||
seqdiag {
|
||||
Client -> "tacker-server" [label = " GET /vnf_instantces"];
|
||||
Client <-- "tacker-server" [label = " Resonse 200 OK (vnfPkgId)"];
|
||||
}
|
BIN
specs/victoria/enhancement_enhance-vnf-lcm-api-support/03.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
@ -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"];
|
||||
}
|
BIN
specs/victoria/enhancement_enhance-vnf-lcm-api-support/04.png
Normal file
After Width: | Height: | Size: 45 KiB |
@ -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.
|
||||
|
27
specs/victoria/support-etsi-nfv-based-errorhandling/01.diag
Normal 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"];
|
||||
}
|
BIN
specs/victoria/support-etsi-nfv-based-errorhandling/01.png
Normal file
After Width: | Height: | Size: 24 KiB |
32
specs/victoria/support-etsi-nfv-based-errorhandling/02.diag
Normal 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"];
|
||||
}
|
BIN
specs/victoria/support-etsi-nfv-based-errorhandling/02.png
Normal file
After Width: | Height: | Size: 32 KiB |
@ -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
|
||||
|
||||
|
||||
5)Flow 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
|
||||
|
@ -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"];
|
||||
}
|
After Width: | Height: | Size: 5.9 KiB |