def test_no_nodes(self):
        # One error per each flavor
        expected = actions.Result(
            error={
                'errors': [
                    'Error: only 0 of 1 requested ironic nodes are '
                    'tagged to profile compute (for flavor '
                    'compute)\n'
                    'Recommendation: tag more nodes using openstack '
                    'baremetal node set --property  '
                    '"capabilities=profile:compute,'
                    'boot_option:local" <NODE ID>',
                    'Error: only 0 of 1 requested ironic nodes are '
                    'tagged to profile control (for flavor '
                    'control).\n'
                    'Recommendation: tag more nodes using openstack '
                    'baremetal node set --property '
                    '"capabilities=profile:control,'
                    'boot_option:local" <NODE ID>'
                ],
                'warnings': []
            })

        action = validations.VerifyProfilesAction(self.nodes, self.flavors)
        result = action.run(self.ctx)
        self.assertEqual(expected.error['errors'].sort(),
                         result.error['errors'].sort())
        self.assertEqual(expected.error['warnings'], result.error['warnings'])
        self.assertEqual(None, result.data)
    def test_assign_profiles_wrong_state(self):
        # active nodes are not considered for assigning profiles
        self.nodes[:] = [
            self._get_fake_node(possible_profiles=['compute'],
                                provision_state='active'),
            self._get_fake_node(possible_profiles=['control'],
                                provision_state='cleaning'),
            self._get_fake_node(profile='compute', provision_state='error')
        ]
        expected = actions.Result(
            error={
                'warnings': [
                    'There are 1 ironic nodes with no profile that will not '
                    'be used: %s' % self.nodes[0].get('uuid')
                ],
                'errors': [
                    'Error: only 0 of 1 requested ironic nodes are tagged to '
                    'profile control (for flavor control).\n'
                    'Recommendation: tag more nodes using openstack baremetal '
                    'node set --property "capabilities=profile:control,'
                    'boot_option:local" <NODE ID>',
                    'Error: only 0 of 1 requested ironic nodes are tagged to '
                    'profile compute (for flavor compute).\n'
                    'Recommendation: tag more nodes using openstack baremetal '
                    'node set --property "capabilities=profile:compute,'
                    'boot_option:local" <NODE ID>'
                ]
            })

        action = validations.VerifyProfilesAction(self.nodes, self.flavors)
        result = action.run(self.ctx)
        self.assertEqual(expected.error['errors'].sort(),
                         result.error['errors'].sort())
        self.assertEqual(expected.error['warnings'], result.error['warnings'])
        self.assertEqual(None, result.data)
    def _test(self, expected_result):
        action = validations.VerifyProfilesAction(self.nodes, self.flavors)
        result = action.run(self.ctx)

        self.assertEqual(expected_result, result)