blob: 633ffe369670ae2754dc3a98daec6813b2023db5 [file] [log] [blame]
Lukasz Rajewski4ebe1e72018-11-30 08:40:48 +01001.. contents::
2 :depth: 3
3..
4
5vFW Traffic Distribution Use Case
6---------------------------------
7Description
8~~~~~~~~~~~
9
10The purpose of this work was to create new LCM API in APPC – DistributeTraffic. The APPC/SDN-C client is requesting a change to traffic distribution (redistribution) done by a traffic balancing/distribution entity (aka anchor point) or mechanism. This action targets the traffic balancing/distribution entity, in some cases DNS, other cases a load balancer external to the VNF instance, as examples. Traffic distribution (weight) changes intended to take a VNF instance out of service are completed only when all in-flight traffic/transactions have been completed. To complete the traffic redistribution process, gracefully taking a VNF instance out-of-service,without dropping in-flight calls or sessions, QuiesceTraffic command may need to follow traffic distribution changes (assigning weight 0 or very low weight to VNF instance). The VNF application remains in an active state.
11
12Traffic Distribution functionality is an outcome of Change Management project. Further details can be found on project's page
13
14https://wiki.onap.org/display/DW/Change+Management+Extensions
15
16Test Scenario
17~~~~~~~~~~~~~
18
19.. figure:: files/figure1.png
20 :scale: 40 %
21 :align: center
22
23 Figure 1 The idea of DistributeTraffic LCM Use Case
24
25The idea of the scenario is shown on Figure 1. In a result of the DistributeTraffic LCM action traffic flow originated from vPKG to vFW 1 and vSINK 1 is redirected to vFW 2 and vSINK 2. Result of the change can be observed also on the vSINKs' dashboards which show a current incoming traffic. Observation of the dashboard from vSINK 1 and vSINK 2 proves that API works properly.
26
27.. figure:: files/figure2.png
28 :scale: 50 %
29 :align: center
30
31 Figure 2 The result of traffic distribution
32
33In order to setup the scenario and to test the DistributeTraffic LCM API in action you need to perform the following steps:
34
351. Create an instance of vFWDT (vPKG , 2 x vFW, 2 x vSINK) – dedicated for the DistributeTraffic LCM API tests
36
37#. Upload Ansible playbook to Ansible Server
38
39#. Setup Ansible Server to work with vPKG VM
40
41#. Create configuration file for DistributeTraffic LCM in Ansible Server
42
43#. Configure VNF in APPC CDT tool
44
45#. Invoke REST API via APIDOC explorer, CDT Test tool or DMaaP
46
47You need to have an access to the following containers:
48
49- APPC MariaDB container – setup Ansible adapter for VNF
50
51- APPC Ansible Server container – setyp of Ansible Server,
52 configuration of playbook and input parameters for action
53
54- Any container that can be used to call DMaaP API e.g. the SO container
55
56.. note:: This tutorial is based on SB-07 integration lab that was based on OpenStack deployment. For OOM based deployment port number may be different.
57
58Scenario Setup
59--------------
60
61vFWDT Instantiation
62~~~~~~~~~~~~~~~~~~~
63
64In order to test a DistributeTraffic LCM API functionality a dedicated vFW instance must be prepared. It differs from a standard vFW instance by having an additional VF-module with a second instance of vFW and a second instance of vSINK. Thanks to that when a service instance is deployed there are already available two instances of vFW and vSINK that can be used for verification of DistributeTraffic LCM API – there is no need to use the ScaleOut function to test DistributeTraffic functionality what simplifies preparations for tests.
65
66In order to instantiate vFWDT please follow the procedure for standard vFW with following changes:
67
681. Please use the following HEAT templates:
69
70https://github.com/onap/demo/tree/master/heat/vFWDT
71
722. Create Virtual Service in SDC with composition like it is shown on Figure 3
73
74.. figure:: files/figure3.png
75 :scale: 50 %
76 :align: center
77
78 Figure 3 Composition of vFWDT Service
79
803. Use the following payload files in the SDNC-Preload phase during the VF-Module instantiation
81
82- :download:`vPKG preload example <files/vpkg-preload.json>`
83
84- :download:`vFW/SNK 1 preload example <files/vfw-1-preload.json>`
85
86- :download:`vFW/SNK 2 preload example <files/vfw-2-preload.json>`
87
88**Note**: vFWDT has a specific configuration of the networks – different than the one in original vFW use case (see Figure 4). Two networks must be created before the heat stack creation: *onap-private* network (10.0.0.0/16 typically) and *onap-external-private* (e.g. "10.100.0.0/16"). The latter one should be connected over a router to the external network that gives an access to VMs. Thanks to that VMs can have a floating IP from the external network assigned automatically in a time of stacks' creation. Moreover, the vPKG heat stack must be created before the vFW/vSINK stacks (it means that the VF-module for vPKG must be created as a first one). The vPKG stack creates two networks for the vFWDT use case: *protected* and *unprotected*; so these networks must be present before the stacks for vFW/vSINK are created.
89
90.. figure:: files/figure4.png
91 :scale: 20 %
92 :align: center
93
94 Figure 4 Configuration of networks for vFWDT
95
96Configuration of Ansible Server
97~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
98
99After an instantiation of the vFWDT service the Ansible server must be configured in order to allow it a reconfiguration of vPKG VM.
100
1011. Enter the Ansible Server container
102
1032. Install nano and wget
104
105::
106
107 apt install wget nano
108
1093. Download the distribute traffic playbook into the :file:`/opt/onap/ccsdk/Playbooks` directory
110
111::
112
113 cd /opt/onap/ccsdk/Playbooks
114
115 wget https://raw.githubusercontent.com/onap/appc-deployment/master/playbook/ansible_vfw_distributetraffic%400.00.yml
116
1174. Change with *nano* the *hosts: all* statement in the playbook into the *hosts: vpkg-1* statement
118
1195. Copy a private key file used for VMs' creation into the :file:`/opt/onap/ccsdk/Playbooks/vpkg-1.pem` file and give it proper rights
120
121::
122
123 chown 400 vpkg-1.pem
124
125.. note:: The private key file must be related with a public key specified in the *pub_key* statement used in the *SDNC-Preloading* phase
126
1276. Edit the :file:`/opt/onap/ccsdk/Playbooks/Ansible\ \_\ inventory` file including *vpkg-1* host
128
129::
130
131 [vpkg-1]
132 vpkg-1 ansible_ssh_host=10.0.110.2 ansible_ssh_user=ubuntu
133 ansible_ssh_private_key_file=/opt/onap/ccsdk/Playbooks/vpkg-1.pem
134
135.. note:: Change IP address respectively
136
1377. Test that the Ansible server can access *vpkg-1* host over ssh
138
139::
140
141 ansible –i Ansible_inventory vpkg-1 –m ping
142
1438. Upload the payload file :file:`/opt/onap/ccsdk/Playbooks/config.json` with extra parameters for the Ansible playbook.
144
145::
146
147 {
148 "fwIp": "192.168.10.110",
149 "sinkIp": "192.168.20.240"
150 }
151
152.. note:: This step can be omitted when the CDT template file for the *DistributeTraffic* action will be formulated in a different way. In consequence all the parameters required by a playbook can be defined directly on the CDT level and there is no need to maintain this file. For our VNF this file contains an IP address of vFW 2 from the *unprotected* network and an IP address of vSINK 2 from the *protected* network.
153
154Configuration of MySQL/MariaDB for Ansible
155~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
156
157For each VNF that uses the Ansible protocol you need to configure *PASSWORD* and *URL* field* in the *DEVICE_AUTHENTICATION* table.
158
1591. Enter the MariaDB container
160
1612. Enter the Maria DB CLI (password is *gamma*)
162
163::
164
165 mysql -u sdnctl -p
166
1673. Invoke the following commands
168
169::
170
171 MariaDB [(none)]> use sdnctl;
172 MariaDB [sdnctl]> select * from DEVICE_AUTHENTICATION;
173 MariaDB [sdnctl]> UPDATE DEVICE_AUTHENTICATION SET URL = 'http://ansiblehost:8000/Dispatch' WHERE DEVICE_AUTHENTICATION_ID=51;
174 MariaDB [sdnctl]> UPDATE DEVICE_AUTHENTICATION SET PASSWORD = 'admin' WHERE DEVICE_AUTHENTICATION_ID=51;
175
176
177.. note:: You need to find in the *select* query result ID of row that has VNF Type like the one specified in the CDT, *DistributeTraffic* as an action name and *Ansible* as a name of a protocol. You should replace *ansiblehost* with an IP or a hostname of the Ansible Server reachable for the APPC container.
178
179Configuration of VNF in the APPC CDT tool
180~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
181
182Following steps aim to configure DistributeTraffic LCM action for our vFW VNF in APPC CDT tool.
183
1841. Enter the Controller Design Tool page: http://appc_ip:CDT_port
185
186.. note:: i.e. http://10.12.5.227:8080 for ONAP OpenStack deployment
187
1882. Click on the *CREATE NEW VNF TYPE* button
189
190.. figure:: files/figure5.png
191 :scale: 60 %
192 :align: center
193
194 Figure 5 Creation of new VNF type in CDT
195
1963. Enter the VNF Type retrieved from AAI or VID and press the *NEXT* button. Retrieve proper values for the vFWDT service instance
197
198.. figure:: files/figure6.png
199 :scale: 60 %
200 :align: center
201
202 Figure 6 Retrieving VNF type value with VID from Virtual Service Instance
203
204
205.. figure:: files/figure7.png
206 :scale: 60 %
207 :align: center
208
209 Figure 7 Creation of new VNF type in CDT
210
2114. For already created VNF Type (if the view does not open itself) click the *View/Edit* button. In the LCM action edit view in the first tab please choose:
212
213 - *DistributeTraffic* as Action namethe
214
215 - *ANSIBLE* as Device Protocol
216
217 - *Y* value in Template dropdown menu
218
219 - *admin* as User Name
220
221 - *8000* as Port Number
222
223
224.. figure:: files/figure8.png
225 :scale: 60 %
226 :align: center
227
228 Figure 8 DistributeTraffic LCM action editing
229
2305. Go to the *Template* tab and upload the request template file of the DistributeTraffic LCM action
231
232::
233
234 {
235 "PlaybookName": "ansible_vfw_distributetraffic@400.00.yml",
236 "NodeList": ["vpkg-1"],
237 "EnvParameters": {
238 "ConfigFileName": "config.json"
239 },
240 "Timeout": 3600
241 }
242
243.. note:: This step allows to create and edit template file for any APPC LCM DistributeTraffic action request for specified before VNF Type.
244
245The *EnvParameters* group contains all the parameters that will be passed directly to the Ansible playbook during the request's execution. The *NodeList* parameter value must match the group of VMs like it was specified in the Ansible inventory file. *PlaybookName* must be the same as the name of playbook that was uploaded before to the Ansible server.
246
247.. figure:: files/figure9.png
248 :scale: 60 %
249 :align: center
250
251 Figure 9 Request template file after uploading
252
253Select *ansible_vfw_distributetraffic@400.00.yml* and press CTRL+4 buttons. The new dialog window will appear. Enter a name *playbook* for this value and press the *Submit* button.
254
255.. figure:: files/figure10.png
256 :scale: 60 %
257 :align: center
258
259 Figure 10 Editing "playbook" parameter of request template
260
261The same operation must be repeated for the *config.json* parameter. The parameter should have name *ConfigFileName*. Press the *Submit* button.
262
263.. figure:: files/figure11.png
264 :scale: 60 %
265 :align: center
266
267 Figure 11 Editing "ConfigFileName" parameter of request template
268
269Afterwards press the *SYNCHRONIZE WITH TEMPLATE PARAMETERS* button. You will be moved to the *Parameter Definition* tab. The new parameters will be listed there.
270
271.. figure:: files/figure12.png
272 :scale: 60 %
273 :align: center
274
275 Figure 12 Summary of parameters specified for DistributeTraffic LCM action.
276
277Finally, go back to the *Reference Data* tab and click *SAVE ALL TO APPC*.
278
279Testing DistributeTraffic LCM API
280---------------------------------
281
282Below we propose three different ways to test DistributeTraffic LCM API.
283
284Test in CDT
285~~~~~~~~~~~
286
287In order to test API in CDT go to *TEST* tab. Upload spreadsheet (Excel file) and enter VNF ID of vFWDT VNF.
288
289:download:`CDT request input <files/cdt-request-input.xlsx>`
290
291The spreadsheet contains input parameters for API request. Values from the this file are used to automatically fill in the LCM request template file being edited in previous steps. Click on *Execute test* button to test API in action.
292
293.. figure:: files/figure13.png
294 :scale: 60 %
295 :align: center
296
297 Figure 13 Result of DistributeTraffic LCM API execution from CDT
298
299APIDOC Explorer
300~~~~~~~~~~~~~~~
301
302Another way to test API is to use APIDOC explorer of APPC that comes with OpenDaylight.
303
3041. Enter APIDOC explorer page: http://appc_ip:appc_portal_port/apidoc/explorer/index.html
305
306.. note:: i.e. http://10.12.5.227:8282/apidoc/explorer/index.html for ONAP OpenStack deployment
307
3082. Choose *appc-provider-lcm* and find POST
309 */operations/appc-provider-lcm:distribute-traffic*
310
3113. In the *payload* input paste below mentioned content.
312
313::
314
315 {
316 "input": {
317 "common-header": {
318 "timestamp": "2018-10-18T08:51:01.628Z",
319 "api-ver": "2.00",
320 "originator-id": "demo",
321 "request-id": "1539852661628",
322 "sub-request-id": "1539852661629",
323 "flags": {
324 "mode": "NORMAL",
325 "force": "TRUE",
326 "ttl": 3600
327 }
328 },
329 "action": "DistributeTraffic",
330 "action-identifiers": {
331 "vnf-id": "2bd5cc6e-9738-436f-b5a8-c1a749a89f52"
332 },
333 "payload": "{\"configuration-parameters\":{\"ConfigFileName\":\ "/opt/onap/ccsdk/Playbooks/dt-vpkg-1-config.json\",\"playbook\":\"ansible_vfw_distributetraffic@400.00.yml\",\"node_list\":\"[vpkg-1]\"}}"
334 }
335 }
336
337.. note:: Remember to use *vnf-id* of your instance of vFW 1 and to set a unique *request-id*. The value of *playbook* and *ConfigFileName* parameters should be the same as uploaded to Ansible Server names of files and their locations. Timestamp must have proper value as well (not from the future and from the past but not more than 30s). In the *payload* parameter *configuration-parameters* section must correspond to all the parameters defined in the template of *DistributeTraffic* action in CDT.
338
339DMaaP event distribution
340~~~~~~~~~~~~~~~~~~~~~~~~
341
342The last option that can be used to test DistributeTraffic API is distribution of DMaaP event e.g. from SO container. It is the closest way to how DistributeTraffic API will be used in the future – invoked from a specific workflow by SO BPMN engine. For that we have a python script that prepares input parameters for DMaaP request. There is a need to change in the script IP address and Port of DMaaP. This script can be copied into any machine/container than has access to DMaaP – in particular it can be copied into the SO container.
343
344::
345
346 from datetime import datetime
347 import os
348 import json
349 from pprint import pprint
350 from random import randint
351
352 request_id = randint(1, 100000000)
353
354 curr_utc_timestamp = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.244Z')
355
356 data = ''
357
358 with open('dmaap-payload.json') as json_data:
359 data = json.load(json_data)
360 data['body']['input']['common-header']['timestamp'] = curr_utc_timestamp
361 data['body']['input']['common-header']['request-id'] = request_id
362 json_data.close()
363 pprint(data)
364
365 with open('dmaap-payload.json', 'w') as outfile:
366 json.dump(data, outfile)
367
368 os.system('curl -X POST -v -H "Content-Type: application/json" -d @./dmaap-payload.json http://10.12.6.80:3904/events/APPC-LCM-READ')
369
370
371POST request to DMaaP requires that *payload* data is specific to a APPC LCM request and defines the same input parameters for the DistributeTraffic LCM action like in the two previous methods.
372
373::
374
375 {
376 "body": {
377 "input": {
378 "action": "DistributeTraffic",
379 "payload": "{\"configuration-parameters\":{\"ConfigFileName\":\"/opt/onap/ccsdk/Playbooks/dt-vpkg-1-config.json\",\"playbook\":\"ansible_vfw_distributetraffic@400.00.yml\",\"node_list\":\"[vpkg-1]\"}}",
380 "common-header": {
381 "api-ver": "2.00",
382 "timestamp": "2018-10-22T11:11:25.244Z",
383 "flags": {
384 "force": "TRUE",
385 "mode": "NORMAL",
386 "ttl": 36000
387 },
388 "request-id": 27081074,
389 "originator-id": "demo",
390 "sub-request-id": "1540197850899"
391 },
392 "action-identifiers": {
393 "vnf-id": "50ac9605-ce63-442d-a103-80e9cf4753ca"
394 }
395 }
396 },
397 "cambria.partition": "APPC",
398 "rpc-name": "distribute-traffic",
399 "correlation-id": "c09ac7d1-de62-0016-2000-e63701125557-201",
400 "version": "2.0",
401 "type": "request"
402 }