예제 #1
0
    def test_build_complete_triggers(self, storage):
        m = Mock()
        m.get_project_definition.return_value = json.dumps({
            'timeout': 5,
            'triggers': [
                {
                    'name': 'github',
                    'type': 'github_pr',
                    'runs': [{
                        'name': 'run0',
                        'host-tag': 'foo*',
                    }],
                    'triggers': [
                        {'name': 'build-trigger'},
                    ]
                },
                {
                    'name': 'build-trigger',
                    'type': 'simple',
                    'runs': [{
                        'name': 'test',
                        'host-tag': 'foo*',
                        'container': 'container-foo',
                        'script': 'test',
                    }],
                },
            ],
            'scripts': {
                'test': '#test#',
            }
        })
        m.console_logfd.return_value = open('/dev/null', 'w')
        m.get_run_definition.return_value = json.dumps({})
        m.get_build_params.return_value = {'buildparam': '42'}
        storage.return_value = m
        r = Run(self.build, 'run0')
        r.trigger = 'github'
        r.status = BuildStatus.RUNNING
        r.queue_priority = 8675309
        db.session.add(r)
        db.session.commit()

        headers = [
            ('Authorization', 'Token %s' % r.api_key),
            ('X-RUN-STATUS', 'PASSED'),
        ]
        self._post(self.urlbase + 'run0/', None, headers, 200)

        db.session.refresh(r)
        run = Run.query.all()[1]
        self.assertEqual('test', run.name)
        self.assertEqual('QUEUED', run.status.name)
        rundef = json.loads(m.set_run_definition.call_args[0][1])
        self.assertEqual('42', rundef['env']['buildparam'])
        self.assertEqual(8675309, run.queue_priority)
예제 #2
0
    def test_worker_queue_priority(self, storage):
        """Validate queue priorities for Runs are honored.

           1. Create a normal project with 2 QUEUED builds.
           2. Set the priority of the newer build higher than the older build
           3. Verify queue priority is done properly.
        """
        if db.engine.dialect.name == 'sqlite':
            self.skipTest('Test requires MySQL')
        rundef = {'run_url': 'foo', 'runner_url': 'foo', 'env': {}}
        storage().get_run_definition.return_value = json.dumps(rundef)
        w = Worker('w1', 'ubuntu', 12, 2, 'aarch64', 'key', 2, ['aarch96'])
        w.enlisted = True
        w.online = True
        db.session.add(w)

        self.create_projects('job-1')
        p = Project.query.all()[0]
        p.synchronous_builds = True
        db.session.commit()

        b = Build.create(p)
        r = Run(b, 'r1')
        r.host_tag = 'aarch96'
        db.session.add(r)
        r = Run(b, 'r2')
        r.host_tag = 'aarch96'
        r.queue_priority = 2  # this is *newer* build but *higher* priority
        db.session.add(r)

        db.session.commit()
        headers = [
            ('Content-type', 'application/json'),
            ('Authorization', 'Token key'),
        ]
        qs = 'available_runners=1&foo=2'
        resp = self.client.get('/workers/w1/',
                               headers=headers,
                               query_string=qs)
        self.assertEqual(200, resp.status_code, resp.data)
        data = json.loads(resp.data.decode())
        self.assertEqual(1, len(data['data']['worker']['run-defs']))
        self.assertEqual([BuildStatus.QUEUED, BuildStatus.RUNNING],
                         [x.status for x in Run.query])
예제 #3
0
    def test_worker_queue_priority(self, storage):
        """Validate queue priorities for Runs are honored.

        1. Create a normal project with 2 QUEUED builds.
        2. Set the priority of the newer build higher than the older build
        3. Verify queue priority is done properly.
        """
        if db.engine.dialect.name == "sqlite":
            self.skipTest("Test requires MySQL")
        rundef = {"run_url": "foo", "runner_url": "foo", "env": {}}
        storage().get_run_definition.return_value = json.dumps(rundef)
        w = Worker("w1", "ubuntu", 12, 2, "aarch64", "key", 2, ["aarch96"])
        w.enlisted = True
        w.online = True
        db.session.add(w)

        self.create_projects("job-1")
        p = Project.query.all()[0]
        p.synchronous_builds = True
        db.session.commit()

        b = Build.create(p)
        r = Run(b, "r1")
        r.host_tag = "aarch96"
        db.session.add(r)
        r = Run(b, "r2")
        r.host_tag = "aarch96"
        r.queue_priority = 2  # this is *newer* build but *higher* priority
        db.session.add(r)

        db.session.commit()
        headers = [
            ("Content-type", "application/json"),
            ("Authorization", "Token key"),
        ]
        qs = "available_runners=1&foo=2"
        resp = self.client.get("/workers/w1/",
                               headers=headers,
                               query_string=qs)
        self.assertEqual(200, resp.status_code, resp.data)
        data = json.loads(resp.data.decode())
        self.assertEqual(1, len(data["data"]["worker"]["run-defs"]))
        self.assertEqual([BuildStatus.QUEUED, BuildStatus.RUNNING],
                         [x.status for x in Run.query])
예제 #4
0
    def test_build_complete_triggers(self, storage, notify):
        class MockStorage:
            projdef = {
                "timeout":
                5,
                "triggers": [
                    {
                        "name": "github",
                        "type": "github_pr",
                        "email": {
                            "users": "*****@*****.**",
                        },
                        "runs": [{
                            "name": "run0",
                            "host-tag": "foo*",
                        }],
                        "triggers": [
                            {
                                "name": "build-trigger"
                            },
                        ],
                    },
                    {
                        "name":
                        "build-trigger",
                        "type":
                        "simple",
                        "runs": [{
                            "name": "test",
                            "host-tag": "foo*",
                            "container": "container-foo",
                            "script": "test",
                        }],
                    },
                ],
                "scripts": {
                    "test": "#test#",
                },
            }

            @classmethod
            def get_projdef(cls, build):
                return yaml.dump(cls.projdef)

            @classmethod
            def create_projdef(cls, build, projdef):
                cls.projdef = yaml.safe_load(projdef)

        m = Mock()
        m.get_project_definition = MockStorage.get_projdef
        m.create_project_definition = MockStorage.create_projdef

        m.console_logfd.return_value = open("/dev/null", "w")
        m.get_run_definition.return_value = json.dumps({})
        m.get_build_params.return_value = {"buildparam": "42"}
        storage.return_value = m
        r = Run(self.build, "run0")
        r.trigger = "github"
        r.status = BuildStatus.RUNNING
        r.queue_priority = 8675309
        db.session.add(r)
        db.session.commit()

        headers = [
            ("Authorization", "Token %s" % r.api_key),
            ("X-RUN-STATUS", "PASSED"),
        ]
        self._post(self.urlbase + "run0/", None, headers, 200)

        db.session.refresh(r)
        run = Run.query.all()[1]
        self.assertEqual("test", run.name)
        self.assertEqual("QUEUED", run.status.name)
        rundef = json.loads(m.set_run_definition.call_args[0][1])
        self.assertEqual("42", rundef["env"]["buildparam"])
        self.assertEqual(8675309, run.queue_priority)

        headers[0] = ("Authorization", "Token %s" % run.api_key)
        self._post(self.urlbase + "test/", None, headers, 200)
        run = Run.query.all()[1]
        self.assertEqual("test", run.name)
        self.assertEqual("PASSED", run.status.name)
        self.assertEqual("PASSED", self.build.status.name)

        notify.assert_called_once_with(self.build, "*****@*****.**")