def get_cib(self, minimal_version=None): if self.__loaded_cib_diff_source is not None: raise AssertionError("CIB has already been loaded") self.__loaded_cib_diff_source = get_cib_xml(self.cmd_runner()) self.__loaded_cib_to_modify = get_cib(self.__loaded_cib_diff_source) if minimal_version is not None: upgraded_cib = ensure_cib_version( self.cmd_runner(), self.__loaded_cib_to_modify, minimal_version ) if upgraded_cib is not None: self.__loaded_cib_to_modify = upgraded_cib self.__loaded_cib_diff_source = etree_to_str(upgraded_cib) if not self._cib_upgrade_reported: self.report_processor.process( reports.cib_upgrade_successful() ) self._cib_upgrade_reported = True self.__loaded_cib_diff_source_feature_set = ( get_cib_crm_feature_set( self.__loaded_cib_to_modify, none_if_missing=True ) or Version(0, 0, 0) ) return self.__loaded_cib_to_modify
def verify(env, verbose=False): runner = env.cmd_runner() dummy_stdout, verify_stderr, verify_returncode = verify_cmd( runner, verbose=verbose, ) #1) Do not even try to think about upgrading! #2) We do not need cib management in env (no need for push...). #So env.get_cib is not best choice here (there were considerations to #upgrade cib at all times inside env.get_cib). Go to a lower level here. if verify_returncode != 0: env.report_processor.append(reports.invalid_cib_content(verify_stderr)) #Cib is sometimes loadable even if `crm_verify` fails (e.g. when #fencing topology is invalid). On the other hand cib with id duplication #is not loadable. #We try extra checks when cib is possible to load. cib_xml, dummy_stderr, returncode = get_cib_xml_cmd_results(runner) if returncode != 0: #can raise; raise LibraryError is better but in this case we prefer #be consistent with raising below env.report_processor.send() else: cib_xml = get_cib_xml(runner) cib = get_cib(cib_xml) fencing_topology.verify( env.report_processor, get_fencing_topology(cib), get_resources(cib), ClusterState(get_cluster_status_xml(runner)).node_section.nodes) #can raise env.report_processor.send()
def test_invalid_xml(self): xml = "<invalid><xml />" assert_raise_library_error( lambda: lib.get_cib(xml), ( Severity.ERROR, report_codes.CIB_LOAD_ERROR_BAD_FORMAT, { } ) )
def get_cib(self, minimal_version=None): cib = get_cib(self._get_cib_xml()) if minimal_version is not None: upgraded_cib = ensure_cib_version(self.cmd_runner(), cib, minimal_version) if upgraded_cib is not None: cib = upgraded_cib if self.is_cib_live and not self._cib_upgraded: self.report_processor.process( reports.cib_upgrade_successful()) self._cib_upgraded = True return cib
def test_invalid_xml(self, xml_fromstring_mock): reason = "custom reason" xml_fromstring_mock.side_effect = etree.XMLSyntaxError(reason, 1, 1, 1) xml = "<invalid><xml />" assert_raise_library_error( lambda: lib.get_cib(xml), fixture.error( report_codes.CIB_LOAD_ERROR_BAD_FORMAT, reason=f"{reason} (line 1)", ), ) xml_fromstring_mock.assert_called_once_with(xml)
def get_cib(self, minimal_version=None): cib = get_cib(self._get_cib_xml()) if minimal_version is not None: upgraded_cib = ensure_cib_version( self.cmd_runner(), cib, minimal_version ) if upgraded_cib is not None: cib = upgraded_cib if self.is_cib_live and not self._cib_upgraded: self.report_processor.process( reports.cib_upgrade_successful() ) self._cib_upgraded = True return cib
def get_cib( self, minimal_version: Optional[Version] = None, nice_to_have_version: Optional[Version] = None, ) -> _Element: if self.__loaded_cib_diff_source is not None: raise AssertionError("CIB has already been loaded") self.__loaded_cib_diff_source = get_cib_xml(self.cmd_runner()) self.__loaded_cib_to_modify = get_cib(self.__loaded_cib_diff_source) if ( nice_to_have_version is not None and minimal_version is not None and minimal_version >= nice_to_have_version ): nice_to_have_version = None for version, mandatory in ( (nice_to_have_version, False), (minimal_version, True), ): if version is not None: upgraded_cib, was_upgraded = ensure_cib_version( self.cmd_runner(), self.__loaded_cib_to_modify, version, fail_if_version_not_met=mandatory, ) if was_upgraded: self.__loaded_cib_to_modify = upgraded_cib self.__loaded_cib_diff_source = etree_to_str(upgraded_cib) if not self._cib_upgrade_reported: self.report_processor.report( ReportItem.info( reports.messages.CibUpgradeSuccessful() ) ) self._cib_upgrade_reported = True self.__loaded_cib_diff_source_feature_set = get_cib_crm_feature_set( self.__loaded_cib_to_modify, none_if_missing=True ) or Version(0, 0, 0) return self.__loaded_cib_to_modify
def get_cib(self, minimal_version: Optional[Version] = None) -> Element: if self.__loaded_cib_diff_source is not None: raise AssertionError("CIB has already been loaded") self.__loaded_cib_diff_source = get_cib_xml(self.cmd_runner()) self.__loaded_cib_to_modify = get_cib(self.__loaded_cib_diff_source) if minimal_version is not None: upgraded_cib = ensure_cib_version(self.cmd_runner(), self.__loaded_cib_to_modify, minimal_version) if upgraded_cib is not None: self.__loaded_cib_to_modify = upgraded_cib self.__loaded_cib_diff_source = etree_to_str(upgraded_cib) if not self._cib_upgrade_reported: self.report_processor.report( ReportItem.info( reports.messages.CibUpgradeSuccessful())) self._cib_upgrade_reported = True self.__loaded_cib_diff_source_feature_set = get_cib_crm_feature_set( self.__loaded_cib_to_modify, none_if_missing=True) or Version( 0, 0, 0) return self.__loaded_cib_to_modify
def test_success(self): xml = "<xml />" assert_xml_equal(xml, str(XmlManipulation((lib.get_cib(xml)))))