def setUp(self): super(SettingsFieldTestCase, self).setUp() with open('sushy/tests/unit/json_samples/settings.json') as f: self.json = json.load(f) self.settings = settings.SettingsField() conn = mock.Mock() with open('sushy/tests/unit/json_samples/message_registry.json') as f: conn.get.return_value.json.return_value = json.load(f) registry = message_registry.MessageRegistry( conn, '/redfish/v1/Registries/Test', redfish_version='1.0.2') self.registries = {'Test.1.0': registry}
def setUp(self): super(SettingsFieldTestCase, self).setUp() with open('sushy/tests/unit/json_samples/settings.json') as f: self.json = json.load(f) self.settings = settings.SettingsField()
class Bios(base.ResourceBase): identity = base.Field('Id', required=True) """The Bios resource identity string""" name = base.Field('Name') """The name of the resource""" description = base.Field('Description') """Human-readable description of the BIOS resource""" _attribute_registry = base.Field('AttributeRegistry') """The Resource ID of the Attribute Registry for the BIOS Attributes resource """ _settings = settings.SettingsField() """Results of last BIOS attribute update""" attributes = base.Field('Attributes') """Vendor-specific key-value dict of effective BIOS attributes Attributes cannot be updated directly. To update use :py:func:`~set_attribute` or :py:func:`~set_attributes` """ _actions = ActionsField('Actions') @property @utils.cache_it def _pending_settings_resource(self): """Pending BIOS settings resource""" return Bios(self._conn, self._settings.resource_uri, redfish_version=self.redfish_version) @property def pending_attributes(self): """Pending BIOS attributes BIOS attributes that have been committed to the system, but for them to take effect system restart is necessary """ return self._pending_settings_resource.attributes def set_attribute(self, key, value): """Update an attribute Attribute update is not immediate but requires system restart. Committed attributes can be checked at :py:attr:`~pending_attributes` property :param key: Attribute name :param value: Attribute value """ self.set_attributes({key: value}) def set_attributes(self, value): """Update many attributes at once Attribute update is not immediate but requires system restart. Committed attributes can be checked at :py:attr:`~pending_attributes` property :param value: Key-value pairs for attribute name and value """ self._settings.commit(self._conn, {'Attributes': value}) utils.cache_clear(self, force_refresh=False, only_these=['_pending_settings_resource']) def _get_reset_bios_action_element(self): actions = self._actions if not actions: raise exceptions.MissingAttributeError(attribute="Actions", resource=self._path) reset_bios_action = actions.reset_bios if not reset_bios_action: raise exceptions.MissingActionError(action='#Bios.ResetBios', resource=self._path) return reset_bios_action def _get_change_password_element(self): actions = self._actions if not actions: raise exceptions.MissingAttributeError(attribute="Actions", resource=self._path) change_password_action = actions.change_password if not change_password_action: raise exceptions.MissingActionError(action='#Bios.ChangePassword', resource=self._path) return change_password_action def reset_bios(self): """Reset the BIOS attributes to default""" target_uri = self._get_reset_bios_action_element().target_uri LOG.debug('Resetting BIOS attributes %s ...', self.identity) self._conn.post(target_uri) LOG.info('BIOS attributes %s is being reset', self.identity) def change_password(self, new_password, old_password, password_name): """Change BIOS password""" target_uri = self._get_change_password_element().target_uri LOG.debug('Changing BIOS password %s ...', self.identity) self._conn.post(target_uri, data={ 'NewPassword': new_password, 'OldPassword': old_password, 'PasswordName': password_name }) LOG.info('BIOS password %s is being changed', self.identity)
class Bios(base.ResourceBase): def __init__(self, connector, path, redfish_version=None, registries=None): """A class representing a Bios :param connector: A Connector instance :param path: Sub-URI path to the Bios resource :param registries: Dict of message registries to be used when parsing messages of attribute update status """ super(Bios, self).__init__(connector, path, redfish_version, registries) identity = base.Field('Id', required=True) """The Bios resource identity string""" name = base.Field('Name') """The name of the resource""" description = base.Field('Description') """Human-readable description of the BIOS resource""" _attribute_registry = base.Field('AttributeRegistry') """The Resource ID of the Attribute Registry for the BIOS Attributes resource """ _settings = settings.SettingsField() """Results of last BIOS attribute update""" attributes = base.Field('Attributes') """Vendor-specific key-value dict of effective BIOS attributes Attributes cannot be updated directly. To update use :py:func:`~set_attribute` or :py:func:`~set_attributes` """ maintenance_window = settings.MaintenanceWindowField( '@Redfish.MaintenanceWindow') """Indicates if a given resource has a maintenance window assignment for applying settings or operations""" _actions = ActionsField('Actions') _apply_time_settings = settings.SettingsApplyTimeField() @property @utils.cache_it def _pending_settings_resource(self): """Pending BIOS settings resource""" return Bios(self._conn, self._settings.resource_uri, registries=None, redfish_version=self.redfish_version) @property def pending_attributes(self): """Pending BIOS attributes BIOS attributes that have been committed to the system, but for them to take effect system restart is necessary """ return self._pending_settings_resource.attributes @property def apply_time_settings(self): return self._pending_settings_resource._apply_time_settings def set_attribute(self, key, value, apply_time=None, maint_window_start_time=None, maint_window_duration=None): """Update an attribute Attribute update is not immediate but requires system restart. Committed attributes can be checked at :py:attr:`~pending_attributes` property :param key: Attribute name :param value: Attribute value :param apply_time: When to update the attribute. Optional. APPLY_TIME_IMMEDIATE - Immediate, APPLY_TIME_ON_RESET - On reset, APPLY_TIME_MAINT_START - During specified maintenance time APPLY_TIME_MAINT_RESET - On reset during specified maintenance time :param maint_window_start_time: The start time of a maintenance window, datetime. Required when updating during maintenance window and default maintenance window not set by the system. :param maint_window_duration: Duration of maintenance time since maintenance window start time in seconds. Required when updating during maintenance window and default maintenance window not set by the system. """ self.set_attributes({key: value}, apply_time, maint_window_start_time, maint_window_duration) def set_attributes(self, value, apply_time=None, maint_window_start_time=None, maint_window_duration=None): """Update many attributes at once Attribute update is not immediate but requires system restart. Committed attributes can be checked at :py:attr:`~pending_attributes` property :param value: Key-value pairs for attribute name and value :param apply_time: When to update the attributes. Optional. APPLY_TIME_IMMEDIATE - Immediate, APPLY_TIME_ON_RESET - On reset, APPLY_TIME_MAINT_START - During specified maintenance time APPLY_TIME_MAINT_RESET - On reset during specified maintenance time :param maint_window_start_time: The start time of a maintenance window, datetime. Required when updating during maintenance window and default maintenance window not set by the system. :param maint_window_duration: Duration of maintenance time since maintenance window start time in seconds. Required when updating during maintenance window and default maintenance window not set by the system. """ payload = {'Attributes': value} if (not apply_time and (maint_window_start_time or maint_window_duration)): raise ValueError('"apply_time" missing when passing maintenance ' 'window settings') if apply_time: prop = '@Redfish.SettingsApplyTime' payload[prop] = { '@odata.type': '#Settings.v1_0_0.PreferredApplyTime', 'ApplyTime': res_maps.APPLY_TIME_VALUE_MAP_REV[apply_time] } if maint_window_start_time and not maint_window_duration: raise ValueError('"maint_window_duration" missing') if not maint_window_start_time and maint_window_duration: raise ValueError('"maint_window_start_time" missing') if maint_window_start_time and maint_window_duration: payload[prop]['MaintenanceWindowStartTime'] =\ maint_window_start_time.isoformat() payload[prop]['MaintenanceWindowDurationInSeconds'] =\ maint_window_duration self._settings.commit(self._conn, payload) utils.cache_clear(self, force_refresh=False, only_these=['_pending_settings_resource']) def _get_reset_bios_action_element(self): actions = self._actions if not actions: raise exceptions.MissingAttributeError(attribute="Actions", resource=self._path) reset_bios_action = actions.reset_bios if not reset_bios_action: raise exceptions.MissingActionError(action='#Bios.ResetBios', resource=self._path) return reset_bios_action def _get_change_password_element(self): actions = self._actions if not actions: raise exceptions.MissingAttributeError(attribute="Actions", resource=self._path) change_password_action = actions.change_password if not change_password_action: raise exceptions.MissingActionError(action='#Bios.ChangePassword', resource=self._path) return change_password_action def reset_bios(self): """Reset the BIOS attributes to default""" target_uri = self._get_reset_bios_action_element().target_uri LOG.debug('Resetting BIOS attributes %s ...', self.identity) try: self._conn.post(target_uri) except exceptions.HTTPError as resp: # Send empty payload, if BMC expects body if resp.status_code in [ http_client.UNSUPPORTED_MEDIA_TYPE, http_client.BAD_REQUEST ]: self._conn.post(target_uri, data={}) else: raise LOG.info('BIOS attributes %s is being reset', self.identity) def change_password(self, new_password, old_password, password_name): """Change BIOS password""" target_uri = self._get_change_password_element().target_uri LOG.debug('Changing BIOS password %s ...', self.identity) self._conn.post(target_uri, data={ 'NewPassword': new_password, 'OldPassword': old_password, 'PasswordName': password_name }) LOG.info('BIOS password %s is being changed', self.identity) @property def update_status(self): """Status of the last attribute update :returns: :class:`sushy.resources.settings.SettingsUpdate` object containing status and any messages """ return self._settings.get_status(self._registries) @property def supported_apply_times(self): """List of supported BIOS update apply times :returns: List of supported update apply time names """ return self._settings._supported_apply_times
class Bios(base.ResourceBase): def __init__(self, connector, path, redfish_version=None, registries=None): """A class representing a Bios :param connector: A Connector instance :param path: Sub-URI path to the Bios resource :param registries: Dict of message registries to be used when parsing messages of attribute update status """ super(Bios, self).__init__(connector, path, redfish_version, registries) identity = base.Field('Id', required=True) """The Bios resource identity string""" name = base.Field('Name') """The name of the resource""" description = base.Field('Description') """Human-readable description of the BIOS resource""" _attribute_registry = base.Field('AttributeRegistry') """The Resource ID of the Attribute Registry for the BIOS Attributes resource """ _settings = settings.SettingsField() """Results of last BIOS attribute update""" attributes = base.Field('Attributes') """Vendor-specific key-value dict of effective BIOS attributes Attributes cannot be updated directly. To update use :py:func:`~set_attribute` or :py:func:`~set_attributes` """ _actions = ActionsField('Actions') _apply_time_settings = settings.SettingsApplyTimeField() @property @utils.cache_it def _pending_settings_resource(self): """Pending BIOS settings resource""" return Bios(self._conn, self._settings.resource_uri, registries=None, redfish_version=self.redfish_version) @property def pending_attributes(self): """Pending BIOS attributes BIOS attributes that have been committed to the system, but for them to take effect system restart is necessary """ return self._pending_settings_resource.attributes @property def apply_time_settings(self): return self._pending_settings_resource._apply_time_settings def set_attribute(self, key, value): """Update an attribute Attribute update is not immediate but requires system restart. Committed attributes can be checked at :py:attr:`~pending_attributes` property :param key: Attribute name :param value: Attribute value """ self.set_attributes({key: value}) def set_attributes(self, value): """Update many attributes at once Attribute update is not immediate but requires system restart. Committed attributes can be checked at :py:attr:`~pending_attributes` property :param value: Key-value pairs for attribute name and value """ self._settings.commit(self._conn, {'Attributes': value}) utils.cache_clear(self, force_refresh=False, only_these=['_pending_settings_resource']) def _get_reset_bios_action_element(self): actions = self._actions if not actions: raise exceptions.MissingAttributeError(attribute="Actions", resource=self._path) reset_bios_action = actions.reset_bios if not reset_bios_action: raise exceptions.MissingActionError(action='#Bios.ResetBios', resource=self._path) return reset_bios_action def _get_change_password_element(self): actions = self._actions if not actions: raise exceptions.MissingAttributeError(attribute="Actions", resource=self._path) change_password_action = actions.change_password if not change_password_action: raise exceptions.MissingActionError(action='#Bios.ChangePassword', resource=self._path) return change_password_action def reset_bios(self): """Reset the BIOS attributes to default""" target_uri = self._get_reset_bios_action_element().target_uri LOG.debug('Resetting BIOS attributes %s ...', self.identity) try: self._conn.post(target_uri) except exceptions.HTTPError as resp: # Send empty payload, if BMC expects body if resp.status_code == http_client.UNSUPPORTED_MEDIA_TYPE: self._conn.post(target_uri, data={}) else: raise LOG.info('BIOS attributes %s is being reset', self.identity) def change_password(self, new_password, old_password, password_name): """Change BIOS password""" target_uri = self._get_change_password_element().target_uri LOG.debug('Changing BIOS password %s ...', self.identity) self._conn.post(target_uri, data={ 'NewPassword': new_password, 'OldPassword': old_password, 'PasswordName': password_name }) LOG.info('BIOS password %s is being changed', self.identity) @property def update_status(self): """Status of the last attribute update :returns: :class:`sushy.resources.settings.SettingsUpdate` object containing status and any messages """ return self._settings.get_status(self._registries)