Ejemplo n.º 1
0
    def get_resource_program(self):
        """
        Return a ResourceProgram based on the 'requires' expression.

        The program instance is cached in the JobDefinition and is not
        compiled or validated on subsequent calls.

        :returns:
            ResourceProgram if one is available or None
        :raises ResourceProgramError:
            If the program definition is incorrect
        """
        if self.requires is not None and self._resource_program is None:
            if self._provider is not None:
                implicit_namespace = self._provider.namespace
            else:
                implicit_namespace = None
            if self.imports is not None:
                imports = list(self.get_imported_jobs())
            else:
                imports = None
            self._resource_program = ResourceProgram(self.requires,
                                                     implicit_namespace,
                                                     imports)
        return self._resource_program
Ejemplo n.º 2
0
 def test_namespace_support(self):
     prog = ResourceProgram(
         "package.name == 'fwts'\n"
         "platform.arch in ('i386', 'amd64')",
         implicit_namespace="com.canonical")
     self.assertEqual(prog.required_resources,
                      {'com.canonical::package', 'com.canonical::platform'})
Ejemplo n.º 3
0
class ResourceProgramTests(TestCase):
    def setUp(self):
        super(ResourceProgramTests, self).setUp()
        self.prog = ResourceProgram("\n"  # empty lines are ignored
                                    "package.name == 'fwts'\n"
                                    "platform.arch in ('i386', 'amd64')")

    def test_expressions(self):
        self.assertEqual(len(self.prog.expression_list), 2)
        self.assertEqual(self.prog.expression_list[0].text,
                         "package.name == 'fwts'")
        self.assertEqual(self.prog.expression_list[0].resource_name, "package")
        self.assertEqual(self.prog.expression_list[1].text,
                         "platform.arch in ('i386', 'amd64')")
        self.assertEqual(self.prog.expression_list[1].resource_name,
                         "platform")

    def test_required_resources(self):
        self.assertEqual(self.prog.required_resources,
                         set(('package', 'platform')))

    def test_evaluate_failure_not_true(self):
        resource_map = {
            'package': [
                Resource({'name': 'plainbox'}),
            ],
            'platform': [Resource({'arch': 'i386'})]
        }
        with self.assertRaises(ExpressionFailedError) as call:
            self.prog.evaluate_or_raise(resource_map)
        self.assertEqual(call.exception.expression.text,
                         "package.name == 'fwts'")

    def test_evaluate_without_no_match(self):
        resource_map = {'package': [], 'platform': []}
        with self.assertRaises(ExpressionFailedError) as call:
            self.prog.evaluate_or_raise(resource_map)
        self.assertEqual(call.exception.expression.text,
                         "package.name == 'fwts'")

    def test_evaluate_failure_no_resource(self):
        resource_map = {'platform': [Resource({'arch': 'i386'})]}
        with self.assertRaises(ExpressionCannotEvaluateError) as call:
            self.prog.evaluate_or_raise(resource_map)
        self.assertEqual(call.exception.expression.text,
                         "package.name == 'fwts'")

    def test_evaluate_success(self):
        resource_map = {
            'package':
            [Resource({'name': 'plainbox'}),
             Resource({'name': 'fwts'})],
            'platform': [Resource({'arch': 'i386'})]
        }
        self.assertTrue(self.prog.evaluate_or_raise(resource_map))
Ejemplo n.º 4
0
    def get_resource_program(self):
        """
        Return a ResourceProgram based on the 'requires' expression.

        The program instance is cached in the JobDefinition and is not
        compiled or validated on subsequent calls.

        Returns ResourceProgram or None
        Raises ResourceProgramError or SyntaxError
        """
        if self.requires is not None and self._resource_program is None:
            self._resource_program = ResourceProgram(self.requires)
        return self._resource_program
Ejemplo n.º 5
0
    def get_filter_program(self):
        """
        Get filter program compiled from the template-filter field.

        :returns:
            ResourceProgram created out of the text of the template-filter
            field.
        """
        if self.template_filter is not None and self._filter_program is None:
            self._filter_program = ResourceProgram(self.template_filter,
                                                   self.resource_namespace,
                                                   self.get_imported_jobs())
        return self._filter_program
Ejemplo n.º 6
0
class ResourceProgramTests(TestCase):

    def setUp(self):
        super(ResourceProgramTests, self).setUp()
        self.prog = ResourceProgram(
            "\n"  # empty lines are ignored
            "package.name == 'fwts'\n"
            "platform.arch in ('i386', 'amd64')")

    def test_expressions(self):
        self.assertEqual(len(self.prog.expression_list), 2)
        self.assertEqual(self.prog.expression_list[0].text,
                         "package.name == 'fwts'")
        self.assertEqual(self.prog.expression_list[0].resource_name,
                         "package")
        self.assertEqual(self.prog.expression_list[1].text,
                         "platform.arch in ('i386', 'amd64')")
        self.assertEqual(self.prog.expression_list[1].resource_name,
                         "platform")

    def test_required_resources(self):
        self.assertEqual(self.prog.required_resources,
                         set(('package', 'platform')))

    def test_evaluate(self):
        resources = {
            'package': [
                Resource({'name': 'plainbox'}),
                Resource({'name': 'fwts'})],
            'platform': [
                Resource({'arch': 'i386'})]
        }
        self.assertIn('package', resources)
        self.assertIn('platform', resources)
        for name in self.prog.required_resources:
            self.assertIn(name, resources)
        self.assertTrue(self.prog.evaluate(resources))

    def test_evaluate_without_resources(self):
        with self.assertRaises(ResourceLookupError) as call:
            self.prog.evaluate({'package': []})
        self.assertEqual(call.exception.resource_name, 'platform')
        with self.assertRaises(ResourceLookupError) as call:
            self.prog.evaluate({'platform': []})
        self.assertEqual(call.exception.resource_name, 'package')

    def test_evaluate_without_empty_resources(self):
        self.assertFalse(self.prog.evaluate({'package': [], 'platform': []}))
Ejemplo n.º 7
0
class ResourceProgramTests(TestCase):
    def setUp(self):
        super(ResourceProgramTests, self).setUp()
        self.prog = ResourceProgram("\n"  # empty lines are ignored
                                    "package.name == 'fwts'\n"
                                    "platform.arch in ('i386', 'amd64')")

    def test_expressions(self):
        self.assertEqual(len(self.prog.expression_list), 2)
        self.assertEqual(self.prog.expression_list[0].text,
                         "package.name == 'fwts'")
        self.assertEqual(self.prog.expression_list[0].resource_name, "package")
        self.assertEqual(self.prog.expression_list[1].text,
                         "platform.arch in ('i386', 'amd64')")
        self.assertEqual(self.prog.expression_list[1].resource_name,
                         "platform")

    def test_required_resources(self):
        self.assertEqual(self.prog.required_resources,
                         set(('package', 'platform')))

    def test_evaluate(self):
        resources = {
            'package':
            [Resource({'name': 'plainbox'}),
             Resource({'name': 'fwts'})],
            'platform': [Resource({'arch': 'i386'})]
        }
        self.assertIn('package', resources)
        self.assertIn('platform', resources)
        for name in self.prog.required_resources:
            self.assertIn(name, resources)
        self.assertTrue(self.prog.evaluate(resources))

    def test_evaluate_without_resources(self):
        with self.assertRaises(ResourceLookupError) as call:
            self.prog.evaluate({'package': []})
        self.assertEqual(call.exception.resource_name, 'platform')
        with self.assertRaises(ResourceLookupError) as call:
            self.prog.evaluate({'platform': []})
        self.assertEqual(call.exception.resource_name, 'package')

    def test_evaluate_without_empty_resources(self):
        self.assertFalse(self.prog.evaluate({'package': [], 'platform': []}))
Ejemplo n.º 8
0
 def setUp(self):
     super(ResourceProgramTests, self).setUp()
     self.prog = ResourceProgram("\n"  # empty lines are ignored
                                 "package.name == 'fwts'\n"
                                 "platform.arch in ('i386', 'amd64')")
Ejemplo n.º 9
0
 def setUp(self):
     super(ResourceProgramTests, self).setUp()
     self.prog = ResourceProgram(
         "\n"  # empty lines are ignored
         "package.name == 'fwts'\n"
         "platform.arch in ('i386', 'amd64')")
Ejemplo n.º 10
0
class ResourceProgramTests(TestCase):

    def setUp(self):
        super(ResourceProgramTests, self).setUp()
        self.prog = ResourceProgram(
            "\n"  # empty lines are ignored
            "package.name == 'fwts'\n"
            "platform.arch in ('i386', 'amd64')")

    def test_expressions(self):
        self.assertEqual(len(self.prog.expression_list), 2)
        self.assertEqual(self.prog.expression_list[0].text,
                         "package.name == 'fwts'")
        self.assertEqual(self.prog.expression_list[0].resource_name,
                         "package")
        self.assertEqual(self.prog.expression_list[1].text,
                         "platform.arch in ('i386', 'amd64')")
        self.assertEqual(self.prog.expression_list[1].resource_name,
                         "platform")

    def test_required_resources(self):
        self.assertEqual(self.prog.required_resources,
                         set(('package', 'platform')))

    def test_evaluate_failure_not_true(self):
        resource_map = {
            'package': [
                Resource({'name': 'plainbox'}),
            ],
            'platform': [
                Resource({'arch': 'i386'})]
        }
        with self.assertRaises(ExpressionFailedError) as call:
            self.prog.evaluate_or_raise(resource_map)
        self.assertEqual(call.exception.expression.text,
                         "package.name == 'fwts'")

    def test_evaluate_without_no_match(self):
        resource_map = {
            'package': [],
            'platform': []
        }
        with self.assertRaises(ExpressionFailedError) as call:
            self.prog.evaluate_or_raise(resource_map)
        self.assertEqual(call.exception.expression.text,
                         "package.name == 'fwts'")

    def test_evaluate_failure_no_resource(self):
        resource_map = {
            'platform': [
                Resource({'arch': 'i386'})]
        }
        with self.assertRaises(ExpressionCannotEvaluateError) as call:
            self.prog.evaluate_or_raise(resource_map)
        self.assertEqual(call.exception.expression.text,
                         "package.name == 'fwts'")

    def test_evaluate_success(self):
        resource_map = {
            'package': [
                Resource({'name': 'plainbox'}),
                Resource({'name': 'fwts'})],
            'platform': [
                Resource({'arch': 'i386'})]
        }
        self.assertTrue(self.prog.evaluate_or_raise(resource_map))