2019-09-23 17:23:20 +02:00

110 lines
3.2 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
import os
import sys
import sushy
from sushy_oem_idrac import utils
USERNAME = 'root'
PASSWORD = 'calvin'
SERVICE_ROOT = 'http://demo.snmplabs.com:80/redfish/v1'
SYSTEM_ID = '437XR1138R2'
BOOT_DEVICE = sushy.VIRTUAL_MEDIA_CD
BOOT_MODE = sushy.BOOT_SOURCE_MODE_BIOS
BOOT_IMAGE = 'http://demo.snmplabs.com/mini.iso'
LOG = logging.getLogger(__name__)
def main():
"""Boot Dell node from virtual media device"""
LOG.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
LOG.addHandler(handler)
authenticator = sushy.auth.BasicAuth(USERNAME, PASSWORD)
conn = sushy.Sushy(SERVICE_ROOT, verify=False, auth=authenticator)
LOG.info('connected to %s', SERVICE_ROOT)
system = conn.get_system(
os.path.join(SERVICE_ROOT, 'Systems', SYSTEM_ID))
LOG.info('read system resource %s', system.identity)
for manager in system.managers:
LOG.info('trying manager %s', manager.identity)
for v_media in manager.virtual_media.get_members():
if BOOT_DEVICE not in v_media.media_types:
continue
LOG.info(
'device %s is present at %s', BOOT_DEVICE, manager.identity)
try:
manager_oem = manager.get_oem_extension('Dell')
except sushy.exceptions.OEMExtensionNotFoundError:
LOG.info('Dell OEM not found')
continue
LOG.info('found Dell OEM extension at %s', manager.identity)
if v_media.inserted:
v_media.eject_media()
LOG.info('ejected virtual media')
v_media.insert_media(BOOT_IMAGE, inserted=True,
write_protected=True)
LOG.info('inserted boot image %s into virtual media', BOOT_IMAGE)
# the caller (e.g. ironic) sets boot mode first, boot device second
system.set_system_boot_source(
BOOT_DEVICE, enabled=sushy.BOOT_SOURCE_ENABLED_CONTINUOUS,
mode=BOOT_MODE)
# with Dell, patching System tree does not work as expected
# we need to reboot for the new boot mode to take effect
utils.reboot_system(system)
LOG.info('set boot mode to %s', BOOT_MODE)
manager_oem.set_virtual_boot_device(
BOOT_DEVICE, persistent=False, manager=manager, system=system)
LOG.info('set boot device to %s', BOOT_DEVICE)
# real caller should better not use our way to reboot
utils.reboot_system(system)
LOG.info('system rebooted')
return 0
if __name__ == '__main__':
sys.exit(main())