summaryrefslogtreecommitdiff
path: root/doc/source/admin/drivers/idrac.rst
blob: a8d157ec801af4199f5ab30ca461fa3796347e6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
============
iDRAC driver
============

Overview
========

The integrated Dell Remote Access Controller (iDRAC_) is an out-of-band
management platform on Dell EMC servers, and is supported directly by
the ``idrac`` hardware type. This driver uses the Dell Web Services for
Management (WSMAN) protocol and the standard Distributed Management Task
Force (DMTF) Redfish protocol to perform all of its functions.

iDRAC_ hardware is also supported by the generic ``ipmi`` and ``redfish``
hardware types, though with smaller feature sets.

Key features of the Dell iDRAC driver include:

* Out-of-band node inspection
* Boot device management and firmware management
* Power management
* RAID controller management and RAID volume configuration
* BIOS settings configuration

Ironic Features
---------------

The ``idrac`` hardware type supports the following Ironic interfaces:

* `BIOS Interface`_: BIOS management
* `Inspect Interface`_: Hardware inspection
* `Management Interface`_: Boot device and firmware management
* Power Interface: Power management
* `RAID Interface`_: RAID controller and disk management
* `Vendor Interface`_: BIOS management (WSMAN) and eject virtual media
  (Redfish)

Prerequisites
-------------

The ``idrac`` hardware type requires the ``python-dracclient`` library
to be installed on the ironic conductor node(s) if an Ironic node is
configured to use an ``idrac-wsman`` interface implementation, for example::

    sudo pip install 'python-dracclient>=3.1.0'

Additionally, the ``idrac`` hardware type requires the ``sushy`` library
to be installed on the ironic conductor node(s) if an Ironic node is
configured to use an ``idrac-redfish`` interface implementation, for example::

   sudo pip install 'python-dracclient>=3.1.0' 'sushy>=2.0.0'

Enabling
--------

The iDRAC driver supports WSMAN for the bios, inspect, management, power,
raid, and vendor interfaces. In addition, it supports Redfish for
the bios, inspect, management, power, and raid interfaces. The iDRAC driver
allows you to mix and match WSMAN and Redfish interfaces.

The ``idrac-wsman`` implementation must be enabled to use WSMAN for
an interface. The ``idrac-redfish`` implementation must be enabled
to use Redfish for an interface.

To enable the ``idrac`` hardware type with the minimum interfaces,
all using WSMAN, add the following to your ``/etc/ironic/ironic.conf``:

.. code-block:: ini

    [DEFAULT]
    enabled_hardware_types=idrac
    enabled_management_interfaces=idrac-wsman
    enabled_power_interfaces=idrac-wsman

To enable all optional features (BIOS, inspection, RAID, and vendor passthru)
using Redfish where it is supported and WSMAN where not, use the
following configuration:

.. code-block:: ini

    [DEFAULT]
    enabled_hardware_types=idrac
    enabled_bios_interfaces=idrac-redfish
    enabled_inspect_interfaces=idrac-redfish
    enabled_management_interfaces=idrac-redfish
    enabled_power_interfaces=idrac-redfish
    enabled_raid_interfaces=idrac-redfish
    enabled_vendor_interfaces=idrac-redfish

Below is the list of supported interface implementations in priority
order:

================     ===================================================
Interface            Supported Implementations
================     ===================================================
``bios``             ``idrac-wsman``, ``idrac-redfish``, ``no-bios``
``boot``             ``ipxe``, ``pxe``, ``idrac-redfish-virtual-media``
``console``          ``no-console``
``deploy``           ``direct``, ``ansible``, ``ramdisk``
``inspect``          ``idrac-wsman``, ``idrac``, ``idrac-redfish``,
                     ``inspector``, ``no-inspect``
``management``       ``idrac-wsman``, ``idrac``, ``idrac-redfish``
``network``          ``flat``, ``neutron``, ``noop``
``power``            ``idrac-wsman``, ``idrac``, ``idrac-redfish``
``raid``             ``idrac-wsman``, ``idrac``, ``idrac-redfish``, ``no-raid``
``rescue``           ``no-rescue``, ``agent``
``storage``          ``noop``, ``cinder``, ``external``
``vendor``           ``idrac-wsman``, ``idrac``, ``idrac-redfish``,
                     ``no-vendor``
================     ===================================================

.. NOTE::
   ``idrac`` is the legacy name of the WSMAN interface. It has been
   deprecated in favor of ``idrac-wsman`` and may be removed in a
   future release.

Protocol-specific Properties
----------------------------

The WSMAN and Redfish protocols require different properties to be specified
in the Ironic node's ``driver_info`` field to communicate with the bare
metal system's iDRAC.

The WSMAN protocol requires the following properties:

* ``drac_username``: The WSMAN user name to use when communicating
  with the iDRAC. Usually ``root``.
* ``drac_password``: The password for the WSMAN user to use when
  communicating with the iDRAC.
* ``drac_address``: The IP address of the iDRAC.

The Redfish protocol requires the following properties:

* ``redfish_username``: The Redfish user name to use when
  communicating with the iDRAC. Usually ``root``.
* ``redfish_password``: The password for the Redfish user to use
  when communicating with the iDRAC.
* ``redfish_address``: The URL address of the iDRAC. It must include the
  authority portion of the URL, and can optionally include the scheme. If
  the scheme is missing, https is assumed.
* ``redfish_system_id``: The Redfish ID of the server to be
  managed. This should always be: ``/redfish/v1/Systems/System.Embedded.1``.

For other Redfish protocol parameters see :doc:`/admin/drivers/redfish`.

If using only interfaces which use WSMAN (``idrac-wsman``), then only
the WSMAN properties must be supplied. If using only interfaces which
use Redfish (``idrac-redfish``), then only the Redfish properties must be
supplied. If using a mix of interfaces, where some use WSMAN and others
use Redfish, both the WSMAN and Redfish properties must be supplied.

Enrolling
---------

The following command enrolls a bare metal node with the ``idrac``
hardware type using WSMAN for all interfaces:

.. code-block:: bash

    baremetal node create --driver idrac \
        --driver-info drac_username=user \
        --driver-info drac_password=pa$$w0rd \
        --driver-info drac_address=drac.host

The following command enrolls a bare metal node with the ``idrac``
hardware type using Redfish for all interfaces:

.. code-block:: bash

    baremetal node create --driver idrac \
        --driver-info redfish_username=user \
        --driver-info redfish_password=pa$$w0rd \
        --driver-info redfish_address=drac.host \
        --driver-info redfish_system_id=/redfish/v1/Systems/System.Embedded.1 \
        --bios-interface idrac-redfish \
        --inspect-interface idrac-redfish \
        --management-interface idrac-redfish \
        --power-interface idrac-redfish \
        --raid-interface idrac-redfish \
        --vendor-interface idrac-redfish

The following command enrolls a bare metal node with the ``idrac``
hardware type assuming a mix of Redfish and WSMAN interfaces are used:

.. code-block:: bash

    baremetal node create --driver idrac \
        --driver-info drac_username=user \
        --driver-info drac_password=pa$$w0rd
        --driver-info drac_address=drac.host \
        --driver-info redfish_username=user \
        --driver-info redfish_password=pa$$w0rd \
        --driver-info redfish_address=drac.host \
        --driver-info redfish_system_id=/redfish/v1/Systems/System.Embedded.1 \
        --bios-interface idrac-redfish \
        --inspect-interface idrac-redfish \
        --management-interface idrac-redfish \
        --power-interface idrac-redfish

.. NOTE::
   If using WSMAN for the management interface, then WSMAN must be  used
   for the power interface. The same applies to Redfish. It is currently not
   possible to use Redfish for one and WSMAN for the other.

BIOS Interface
==============

The BIOS interface implementations supported by the ``idrac`` hardware type
allows BIOS to be configured with the standard clean/deploy step approach.

Example
-------
A clean step to enable ``Virtualization`` and ``SRIOV`` in BIOS of an iDRAC
BMC would be as follows::

  {
    "target":"clean",
    "clean_steps": [
      {
        "interface": "bios",
        "step": "apply_configuration",
        "args": {
          "settings": [
            {
              "name": "ProcVirtualization",
              "value": "Enabled"
            },
            {
              "name": "SriovGlobalEnable",
              "value": "Enabled"
            }
          ]
        }
      }
    ]
  }

See the `Known Issues`_ for a known issue with ``factory_reset`` clean step.
For additional details of BIOS configuration, see :doc:`/admin/bios`.

Inspect Interface
=================

The Dell iDRAC out-of-band inspection process catalogs all the same
attributes of the server as the IPMI driver. Unlike IPMI, it does this
without requiring the system to be rebooted, or even to be powered on.
Inspection is performed using the Dell WSMAN or Redfish protocol directly
without affecting the operation of the system being inspected.

The inspection discovers the following properties:

* ``cpu_arch``: cpu architecture
* ``cpus``: number of cpus
* ``local_gb``: disk size in gigabytes
* ``memory_mb``: memory size in megabytes

Extra capabilities:

* ``boot_mode``: UEFI or BIOS boot mode.
* ``pci_gpu_devices``: number of GPU devices connected to the bare metal.

It also creates baremetal ports for each NIC port detected in the system.
The ``idrac-wsman`` inspect interface discovers which NIC ports are
configured to PXE boot and sets ``pxe_enabled`` to ``True`` on those ports.
The ``idrac-redfish`` inspect interface does not currently set ``pxe_enabled``
on the ports. The user should ensure that ``pxe_enabled`` is set correctly on
the ports following inspection with the ``idrac-redfish`` inspect interface.

Management Interface
====================

The management interface for ``idrac-redfish`` supports:

* updating firmware on nodes using a manual cleaning step. See
  :doc:`/admin/drivers/redfish` for more information on firmware update
  support.
* updating system and getting its inventory using configuration molds. For more
  information see `Import and export configuration`_.


Import and export configuration
-------------------------------

The clean and deploy steps provided in this section allow to configure the
system and collect the system inventory using configuration mold files.

The introduction of this feature in the Wallaby release is experimental.

These steps are:

* ``export_configuration`` with the ``export_configuration_location`` input
  parameter to export the configuration from the existing system.
* ``import_configuration`` with the ``import_configuration_location`` input
  parameter to import the existing configuration mold into the system.
* ``import_export_configuration`` with the ``export_configuration_location``
  and ``import_configuration_location`` input parameters. This step combines
  the previous two steps into one step that first imports existing
  configuration mold into system, then exports the resulting configuration.

The input parameters provided include the URL where the configuration mold is
to be stored after the export, or the reference location for an import. For
more information on setting up storage and available options see
`Storage setup`_.

Configuration molds are JSON files that contain three top-level sections:
``bios``, ``raid`` and ``oem``. The following is an example of a configuration
mold:

.. code-block::

  {
    "bios": {
      "reset": false,
      "settings": [
        {
          "name": "ProcVirtualization",
          "value": "Enabled"
        },
        {
          "name": "MemTest",
          "value": "Disabled"
        }
      ]
    }
    "raid": {
      "create_nonroot_volumes": true,
      "create_root_volume": true,
      "delete_existing": false,
      "target_raid_config": {
        "logical_disks": [
          {
            "size_gb": 50,
            "raid_level": "1+0",
            "controller": "RAID.Integrated.1-1",
            "volume_name": "root_volume",
            "is_root_volume": true,
            "physical_disks": [
              "Disk.Bay.0:Encl.Int.0-1:RAID.Integrated.1-1",
              "Disk.Bay.1:Encl.Int.0-1:RAID.Integrated.1-1"
            ]
          },
          {
            "size_gb": 100,
            "raid_level": "5",
            "controller": "RAID.Integrated.1-1",
            "volume_name": "data_volume",
            "physical_disks": [
              "Disk.Bay.2:Encl.Int.0-1:RAID.Integrated.1-1",
              "Disk.Bay.3:Encl.Int.0-1:RAID.Integrated.1-1",
              "Disk.Bay.4:Encl.Int.0-1:RAID.Integrated.1-1"
            ]
          }
        ]
      }
    }
    "oem": {
      "interface": "idrac-redfish",
      "data": {
        "SystemConfiguration": {
          "Model": "PowerEdge R640",
          "ServiceTag": "8CY9Z99",
          "TimeStamp": "Fri Jun 26 08:43:15 2020",
          "Components": [
            {
              [...]
              "FQDD": "NIC.Slot.1-1-1",
              "Attributes": [
                {
                "Name": "BlnkLeds",
                "Value": "15",
                "Set On Import": "True",
                "Comment": "Read and Write"
                },
                {
                "Name": "VirtMacAddr",
                "Value": "00:00:00:00:00:00",
                "Set On Import": "False",
                "Comment": "Read and Write"
                },
                {
                "Name": "VirtualizationMode",
                "Value": "NONE",
                "Set On Import": "True",
                "Comment": "Read and Write"
                },
              [...]
              ]
            }
          ]
        }
    }
  }

Currently, the OEM section is the only section that is supported. The OEM
section uses the iDRAC Server Configuration Profile (SCP) and can be edited as
necessary if it complies with the SCP. For more information about SCP and its
capabilities, see SCP_Reference_Guide_.

.. NOTE::
   iDRAC BMC connection settings are not exported to avoid overwriting these in
   another system when using unmodified exported configuration mold in import
   step. If need to replicate iDRAC BMC connection settings, then add these
   settings manually to configuration mold for import step.

To replicate the system configuration to that of a similar system, perform the
following steps:

#. Configure a golden, or one to many, system.
#. Use the ``export_configuration`` step to export the configuration to the
   wanted location.
#. Adjust the exported configuration mold for other systems to replicate. For
   example, remove sections that do not need to be replicated such as iDRAC
   connection settings. The configuration mold can be accessed directly from
   the storage location.
#. Import the selected configuration mold into the other systems using the
   ``import_configuration`` step.

It is not mandatory to use ``export_configuration`` step to create a
configuration mold. Upload the file to a designated storage location without
using Ironic if it has been created manually or by other means.

Storage setup
^^^^^^^^^^^^^

To start using these steps, configure the storage location. The settings can be
found in the ``[molds]`` section. Configure the storage type from the
``[molds]storage`` setting. Currently, ``swift``, which is enabled by default,
and ``http`` are supported.

In the setup input parameters, the complete HTTP URL is used. This requires
that the containers (for ``swift``) and the directories (for ``http``) are
created beforehand, and that read/write access is configured accordingly.

.. NOTE::
  Use of TLS is strongly advised.

This setup configuration allows a user to access these locations outside of
Ironic to list, create, update, and delete the configuration molds.

For more information see `Swift configuration`_ and `HTTP configuration`_.

Swift configuration
~~~~~~~~~~~~~~~~~~~

To use Swift with configuration molds,

#. Create the containers to be used for configuration mold storage.
#. For Ironic Swift user that is configured in the ``[swift]`` section add
   read/write access to these containers.

HTTP configuration
~~~~~~~~~~~~~~~~~~

To use HTTP server with configuration molds,

#. Enable HTTP PUT support.
#. Create the directory to be used for the configuration mold storage.
#. Configure read/write access for HTTP Basic access authentication and provide
   user credentials in ``[molds]user`` and ``[molds]password`` fields.

The HTTP web server does not support multitenancy and is intended to be used in
a stand-alone Ironic, or single-tenant OpenStack environment.

RAID Interface
==============

See :doc:`/admin/raid` for more information on Ironic RAID support.

RAID interface of ``redfish`` hardware type can be used on iDRAC systems.
Compared to ``redfish`` RAID interface, using ``idrac-redfish`` adds:

* Waiting for real-time operations to be available on RAID controllers. When
  using ``redfish`` this is not guaranteed and reboots might be intermittently
  required to complete,
* Converting non-RAID disks to RAID mode if there are any,
* Clearing foreign configuration, if any, after deleting virtual disks.

The following properties are supported by the iDRAC WSMAN and Redfish RAID
interface implementation:

.. NOTE::
  When using ``idrac-redfish`` for RAID interface iDRAC firmware greater than
  4.40.00.00 is required.

Mandatory properties
--------------------

* ``size_gb``: Size in gigabytes (integer) for the logical disk. Use ``MAX`` as
  ``size_gb`` if this logical disk is supposed to use the rest of the space available.
* ``raid_level``: RAID level for the logical disk. Valid values are
  ``0``, ``1``, ``5``, ``6``, ``1+0``, ``5+0`` and ``6+0``.

.. NOTE::
  ``JBOD`` and ``2`` are not supported, and will fail with reason: 'Cannot
  calculate spans for RAID level.'

Optional properties
-------------------

* ``is_root_volume``: Optional. Specifies whether this disk is a root volume.
  By default, this is ``False``.
* ``volume_name``: Optional. Name of the volume to be created. If this is not
  specified, it will be auto-generated.

Backing physical disk hints
---------------------------

See :doc:`/admin/raid` for more information on backing disk hints.

These are machine-independent information. The hints are specified for each
logical disk to help Ironic find the desired disks for RAID configuration.

* ``disk_type``
* ``interface_type``
* ``share_physical_disks``
* ``number_of_physical_disks``

Backing physical disks
----------------------

These are Dell RAID controller-specific values and must match the
names provided by the iDRAC.

* ``controller``: Mandatory. The name of the controller to use.
* ``physical_disks``: Optional. The names of the physical disks to use.

.. NOTE::
  ``physical_disks`` is a mandatory parameter if the property ``size_gb`` is set to ``MAX``.

Examples
--------

Creation of RAID ``1+0`` logical disk with six disks on one controller:

.. code-block:: json

  { "logical_disks":
    [ { "controller": "RAID.Integrated.1-1",
        "is_root_volume": "True",
        "physical_disks": [
          "Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1",
          "Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1",
          "Disk.Bay.2:Enclosure.Internal.0-1:RAID.Integrated.1-1",
          "Disk.Bay.3:Enclosure.Internal.0-1:RAID.Integrated.1-1",
          "Disk.Bay.4:Enclosure.Internal.0-1:RAID.Integrated.1-1",
          "Disk.Bay.5:Enclosure.Internal.0-1:RAID.Integrated.1-1"],
        "raid_level": "1+0",
        "size_gb": "MAX"}]}


Manual RAID Invocation
----------------------

The following command can be used to delete any existing RAID configuration.
It deletes all virtual disks/RAID volumes, unassigns all global and dedicated
hot spare physical disks, and clears foreign configuration:

.. code-block:: bash

  baremetal node clean --clean-steps \
    '[{"interface": "raid", "step": "delete_configuration"}]' ${node_uuid}


The following command shows an example of how to set the target RAID
configuration:

.. code-block:: bash

  baremetal node set --target-raid-config '{ "logical_disks":
    [ { "controller": "RAID.Integrated.1-1",
        "is_root_volume": true,
        "physical_disks": [
          "Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1",
          "Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1"],
        "raid_level": "0",
        "size_gb": "MAX"}]}' ${node_uuid}


The following command can be used to create a RAID configuration:

.. code-block:: bash

  baremetal node clean --clean-steps \
    '[{"interface": "raid", "step": "create_configuration"}]' <node>


When the physical disk names or controller names are not known, the
following Python code example shows how the ``python-dracclient`` can
be used to fetch the information directly from the Dell bare metal:

.. code-block:: python

  import dracclient.client


  client = dracclient.client.DRACClient(
      host="192.168.1.1",
      username="root",
      password="calvin")
  controllers = client.list_raid_controllers()
  print(controllers)

  physical_disks = client.list_physical_disks()
  print(physical_disks)

Or using ``sushy`` with Redfish:

.. code-block:: python

  import sushy


  client = sushy.Sushy('https://192.168.1.1', username='root', password='calvin', verify=False)
  for s in client.get_system_collection().get_members():
    print("System: %(id)s" % {'id': s.identity})
    for c in system1.storage.get_members():
        print("\tController: %(id)s" % {'id': c.identity})
        for d in c.drives:
          print("\t\tDrive: %(id)s" % {'id': d.identity})

Vendor Interface
================

idrac-wsman
-----------

Dell iDRAC BIOS management is available through the Ironic WSMAN vendor
passthru interface.

========================  ============   ======================================
Method Name               HTTP Method    Description
========================  ============   ======================================
``abandon_bios_config``   ``DELETE``     Abandon a BIOS configuration job.
``commit_bios_config``    ``POST``       Commit a BIOS configuration job
                                         submitted through ``set_bios_config``.
                                         Required argument: ``reboot`` -
                                         indicates whether a reboot job
                                         should be automatically created
                                         with the config job. Returns a
                                         dictionary containing the ``job_id``
                                         key with the ID of the newly created
                                         config job, and the
                                         ``reboot_required`` key indicating
                                         whether the node needs to be rebooted
                                         to execute the config job.
``get_bios_config``       ``GET``        Returns a dictionary containing the
                                         node's BIOS settings.
``list_unfinished_jobs``  ``GET``        Returns a dictionary containing
                                         the key ``unfinished_jobs``; its value
                                         is a list of dictionaries. Each
                                         dictionary represents an unfinished
                                         config job object.
``set_bios_config``       ``POST``       Change the BIOS configuration on
                                         a node. Required argument: a
                                         dictionary of {``AttributeName``:
                                         ``NewValue``}. Returns a dictionary
                                         containing the ``is_commit_required``
                                         key indicating whether
                                         ``commit_bios_config`` needs to be
                                         called to apply the changes and the
                                         ``is_reboot_required`` value
                                         indicating whether the server must
                                         also be rebooted. Possible values are
                                         ``true`` and ``false``.
========================  ============   ======================================


Examples
^^^^^^^^

Get BIOS Config
~~~~~~~~~~~~~~~

.. code-block:: bash

  baremetal node passthru call --http-method GET <node> get_bios_config

Snippet of output showing virtualization enabled:

.. code-block:: json

  {"ProcVirtualization": {
        "current_value": "Enabled",
        "instance_id": "BIOS.Setup.1-1:ProcVirtualization",
        "name": "ProcVirtualization",
        "pending_value": null,
        "possible_values": [
            "Enabled",
            "Disabled"],
        "read_only": false }}

There are a number of items to note from the above snippet:

* ``name``: this is the name to use in a call to ``set_bios_config``.
* ``current_value``: the current state of the setting.
* ``pending_value``: if the value has been set, but not yet committed,
  the new value is shown here. The change can either be committed or
  abandoned.
* ``possible_values``: shows a list of valid values which can be used
  in a call to ``set_bios_config``.
* ``read_only``: indicates if the value is capable of being changed.

Set BIOS Config
~~~~~~~~~~~~~~~

.. code-block:: bash

  baremetal node passthru call <node> set_bios_config --arg "name=value"


Walkthrough of perfoming a BIOS configuration change:

The following section demonstrates how to change BIOS configuration settings,
detect that a commit and reboot are required, and act on them accordingly. The
two properties that are being changed are:

* Enable virtualization technology of the processor
* Globally enable SR-IOV

.. code-block:: bash

  baremetal node passthru call <node> set_bios_config \
    --arg "ProcVirtualization=Enabled" \
    --arg "SriovGlobalEnable=Enabled"

This returns a dictionary indicating what actions are required next:

.. code-block:: json

  {
    "is_reboot_required": true,
    "is_commit_required": true
  }


Commit BIOS Changes
~~~~~~~~~~~~~~~~~~~

The next step is to commit the pending change to the BIOS. Note that in this
example, the ``reboot`` argument is set to ``true``. The response indicates
that a reboot is no longer required as it has been scheduled automatically
by the ``commit_bios_config`` call. If the reboot argument is not supplied,
the job is still created, however it remains in the ``scheduled`` state
until a reboot is performed. The reboot can be initiated through the
Ironic power API.

.. code-block:: bash

  baremetal node passthru call <node> commit_bios_config \
    --arg "reboot=true"

.. code-block:: json

  {
    "job_id": "JID_499377293428",
    "reboot_required": false
  }

The state of any executing job can be queried:

.. code-block:: bash

  baremetal node passthru call --http-method GET <node> list_unfinished_jobs


.. code-block:: json

  {"unfinished_jobs":
      [{"status": "Scheduled",
        "name": "ConfigBIOS:BIOS.Setup.1-1",
        "until_time": "TIME_NA",
        "start_time": "TIME_NOW",
        "message": "Task successfully scheduled.",
        "percent_complete": "0",
        "id": "JID_499377293428"}]}


Abandon BIOS Changes
~~~~~~~~~~~~~~~~~~~~

Instead of committing, a pending change can be abandoned:

.. code-block:: bash

  baremetal node passthru call --http-method DELETE <node> abandon_bios_config

The abandon command does not provide a response body.


Change Boot Mode
^^^^^^^^^^^^^^^^

The boot mode of the iDRAC can be changed to:

* BIOS - Also called legacy or traditional boot mode. The BIOS initializes the
  system’s processors, memory, bus controllers, and I/O devices. After
  initialization is complete, the BIOS passes control to operating system (OS)
  software. The OS loader uses basic services provided by the system BIOS to
  locate and load OS modules into system memory. After booting the system, the
  BIOS and embedded management controllers execute system management
  algorithms, which monitor and optimize the condition of the underlying
  hardware. BIOS configuration settings enable fine-tuning of the
  performance, power management, and reliability features of the system.
* UEFI - The Unified Extensible Firmware Interface does not change the
  traditional purposes of the system BIOS. To a large extent, a UEFI-compliant
  BIOS performs the same initialization, boot, configuration, and management
  tasks as a traditional BIOS. However, UEFI does change the interfaces and
  data structures the BIOS uses to interact with I/O device firmware and
  operating system software. The primary intent of UEFI is to eliminate
  shortcomings in the traditional BIOS environment, enabling system firmware to
  continue scaling with industry trends.

The UEFI boot mode offers:

* Improved partitioning scheme for boot media
* Support for media larger than 2 TB
* Redundant partition tables
* Flexible handoff from BIOS to OS
* Consolidated firmware user interface
* Enhanced resource allocation for boot device firmware

The boot mode can be changed via the WSMAN vendor passthru interface as
follows:

.. code-block:: bash

  baremetal node passthru call <node> set_bios_config \
    --arg "BootMode=Uefi"

  baremetal node passthru call <node> commit_bios_config \
    --arg "reboot=true"

.. code-block:: bash

  baremetal node passthru call <node> set_bios_config \
    --arg "BootMode=Bios"

  baremetal node passthru call <node> commit_bios_config \
    --arg "reboot=true"

idrac-redfish
-------------

Through the ``idrac-redfish`` vendor passthru interface these methods are
available:

================  ============   ==============================================
Method Name       HTTP Method    Description
================  ============   ==============================================
``eject_media``   ``POST``       Eject a virtual media device. If no device is
                                 provided then all attached devices will be
                                 ejected. Optional argument: ``boot_device`` -
                                 the boot device to eject, either, ``cd``,
                                 ``dvd``, ``usb`` or ``floppy``.
================  ============   ==============================================

Known Issues
============

Nodes go into maintenance mode
------------------------------

After some period of time, nodes managed by the ``idrac`` hardware type may go
into maintenance mode in Ironic. This issue can be worked around by changing
the Ironic power state poll interval to 70 seconds. See
``[conductor]sync_power_state_interval`` in ``/etc/ironic/ironic.conf``.

PXE reset with "factory_reset" BIOS clean step
----------------------------------------------

When using the ``UEFI boot mode`` with non-default PXE interface, the factory
reset can cause the PXE interface to be reset to default, which doesn't allow
the server to PXE boot for any further operations. This can cause a
``clean_failed`` state on the node or ``deploy_failed`` if you attempt to
deploy a node after this step. For now, the only solution is for the operator
to manually restore the PXE settings of the server for it to PXE boot again,
properly.
The problem is caused by the fact that with the ``UEFI boot mode``, the
``idrac`` uses BIOS settings to manage PXE configuration. This is not the case
with the ``BIOS boot mode`` where the PXE configuration is handled as a
configuration job on the integrated NIC itself, independently of the BIOS
settings.

.. _Ironic_RAID: https://docs.openstack.org/ironic/latest/admin/raid.html
.. _iDRAC: https://www.dell.com/idracmanuals

WSMAN vendor passthru timeout
-----------------------------

When iDRAC is not ready and executing WSMAN vendor passthru commands, they take
more time as waiting for iDRAC to become ready again and then time out,
for example:

.. code-block:: bash

  baremetal node passthru call --http-method GET \
    aed58dca-1b25-409a-a32f-3a817d59e1e0 list_unfinished_jobs
  Timed out waiting for a reply to message ID 547ce7995342418c99ef1ea4a0054572 (HTTP 500)

To avoid this need to increase timeout for messaging in ``/etc/ironic/ironic.conf``
and restart Ironic API service.

.. code-block:: ini

  [DEFAULT]
  rpc_response_timeout = 600

Timeout when powering off
-------------------------

Some servers might be slow when soft powering off and time out. The default retry count
is 6, resulting in 30 seconds timeout (the default retry interval set by
``post_deploy_get_power_state_retry_interval`` is 5 seconds).
To resolve this issue, increase the timeout to 90 seconds by setting the retry count to
18 as follows:

.. code-block:: ini

    [agent]
    post_deploy_get_power_state_retries = 18

Unable to mount remote share with iDRAC firmware before 4.40.40.00
------------------------------------------------------------------

When using iDRAC firmware 4.40.00.00 and consecutive versions before 4.40.40.00
with virtual media boot and new Virtual Console plug-in type eHTML5, there is
an error: "Unable to mount remote share". This is a known issue that is fixed
in 4.40.40.00 iDRAC firmware release. If cannot upgrade, then adjust settings
in iDRAC to use plug-in type HTML5. In iDRAC web UI go to Configuration ->
Virtual Console and select Plug-in Type to HTML5.

During upgrade to 4.40.00.00 or newer iDRAC firmware eHTML5 is automatically
selected if default plug-in type has been used and never changed. Systems that
have plug-in type changed will keep selected plug-in type after iDRAC firmware
upgrade.

Firmware update from Swift fails before 6.00.00.00
--------------------------------------------------

With iDRAC firmware prior to 6.00.00.00 and when using Swift to stage firmware
update files in Management interface ``firmware_update`` clean step of
``redfish`` or ``idrac`` hardware type, the cleaning fails with error
"An internal error occurred. Unable to complete the specified operation." in
iDRAC job. This is fixed in iDRAC firmware 6.00.00.00. If cannot upgrade, then
use HTTP service to stage firmware files for iDRAC.

.. _SCP_Reference_Guide: http://downloads.dell.com/manuals/common/dellemc-server-config-profile-refguide.pdf