def create( report_processor, resources_section, resource_id, resource_agent, raw_operation_list=None, meta_attributes=None, instance_attributes=None, allow_invalid_operation=False, allow_invalid_instance_attributes=False, use_default_operations=True, resource_type="resource" ): """ Prepare all parts of primitive resource and append it into cib. report_processor is a tool for warning/info/error reporting etree.Element resources_section is place where new element will be appended string resource_id is id of new resource lib.resource_agent.CrmAgent resource_agent list of dict raw_operation_list specifies operations of resource dict meta_attributes specifies meta attributes of resource dict instance_attributes specifies instance attributes of resource bool allow_invalid_operation is flag for skipping validation of operations bool allow_invalid_instance_attributes is flag for skipping validation of instance_attributes bool use_default_operations is flag for completion operations with default actions specified in resource agent string resource_type -- describes the resource for reports """ if raw_operation_list is None: raw_operation_list = [] if meta_attributes is None: meta_attributes = {} if instance_attributes is None: instance_attributes = {} if does_id_exist(resources_section, resource_id): raise LibraryError(reports.id_already_exists(resource_id)) validate_id(resource_id, "{0} name".format(resource_type)) operation_list = prepare_operations( report_processor, raw_operation_list, resource_agent.get_cib_default_actions( necessary_only=not use_default_operations ), [operation["name"] for operation in resource_agent.get_actions()], allow_invalid=allow_invalid_operation, ) report_processor.process_list( resource_agent.validate_parameters( instance_attributes, parameters_type=resource_type, allow_invalid=allow_invalid_instance_attributes, ) ) return append_new( resources_section, resource_id, resource_agent.get_standard(), resource_agent.get_provider(), resource_agent.get_type(), instance_attributes=instance_attributes, meta_attributes=meta_attributes, operation_list=operation_list )
def create( report_processor: reports.ReportProcessor, resources_section: _Element, id_provider: IdProvider, resource_id: str, resource_agent_facade: ResourceAgentFacade, raw_operation_list: Optional[Iterable[ResourceOperationIn]] = None, meta_attributes: Optional[Mapping[str, str]] = None, instance_attributes: Optional[Mapping[str, str]] = None, allow_invalid_operation: bool = False, allow_invalid_instance_attributes: bool = False, use_default_operations: bool = True, resource_type: str = "resource", # TODO remove this arg do_not_report_instance_attribute_server_exists: bool = False, ): # pylint: disable=too-many-arguments # pylint: disable=too-many-locals """ Prepare all parts of primitive resource and append it into cib. report_processor -- a tool for warning/info/error reporting resources_section -- a place where the new resource will be appended id_provider -- elements' ids generator resource_id -- id of the new resource resource_agent_facade -- resource agent raw_operation_list -- specifies operations of the resource meta_attributes -- specifies meta attributes of the resource instance_attributes -- specifies instance attributes of the resource allow_invalid_operation -- flag for skipping validation of operations allow_invalid_instance_attributes -- flag for skipping validation of instance_attributes use_default_operations -- flag for completion operations with default actions specified in resource agent resource_type -- describes the resource for reports do_not_report_instance_attribute_server_exists -- dirty fix due to suboptimal architecture, TODO: fix the architecture and remove the param """ if raw_operation_list is None: raw_operation_list = [] if meta_attributes is None: meta_attributes = {} if instance_attributes is None: instance_attributes = {} filtered_raw_operation_list = [] for op in raw_operation_list: filtered_raw_operation_list.append( {name: "" if value is None else value for name, value in op.items()} ) if does_id_exist(resources_section, resource_id): raise LibraryError( reports.ReportItem.error( reports.messages.IdAlreadyExists(resource_id) ) ) validate_id(resource_id, "{0} name".format(resource_type)) agent_metadata = resource_agent_facade.metadata operation_list = prepare_operations( report_processor, filtered_raw_operation_list, get_default_operations( agent_metadata, necessary_only=not use_default_operations ), [operation.name for operation in agent_metadata.actions], are_new_role_names_supported(resources_section), allow_invalid=allow_invalid_operation, ) report_items = validate_resource_instance_attributes_create( resource_agent_facade, instance_attributes, resources_section, force=allow_invalid_instance_attributes, ) # TODO remove this "if", see pcs.lib.cib.remote_node.create for details if do_not_report_instance_attribute_server_exists: for report_item in report_items: if isinstance(report_item.message, reports.messages.InvalidOptions): report_msg = cast( reports.messages.InvalidOptions, report_item.message ) report_item.message = reports.messages.InvalidOptions( report_msg.option_names, sorted( [ value for value in report_msg.allowed if value != "server" ] ), report_msg.option_type, report_msg.allowed_patterns, ) report_processor.report_list(report_items) if report_processor.has_errors: raise LibraryError() return append_new( resources_section, id_provider, resource_id, agent_metadata.name.standard, agent_metadata.name.provider, agent_metadata.name.type, instance_attributes=instance_attributes, meta_attributes=meta_attributes, operation_list=operation_list, )
def create( report_processor: ReportProcessor, resources_section, id_provider, resource_id, resource_agent, raw_operation_list=None, meta_attributes=None, instance_attributes=None, allow_invalid_operation=False, allow_invalid_instance_attributes=False, use_default_operations=True, resource_type="resource", do_not_report_instance_attribute_server_exists=False # TODO remove this arg ): # pylint: disable=too-many-arguments """ Prepare all parts of primitive resource and append it into cib. report_processor is a tool for warning/info/error reporting etree.Element resources_section is place where new element will be appended IdProvider id_provider -- elements' ids generator string resource_id is id of new resource lib.resource_agent.CrmAgent resource_agent list of dict raw_operation_list specifies operations of resource dict meta_attributes specifies meta attributes of resource dict instance_attributes specifies instance attributes of resource bool allow_invalid_operation is flag for skipping validation of operations bool allow_invalid_instance_attributes is flag for skipping validation of instance_attributes bool use_default_operations is flag for completion operations with default actions specified in resource agent string resource_type -- describes the resource for reports bool do_not_report_instance_attribute_server_exists -- dirty fix due to suboptimal architecture, TODO: fix the architecture and remove the param """ if raw_operation_list is None: raw_operation_list = [] if meta_attributes is None: meta_attributes = {} if instance_attributes is None: instance_attributes = {} if does_id_exist(resources_section, resource_id): raise LibraryError(reports.id_already_exists(resource_id)) validate_id(resource_id, "{0} name".format(resource_type)) operation_list = prepare_operations( report_processor, raw_operation_list, resource_agent.get_cib_default_actions( necessary_only=not use_default_operations ), [operation["name"] for operation in resource_agent.get_actions()], allow_invalid=allow_invalid_operation, ) if report_processor.report_list( validate_resource_instance_attributes_create( resource_agent, instance_attributes, resources_section, force=allow_invalid_instance_attributes, do_not_report_instance_attribute_server_exists=( do_not_report_instance_attribute_server_exists ) ) ).has_errors: raise LibraryError() return append_new( resources_section, id_provider, resource_id, resource_agent.get_standard(), resource_agent.get_provider(), resource_agent.get_type(), instance_attributes=instance_attributes, meta_attributes=meta_attributes, operation_list=operation_list )
def create( report_processor, resources_section, resource_id, resource_agent, raw_operation_list=None, meta_attributes=None, instance_attributes=None, allow_invalid_operation=False, allow_invalid_instance_attributes=False, use_default_operations=True, ensure_disabled=False, ): """ Prepare all parts of primitive resource and append it into cib. report_processor is a tool for warning/info/error reporting etree.Element resources_section is place where new element will be appended string resource_id is id of new resource lib.resource_agent.CrmAgent resource_agent list of dict raw_operation_list specifies operations of resource dict meta_attributes specifies meta attributes of resource dict instance_attributes specifies instance attributes of resource bool allow_invalid_operation is flag for skipping validation of operations bool allow_invalid_instance_attributes is flag for skipping validation of instance_attributes bool use_default_operations is flag for completion operations with default actions specified in resource agent bool ensure_disabled is flag for completion meta_attributes with attribute causing disabling resource """ if raw_operation_list is None: raw_operation_list = [] if meta_attributes is None: meta_attributes = {} if instance_attributes is None: instance_attributes = {} if does_id_exist(resources_section, resource_id): raise LibraryError(reports.id_already_exists(resource_id)) validate_id(resource_id, "resource name") operation_list = prepare_operations( report_processor, raw_operation_list, resource_agent.get_cib_default_actions( necessary_only=not use_default_operations ), [operation["name"] for operation in resource_agent.get_actions()], allow_invalid=allow_invalid_operation, ) if ensure_disabled: meta_attributes = disable_meta(meta_attributes) report_processor.process_list( resource_agent.validate_parameters( instance_attributes, parameters_type="resource", allow_invalid=allow_invalid_instance_attributes, ) ) return append_new( resources_section, resource_id, resource_agent.get_standard(), resource_agent.get_provider(), resource_agent.get_type(), instance_attributes=instance_attributes, meta_attributes=meta_attributes, operation_list=operation_list )