This python script contains the following:
1.- Getting hardware information.
2.- Getting the hardware components.
3.- Getting hardware components firmware version information.
4.- Updating the firmware on components.
import SoftLayer
import click
from prettytable import PrettyTable
class HardwareComponents():
def __init__(self):
self.client = SoftLayer.create_client_from_env()
def hardware_information(self, hostname):
"""
Get the Hardware Server Information.
"""
mask = 'mask[hardwareStatus,lastOperatingSystemReload,datacenter,billingItem[hourlyFlag],' \
'lastTransaction[transactionGroup],processorPhysicalCoreAmount,memoryCapacity,' \
'operatingSystem[softwareLicense[softwareDescription]]]'
hardware_id = self.get_hardware_detail(hostname).get('id')
result = self.client['SoftLayer_Hardware_Server'].getObject(id=hardware_id, mask=mask)
table = PrettyTable()
table.title = "Hardware Server details"
table.field_names = ['name', 'value']
table.align['name'] = 'r'
table.align['value'] = 'l'
table.add_row(['Name', result['fullyQualifiedDomainName']])
table.add_row(['Status', result['hardwareStatus']['status']])
table.add_row(['Id', result['id']])
table.add_row(['Started', result['provisionDate']])
table.add_row(['Reloaded', result['lastOperatingSystemReload']['modifyDate']])
table.add_row(['MFR Serial #', result['manufacturerSerialNumber']])
table.add_row(['Location', result['datacenter']['longName']])
table.add_row(['Serial #', result['serialNumber']])
table.add_row(['Billing', "Hourly" if result['billingItem']['hourlyFlag'] else "Monthly"])
table.add_row(['Last transaction', result['lastTransaction']['transactionGroup']['name']])
table.add_row(['cores', result['processorPhysicalCoreAmount']])
table.add_row(['memory', result['memoryCapacity']])
table.add_row(['public_ip', result['primaryIpAddress']])
table.add_row(['private_ip', result['primaryBackendIpAddress']])
table.add_row(['os', result['operatingSystem']['softwareLicense']['softwareDescription']['manufacturer']])
table.add_row(['os_version', result['operatingSystem']['softwareLicense']['softwareDescription']['version']])
print(table)
def list_hardware_components(self, hostname):
"""
Get the Hardware Server Components.
"""
mask = 'mask[activeComponents[hardwareComponentModel[hardwareGenericComponentModel[hardwareComponentType]]]]'
hardware_id = self.get_hardware_detail(hostname).get('id')
result = self.client['SoftLayer_Hardware_Server'].getObject(id=hardware_id, mask=mask)
table = PrettyTable()
table.title = "Hardware Components"
table.field_names = ['id', 'hardwareComponentType', 'capacity', 'manufacturer', 'name', 'version']
capacity = None
component_type = None
for component in result['activeComponents']:
if 'hardwareGenericComponentModel' in component['hardwareComponentModel']:
capacity = component['hardwareComponentModel']['hardwareGenericComponentModel']['capacity']
component_type = component['hardwareComponentModel']['hardwareGenericComponentModel'][
'hardwareComponentType']['type']
table.add_row([component['hardwareComponentModel']['id'],
component_type,
capacity,
component['hardwareComponentModel']['manufacturer'],
component['hardwareComponentModel']['name'],
component['hardwareComponentModel']['version']
])
print(table)
def list_hardware_component_firmware(self, hostname, component_id=None):
"""
Get the last firmware version updated for a specific hardware component.
"""
mask = 'mask[hardwareComponentModel[firmwares]]'
hardware_id = self.get_hardware_detail(hostname).get('id')
if component_id:
result = self.client['SoftLayer_Hardware_Server'].getComponents(mask=mask, id=hardware_id)
table = PrettyTable()
table.title = "Hardware Component Firmware"
table.field_names = ['id', 'createDate', 'hardwareComponentModelId', 'version']
list_firmware = list()
for component in result:
if component_id == component['hardwareComponentModel']['id']:
for firmware in component['hardwareComponentModel']['firmwares']:
list_firmware.append(firmware)
if not len(list_firmware) == 0:
list_result = sorted(list_firmware, key=lambda x: x['createDate'])
last_firmware = list_result[len(list_result) - 1]
table.add_row([last_firmware['id'],
last_firmware['createDate'],
last_firmware['hardwareComponentModelId'],
last_firmware['version'],
])
print(table)
else:
print('The hardware component id is required.')
def update_firmware(self, hostname, ipmi=0, raid_controller=0, bios=0, hard_drive=0):
"""
Firmware Update.
"""
result = None
try:
hardware_id = self.get_hardware_detail(hostname).get('id')
result = self.client['SoftLayer_Hardware_Server'].createFirmwareUpdateTransaction(ipmi,
raid_controller,
bios,
hard_drive,
id=hardware_id)
except SoftLayer.SoftLayerAPIError as e:
print("Update failed. faultCode=%s, faultString=%s" % (
e.faultCode, e.faultString))
if result:
print("Update firmware successfully")
else:
print("Update firmware failed")
def get_hardware_detail(self, hostname):
"""
Get an specific hardware server detail from the account through the hostname.
"""
object_filter = {
"hardware": {
"hostname": {
"operation": hostname
}
}
}
user_detail = self.client['SoftLayer_Account'].getHardware(filter=object_filter)
return user_detail[0]
@click.command()
@click.argument('hostname')
@click.option('--component-id', type=click.INT,
help='Hardware Component Id')
@click.option('--ipmi', type=click.INT,
help='Set this hardware Component to 1 (to upgrade) or 0 (not upgrade)')
@click.option('--raid-controller', type=click.INT,
help='Set this hardware Component to 1 (to upgrade) or 0 (not upgrade)')
@click.option('--bios', type=click.INT,
help='Set this hardware Component to 1 (to upgrade) or 0 (not upgrade)')
@click.option('--hard_drive', type=click.INT,
help='Set this hardware Component to 1 (to upgrade) or 0 (not upgrade)')
def main(hostname, component_id, ipmi, raid_controller, bios, hard_drive):
main = HardwareComponents()
# Uncomment this to print out the API calls made.
"""
Hardware Server Detail.
"""
# main.hardware_information(hostname)
"""
Hardware Server Components.
"""
# main.list_hardware_components(hostname)
"""
Show the last firmware version updated for a specific hardware component.
Get the component_id from the second request.
"""
# main.list_hardware_component_firmware(hostname, component_id=component_id)
"""
Update Firmware.
Set the options impi, raid-controller, bios or hard-drive with "1" if you
want to update the component or "0" if you do not want to update.
"""
main.update_firmware(hostname, ipmi=ipmi, raid_controller=raid_controller, bios=bios, hard_drive=hard_drive)
if __name__ == "__main__":
main()
If this article contains any error, or leaves any of your questions unanswered, please help us out by
opening up a github issue.
Open an issue