ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 1 | .. This work is licensed under a Creative Commons Attribution 4.0 |
| 2 | .. International License. http://creativecommons.org/licenses/by/4.0 |
| 3 | .. Copyright © 2017-2020 Aarna Networks, Inc. |
| 4 | |
| 5 | vFW Service Deployment Tutorial |
| 6 | ############################### |
| 7 | |
| 8 | In this tutorial, we will deploy the service created in the previous Service Design tutorial onto OpenStack. |
| 9 | We will do so by using the VID GUI from the ONAP Portal. Login as user demo. |
| 10 | |
| 11 | In this section, you will learn the following through VID GUI |
| 12 | |
| 13 | * How to Instantiate a Service |
| 14 | * How to Instantiate a VNF |
| 15 | * How to Instantiate VF Module |
| 16 | * How to Instantiate Network |
| 17 | |
| 18 | Let us start by running Robot init script |
| 19 | |
| 20 | 1. Run Robot init script to populate demo models. |
| 21 | |
| 22 | .. code-block:: |
| 23 | |
| 24 | cd ~/oom/kubernetes/robot |
| 25 | ./demo-k8s.sh onap init |
| 26 | |
| 27 | Result: |
| 28 | All tests must pass, below is sample output. |
| 29 | |
| 30 | Number of parameters: |
| 31 | 2 |
| 32 | KEY: |
| 33 | init |
| 34 | ++ kubectl --namespace onap get pods |
| 35 | ++ sed 's/ .*//' |
| 36 | ++ grep robot |
| 37 | + POD=dev-robot-578b965f4d-vlk8b |
| 38 | ++ dirname ./demo-k8s.sh |
| 39 | + DIR=. |
| 40 | + SCRIPTDIR=scripts/demoscript |
| 41 | + ETEHOME=/var/opt/ONAP |
| 42 | + '[' ']' |
| 43 | ++ kubectl --namespace onap exec dev-robot-578b965f4d-vlk8b -- bash -c 'ls -1q /share/logs/ | wc -l' |
| 44 | + export GLOBAL_BUILD_NUMBER=3 |
| 45 | + GLOBAL_BUILD_NUMBER=3 |
| 46 | ++ printf %04d 3 |
| 47 | + OUTPUT_FOLDER=0003_demo_init |
| 48 | + DISPLAY_NUM=93 |
| 49 | + VARIABLEFILES='-V /share/config/robot_properties.py' |
| 50 | + kubectl --namespace onap exec dev-robot-578b965f4d-vlk8b -- /var/opt/ONAP/runTags.sh -V /share/config/robot_properties.py |
| 51 | -d /share/logs/0003_demo_init -i InitDemo --display 93 |
| 52 | Starting Xvfb on display :93 with res 1280x1024x24 |
| 53 | Executing robot tests at log level TRACE |
| 54 | ============================================================================== |
| 55 | Testsuites |
| 56 | ============================================================================== |
| 57 | Testsuites.Demo :: Executes the VNF Orchestration Test cases including setu... |
| 58 | ============================================================================== |
| 59 | Initialize Customer And Models | PASS | |
| 60 | ------------------------------------------------------------------------------ |
| 61 | Initialize SO Openstack Identity For V3 | PASS | |
| 62 | ------------------------------------------------------------------------------ |
| 63 | Testsuites.Demo :: Executes the VNF Orchestration Test cases inclu... | PASS | |
| 64 | 2 critical tests, 2 passed, 0 failed |
| 65 | 2 tests total, 2 passed, 0 failed |
| 66 | ============================================================================== |
| 67 | Testsuites | PASS | |
| 68 | 2 critical tests, 2 passed, 0 failed |
| 69 | 2 tests total, 2 passed, 0 failed |
| 70 | ============================================================================== |
| 71 | Output: /share/logs/0003_demo_init/output.xml |
| 72 | Log: /share/logs/0003_demo_init/log.html |
| 73 | Report: /share/logs/0003_demo_init/report.html |
| 74 | |
| 75 | 2. Create vFW_demo_service Instance |
| 76 | |
| 77 | A. Login into the ONAP portal as user demo / demo123456! |
| 78 | |
| 79 | |image4| |
| 80 | |
| 81 | B. Go to Home and select Virtual Infrastructure Deployment (VID) application |
| 82 | |
| 83 | |image11| |
| 84 | |
| 85 | If you see VID reporting a Security failure, and the browser does not give option to Allow Exception button as below |
| 86 | |
| 87 | |image22| |
| 88 | |
| 89 | Apply the below workaround for the above issue |
| 90 | |
| 91 | Copy the vid.api.simpledemo.onap.org:30200 from the above window, open new tab and paste the copied URL |
| 92 | as https://vid.api.simpledemo.onap.org:30200 and click on Advanced then click on Accept the Risk and Continue tab |
| 93 | |
| 94 | |image13| |
| 95 | |
| 96 | Then Close the tab, go to the ONAP Home page and load the VID UI again, you will see VID home page |
| 97 | |
| 98 | |image17| |
| 99 | |
| 100 | C. Select Test API for A-la-carte as VNF_API(old) then click Browse SDC Service Models (Left side panel) |
| 101 | |
| 102 | |image10| |
| 103 | |
| 104 | D. Search for the service to instantiate, select a service (vfw_demo_service) distributed in SDC and click Deploy |
| 105 | |
| 106 | |image1| |
| 107 | |
| 108 | E. Complete the fields indicated by the red star and click Confirm |
| 109 | |
| 110 | * Instance Name = vFW_service_00 |
| 111 | * Subscriber Name = Demonstration |
| 112 | * Service Type = vFW |
| 113 | * Owning Entity = OE-Demonstration |
| 114 | |
| 115 | |image24| |
| 116 | |
| 117 | F. Select Confirm Button |
| 118 | |
| 119 | We should see the “Service instance was created successfully” message |
| 120 | |
| 121 | |image15| |
| 122 | |
| 123 | G. Click Close and the next screen should appear. It will allow you to declare VNF(s) and Network(s) |
| 124 | that are part of the service model composition |
| 125 | |
| 126 | |image29| |
| 127 | |
| 128 | 3. Instantiate a VNF |
| 129 | |
| 130 | A. click on “Add node instance” and select the VNF you want to instantiate in the list |
| 131 | |
| 132 | |image9| |
| 133 | |
| 134 | B. Complete the fields indicated by the red star and click Confirm |
| 135 | |
| 136 | * Instance Name = vFW_demo_VNF |
| 137 | * Product Family = vFW |
| 138 | * Region = RegionOne(CLOUDOWNER) |
| 139 | * Tenant = admin |
| 140 | * Line Of Business = LOB-Demonstration |
| 141 | * Platform = Platform-Demonstration |
| 142 | |
| 143 | |image6| |
| 144 | |
| 145 | You will get a status complete dialog message |
| 146 | |
| 147 | |image18| |
| 148 | |
| 149 | C. Click on close button, the following screen then should appear |
| 150 | |
| 151 | |image16| |
| 152 | |
| 153 | 4. Instantiate VF Module |
| 154 | |
| 155 | Note: Before creating VF module get the required parameter values to prepare SDNC preload data |
| 156 | |
| 157 | A. Copy the following VNF attributes from VNF instance detail screen |
| 158 | |
| 159 | * generic-vnf-name = vFW_demo_VNF (value must be equal to the VNF instance name value) |
| 160 | |
| 161 | |image25| |
| 162 | |
| 163 | * generic-vnf-type = vFW_demo_service/vFW_demo 0 (value must be equal to VNF Type value) |
| 164 | |
| 165 | |image20| |
| 166 | |
| 167 | * service-type = f7c80167-ed06-48ef-a991-61b43196f98f (value must be equal to the service instance id value) |
| 168 | |
| 169 | |image26| |
| 170 | |
| 171 | B. Copy the following attributes From Create VF Module screen |
| 172 | |
| 173 | * vnf-name = lfn_vf_module (value must be equal to the VF module instance name value) |
| 174 | * vnf-type = VfwDemo..base_vfw..module-0 (value must be equal to the “Model Name” value - see create VF module screen) |
| 175 | |
| 176 | |image27| |
| 177 | |
| 178 | C. Get the required vnf-parameters values from Heat env file imported while SDC design |
| 179 | (refer https://github.com/onap/demo/blob/master/heat/vFW/base_vfw.env) |
| 180 | |
| 181 | Login to Openstack and execute the below commands and get the required openstack related parameter values |
| 182 | to update in SDNC preload data |
| 183 | |
| 184 | * download the image ubuntu-14.04 from cloud images & create an image with "ubuntu-14-04-cloud-amd6" name |
| 185 | * create the flavor with m1.medium |
| 186 | * create OAM_NETWORK ID & OAM_SUBNET ID (use subnet range from base_vfw.env file) |
| 187 | * execute openstack security group rule to open all ports for onap |
| 188 | |
| 189 | D. Run the SDNC preload curl command |
| 190 | Below is the sample curl command updated with all the required parameters |
| 191 | |
| 192 | .. code-block:: |
| 193 | |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 194 | curl -k -X POST https://sdnc.api.simpledemo.onap.org:30267/restconf/operations/GENERIC-RESOURCE-API:preload-vf-module-topology-operation \ |
| 195 | -H 'Accept: application/json' \ |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 196 | -H 'Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==' \ |
| 197 | -H 'Content-Type: application/json' \ |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 198 | -H 'X- FromAppId: API client' \ |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 199 | -H 'cache-control: no-cache' \ |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 200 | -d @vFW_sdnc_VF_preload.json |
| 201 | |
| 202 | Below is the json file payload content |
| 203 | cat vFW_sdnc_VF_preload.json |
| 204 | { |
| 205 | "input": { |
| 206 | "request-information": { |
| 207 | "notification-url": "onap.org", |
| 208 | "order-number": "1", |
| 209 | "order-version": "1", |
| 210 | "request-action": "PreloadVfModuleRequest", |
| 211 | "request-id": "test" |
| 212 | }, |
| 213 | "sdnc-request-header": { |
| 214 | "svc-action": "reserve", |
| 215 | "svc-notification-url": "http:\/\/onap.org:8080\/adapters\/rest\/SDNCNotify", |
| 216 | "svc-request-id": "test" |
| 217 | }, |
| 218 | "preload-vf-module-topology-information": { |
| 219 | "vnf-resource-assignments": { |
| 220 | "availability-zones": { |
| 221 | "availability-zone": [ |
| 222 | "nova" |
| 223 | ], |
| 224 | "max-count": "1" |
| 225 | }, |
| 226 | "vnf-networks": { |
| 227 | "vnf-network": [] |
| 228 | } |
| 229 | }, |
| 230 | "vf-module-topology": { |
| 231 | "vf-module-topology-identifier": { |
| 232 | "vf-module-name": "lfn_vf_module" |
| 233 | }, |
| 234 | "vf-module-parameters": { |
| 235 | "param":[{ |
| 236 | "name": "vfw_image_name", |
| 237 | "value": "ubuntu-14-04-cloud-amd6" |
| 238 | }, |
| 239 | { |
| 240 | "name": "vfw_flavor_name", |
| 241 | "value": "m1.medium" |
| 242 | }, |
| 243 | { |
| 244 | "name": "vfw_name_0", |
| 245 | "value": "zdfw1fwl01fwl09" |
| 246 | }, |
| 247 | { |
| 248 | "name": "vfw_int_unprotected_private_ip_0", |
| 249 | "value": "192.168.10.109" |
| 250 | }, |
| 251 | { |
| 252 | "name": "vfw_int_protected_private_ip_0", |
| 253 | "value": "192.168.20.109" |
| 254 | }, |
| 255 | { |
| 256 | "name": "vfw_onap_private_ip_0", |
| 257 | "value": "10.10.10.15" |
| 258 | }, |
| 259 | { |
| 260 | "name": "vfw_int_protected_private_floating_ip", |
| 261 | "value": "192.168.10.209" |
| 262 | }, |
| 263 | { |
| 264 | "name": "vpg_int_unprotected_private_ip_0", |
| 265 | "value": "192.168.10.209" |
| 266 | }, |
| 267 | { |
| 268 | "name": "vpg_image_name", |
| 269 | "value": "ubuntu-14-04-cloud-amd6" |
| 270 | }, |
| 271 | { |
| 272 | "name": "vpg_flavor_name", |
| 273 | "value": "m1.medium" |
| 274 | }, |
| 275 | { |
| 276 | "name": "vpg_name_0", |
| 277 | "value": "zdfw1fwl01pgn09" |
| 278 | }, |
| 279 | { |
| 280 | "name": "vpg_onap_private_ip_0", |
| 281 | "value": "10.10.10.16" |
| 282 | }, |
| 283 | { |
| 284 | "name": "vsn_image_name", |
| 285 | "value": "ubuntu-14-04-cloud-amd6" |
| 286 | }, |
| 287 | { |
| 288 | "name": "vsn_flavor_name", |
| 289 | "value": "m1.medium" |
| 290 | }, |
| 291 | { |
| 292 | "name": "vsn_name_0", |
| 293 | "value": "zdfw1fwl01snk09" |
| 294 | }, |
| 295 | { |
| 296 | "name": "vsn_int_protected_private_ip_0", |
| 297 | "value": "192.168.20.251" |
| 298 | }, |
| 299 | { |
| 300 | "name": "vsn_onap_private_ip_0", |
| 301 | "value": "10.10.10.17" |
| 302 | }, |
| 303 | { |
| 304 | "name": "public_net_id", |
| 305 | "value": "9af666a2-73db-4dd4-bdad-a5dd82f6fddc" |
| 306 | }, |
| 307 | { |
| 308 | "name": "unprotected_private_net_id", |
| 309 | "value": "zdfw1fwl09_unprotected" |
| 310 | }, |
| 311 | { |
| 312 | "name": "unprotected_private_net_cidr", |
| 313 | "value": "192.168.10.0/24" |
| 314 | }, |
| 315 | { |
| 316 | "name": "protected_private_net_id", |
| 317 | "value": "zdfw1fwl09_protected" |
| 318 | }, |
| 319 | { |
| 320 | "name": "protected_private_net_cidr", |
| 321 | "value": "192.168.20.0/24" |
| 322 | }, |
| 323 | { |
| 324 | "name": "onap_private_net_id", |
| 325 | "value": "OAM_NETWORK" |
| 326 | }, |
| 327 | { |
| 328 | "name": "onap_private_subnet_id", |
| 329 | "value": "OAM_SUBNET" |
| 330 | }, |
| 331 | { |
| 332 | "name": "onap_private_net_cidr", |
| 333 | "value": "10.10.10.0/24" |
| 334 | }, |
| 335 | { |
| 336 | "name": "vfw_name", |
| 337 | "value": "vFW_demo_VNF" |
| 338 | }, |
| 339 | { |
| 340 | "name": "vnf_id:", |
| 341 | "value": "vFirewall_demo_app" |
| 342 | }, |
| 343 | { |
| 344 | "name": "vf_module_id:", |
| 345 | "value": "vFirewall" |
| 346 | }, |
| 347 | { |
| 348 | "name": "dcae_collector_ip", |
| 349 | "value": "127.0.0.1" |
| 350 | }, |
| 351 | { |
| 352 | "name": "dcae_collector_port", |
| 353 | "value": "30235" |
| 354 | }, |
| 355 | { |
| 356 | "name": "demo_artifacts_version", |
| 357 | "value": "1.6.0-SNAPSHOT" |
| 358 | }, |
| 359 | { |
| 360 | "name": "install_script_version", |
| 361 | "value": "1.6.0-SNAPSHOT" |
| 362 | }, |
| 363 | { |
| 364 | "name": "key_name", |
| 365 | "value": "vfw_key" |
| 366 | }, |
| 367 | { |
| 368 | "name": "pub_key", |
| 369 | "value": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD1Bv4Vb3RzfKoW3R6j+bk4fqCVkrHSqnK2Xo1A2139jGm6wvUocQznaawoL5kfqTATPOl1kwi6EvWgy+aVV7UmELdm2nFPUErcPT8B73hfFImpNkz6q93TCmx4lJNz+5k6nemUn+K4fz7a1ggLYahTOTzJsNBffaVE7LA/ahGxzK7zVqWrdO0hoJAxnENp46qEtrQk3PIoWn4MRy2xj4hnnLFETWxYcktIdV6YQzJUlK/wZOWrGdkPdnjLaIO84ZxjPedxgGl1BOuUKAWqlC0g9I1Q9tcCrBnahVFLt3ibloFcLSEl1zrzYtJtF2w1i/SDBSpqxIr68TEo7/FPfAP1" |
| 370 | }, |
| 371 | { |
| 372 | "name": "cloud_env", |
| 373 | "value": "openstack" |
| 374 | }, |
| 375 | { |
| 376 | "name": "sec_group", |
| 377 | "value": "default" |
| 378 | }, |
| 379 | { |
| 380 | "name": "nexus_artifact_repo", |
| 381 | "value": "https://nexus.onap.org" |
| 382 | } |
| 383 | |
| 384 | ] |
| 385 | } |
| 386 | }, |
| 387 | "vnf-topology-identifier-structure": { |
| 388 | "vnf-name": "vFW_demo_VNF", |
| 389 | "vnf-type": "vFW_demo_service/vFW_demo 0" |
| 390 | } |
| 391 | } |
| 392 | } |
| 393 | } |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 394 | |
| 395 | Output looks somthing like below |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 396 | {"output":{"response-message":"success","ack-final-indicator":"Y","svc-request-id":"test","response-code":"200"}} |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 397 | |
| 398 | E. Now click on Add VF-Module with the same name as updated through SDNC preload, click on SDN-C Preload |
| 399 | check box then press confirm |
| 400 | |
| 401 | |image28| |
| 402 | |
| 403 | You will get a status complete dialog message |
| 404 | |
| 405 | |image2| |
| 406 | |
| 407 | F. Click on close, now the following screen should appear |
| 408 | |
| 409 | |image19| |
| 410 | |
| 411 | 5. Instantiate Network |
| 412 | |
| 413 | A. Prepare the “SDNC preload” data before creating network instance |
| 414 | |
| 415 | * network-role = integration_test_net (provide any value) |
| 416 | * network-technology = neutron (use “neutron” as this example will instantiate a network using openstack neutron application) |
| 417 | * service-type = vFW_demo_service (value must be equal to “Service Name” (=service model name) displayed on VID screen) |
| 418 | |
| 419 | |image5| |
| 420 | |
| 421 | * network-name = lfn_nwt_001 (value must be equal to the desired network instance name) |
| 422 | |
| 423 | |image7| |
| 424 | |
| 425 | * network-type = Generic NeutronNet (value must be equal to “Model Name”“Generic NeutronNet” displayed on VID screen) |
| 426 | |
| 427 | |image8| |
| 428 | |
| 429 | B. Run the below SDNC preload curl command |
| 430 | |
| 431 | .. code-block:: |
| 432 | |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 433 | curl -k -X POST https://sdnc.api.simpledemo.onap.org:30267/restconf/operations/GENERIC-RESOURCE-API:preload-network-topology-operation \ |
| 434 | -H 'Accept: application/json' \ |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 435 | -H 'Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==' \ |
| 436 | -H 'Content-Type: application/json' \ |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 437 | -H 'X- FromAppId: API client' \ |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 438 | -H 'cache-control: no-cache' \ |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 439 | -d @vFW_sdnc_Network_preload.json |
| 440 | |
| 441 | Below is the json file payload content |
| 442 | cat vFW_sdnc_Network_preload.json |
| 443 | |
| 444 | { |
| 445 | "input": { |
| 446 | "preload-network-topology-information": { |
| 447 | "network-policy": [], |
| 448 | "route-table-reference": [], |
| 449 | "vpn-bindings": [], |
| 450 | "network-topology-identifier-structure": { |
| 451 | "network-role": "integration_test_net", |
| 452 | "network-technology": "neutron", |
| 453 | "network-name": "lfn_nwt_001", |
| 454 | "network-type": "Generic NeutronNet" |
| 455 | }, |
| 456 | "is-external-network": false, |
| 457 | "is-shared-network": false, |
| 458 | "is-provider-network": false, |
| 459 | "physical-network-name": "Not Aplicable", |
| 460 | "subnets": [{ |
| 461 | "cidr-mask": "24", |
| 462 | "dhcp-enabled": "N", |
| 463 | "gateway-address": "10.10.10.1", |
| 464 | "ip-version": "4", |
| 465 | "start-address": "10.10.10.20", |
| 466 | "subnet-name": "test-subnet-005" |
| 467 | }] |
| 468 | }, |
| 469 | "sdnc-request-header": { |
| 470 | "svc-request-id": "test", |
| 471 | "svc-notification-url": "http:\/\/onap.org:8080\/adapters\/rest\/SDNCNotify", |
| 472 | "svc-action": "reserve" |
| 473 | } |
| 474 | } |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 475 | } |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 476 | |
| 477 | Output looks something like below |
ramagp | 12d98ea | 2021-09-13 13:10:24 +0530 | [diff] [blame^] | 478 | {"output":{"response-message":"success","ack-final-indicator":"Y","svc-request-id":"test","response-code":"200"}} |
ramagp | 6188f9d | 2021-01-24 16:23:31 +0000 | [diff] [blame] | 479 | |
| 480 | C. Click on “Add Network” and select the Network you want to instantiate in the list |
| 481 | |
| 482 | |image12| |
| 483 | |
| 484 | D. Click Confirm, We will get a status complete dialog message |
| 485 | |
| 486 | |image14| |
| 487 | |
| 488 | E. Click close, the following screen should appear |
| 489 | |
| 490 | |image3| |
| 491 | |
| 492 | At this point, the Network and subnets are now instantiated in the cloud platform |
| 493 | |
| 494 | 6. Now login to OpenStack Horizon dashboard, see stacks created in Openstack |
| 495 | |
| 496 | A. Go to Project → Orchestration → Stacks |
| 497 | We can see the VF module and Network stacks status |
| 498 | |
| 499 | |image23| |
| 500 | |
| 501 | B. Now we can go to Admin → Compute → Instances to check the instances status |
| 502 | |
| 503 | |image21| |
| 504 | |
| 505 | |
| 506 | .. |image4| image:: media/image4.png |
| 507 | .. |image11| image:: media/image11.png |
| 508 | .. |image22| image:: media/image22.png |
| 509 | .. |image13| image:: media/image13.png |
| 510 | .. |image17| image:: media/image17.png |
| 511 | .. |image10| image:: media/image10.png |
| 512 | .. |image1| image:: media/image1.png |
| 513 | .. |image24| image:: media/image24.png |
| 514 | .. |image15| image:: media/image15.png |
| 515 | .. |image29| image:: media/image29.png |
| 516 | .. |image9| image:: media/image9.png |
| 517 | .. |image6| image:: media/image6.png |
| 518 | .. |image18| image:: media/image18.png |
| 519 | .. |image16| image:: media/image16.png |
| 520 | .. |image25| image:: media/image25.png |
| 521 | .. |image20| image:: media/image20.png |
| 522 | .. |image26| image:: media/image26.png |
| 523 | .. |image27| image:: media/image27.png |
| 524 | .. |image28| image:: media/image28.png |
| 525 | .. |image2| image:: media/image2.png |
| 526 | .. |image19| image:: media/image19.png |
| 527 | .. |image5| image:: media/image5.png |
| 528 | .. |image7| image:: media/image7.png |
| 529 | .. |image8| image:: media/image8.png |
| 530 | .. |image12| image:: media/image12.png |
| 531 | .. |image14| image:: media/image14.png |
| 532 | .. |image3| image:: media/image3.png |
| 533 | .. |image23| image:: media/image23.png |
| 534 | .. |image21| image:: media/image21.png |
| 535 | |
| 536 | |
| 537 | |
| 538 | |
| 539 | |
| 540 | |
| 541 | |
| 542 | |
| 543 | |
| 544 | |
| 545 | |
| 546 | |
| 547 | |
| 548 | |
| 549 | |
| 550 | |
| 551 | |
| 552 | |
| 553 | |
| 554 | |
| 555 | |