예제 #1
0
    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)
예제 #2
0
 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))
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
 def test_nothing_requested_nothing_found(self):
     fltr = _scheduler.CapabilitiesFilter({})
     node = mock.Mock(properties={}, spec=['properties', 'name', 'id'])
     self.assertTrue(fltr(node))
예제 #6
0
 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)