def _prefilter_nodes(self, resource_class, conductor_group, capabilities, candidates, predicate): """Build a list of candidate nodes for allocation.""" if candidates: try: nodes = [self._get_node(node) for node in candidates] except os_exc.ResourceNotFound as exc: raise exceptions.InvalidNode(str(exc)) else: nodes = list( self.connection.baremetal.nodes( details=True, associated=False, provision_state='available', maintenance=False, resource_class=resource_class, conductor_group=conductor_group)) if not nodes: raise exceptions.NodesNotFound(resource_class, conductor_group) filters = [ _scheduler.NodeTypeFilter(resource_class, conductor_group), ] if capabilities: filters.append(_scheduler.CapabilitiesFilter(capabilities)) if predicate is not None: filters.append(_scheduler.CustomPredicateFilter(predicate)) return _scheduler.run_filters(filters, nodes)
def test_not_matching_node(self): fltr = _scheduler.CapabilitiesFilter({ 'profile': 'compute', 'foo': 'bar' }) node = mock.Mock(properties={'capabilities': 'foo:bar,answer:42'}, spec=['properties', 'name', 'id']) self.assertFalse(fltr(node))
def test_malformed_capabilities(self): fltr = _scheduler.CapabilitiesFilter({'profile': 'compute'}) for cap in ['foo,profile:control', 42, 'a:b:c']: node = mock.Mock(properties={'capabilities': cap}, spec=['properties', 'name', 'id']) self.assertFalse(fltr(node)) self.assertRaisesRegex( exceptions.CapabilitiesNotFound, 'No available nodes found with capabilities ' 'profile=compute, existing capabilities: none', fltr.fail)
def test_fail_message(self): fltr = _scheduler.CapabilitiesFilter({'profile': 'compute'}) node = mock.Mock(properties={'capabilities': 'profile:control'}, spec=['properties', 'name', 'id']) self.assertFalse(fltr(node)) self.assertRaisesRegex( exceptions.CapabilitiesNotFound, 'No available nodes found with capabilities ' 'profile=compute, existing capabilities: ' r'profile=control \(1 node\(s\)\)', fltr.fail)
def test_nothing_requested_nothing_found(self): fltr = _scheduler.CapabilitiesFilter({}) node = mock.Mock(properties={}, spec=['properties', 'name', 'id']) self.assertTrue(fltr(node))
def test_fail_no_capabilities(self): fltr = _scheduler.CapabilitiesFilter({'profile': 'compute'}) self.assertRaisesRegex( exceptions.CapabilitiesNotFound, 'No available nodes found with capabilities ' 'profile=compute, existing capabilities: none', fltr.fail)