def update_alert(lib_env, alert_id, path, instance_attribute_dict, meta_attribute_dict, description=None): """ Update existing alert with specified id. lib_env -- LibraryEnvironment alert_id -- id of alert to be updated path -- new path, if None old value will stay unchanged instance_attribute_dict -- dictionary of instance attributes to update meta_attribute_dict -- dictionary of meta attributes to update description -- new description, if empty string, old description will be deleted, if None old value will stay unchanged """ cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) alert_el = alert.update_alert(cib, alert_id, path, description) arrange_first_instance_attributes(alert_el, instance_attribute_dict, id_provider) arrange_first_meta_attributes(alert_el, meta_attribute_dict, id_provider) lib_env.push_cib()
def update_alert( lib_env, alert_id, path, instance_attribute_dict, meta_attribute_dict, description=None ): """ Update existing alert with specified id. lib_env -- LibraryEnvironment alert_id -- id of alert to be updated path -- new path, if None old value will stay unchanged instance_attribute_dict -- dictionary of instance attributes to update meta_attribute_dict -- dictionary of meta attributes to update description -- new description, if empty string, old description will be deleted, if None old value will stay unchanged """ cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) alert_el = alert.update_alert(cib, alert_id, path, description) arrange_first_instance_attributes( alert_el, instance_attribute_dict, id_provider ) arrange_first_meta_attributes( alert_el, meta_attribute_dict, id_provider ) lib_env.push_cib()
def create_alert(lib_env, alert_id, path, instance_attribute_dict, meta_attribute_dict, description=None): """ Create new alert. Raises LibraryError if path is not specified, or any other failure. lib_env -- LibraryEnvironment alert_id -- id of alert to be created, if None it will be generated path -- path to script for alert instance_attribute_dict -- dictionary of instance attributes meta_attribute_dict -- dictionary of meta attributes description -- alert description description """ if not path: raise LibraryError(reports.required_option_is_missing(["path"])) cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) alert_el = alert.create_alert(cib, alert_id, path, description) arrange_first_instance_attributes(alert_el, instance_attribute_dict, id_provider) arrange_first_meta_attributes(alert_el, meta_attribute_dict, id_provider) lib_env.push_cib()
def create_alert( lib_env, alert_id, path, instance_attribute_dict, meta_attribute_dict, description=None ): """ Create new alert. Raises LibraryError if path is not specified, or any other failure. lib_env -- LibraryEnvironment alert_id -- id of alert to be created, if None it will be generated path -- path to script for alert instance_attribute_dict -- dictionary of instance attributes meta_attribute_dict -- dictionary of meta attributes description -- alert description description """ if not path: raise LibraryError(reports.required_option_is_missing(["path"])) cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) alert_el = alert.create_alert(cib, alert_id, path, description) arrange_first_instance_attributes( alert_el, instance_attribute_dict, id_provider ) arrange_first_meta_attributes( alert_el, meta_attribute_dict, id_provider ) lib_env.push_cib()
def unmanage(resource_el, id_provider): """ Set the resource not to be managed by the cluster etree resource_el -- resource element """ nvpair.arrange_first_meta_attributes(resource_el, { "is-managed": "false", }, id_provider)
def disable(resource_el, id_provider): """ Disable specified resource etree resource_el -- resource element """ nvpair.arrange_first_meta_attributes(resource_el, { "target-role": "Stopped", }, id_provider)
def update(id_provider, bundle_el, container_options, network_options, port_map_add, port_map_remove, storage_map_add, storage_map_remove, meta_attributes): """ Modify an existing bundle (does not touch encapsulated resources) IdProvider id_provider -- elements' ids generator and uniqueness checker etree bundle_el -- the bundle to be updated dict container_options -- container options to modify dict network_options -- network options to modify list of dict port_map_add -- list of port mapping options to add list of string port_map_remove -- list of port mapping ids to remove list of dict storage_map_add -- list of storage mapping options to add list of string storage_map_remove -- list of storage mapping ids to remove dict meta_attributes -- meta attributes to update """ bundle_id = bundle_el.get("id") update_attributes_remove_empty(_get_container_element(bundle_el), container_options) network_element = get_sub_element(bundle_el, "network") if network_options: update_attributes_remove_empty(network_element, network_options) # It's crucial to remove port maps prior to appending new ones: If we are # adding a port map which in any way conflicts with another one and that # another one is being removed in the very same command, the removal must # be done first, otherwise the conflict would manifest itself (and then # possibly the old mapping would be removed) if port_map_remove: _remove_map_elements(network_element.findall("port-mapping"), port_map_remove) for port_map_options in port_map_add: _append_port_map(network_element, id_provider, bundle_id, port_map_options) storage_element = get_sub_element(bundle_el, "storage") # See the comment above about removing port maps prior to adding new ones. if storage_map_remove: _remove_map_elements(storage_element.findall("storage-mapping"), storage_map_remove) for storage_map_options in storage_map_add: _append_storage_map(storage_element, id_provider, bundle_id, storage_map_options) if meta_attributes: arrange_first_meta_attributes(bundle_el, meta_attributes) # remove empty elements with no attributes # meta attributes are handled in their own function remove_when_pointless(network_element) remove_when_pointless(storage_element)
def add_recipient( lib_env, alert_id, recipient_value, instance_attribute_dict, meta_attribute_dict, recipient_id=None, description=None, allow_same_value=False ): """ Add new recipient to alert witch id alert_id. lib_env -- LibraryEnvironment alert_id -- id of alert to which new recipient should be added recipient_value -- value of new recipient instance_attribute_dict -- dictionary of instance attributes to update meta_attribute_dict -- dictionary of meta attributes to update recipient_id -- id of new recipient, if None it will be generated description -- recipient description allow_same_value -- if True unique recipient value is not required """ if not recipient_value: raise LibraryError( reports.required_option_is_missing(["value"]) ) cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) recipient = alert.add_recipient( lib_env.report_processor, cib, alert_id, recipient_value, recipient_id=recipient_id, description=description, allow_same_value=allow_same_value ) arrange_first_instance_attributes( recipient, instance_attribute_dict, id_provider ) arrange_first_meta_attributes( recipient, meta_attribute_dict, id_provider ) lib_env.push_cib()
def add_recipient( lib_env, alert_id, recipient_value, instance_attribute_dict, meta_attribute_dict, recipient_id=None, description=None, allow_same_value=False ): """ Add new recipient to alert witch id alert_id. lib_env -- LibraryEnvironment alert_id -- id of alert to which new recipient should be added recipient_value -- value of new recipient instance_attribute_dict -- dictionary of instance attributes to update meta_attribute_dict -- dictionary of meta attributes to update recipient_id -- id of new recipient, if None it will be generated description -- recipient description allow_same_value -- if True unique recipient value is not required """ if not recipient_value: raise LibraryError( reports.required_options_are_missing(["value"]) ) cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) recipient = alert.add_recipient( lib_env.report_processor, cib, alert_id, recipient_value, recipient_id=recipient_id, description=description, allow_same_value=allow_same_value ) arrange_first_instance_attributes( recipient, instance_attribute_dict, id_provider ) arrange_first_meta_attributes( recipient, meta_attribute_dict, id_provider ) lib_env.push_cib()
def set_as_guest( resource_element, node, addr=None, port=None, connect_timeout=None ): """ Set resource as guest node. etree.Element resource_element """ meta_options = {"remote-node": str(node)} if addr: meta_options["remote-addr"] = str(addr) if port: meta_options["remote-port"] = str(port) if connect_timeout: meta_options["remote-connect-timeout"] = str(connect_timeout) arrange_first_meta_attributes(resource_element, meta_options)
def update_recipient( lib_env, recipient_id, instance_attribute_dict, meta_attribute_dict, recipient_value=None, description=None, allow_same_value=False ): """ Update existing recipient. lib_env -- LibraryEnvironment recipient_id -- id of recipient to be updated instance_attribute_dict -- dictionary of instance attributes to update meta_attribute_dict -- dictionary of meta attributes to update recipient_value -- new recipient value, if None old value will stay unchanged description -- new description, if empty string, old description will be deleted, if None old value will stay unchanged allow_same_value -- if True unique recipient value is not required """ if not recipient_value and recipient_value is not None: raise LibraryError( reports.cib_alert_recipient_invalid_value(recipient_value) ) cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) recipient = alert.update_recipient( lib_env.report_processor, cib, recipient_id, recipient_value=recipient_value, description=description, allow_same_value=allow_same_value ) arrange_first_instance_attributes( recipient, instance_attribute_dict, id_provider ) arrange_first_meta_attributes( recipient, meta_attribute_dict, id_provider ) lib_env.push_cib()
def update_recipient( lib_env, recipient_id, instance_attribute_dict, meta_attribute_dict, recipient_value=None, description=None, allow_same_value=False ): """ Update existing recipient. lib_env -- LibraryEnvironment recipient_id -- id of recipient to be updated instance_attribute_dict -- dictionary of instance attributes to update meta_attribute_dict -- dictionary of meta attributes to update recipient_value -- new recipient value, if None old value will stay unchanged description -- new description, if empty string, old description will be deleted, if None old value will stay unchanged allow_same_value -- if True unique recipient value is not required """ if not recipient_value and recipient_value is not None: raise LibraryError( reports.cib_alert_recipient_invalid_value(recipient_value) ) cib = lib_env.get_cib(REQUIRED_CIB_VERSION) id_provider = IdProvider(cib) recipient = alert.update_recipient( lib_env.report_processor, cib, recipient_id, recipient_value=recipient_value, description=description, allow_same_value=allow_same_value ) arrange_first_instance_attributes( recipient, instance_attribute_dict, id_provider ) arrange_first_meta_attributes( recipient, meta_attribute_dict, id_provider ) lib_env.push_cib()
def _set_any_defaults(section_name, env, options): """ string section_name -- determine the section of defaults LibraryEnvironment env -- provides access to outside environment dict options -- are desired options with its values; when value is empty the option have to be removed """ env.report_processor.process(reports.defaults_can_be_overriden()) if not options: return defaults_section = sections.get(env.get_cib(), section_name) arrange_first_meta_attributes(defaults_section, options, new_id="{0}-options".format(section_name)) remove_when_pointless(defaults_section) env.push_cib()
def _set_any_defaults(section_name, env: LibraryEnvironment, options): """ string section_name -- determine the section of defaults env -- provides access to outside environment dict options -- are desired options with its values; when value is empty the option have to be removed """ # Do not ever remove the nvset element, even if it is empty. There may be # ACLs set in pacemaker which allow "write" for nvpairs (adding, changing # and removing) but not nvsets. In such a case, removing the nvset would # cause the whole change to be rejected by pacemaker with a "permission # denied" message. # https://bugzilla.redhat.com/show_bug.cgi?id=1642514 env.report_processor.report( ReportItem.warning(reports.messages.DefaultsCanBeOverriden())) if not options: return cib = env.get_cib() # Do not create new defaults element if we are only removing values from it. only_removing = True for value in options.values(): if value != "": only_removing = False break if only_removing and not sections.exists(cib, section_name): return defaults_section = sections.get(cib, section_name) arrange_first_meta_attributes( defaults_section, options, IdProvider(cib), new_id="{0}-options".format(section_name), ) env.push_cib()
def _set_any_defaults(section_name, env, options): """ string section_name -- determine the section of defaults LibraryEnvironment env -- provides access to outside environment dict options -- are desired options with its values; when value is empty the option have to be removed """ # Do not ever remove the nvset element, even if it is empty. There may be # ACLs set in pacemaker which allow "write" for nvpairs (adding, changing # and removing) but not nvsets. In such a case, removing the nvset would # cause the whole change to be rejected by pacemaker with a "permission # denied" message. # https://bugzilla.redhat.com/show_bug.cgi?id=1642514 env.report_processor.process(reports.defaults_can_be_overriden()) if not options: return cib = env.get_cib() # Do not create new defaults element if we are only removing values from it. only_removing = True for value in options.values(): if value != "": only_removing = False break if only_removing and not sections.exists(cib, section_name): return defaults_section = sections.get(cib, section_name) arrange_first_meta_attributes( defaults_section, options, IdProvider(cib), new_id="{0}-options".format(section_name), ) env.push_cib()
def update( id_provider, bundle_el, container_options, network_options, port_map_add, port_map_remove, storage_map_add, storage_map_remove, meta_attributes, ): # pylint: disable=too-many-arguments, too-many-locals """ Modify an existing bundle (does not touch encapsulated resources) IdProvider id_provider -- elements' ids generator and uniqueness checker etree bundle_el -- the bundle to be updated dict container_options -- container options to modify dict network_options -- network options to modify list of dict port_map_add -- list of port mapping options to add list of string port_map_remove -- list of port mapping ids to remove list of dict storage_map_add -- list of storage mapping options to add list of string storage_map_remove -- list of storage mapping ids to remove dict meta_attributes -- meta attributes to update """ # Do not ever remove meta_attributes, network and storage elements, even if # they are empty. There may be ACLs set in pacemaker which allow "write" # for their children (adding, changing and removing) but not themselves. In # such a case, removing those elements would cause the whole change to be # rejected by pacemaker with a "permission denied" message. # https://bugzilla.redhat.com/show_bug.cgi?id=1642514 bundle_id = bundle_el.get("id") update_attributes_remove_empty(_get_container_element(bundle_el), container_options) network_element = get_sub_element(bundle_el, "network", append_if_missing=False) if network_options: update_attributes_remove_empty(network_element, network_options) # It's crucial to remove port maps prior to appending new ones: If we are # adding a port map which in any way conflicts with another one and that # another one is being removed in the very same command, the removal must # be done first, otherwise the conflict would manifest itself (and then # possibly the old mapping would be removed) if port_map_remove: _remove_map_elements(network_element.findall("port-mapping"), port_map_remove) if port_map_add: for port_map_options in port_map_add: _append_port_map(network_element, id_provider, bundle_id, port_map_options) append_when_useful(bundle_el, network_element) storage_element = get_sub_element(bundle_el, "storage", append_if_missing=False) # See the comment above about removing port maps prior to adding new ones. if storage_map_remove: _remove_map_elements(storage_element.findall("storage-mapping"), storage_map_remove) if storage_map_add: for storage_map_options in storage_map_add: _append_storage_map(storage_element, id_provider, bundle_id, storage_map_options) append_when_useful(bundle_el, storage_element) if meta_attributes: arrange_first_meta_attributes(bundle_el, meta_attributes, id_provider)