def detect_known_bugs(): """Unit fails to start complaining there are members in the relation.""" known_bugs = { 1910958: { "description": ("Unit fails to start complaining there are " "members in the relation."), "pattern": ( r'.* manifold worker returned unexpected error: failed to ' r'initialize uniter for "[A-Za-z0-9-]+": cannot create ' r'relation state tracker: cannot remove persisted state, ' r'relation \d+ has members'), "hint": "manifold worker returned unexpected error", } } s = FileSearcher() for bug in known_bugs: sd = SearchDef(known_bugs[bug]["pattern"], tag=1910958, hint=known_bugs[bug]["hint"]) s.add_search_term(sd, f"{JUJU_LOG_PATH}/*") results = s.search() for bug in known_bugs: if results.find_by_tag(bug): add_known_bug(bug, known_bugs.get("description"))
def test_add_known_bug_first(self): with mock.patch.object(known_bugs_utils, 'PLUGIN_TMP_DIR', self.tmpdir): known_bugs_utils.add_known_bug(1) ret = known_bugs_utils.get_known_bugs() self.assertEquals(ret, { known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: ['https://pad.lv/1'] })
def process_results(self, results): for bugsearch in self.bug_definitions: tag = bugsearch["def"].tag _results = results.find_by_tag(tag) if _results: if bugsearch["def"].reason_format_result_groups: reason = bugsearch["def"].rendered_reason(_results[0]) add_known_bug(tag, reason) else: add_known_bug(tag, bugsearch["def"].reason)
def test_add_known_bug_first(self): with mock.patch.object(known_bugs_utils, 'PLUGIN_TMP_DIR', self.tmpdir): known_bugs_utils.add_known_bug(1) ret = known_bugs_utils._get_known_bugs() self.assertEquals(ret, {known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: [{'id': 'https://bugs.launchpad.net/bugs/1', 'desc': 'no description provided', 'origin': 'testplugin.01part'} ]})
def test_add_known_bug_first(self): with mock.patch.object(known_bugs_utils, 'PLUGIN_TMP_DIR', self.tmpdir): known_bugs_utils.add_known_bug(1) ret = known_bugs_utils._get_known_bugs() self.assertEquals( ret, { known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: [{ 'https://bugs.launchpad.net/bugs/1': 'Microsoft has a majority market share' }] })
def test_add_known_bug(self): known_bugs = { known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: ['https://pad.lv/1'] } with mock.patch.object(known_bugs_utils, 'PLUGIN_TMP_DIR', self.tmpdir): with open(os.path.join(self.tmpdir, 'known_bugs.yaml'), 'w') as fd: fd.write(yaml.dump(known_bugs)) known_bugs_utils.add_known_bug(2) ret = known_bugs_utils.get_known_bugs() self.assertEquals( ret, { known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: ['https://pad.lv/1', 'https://pad.lv/2'] })
def check_stats(self): if not self.get_sysfs_cachesets(): return for path in self.get_sysfs_cachesets(): path = os.path.join(path, "cache_available_percent") with open(path) as fd: value = fd.read().strip() limit = CACHE_AVAILABLE_PERCENT_LIMIT_LP1900438 if int(value) <= limit: msg = ( "bcache cache_available_percent ({}) is <= {} - " "this node could be suffering from bug 1900438".format( value, limit)) add_issue(BcacheWarning(msg)) add_known_bug(1900438, "see BcacheWarning for info")
def detect_known_bugs(): """Unit fails to start complaining there are members in the relation.""" data_source = f"{JUJU_LOG_PATH}/*.log" if constants.USE_ALL_LOGS: data_source = f"{data_source}*" s = FileSearcher() for bugdef in BUG_SEARCHES: s.add_search_term(bugdef, data_source) results = s.search() for bugdef in BUG_SEARCHES: bug_results = results.find_by_tag(bugdef.tag) if bug_results: reason = bugdef.render_reason(bug_results[0]) add_known_bug(bugdef.tag, reason)
def test_add_known_bug(self): known_bugs = {known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: [{'id': 'https://bugs.launchpad.net/bugs/1', 'desc': 'no description provided', 'origin': 'testplugin.01part'}]} with mock.patch.object(known_bugs_utils, 'PLUGIN_TMP_DIR', self.tmpdir): with open(os.path.join(self.tmpdir, 'known_bugs.yaml'), 'w') as fd: fd.write(yaml.dump(known_bugs)) known_bugs_utils.add_known_bug(2) ret = known_bugs_utils._get_known_bugs() expected = {known_bugs_utils.MASTER_YAML_KNOWN_BUGS_KEY: [{'id': 'https://bugs.launchpad.net/bugs/1', 'desc': 'no description provided', 'origin': 'testplugin.01part'}, {'id': 'https://bugs.launchpad.net/bugs/2', 'desc': 'no description provided', 'origin': 'testplugin.01part'}]} self.assertEquals(ret, expected)
def run_cpu_pinning_checks(self): """Perform a set of checks on Nova cpu pinning configuration to ensure it is setup as expected. """ if self.cpu_dedicated_set: intersect1 = self.cpu_dedicated_set.intersection(self.isolcpus) intersect2 = self.cpu_dedicated_set.intersection(self.cpuaffinity) if intersect1: if intersect2: extra = ("intersection with isolcpus: {}\nintersection " "with cpuaffinity: {}".format( intersect1, intersect2)) msg = ("{} is a subset of both isolcpus AND " "cpuaffinity".format(self.cpu_dedicated_set_name)) self.results.add_error(msg, extra) elif intersect2: if intersect1: extra = ("intersection with isolcpus: {}\nintersection " "with cpuaffinity: {}".format( intersect1, intersect2)) msg = ("{} is a subset of both isolcpus AND " "cpuaffinity".format(self.cpu_dedicated_set_name)) self.results.add_error(msg, extra) else: msg = ("{} is neither a subset of isolcpus nor cpuaffinity". format(self.cpu_dedicated_set_name)) self.results.add_error(msg) reason = "cpu pinning check: {}".format(msg) add_known_bug(1897275, reason) intersect = self.cpu_shared_set.intersection(self.kernel.isolcpus) if intersect: extra = "intersection: {}".format(list_to_str(intersect)) self.results.add_error( "cpu_shared_set contains cores from " "isolcpus", extra) intersect = self.cpu_dedicated_set.intersection(self.cpu_shared_set) if intersect: extra = "intersection: {}".format(list_to_str(intersect)) self.results.add_error( "cpu_shared_set and {} overlap".format( self.cpu_dedicated_set_name), extra) intersect = self.isolcpus.intersection(self.cpuaffinity) if intersect: extra = "intersection: {}".format(list_to_str(intersect)) self.results.add_error("isolcpus and cpuaffinity overlap", extra) node_count = 0 for node in self.numa.nodes: if self.cpu_dedicated_set.intersection(set(self.numa.cores(node))): node_count += 1 if node_count > 1: extra = "" for node in self.numa.nodes: if extra: extra += "\n" extra += "node{}: {}".format( node, list_to_str(self.numa.cores(node))) extra += "\n{}: {}".format(self.cpu_dedicated_set_name, list_to_str(self.cpu_dedicated_set)) self.results.add_info( "{} has cores from > 1 numa node".format( self.cpu_dedicated_set_name), extra) if self.isolcpus or self.cpuaffinity: total_isolated = self.isolcpus.union(self.cpuaffinity) nonisolated = set(total_isolated).intersection() if len(nonisolated) <= 4: self.results.add_warn("Host has only {} cores unpinned. This " "might cause unintended performance " "problems".format(len(nonisolated)))
def process_bug_results(self, results): for tag in self.agent_bug_search_terms: if results.find_by_tag(tag): reason = self.agent_bug_search_terms[tag]["reason"] add_known_bug(tag, description=reason)
def process_results(self, results): for bugsearch in AGENT_BUG_SEARCHES: if results.find_by_tag(bugsearch.tag): add_known_bug(bugsearch.tag, bugsearch.reason)
def process_results(self, results): for bugsearch in AGENT_BUG_SEARCHES: tag = bugsearch["def"].tag if results.find_by_tag(tag): add_known_bug(tag, bugsearch["def"].reason)