Merge "[ha] odl: Set _param:cluster_vip_address"
[fuel.git] / docs / release / userguide / userguide.rst
1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. http://creativecommons.org/licenses/by/4.0
3 .. (c) Open Platform for NFV Project, Inc. and its contributors
4
5 *********************
6 OPNFV Fuel User Guide
7 *********************
8
9 Abstract
10 ========
11
12 This document contains details about using OPNFV Fuel ``Gambia`` release after
13 it was deployed. For details on how to deploy OpenStack, check
14 the installation instructions in the :ref:`fuel_userguide_references` section.
15
16 This is an unified documentation for both ``x86_64`` and ``aarch64``
17 architectures. All information is common for both architectures
18 except when explicitly stated.
19
20 Network Overview
21 ================
22
23 Fuel uses several networks to deploy and administer the cloud:
24
25 +------------------+----------------------------------------------------------+
26 | Network name     | Description                                              |
27 |                  |                                                          |
28 +==================+==========================================================+
29 | **PXE/admin**    | Used for booting the nodes via PXE and/or Salt           |
30 |                  | control network                                          |
31 +------------------+----------------------------------------------------------+
32 | **mcpcontrol**   | Used to provision the infrastructure hosts (Salt & MaaS) |
33 +------------------+----------------------------------------------------------+
34 | **management**   | Used for internal communication between                  |
35 |                  | OpenStack components                                     |
36 +------------------+----------------------------------------------------------+
37 | **internal**     | Used for VM data communication within the                |
38 |                  | cloud deployment                                         |
39 +------------------+----------------------------------------------------------+
40 | **public**       | Used to provide Virtual IPs for public endpoints         |
41 |                  | that are used to connect to OpenStack services APIs.     |
42 |                  | Used by Virtual machines to access the Internet          |
43 +------------------+----------------------------------------------------------+
44
45 These networks - except ``mcpcontrol`` - can be Linux bridges configured
46 before the deploy on the Jumpserver.
47 If they don't exists at deploy time, they will be created by the scripts as
48 ``libvirt`` managed networks.
49
50 Network ``mcpcontrol``
51 ~~~~~~~~~~~~~~~~~~~~~~
52
53 ``mcpcontrol`` is a virtual network, managed by libvirt. Its only purpose is to
54 provide a simple method of assigning an arbitrary ``INSTALLER_IP`` to the Salt
55 master node (``cfg01``), to maintain backwards compatibility with old OPNFV
56 Fuel behavior. Normally, end-users only need to change the ``INSTALLER_IP`` if
57 the default CIDR (``10.20.0.0/24``) overlaps with existing lab networks.
58
59 ``mcpcontrol`` has both NAT and DHCP enabled, so the Salt master (``cfg01``)
60 and the MaaS VM (``mas01``, when present) get assigned predefined IPs (``.2``,
61 ``.3``, while the jumpserver bridge port gets ``.1``).
62
63 +------------------+---------------------------+-----------------------------+
64 | Host             | Offset in IP range        | Default address             |
65 +==================+===========================+=============================+
66 | ``jumpserver``   | 1st                       | ``10.20.0.1``               |
67 +------------------+---------------------------+-----------------------------+
68 | ``cfg01``        | 2nd                       | ``10.20.0.2``               |
69 +------------------+---------------------------+-----------------------------+
70 | ``mas01``        | 3rd                       | ``10.20.0.3``               |
71 +------------------+---------------------------+-----------------------------+
72
73 This network is limited to the ``jumpserver`` host and does not require any
74 manual setup.
75
76 Network ``PXE/admin``
77 ~~~~~~~~~~~~~~~~~~~~~
78
79 .. TIP::
80
81     ``PXE/admin`` does not usually use an IP range offset in ``IDF``.
82
83 .. NOTE::
84
85     During ``MaaS`` commissioning phase, IP addresses are handed out by
86     ``MaaS``'s DHCP.
87
88 .. WARNING::
89
90     Default addresses in below table correspond to a ``PXE/admin`` CIDR of
91     ``192.168.11.0/24`` (the usual value used in OPNFV labs).
92
93     This is defined in ``IDF`` and can easily be changed to something else.
94
95 .. TODO: detail MaaS DHCP range start/end
96
97 +------------------+-----------------------+---------------------------------+
98 | Host             | Offset in IP range    | Default address                 |
99 +==================+=======================+=================================+
100 | ``jumpserver``   | 1st                   | ``192.168.11.1``                |
101 |                  |                       | (manual assignment)             |
102 +------------------+-----------------------+---------------------------------+
103 | ``cfg01``        | 2nd                   | ``192.168.11.2``                |
104 +------------------+-----------------------+---------------------------------+
105 | ``mas01``        | 3rd                   | ``192.168.11.3``                |
106 +------------------+-----------------------+---------------------------------+
107 | ``prx01``,       | 4th,                  | ``192.168.11.4``,               |
108 | ``prx02``        | 5th                   | ``192.168.11.5``                |
109 +------------------+-----------------------+---------------------------------+
110 | ``gtw01``,       | ...                   | ``...``                         |
111 | ``gtw02``,       |                       |                                 |
112 | ``gtw03``        |                       |                                 |
113 +------------------+-----------------------+---------------------------------+
114 | ``kvm01``,       |                       |                                 |
115 | ``kvm02``,       |                       |                                 |
116 | ``kvm03``        |                       |                                 |
117 +------------------+-----------------------+---------------------------------+
118 | ``dbs01``,       |                       |                                 |
119 | ``dbs02``,       |                       |                                 |
120 | ``dbs03``        |                       |                                 |
121 +------------------+-----------------------+---------------------------------+
122 | ``msg01``,       |                       |                                 |
123 | ``msg02``,       |                       |                                 |
124 | ``msg03``        |                       |                                 |
125 +------------------+-----------------------+---------------------------------+
126 | ``mdb01``,       |                       |                                 |
127 | ``mdb02``,       |                       |                                 |
128 | ``mdb03``        |                       |                                 |
129 +------------------+-----------------------+---------------------------------+
130 | ``ctl01``,       |                       |                                 |
131 | ``ctl02``,       |                       |                                 |
132 | ``ctl03``        |                       |                                 |
133 +------------------+-----------------------+---------------------------------+
134 | ``odl01``,       |                       |                                 |
135 | ``odl02``,       |                       |                                 |
136 | ``odl03``        |                       |                                 |
137 +------------------+-----------------------+---------------------------------+
138 | ``mon01``,       |                       |                                 |
139 | ``mon02``,       |                       |                                 |
140 | ``mon03``,       |                       |                                 |
141 | ``log01``,       |                       |                                 |
142 | ``log02``,       |                       |                                 |
143 | ``log03``,       |                       |                                 |
144 | ``mtr01``,       |                       |                                 |
145 | ``mtr02``,       |                       |                                 |
146 | ``mtr03``        |                       |                                 |
147 +------------------+-----------------------+---------------------------------+
148 | ``cmp001``,      |                       |                                 |
149 | ``cmp002``,      |                       |                                 |
150 | ``...``          |                       |                                 |
151 +------------------+-----------------------+---------------------------------+
152
153 Network ``management``
154 ~~~~~~~~~~~~~~~~~~~~~~
155
156 .. TIP::
157
158     ``management`` often has an IP range offset defined in ``IDF``.
159
160 .. WARNING::
161
162     Default addresses in below table correspond to a ``management`` IP range of
163     ``172.16.10.10-172.16.10.254`` (one of the commonly used values in OPNFV
164     labs). This is defined in ``IDF`` and can easily be changed to something
165     else. Since the ``jumpserver`` address is manually assigned, this is
166     usually not subject to the IP range restriction in ``IDF``.
167
168 +------------------+-----------------------+---------------------------------+
169 | Host             | Offset in IP range    | Default address                 |
170 +==================+=======================+=================================+
171 | ``jumpserver``   | N/A                   | ``172.16.10.1``                 |
172 |                  |                       | (manual assignment)             |
173 +------------------+-----------------------+---------------------------------+
174 | ``cfg01``        | 1st                   | ``172.16.10.11``                |
175 +------------------+-----------------------+---------------------------------+
176 | ``mas01``        | 2nd                   | ``172.16.10.12``                |
177 +------------------+-----------------------+---------------------------------+
178 | ``prx``          | 3rd,                  | ``172.16.10.13``,               |
179 |                  |                       |                                 |
180 | ``prx01``,       | 4th,                  | ``172.16.10.14``,               |
181 | ``prx02``        | 5th                   | ``172.16.10.15``                |
182 +------------------+-----------------------+---------------------------------+
183 | ``gtw01``,       | ...                   | ``...``                         |
184 | ``gtw02``,       |                       |                                 |
185 | ``gtw03``        |                       |                                 |
186 +------------------+-----------------------+---------------------------------+
187 | ``kvm``,         |                       |                                 |
188 |                  |                       |                                 |
189 | ``kvm01``,       |                       |                                 |
190 | ``kvm02``,       |                       |                                 |
191 | ``kvm03``        |                       |                                 |
192 +------------------+-----------------------+---------------------------------+
193 | ``dbs``,         |                       |                                 |
194 |                  |                       |                                 |
195 | ``dbs01``,       |                       |                                 |
196 | ``dbs02``,       |                       |                                 |
197 | ``dbs03``        |                       |                                 |
198 +------------------+-----------------------+---------------------------------+
199 | ``msg``,         |                       |                                 |
200 |                  |                       |                                 |
201 | ``msg01``,       |                       |                                 |
202 | ``msg02``,       |                       |                                 |
203 | ``msg03``        |                       |                                 |
204 +------------------+-----------------------+---------------------------------+
205 | ``mdb``,         |                       |                                 |
206 |                  |                       |                                 |
207 | ``mdb01``,       |                       |                                 |
208 | ``mdb02``,       |                       |                                 |
209 | ``mdb03``        |                       |                                 |
210 +------------------+-----------------------+---------------------------------+
211 | ``ctl``,         |                       |                                 |
212 |                  |                       |                                 |
213 | ``ctl01``,       |                       |                                 |
214 | ``ctl02``,       |                       |                                 |
215 | ``ctl03``        |                       |                                 |
216 +------------------+-----------------------+---------------------------------+
217 | ``odl``,         |                       |                                 |
218 |                  |                       |                                 |
219 | ``odl01``,       |                       |                                 |
220 | ``odl02``,       |                       |                                 |
221 | ``odl03``        |                       |                                 |
222 +------------------+-----------------------+---------------------------------+
223 | ``mon``,         |                       |                                 |
224 |                  |                       |                                 |
225 | ``mon01``,       |                       |                                 |
226 | ``mon02``,       |                       |                                 |
227 | ``mon03``,       |                       |                                 |
228 |                  |                       |                                 |
229 | ``log``,         |                       |                                 |
230 |                  |                       |                                 |
231 | ``log01``,       |                       |                                 |
232 | ``log02``,       |                       |                                 |
233 | ``log03``,       |                       |                                 |
234 |                  |                       |                                 |
235 | ``mtr``,         |                       |                                 |
236 |                  |                       |                                 |
237 | ``mtr01``,       |                       |                                 |
238 | ``mtr02``,       |                       |                                 |
239 | ``mtr03``        |                       |                                 |
240 +------------------+-----------------------+---------------------------------+
241 | ``cmp001``,      |                       |                                 |
242 | ``cmp002``,      |                       |                                 |
243 | ``...``          |                       |                                 |
244 +------------------+-----------------------+---------------------------------+
245
246 Network ``internal``
247 ~~~~~~~~~~~~~~~~~~~~
248
249 .. TIP::
250
251     ``internal`` does not usually use an IP range offset in ``IDF``.
252
253 .. WARNING::
254
255     Default addresses in below table correspond to an ``internal`` CIDR of
256     ``10.1.0.0/24`` (the usual value used in OPNFV labs).
257     This is defined in ``IDF`` and can easily be changed to something else.
258
259 +------------------+------------------------+--------------------------------+
260 | Host             | Offset in IP range     | Default address                |
261 +==================+========================+================================+
262 | ``jumpserver``   | N/A                    | ``10.1.0.1``                   |
263 |                  |                        | (manual assignment, optional)  |
264 +------------------+------------------------+--------------------------------+
265 | ``gtw01``,       | 1st,                   | ``10.1.0.2``,                  |
266 | ``gtw02``,       | 2nd,                   | ``10.1.0.3``,                  |
267 | ``gtw03``        | 3rd                    | ``10.1.0.4``                   |
268 +------------------+------------------------+--------------------------------+
269 | ``cmp001``,      | 4th,                   | ``10.1.0.5``,                  |
270 | ``cmp002``,      | 5th,                   | ``10.1.0.6``,                  |
271 | ``...``          | ...                    | ``...``                        |
272 +------------------+------------------------+--------------------------------+
273
274 Network ``public``
275 ~~~~~~~~~~~~~~~~~~
276
277 .. TIP::
278
279     ``public`` often has an IP range offset defined in ``IDF``.
280
281 .. WARNING::
282
283     Default addresses in below table correspond to a ``public`` IP range of
284     ``172.30.10.100-172.30.10.254`` (one of the used values in OPNFV
285     labs). This is defined in ``IDF`` and can easily be changed to something
286     else. Since the ``jumpserver`` address is manually assigned, this is
287     usually not subject to the IP range restriction in ``IDF``.
288
289 +------------------+------------------------+--------------------------------+
290 | Host             | Offset in IP range     | Default address                |
291 +==================+========================+================================+
292 | ``jumpserver``   | N/A                    | ``172.30.10.72``               |
293 |                  |                        | (manual assignment, optional)  |
294 +------------------+------------------------+--------------------------------+
295 | ``prx``,         | 1st,                   | ``172.30.10.101``,             |
296 |                  |                        |                                |
297 | ``prx01``,       | 2nd,                   | ``172.30.10.102``,             |
298 | ``prx02``        | 3rd                    | ``172.30.10.103``              |
299 +------------------+------------------------+--------------------------------+
300 | ``gtw01``,       | 4th,                   | ``172.30.10.104``,             |
301 | ``gtw02``,       | 5th,                   | ``172.30.10.105``,             |
302 | ``gtw03``        | 6th                    | ``172.30.10.106``              |
303 +------------------+------------------------+--------------------------------+
304 | ``ctl01``,       | ...                    | ``...``                        |
305 | ``ctl02``,       |                        |                                |
306 | ``ctl03``        |                        |                                |
307 +------------------+------------------------+--------------------------------+
308 | ``odl``,         |                        |                                |
309 +------------------+------------------------+--------------------------------+
310 | ``cmp001``,      |                        |                                |
311 | ``cmp002``,      |                        |                                |
312 | ``...``          |                        |                                |
313 +------------------+------------------------+--------------------------------+
314
315 Accessing the Salt Master Node (``cfg01``)
316 ==========================================
317
318 The Salt Master node (``cfg01``) runs a ``sshd`` server listening on
319 ``0.0.0.0:22``.
320
321 To login as ``ubuntu`` user, use the RSA private key ``/var/lib/opnfv/mcp.rsa``:
322
323 .. code-block:: console
324
325     jenkins@jumpserver:~$ ssh -o StrictHostKeyChecking=no \
326                               -i /var/lib/opnfv/mcp.rsa \
327                               -l ubuntu 10.20.0.2
328     ubuntu@cfg01:~$
329
330 .. NOTE::
331
332     User ``ubuntu`` has sudo rights.
333
334 .. TIP::
335
336     The Salt master IP (``10.20.0.2``) is not hard set, it is configurable via
337     ``INSTALLER_IP`` during deployment.
338
339 .. TIP::
340
341     Starting with the ``Gambia`` release, ``cfg01`` is containerized, so this
342     also works (from ``jumpserver`` only):
343
344 .. code-block:: console
345
346     jenkins@jumpserver:~$ docker exec -it fuel bash
347     root@cfg01:~$
348
349 Accessing Cluster Nodes
350 =======================
351
352 Logging in to cluster nodes is possible from the Jumpserver, Salt Master etc.
353
354 .. code-block:: console
355
356     jenkins@jumpserver:~$ ssh -i /var/lib/opnfv/mcp.rsa ubuntu@192.168.11.52
357
358 .. TIP::
359
360     ``/etc/hosts`` on ``cfg01`` has all the cluster hostnames, which can be
361     used instead of IP addresses.
362
363 .. code-block:: console
364
365     root@cfg01:~$ ssh -i ~/fuel/mcp/scripts/mcp.rsa ubuntu@ctl01
366
367 Debugging ``MaaS`` Comissioning/Deployment Issues
368 =================================================
369
370 One of the most common issues when setting up a new POD is ``MaaS`` failing to
371 commission/deploy the nodes, usually timing out after a couple of retries.
372
373 Such failures might indicate misconfiguration in ``PDF``/``IDF``, ``TOR``
374 switch configuration or even faulty hardware.
375
376 Here are a couple of pointers for isolating the problem.
377
378 Accessing the ``MaaS`` Dashboard
379 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
380
381 ``MaaS`` web-based dashboard is available at
382 ``http://<mas01 IP address>:5240/MAAS``, e.g.
383 ``http://172.16.10.12:5240/MAAS``.
384
385 The administrator credentials are ``opnfv``/``opnfv_secret``.
386
387 .. NOTE::
388
389     ``mas01`` VM does not automatically get assigned an IP address in the
390     public network segment. If ``MaaS`` dashboard should be accesiable from
391     the public network, such an address can be manually added to the last
392     VM NIC interface in ``mas01`` (which is already connected to the public
393     network bridge).
394
395 Ensure Commission/Deploy Timeouts Are Not Too Small
396 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
397
398 Some hardware takes longer to boot or to run the initial scripts during
399 commissioning/deployment phases. If that's the case, ``MaaS`` will time out
400 waiting for the process to finish. ``MaaS`` logs will reflect that, and the
401 issue is usually easy to observe on the nodes' serial console - if the node
402 seems to PXE-boot the OS live image, starts executing cloud-init/curtin
403 hooks without spilling critical errors, then it is powered down/shut off,
404 most likely the timeout was hit.
405
406 To access the serial console of a node, see your board manufacturer's
407 documentation. Some hardware no longer has a physical serial connector these
408 days, usually being replaced by a vendor-specific software-based interface.
409
410 If the board supports ``SOL`` (Serial Over LAN) over ``IPMI`` lanplus protocol,
411 a simpler solution to hook to the serial console is to use ``ipmitool``.
412
413 .. TIP::
414
415     Early boot stage output might not be shown over ``SOL``, but only over
416     the video console provided by the (vendor-specific) interface.
417
418 .. code-block:: console
419
420     jenkins@jumpserver:~$ ipmitool -H <host BMC IP> -U <user> -P <pass> \
421                                    -I lanplus sol activate
422
423 To bypass this, simply set a larger timeout in the ``IDF``.
424
425 Check Jumpserver Network Configuration
426 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
427
428 .. code-block:: console
429
430     jenkins@jumpserver:~$ brctl show
431     jenkins@jumpserver:~$ ifconfig -a
432
433 +-----------------------+------------------------------------------------+
434 | Configuration item    | Expected behavior                              |
435 +=======================+================================================+
436 | IP addresses assigned | IP addresses should be assigned to the bridge, |
437 | to bridge ports       | and not to individual bridge ports             |
438 +-----------------------+------------------------------------------------+
439
440 Check Network Connectivity Between Nodes on the Jumpserver
441 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
442
443 ``cfg01`` is a Docker container running on the ``jumpserver``, connected to
444 Docker networks (created by docker-compose automatically on container up),
445 which in turn are connected using veth pairs to their ``libvirt`` managed
446 counterparts.
447
448 For example, the ``mcpcontrol`` network(s) should look like below.
449
450 .. code-block:: console
451
452     jenkins@jumpserver:~$ brctl show mcpcontrol
453     bridge name   bridge id           STP enabled   interfaces
454     mcpcontrol    8000.525400064f77   yes           mcpcontrol-nic
455                                                     veth_mcp0
456                                                     vnet8
457
458     jenkins@jumpserver:~$ docker network ls
459     NETWORK ID    NAME                              DRIVER   SCOPE
460     81a0fdb3bd78  docker-compose_docker-mcpcontrol  macvlan  local
461     [...]
462
463     jenkins@jumpserver:~$ docker network inspect docker-compose_mcpcontrol
464     [
465         {
466             "Name": "docker-compose_mcpcontrol",
467             [...]
468             "Options": {
469                 "parent": "veth_mcp1"
470             },
471         }
472     ]
473
474 Before investigating the rest of the cluster networking configuration, the
475 first thing to check is that ``cfg01`` has network connectivity to other
476 jumpserver hosted nodes, e.g. ``mas01`` and to the jumpserver itself
477 (provided that the jumpserver has an IP address in that particular network
478 segment).
479
480 .. code-block:: console
481
482     jenkins@jumpserver:~$ docker exec -it fuel bash
483     root@cfg01:~# ifconfig -a | grep inet
484         inet addr:10.20.0.2     Bcast:0.0.0.0  Mask:255.255.255.0
485         inet addr:172.16.10.2   Bcast:0.0.0.0  Mask:255.255.255.0
486         inet addr:192.168.11.2  Bcast:0.0.0.0  Mask:255.255.255.0
487
488 For each network of interest (``mcpcontrol``, ``mgmt``, ``PXE/admin``), check
489 that ``cfg01`` can ping the jumpserver IP in that network segment, as well as
490 the ``mas01`` IP in that network.
491
492 .. NOTE::
493
494     ``mcpcontrol`` is set up at VM bringup, so it should always be available,
495     while the other networks are configured by Salt as part of the
496     ``virtual_init`` STATE file.
497
498 .. code-block:: console
499
500     root@cfg01:~# ping -c1 10.20.0.1  # mcpcontrol jumpserver IP
501     root@cfg01:~# ping -c1 10.20.0.3  # mcpcontrol mas01 IP
502
503 .. TIP::
504
505     ``mcpcontrol`` CIDR is configurable via ``INSTALLER_IP`` env var during
506     deployment. However, IP offsets inside that segment are hard set to ``.1``
507     for the jumpserver, ``.2`` for ``cfg01``, respectively to ``.3`` for
508     ``mas01`` node.
509
510 .. code-block:: console
511
512     root@cfg01:~# salt 'mas*' pillar.item --out yaml \
513                   _param:infra_maas_node01_deploy_address \
514                   _param:infra_maas_node01_address
515     mas01.mcp-ovs-noha.local:
516       _param:infra_maas_node01_address: 172.16.10.12
517       _param:infra_maas_node01_deploy_address: 192.168.11.3
518
519     root@cfg01:~# ping -c1 192.168.11.1  # PXE/admin jumpserver IP
520     root@cfg01:~# ping -c1 192.168.11.3  # PXE/admin mas01 IP
521     root@cfg01:~# ping -c1 172.16.10.1   # mgmt jumpserver IP
522     root@cfg01:~# ping -c1 172.16.10.12  # mgmt mas01 IP
523
524 .. TIP::
525
526     Jumpserver IP addresses for ``PXE/admin``, ``mgmt`` and ``public`` bridges
527     are user-chosen and manually set, so above snippets should be adjusted
528     accordingly if the user chose a different IP, other than ``.1`` in each
529     CIDR.
530
531 Alternatively, a quick ``nmap`` scan would work just as well.
532
533 .. code-block:: console
534
535     root@cfg01:~# apt update && apt install -y nmap
536     root@cfg01:~# nmap -sn 10.20.0.0/24     # expected: cfg01, mas01, jumpserver
537     root@cfg01:~# nmap -sn 192.168.11.0/24  # expected: cfg01, mas01, jumpserver
538     root@cfg01:~# nmap -sn 172.16.10.0/24   # expected: cfg01, mas01, jumpserver
539
540 Check ``DHCP`` Reaches Cluster Nodes
541 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
542
543 One common symptom observed during failed commissioning is that ``DHCP`` does
544 not work as expected between cluster nodes (baremetal nodes in the cluster; or
545 virtual machines on the jumpserver in case of ``hybrid`` deployments) and
546 the ``MaaS`` node.
547
548 To confirm or rule out this possibility, monitor the serial console output of
549 one (or more) cluster nodes during ``MaaS`` commissioning. If the node is
550 properly configured to attempt PXE boot, yet it times out waiting for an IP
551 address from ``mas01`` ``DHCP``, it's worth checking that ``DHCP`` packets
552 reach the ``jumpserver``, respectively the ``mas01`` VM.
553
554 .. code-block:: console
555
556     jenkins@jumpserver:~$ sudo apt update && sudo apt install -y dhcpdump
557     jenkins@jumpserver:~$ sudo dhcpdump -i admin_br
558
559 .. TIP::
560
561     If ``DHCP`` requests are present, but no replies are sent, ``iptables``
562     might be interfering on the jumpserver.
563
564 Check ``MaaS`` Logs
565 ~~~~~~~~~~~~~~~~~~~
566
567 If networking looks fine, yet nodes still fail to commission and/or deploy,
568 ``MaaS`` logs might offer more details about the failure:
569
570 * ``/var/log/maas/maas.log``
571 * ``/var/log/maas/rackd.log``
572 * ``/var/log/maas/regiond.log``
573
574 .. TIP::
575
576     If the problem is with the cluster node and not on the ``MaaS`` server,
577     node's kernel logs usually contain useful information.
578     These are saved via rsyslog on the ``mas01`` node in
579     ``/var/log/maas/rsyslog``.
580
581 Recovering Failed Deployments
582 =============================
583
584 The first deploy attempt might fail due to various reasons. If the problem
585 is not systemic (i.e. fixing it will not introduce incompatible configuration
586 changes, like setting a different ``INSTALLER_IP``), the environment is safe
587 to be reused and the deployment process can pick up from where it left off.
588
589 Leveraging these mechanisms requires a minimum understanding of how the
590 deploy process works, at least for manual ``STATE`` runs.
591
592 Automatic (re)deploy
593 ~~~~~~~~~~~~~~~~~~~~
594
595 OPNFV Fuel's ``deploy.sh`` script offers a dedicated argument for this, ``-f``,
596 which will skip executing the first ``N`` ``STATE`` files, where ``N`` is the
597 number of ``-f`` occurrences in the argument list.
598
599 .. TIP::
600
601     The list of ``STATE`` files to be executed for a specific environment
602     depends on the OPNFV scenario chosen, deployment type (``virtual``,
603     ``baremetal`` or ``hybrid``) and the presence/absence of a ``VCP``
604     (virtualized control plane).
605
606 e.g.: Let's consider a ``baremetal`` enviroment, with ``VCP`` and a simple
607 scenario ``os-nosdn-nofeature-ha``, where ``deploy.sh`` failed executing the
608 ``openstack_ha`` ``STATE`` file.
609
610 The simplest redeploy approach (which usually works for **any** combination of
611 deployment type/VCP/scenario) is to issue the same deploy command as the
612 original attempt used, then adding a single ``-f``:
613
614 .. code-block:: console
615
616     jenkins@jumpserver:~/fuel$ ci/deploy.sh -l <lab_name> -p <pod_name> \
617                                             -s <scenario> [...] \
618                                             -f # skips running the virtual_init STATE file
619
620 All ``STATE`` files are re-entrant, so the above is equivalent (but a little
621 slower) to skipping all ``STATE`` files before the ``openstack_ha`` one, like:
622
623 .. code-block:: console
624
625     jenkins@jumpserver:~/fuel$ ci/deploy.sh -l <lab_name> -p <pod_name> \
626                                             -s <scenario> [...] \
627                                             -ffff # skips virtual_init, maas, baremetal_init, virtual_control_plane
628
629 .. TIP::
630
631     For fine tuning the infrastructure setup steps executed during deployment,
632     see also the ``-e`` and ``-P`` deploy arguments.
633
634 .. NOTE::
635
636     On rare occassions, the cluster cannot idempotently be redeployed (e.g.
637     broken MySQL/Galera cluster), in which case some cleanup is due before
638     (re)running the ``STATE`` files. See ``-E`` deploy arg, which allows
639     either forcing a ``MaaS`` node deletion, then redeployment of all
640     baremetal nodes, if used twice (``-EE``); or only erasing the ``VCP`` VMs
641     if used only once (``-E``).
642
643 Manual ``STATE`` Run
644 ~~~~~~~~~~~~~~~~~~~~
645
646 Instead of leveraging the full ``deploy.sh``, one could execute the ``STATE``
647 files one by one (or partially) from the ``cfg01``.
648
649 However, this requires a better understanding of how the list of ``STATE``
650 files to be executed is constructed for a specific scenario, depending on the
651 deployment type and the cluster having baremetal nodes, implemented in:
652
653 * ``mcp/config/scenario/defaults.yaml.j2``
654 * ``mcp/config/scenario/<scenario-name>.yaml``
655
656 e.g.: For the example presented above (baremetal with ``VCP``,
657 ``os-nosdn-nofeature-ha``), the list of ``STATE`` files would be:
658
659 * ``virtual_init``
660 * ``maas``
661 * ``baremetal_init``
662 * ``virtual_control_plane``
663 * ``openstack_ha``
664 * ``networks``
665
666 To execute one (or more) of the remaining ``STATE`` files after a failure:
667
668 .. code-block:: console
669
670     jenkins@jumpserver:~$ docker exec -it fuel bash
671     root@cfg01:~$ cd ~/fuel/mcp/config/states
672     root@cfg01:~/fuel/mcp/config/states$ ./openstack_ha
673     root@cfg01:~/fuel/mcp/config/states$ CI_DEBUG=true ./networks
674
675 For even finer granularity, one can also run the commands in a ``STATE`` file
676 one by one manually, e.g. if the execution failed applying the ``rabbitmq``
677 sls:
678
679 .. code-block:: console
680
681     root@cfg01:~$ salt -I 'rabbitmq:server' state.sls rabbitmq
682
683 Exploring the Cloud with Salt
684 =============================
685
686 To gather information about the cloud, the salt commands can be used.
687 It is based around a master-minion idea where the salt-master pushes config to
688 the minions to execute actions.
689
690 For example tell salt to execute a ping to ``8.8.8.8`` on all the nodes.
691
692 .. code-block:: console
693
694     root@cfg01:~$ salt "*" network.ping 8.8.8.8
695                        ^^^                       target
696                            ^^^^^^^^^^^^          function to execute
697                                         ^^^^^^^  argument passed to the function
698
699 .. TIP::
700
701     Complex filters can be done to the target like compound queries or node roles.
702
703 For more information about Salt see the :ref:`fuel_userguide_references`
704 section.
705
706 Some examples are listed below. Note that these commands are issued from Salt
707 master as ``root`` user.
708
709 View the IPs of All the Components
710 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
711
712 .. code-block:: console
713
714     root@cfg01:~$ salt "*" network.ip_addrs
715     cfg01.mcp-odl-ha.local:
716        - 10.20.0.2
717        - 172.16.10.100
718     mas01.mcp-odl-ha.local:
719        - 10.20.0.3
720        - 172.16.10.3
721        - 192.168.11.3
722     .........................
723
724 View the Interfaces of All the Components and Put the Output in a ``yaml`` File
725 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
726
727 .. code-block:: console
728
729     root@cfg01:~$ salt "*" network.interfaces --out yaml --output-file interfaces.yaml
730     root@cfg01:~# cat interfaces.yaml
731     cfg01.mcp-odl-ha.local:
732      enp1s0:
733        hwaddr: 52:54:00:72:77:12
734        inet:
735        - address: 10.20.0.2
736          broadcast: 10.20.0.255
737          label: enp1s0
738          netmask: 255.255.255.0
739        inet6:
740        - address: fe80::5054:ff:fe72:7712
741          prefixlen: '64'
742          scope: link
743        up: true
744     .........................
745
746 View Installed Packages on MaaS Node
747 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
748
749 .. code-block:: console
750
751     root@cfg01:~# salt "mas*" pkg.list_pkgs
752     mas01.mcp-odl-ha.local:
753         ----------
754         accountsservice:
755             0.6.40-2ubuntu11.3
756         acl:
757             2.2.52-3
758         acpid:
759             1:2.0.26-1ubuntu2
760         adduser:
761             3.113+nmu3ubuntu4
762         anerd:
763             1
764     .........................
765
766 Execute Any Linux Command on All Nodes (e.g. ``ls /var/log``)
767 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
768
769 .. code-block:: console
770
771     root@cfg01:~# salt "*" cmd.run 'ls /var/log'
772     cfg01.mcp-odl-ha.local:
773        alternatives.log
774        apt
775        auth.log
776        boot.log
777        btmp
778        cloud-init-output.log
779        cloud-init.log
780     .........................
781
782 Execute Any Linux Command on Nodes Using Compound Queries Filter
783 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
784
785 .. code-block:: console
786
787     root@cfg01:~# salt -C '* and cfg01*' cmd.run 'ls /var/log'
788     cfg01.mcp-odl-ha.local:
789        alternatives.log
790        apt
791        auth.log
792        boot.log
793        btmp
794        cloud-init-output.log
795        cloud-init.log
796     .........................
797
798 Execute Any Linux Command on Nodes Using Role Filter
799 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
800
801 .. code-block:: console
802
803     root@cfg01:~# salt -I 'nova:compute' cmd.run 'ls /var/log'
804     cmp001.mcp-odl-ha.local:
805        alternatives.log
806        apache2
807        apt
808        auth.log
809        btmp
810        ceilometer
811        cinder
812        cloud-init-output.log
813        cloud-init.log
814     .........................
815
816 Accessing Openstack
817 ===================
818
819 Once the deployment is complete, Openstack CLI is accessible from controller
820 VMs (``ctl01`` ... ``ctl03``).
821
822 Openstack credentials are at ``/root/keystonercv3``.
823
824 .. code-block:: console
825
826     root@ctl01:~# source keystonercv3
827     root@ctl01:~# openstack image list
828     +--------------------------------------+-----------------------------------------------+--------+
829     | ID                                   | Name                                          | Status |
830     +======================================+===============================================+========+
831     | 152930bf-5fd5-49c2-b3a1-cae14973f35f | CirrosImage                                   | active |
832     | 7b99a779-78e4-45f3-9905-64ae453e3dcb | Ubuntu16.04                                   | active |
833     +--------------------------------------+-----------------------------------------------+--------+
834
835 The OpenStack Dashboard, Horizon, is available at ``http://<proxy public VIP>``.
836 The administrator credentials are ``admin``/``opnfv_secret``.
837
838 .. figure:: img/horizon_login.png
839     :width: 60%
840     :align: center
841
842 A full list of IPs/services is available at ``<proxy public VIP>:8090`` for
843 ``baremetal`` deploys.
844
845 .. figure:: img/salt_services_ip.png
846     :width: 60%
847     :align: center
848
849 Guest Operating System Support
850 ==============================
851
852 There are a number of possibilities regarding the guest operating systems
853 which can be spawned on the nodes.
854 The current system spawns virtual machines for VCP VMs on the KVM nodes and VMs
855 requested by users in OpenStack compute nodes. Currently the system supports
856 the following ``UEFI``-images for the guests:
857
858 +------------------+-------------------+--------------------+
859 | OS name          | ``x86_64`` status | ``aarch64`` status |
860 +==================+===================+====================+
861 | Ubuntu 17.10     | untested          | Full support       |
862 +------------------+-------------------+--------------------+
863 | Ubuntu 16.04     | Full support      | Full support       |
864 +------------------+-------------------+--------------------+
865 | Ubuntu 14.04     | untested          | Full support       |
866 +------------------+-------------------+--------------------+
867 | Fedora atomic 27 | untested          | Full support       |
868 +------------------+-------------------+--------------------+
869 | Fedora cloud 27  | untested          | Full support       |
870 +------------------+-------------------+--------------------+
871 | Debian           | untested          | Full support       |
872 +------------------+-------------------+--------------------+
873 | Centos 7         | untested          | Not supported      |
874 +------------------+-------------------+--------------------+
875 | Cirros 0.3.5     | Full support      | Full support       |
876 +------------------+-------------------+--------------------+
877 | Cirros 0.4.0     | Full support      | Full support       |
878 +------------------+-------------------+--------------------+
879
880 The above table covers only ``UEFI`` images and implies ``OVMF``/``AAVMF``
881 firmware on the host. An ``x86_64`` deployment also supports ``non-UEFI``
882 images, however that choice is up to the underlying hardware and the
883 administrator to make.
884
885 The images for the above operating systems can be found in their respective
886 websites.
887
888 OpenStack Storage
889 =================
890
891 OpenStack Cinder is the project behind block storage in OpenStack and OPNFV
892 Fuel supports LVM out of the box.
893
894 By default ``x86_64`` supports 2 additional block storage devices, while
895 ``aarch64`` supports only one.
896
897 More devices can be supported if the OS-image created has additional
898 properties allowing block storage devices to be spawned as ``SCSI`` drives.
899 To do this, add the properties below to the server:
900
901 .. code-block:: console
902
903     root@ctl01:~$ openstack image set --property hw_disk_bus='scsi' \
904                                       --property hw_scsi_model='virtio-scsi' \
905                                       <image>
906
907 The choice regarding which bus to use for the storage drives is an important
908 one. ``virtio-blk`` is the default choice for OPNFV Fuel, which attaches the
909 drives in ``/dev/vdX``. However, since we want to be able to attach a
910 larger number of volumes to the virtual machines, we recommend the switch to
911 ``SCSI`` drives which are attached in ``/dev/sdX`` instead.
912
913 ``virtio-scsi`` is a little worse in terms of performance but the ability to
914 add a larger number of drives combined with added features like ZFS, Ceph et
915 al, leads us to suggest the use of ``virtio-scsi`` in OPNFV Fuel for both
916 architectures.
917
918 More details regarding the differences and performance of ``virtio-blk`` vs
919 ``virtio-scsi`` are beyond the scope of this manual but can be easily found
920 in other sources online like `VirtIO SCSI`_ or `VirtIO performance`_.
921
922 Additional configuration for configuring images in OpenStack can be found in
923 the OpenStack Glance documentation.
924
925 OpenStack Endpoints
926 ===================
927
928 For each OpenStack service three endpoints are created: ``admin``, ``internal``
929 and ``public``.
930
931 .. code-block:: console
932
933     ubuntu@ctl01:~$ openstack endpoint list --service keystone
934     +----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------------+
935     | ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                          |
936     +----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------------+
937     | 008fec57922b4e9e8bf02c770039ae77 | RegionOne | keystone     | identity     | True    | internal  | http://172.16.10.26:5000/v3  |
938     | 1a1f3c3340484bda9ef7e193f50599e6 | RegionOne | keystone     | identity     | True    | admin     | http://172.16.10.26:35357/v3 |
939     | b0a47d42d0b6491b995d7e6230395de8 | RegionOne | keystone     | identity     | True    | public    | https://10.0.15.2:5000/v3    |
940     +----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------------+
941
942 MCP sets up all Openstack services to talk to each other over unencrypted
943 connections on the internal management network. All admin/internal endpoints
944 use plain http, while the public endpoints are https connections terminated
945 via nginx at the ``VCP`` proxy VMs.
946
947 To access the public endpoints an SSL certificate has to be provided. For
948 convenience, the installation script will copy the required certificate
949 to the ``cfg01`` node at ``/etc/ssl/certs/os_cacert``.
950
951 Copy the certificate from the ``cfg01`` node to the client that will access
952 the https endpoints and place it under ``/etc/ssl/certs/``.
953 The SSL connection will be established automatically after.
954
955 .. code-block:: console
956
957     jenkins@jumpserver:~$ ssh -o StrictHostKeyChecking=no -i /var/lib/opnfv/mcp.rsa -l ubuntu 10.20.0.2 \
958       "cat /etc/ssl/certs/os_cacert" | sudo tee /etc/ssl/certs/os_cacert
959
960 Reclass Model Viewer Tutorial
961 =============================
962
963 In order to get a better understanding of the ``reclass`` model Fuel uses, the
964 `reclass-doc`_ tool can be used to visualise the ``reclass`` model.
965
966 To avoid installing packages on the ``jumpserver`` or another host, the
967 ``cfg01`` Docker container can be used. Since the ``fuel`` git repository
968 located on the ``jumpserver`` is already mounted inside ``cfg01`` container,
969 the results can be visualized using a web browser on the ``jumpserver`` at the
970 end of the procedure.
971
972 .. code-block:: console
973
974     jenkins@jumpserver:~$ docker exec -it fuel bash
975     root@cfg01:~$ apt-get update
976     root@cfg01:~$ apt-get install -y npm nodejs
977     root@cfg01:~$ npm install -g reclass-doc
978     root@cfg01:~$ ln -s /usr/bin/nodejs /usr/bin/node
979     root@cfg01:~$ reclass-doc --output ~/fuel/mcp/reclass/modeler \
980                                        ~/fuel/mcp/reclass
981
982 The generated documentation should be available on the ``jumpserver`` inside
983 ``fuel`` git repo subpath ``mcp/reclass/modeler/index.html``.
984
985 .. figure:: img/reclass_doc.png
986     :width: 60%
987     :align: center
988
989 .. _fuel_userguide_references:
990
991 References
992 ==========
993
994 #. :ref:`OPNFV Fuel Installation Instruction <fuel-installation>`
995 #. `Saltstack Documentation`_
996 #. `Saltstack Formulas`_
997 #. `VirtIO performance`_
998 #. `VirtIO SCSI`_
999
1000 .. _`Saltstack Documentation`: https://docs.saltstack.com/en/latest/topics/
1001 .. _`Saltstack Formulas`: https://salt-formulas.readthedocs.io/en/latest/
1002 .. _`VirtIO performance`: https://mpolednik.github.io/2017/01/23/virtio-blk-vs-virtio-scsi/
1003 .. _`VirtIO SCSI`: https://www.ovirt.org/develop/release-management/features/storage/virtio-scsi/
1004 .. _`reclass-doc`: https://github.com/jirihybek/reclass-doc