def _parse_pool_summaries(self, histories): """Parse message output according to the grammar above. Create a lab inventory from the given `histories`, and generate the pool inventory message. Then parse the message and return a dictionary mapping each pool to the message body parsed after that pool. Tests the following assertions: * Each <description> contains a mention of exactly one pool in the `CRITICAL_POOLS` list. * Each pool is mentioned in exactly one <description>. Note that the grammar requires the header to appear once for each pool, so the parsing implicitly asserts that the output contains the header. @param histories Input used to create the test `_LabInventory` object. @return A dictionary mapping model names to the output (a list of lines) for the model. """ inventory = lab_inventory._LabInventory(histories, lab_inventory.MANAGED_POOLS) message = lab_inventory._generate_pool_inventory_message( inventory).split('\n') poolset = set(lab_inventory.CRITICAL_POOLS) seen_url = False seen_intro = False description = '' model_text = {} current_pool = None for line in message: if not seen_url: if _POOL_ADMIN_URL in line: seen_url = True elif not seen_intro: if not line: seen_intro = True elif current_pool is None: if line == self._header: pools_mentioned = [p for p in poolset if p in description] self.assertEqual(len(pools_mentioned), 1) current_pool = pools_mentioned[0] description = '' model_text[current_pool] = [] poolset.remove(current_pool) else: description += line else: if line: model_text[current_pool].append(line) else: current_pool = None self.assertEqual(len(poolset), 0) return model_text
def _get_idle_message(self, histories): """Generate idle inventory and obtain its message. @param histories: Used to create lab inventory. @return the generated idle message. """ inventory = lab_inventory._LabInventory(histories, lab_inventory.MANAGED_POOLS) message = lab_inventory._generate_idle_inventory_message( inventory).split('\n') return message
def create_inventory(self, data): """Initialize a `_LabInventory` instance for testing. @param data Representation of Lab inventory data, as described above. """ histories = [] self.num_duts = 0 status_choices = (_WORKING, _BROKEN, _UNUSED) pools = (self._CRITICAL_POOL, self._SPARE_POOL) for board, counts in data.items(): for i in range(0, len(pools)): for j in range(0, len(status_choices)): for x in range(0, counts[i][j]): history = _FakeHostHistory(board, pools[i], status_choices[j]) histories.append(history) if board is not None: self.num_duts += 1 self.inventory = lab_inventory._LabInventory(histories)
def create_inventory(data): """Create a `_LabInventory` instance for testing. This function allows the construction of a complete `_LabInventory` object from a simplified input representation. A single 'critical pool' is arbitrarily chosen for purposes of testing; there's no coverage for testing arbitrary combinations in more than one critical pool. @param data: dict {key: PoolStatusCounts}. @returns: lab_inventory._LabInventory object. """ histories = [] for model, counts in data.iteritems(): for p, pool in enumerate(POOL_CHOICES): for s, status in enumerate(STATUS_CHOICES): fake_host = _FakeHostHistory(model, pool, status) histories.extend([fake_host] * counts[p][s]) inventory = lab_inventory._LabInventory(histories, lab_inventory.MANAGED_POOLS) return inventory