diff --git a/SoftLayer/CLI/routes.py b/SoftLayer/CLI/routes.py
index 67675738..507ce234 100644
--- a/SoftLayer/CLI/routes.py
+++ b/SoftLayer/CLI/routes.py
@@ -149,6 +149,7 @@
     ('server:reboot', 'SoftLayer.CLI.server.power:reboot'),
     ('server:reload', 'SoftLayer.CLI.server.reload:cli'),
     ('server:credentials', 'SoftLayer.CLI.server.credentials:cli'),
+    ('server:update-firmware', 'SoftLayer.CLI.server.update_firmware:cli'),
 
     ('snapshot', 'SoftLayer.CLI.snapshot'),
     ('snapshot:cancel', 'SoftLayer.CLI.snapshot.cancel:cli'),
diff --git a/SoftLayer/CLI/server/update_firmware.py b/SoftLayer/CLI/server/update_firmware.py
new file mode 100644
index 00000000..f5782787
--- /dev/null
+++ b/SoftLayer/CLI/server/update_firmware.py
@@ -0,0 +1,27 @@
+"""Update firmware."""
+# :license: MIT, see LICENSE for more details.
+
+import SoftLayer
+from SoftLayer.CLI import environment
+from SoftLayer.CLI import exceptions
+from SoftLayer.CLI import formatting
+from SoftLayer.CLI import helpers
+
+import click
+
+
+@click.command()
+@click.argument('identifier')
+@environment.pass_env
+def cli(env, identifier):
+    """Update server firmware."""
+
+    mgr = SoftLayer.HardwareManager(env.client)
+    hw_id = helpers.resolve_id(mgr.resolve_ids, identifier, 'hardware')
+    if env.skip_confirmations or formatting.confirm('This will power off the '
+                                                    'server with id %s and '
+                                                    'update device firmware. '
+                                                    'Continue?' % hw_id):
+        mgr.update_firmware(hw_id)
+    else:
+        raise exceptions.CLIAbort('Aborted.')
diff --git a/SoftLayer/managers/hardware.py b/SoftLayer/managers/hardware.py
index 29dde1b1..90e911f5 100644
--- a/SoftLayer/managers/hardware.py
+++ b/SoftLayer/managers/hardware.py
@@ -745,6 +745,28 @@ def edit(self, hardware_id, userdata=None, hostname=None, domain=None,
 
         return self.hardware.editObject(obj, id=hardware_id)
 
+    def update_firmware(self,
+                        hardware_id,
+                        ipmi=True,
+                        raid_controller=True,
+                        bios=True,
+                        hard_drive=True):
+        """Update hardware firmware.
+
+        This will cause the server to be unavailable for ~20 minutes.
+
+        :param int hardware_id: The ID of the hardware to have its firmware
+                                updated.
+        :param bool ipmi: Update the ipmi firmware.
+        :param bool raid_controller: Update the raid controller firmware.
+        :param bool bios: Update the bios firmware.
+        :param bool hard_drive: Update the hard drive firmware.
+        """
+
+        return self.hardware.createFirmwareUpdateTransaction(
+            bool(ipmi), bool(raid_controller), bool(bios), bool(hard_drive),
+            id=hardware_id)
+
 
 def get_default_value(package_options, category, hourly=False):
     """Returns the default price ID for the specified category.
diff --git a/SoftLayer/transports.py b/SoftLayer/transports.py
index 15964e5c..86307354 100644
--- a/SoftLayer/transports.py
+++ b/SoftLayer/transports.py
@@ -226,8 +226,8 @@ def __call__(self, call):
             module_path = 'SoftLayer.testing.fixtures.%s' % call.service
             module = importlib.import_module(module_path)
         except ImportError:
-            raise NotImplementedError('%s::%s fixture is not implemented'
-                                      % (call.service, call.method))
+            raise NotImplementedError('%s fixture is not implemented'
+                                      % call.service)
         try:
             return getattr(module, call.method)
         except AttributeError:

Firmware Update
Please add the ability to the API and CLI to update the server's firmware.

http://sldn.softlayer.com/reference/services/SoftLayer_Hardware_Server/createFirmwareUpdateTransaction
diff --git a/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py b/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py
index 6da486e1..f8828daa 100644
--- a/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py
+++ b/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py
@@ -70,6 +70,7 @@
 rebootSoft = True
 rebootDefault = True
 rebootHard = True
+createFirmwareUpdateTransaction = True
 setUserMetadata = ['meta']
 reloadOperatingSystem = 'OK'
 getReverseDomainRecords = [
diff --git a/SoftLayer/tests/CLI/modules/server_tests.py b/SoftLayer/tests/CLI/modules/server_tests.py
index f11b58a6..2152df0c 100644
--- a/SoftLayer/tests/CLI/modules/server_tests.py
+++ b/SoftLayer/tests/CLI/modules/server_tests.py
@@ -636,3 +636,14 @@ def test_get_default_value_returns_none_for_unknown_category(self):
         option_mock = {'categories': {'cat1': []}}
         output = create._get_default_value(option_mock, 'nope')
         self.assertEqual(None, output)
+
+    @mock.patch('SoftLayer.CLI.formatting.confirm')
+    def test_update_firmware(self, confirm_mock):
+        confirm_mock.return_value = True
+        result = self.run_command(['server', 'update-firmware', '1000'])
+
+        self.assertEqual(result.exit_code, 0)
+        self.assertEqual(result.output, "")
+        self.assert_called_with('SoftLayer_Hardware_Server',
+                                'createFirmwareUpdateTransaction',
+                                args=((1, 1, 1, 1)), identifier=1000)
diff --git a/SoftLayer/tests/managers/hardware_tests.py b/SoftLayer/tests/managers/hardware_tests.py
index 86ea0719..5044e247 100644
--- a/SoftLayer/tests/managers/hardware_tests.py
+++ b/SoftLayer/tests/managers/hardware_tests.py
@@ -473,10 +473,27 @@ def test_edit(self):
                                 identifier=100)
 
     def test_rescue(self):
-        # Test rescue environment
-        restult = self.hardware.rescue(1234)
+        result = self.hardware.rescue(1234)
 
-        self.assertEqual(restult, True)
+        self.assertEqual(result, True)
         self.assert_called_with('SoftLayer_Hardware_Server',
                                 'bootToRescueLayer',
                                 identifier=1234)
+
+    def test_update_firmware(self):
+        result = self.hardware.update_firmware(100)
+
+        self.assertEqual(result, True)
+        self.assert_called_with('SoftLayer_Hardware_Server',
+                                'createFirmwareUpdateTransaction',
+                                identifier=100, args=(1, 1, 1, 1))
+
+    def test_update_firmware_selective(self):
+        result = self.hardware.update_firmware(100,
+                                               ipmi=False,
+                                               hard_drive=False)
+
+        self.assertEqual(result, True)
+        self.assert_called_with('SoftLayer_Hardware_Server',
+                                'createFirmwareUpdateTransaction',
+                                identifier=100, args=(0, 1, 1, 0))

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.6
tools/test-requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs==22.2.0
Babel==2.11.0
certifi==2021.5.30
charset-normalizer==2.0.12
click==8.0.4
coverage==6.2
distlib==0.3.9
docutils==0.18.1
filelock==3.4.1
fixtures==4.0.1
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig==1.1.1
Jinja2==3.0.3
MarkupSafe==2.0.1
mock==5.2.0
nose==1.3.7
packaging==21.3
pbr==6.1.1
platformdirs==2.4.0
pluggy==1.0.0
prettytable==2.5.0
py==1.11.0
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
pytz==2025.2
requests==2.27.1
six==1.17.0
snowballstemmer==2.2.0
-e git+https://github.com/softlayer/softlayer-python.git@d14a960c929240af09d77717ab5772b22d00e6b1#egg=SoftLayer
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
testtools==2.6.0
toml==0.10.2
tomli==1.2.3
tox==3.28.0
typing_extensions==4.1.1
urllib3==1.26.20
virtualenv==20.17.1
wcwidth==0.2.13
zipp==3.6.0

name: softlayer-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - attrs==22.2.0
      - babel==2.11.0
      - charset-normalizer==2.0.12
      - click==8.0.4
      - coverage==6.2
      - distlib==0.3.9
      - docutils==0.18.1
      - filelock==3.4.1
      - fixtures==4.0.1
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mock==5.2.0
      - nose==1.3.7
      - packaging==21.3
      - pbr==6.1.1
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - prettytable==2.5.0
      - py==1.11.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytz==2025.2
      - requests==2.27.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - testtools==2.6.0
      - toml==0.10.2
      - tomli==1.2.3
      - tox==3.28.0
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - virtualenv==20.17.1
      - wcwidth==0.2.13
      - zipp==3.6.0
prefix: /opt/conda/envs/softlayer-python

SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_update_firmware SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_update_firmware SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_update_firmware_selective
SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_cancel_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_for_bmc SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_missing_required SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_test_flag SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_test_for_bmc SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_test_no_disk SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_test_no_disk_no_raid SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_with_export SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_failed SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_userdata SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_userdata_and_file SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_userfile SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_get_default_value_returns_none_for_unknown_category SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_list_chassis_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_list_servers SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_nic_edit_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_cancel_reasons SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_create_options SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_create_options_for_bmc SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_create_options_with_invalid_chassis SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_details SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_cycle SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_cycle_negative SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_off SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_on SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_default SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_hard SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_negative SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_soft SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reload SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_cancel_hardware_on_bmc SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_cancel_hardware_with_reason_and_comment SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_cancel_hardware_without_reason SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_cancel_metal_immediately SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_cancel_metal_on_anniversary SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_change_port_speed_private SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_change_port_speed_public SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_edit SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_edit_blank SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_edit_meta SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_generate_create_dict_with_all_bare_metal_options SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_generate_create_dict_with_all_dedicated_server_options SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_available_dedicated_server_packages SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_bare_metal_create_options SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_bare_metal_create_options_returns_none_on_error SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_dedicated_server_options SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_default_value SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_default_value_hourly SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_default_value_monthly SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_default_value_none_free SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_default_value_returns_none_for_unknown_category SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_hardware SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_get_server_packages_with_ordering_manager_provided SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_list_hardware SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_list_hardware_with_filters SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_place_order SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_reload SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_rescue SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_resolve_ids_hostname SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_resolve_ids_ip SoftLayer/tests/managers/hardware_tests.py::HardwareTests::test_verify_order
SoftLayer/CLI/routes.py SoftLayer/CLI/server/update_firmware.py SoftLayer/managers/hardware.py SoftLayer/transports.py
SoftLayer/CLI/routes.py SoftLayer/CLI/server/update_firmware.py SoftLayer/managers/hardware.py SoftLayer/transports.py