Exemplo n.º 1
0
    async def start(self):
        """ Start processing the incoming MQTT Message """
        data = await self.c_task.get()
        work = json.loads(data)["input"]
        logger.debug(work)
        current_writer = self.get_writer(work)

        try:
            work_queue = asyncio.Queue()
            for job in work["jobs"]:
                logger.debug(job)
                await work_queue.put(job)

            worker_1 = tower_api_worker.TowerApiWorker(self.config,
                                                       current_writer,
                                                       work_queue)
            worker_2 = tower_api_worker.TowerApiWorker(self.config,
                                                       current_writer,
                                                       work_queue)

            await asyncio.gather(
                asyncio.create_task(worker_1.start()),
                asyncio.create_task(worker_2.start()),
            )
            await current_writer.flush()
        except Exception as exp:
            await current_writer.flush_errors([str(exp)])
            raise
        finally:
            current_writer.cleanup()
async def test_get_with_related():
    """ Test Get Method plus related"""
    writer = SimpleWriter("my_prefix")
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_TEMPLATE_PAYLOAD_FETCH_RELATED)
    worker = tower_api_worker.TowerApiWorker(TestData.config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.get(
            TestData.DEFAULT_JOB_TEMPLATES_LIST_URL,
            status=200,
            body=json.dumps(TestData.JOB_TEMPLATE_RESPONSE),
            headers=headers,
        )
        mocked.get(
            TestData.SURVEY_URL,
            status=200,
            body=json.dumps(TestData.SURVEY_DATA),
            headers=headers,
        )
        res = await worker.start()
        assert writer.called == 2
        assert (
            writer.fname ==
            f"api/v2/job_templates/{TestData.JOB_TEMPLATE_ID_1}/survey_spec/page1"
        )
async def test_monitor():
    """ Test Monitor Method """
    writer = SimpleWriter()
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_MONITOR_PAYLOAD)
    worker = tower_api_worker.TowerApiWorker(TestData.config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.get(
            TestData.JOB_MONITOR_URL,
            status=200,
            body=json.dumps(TestData.JOB_1_RUNNING),
            headers=headers,
        )
        mocked.get(
            TestData.JOB_MONITOR_URL,
            status=200,
            body=json.dumps(TestData.JOB_1_SUCCESSFUL),
            headers=headers,
        )
        res = await worker.start()
        assert writer.data["status"] == "successful"
        assert writer.called == 1
        assert writer.data["url"] == "/api/v2/jobs/500"
        assert writer.data["artifacts"] == {
            "expose_to_cloud_redhat_com__snow_ticket": 12345
        }
async def test_invalid_method():
    """ Test Invalid Method """
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.INVALID_PAYLOAD)
    worker = tower_api_worker.TowerApiWorker(TestData.config, None, work_queue)
    with pytest.raises(Exception) as excinfo:
        await worker.start()
    assert "Invalid method bad" in str(excinfo.value)
async def test_get_400():
    """ test get method - 400"""
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_TEMPLATE_PAYLOAD_SINGLE_PAGE)
    worker = tower_api_worker.TowerApiWorker(TestData.config, None, work_queue)
    with aioresponses() as mocked:
        mocked.get(TestData.DEFAULT_JOB_TEMPLATES_LIST_URL,
                   status=400,
                   body="BAD DATA")
        with pytest.raises(Exception) as excinfo:
            await worker.start()
        assert "BAD DATA" in str(excinfo.value)
async def test_monitor_400():
    """ Test Monitor Method - 400"""
    writer = SimpleWriter()
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_MONITOR_PAYLOAD)
    worker = tower_api_worker.TowerApiWorker(TestData.no_verify_config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.get(TestData.JOB_MONITOR_URL, status=400, body="BAD DATA")
        with pytest.raises(Exception) as excinfo:
            await worker.start()
        assert "BAD DATA" in str(excinfo.value)
async def test_launch_400():
    """ Test Launch Method - 400 """
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_TEMPLATE_LAUNCH_PAYLOAD)
    worker = tower_api_worker.TowerApiWorker(TestData.config, None, work_queue)
    with aioresponses() as mocked:
        mocked.post(
            TestData.JOB_TEMPLATE_POST_URL,
            status=400,
            body="BAD DATA",
        )
        with pytest.raises(Exception) as excinfo:
            await worker.start()
        assert "BAD DATA" in str(excinfo.value)
async def test_get_huge_artifact():
    """ Test Get Method with Huge Artifact"""
    writer = SimpleWriter()
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_GET_PAYLOAD)
    worker = tower_api_worker.TowerApiWorker(TestData.config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.get(
            TestData.JOB_MONITOR_URL,
            status=200,
            body=json.dumps(TestData.JOB_1_SUCCESSFUL_HUGE),
            headers=headers,
        )
        with pytest.raises(Exception) as excinfo:
            await worker.start()
        assert "Artifacts is over 1024 bytes" in str(excinfo.value)
async def test_get():
    """ Test Get Method """
    writer = SimpleWriter("my_prefix")
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_TEMPLATE_PAYLOAD_SINGLE_PAGE)
    worker = tower_api_worker.TowerApiWorker(TestData.config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.get(
            TestData.DEFAULT_JOB_TEMPLATES_LIST_URL,
            status=200,
            body=json.dumps(TestData.JOB_TEMPLATE_RESPONSE),
            headers=headers,
        )
        res = await worker.start()
        assert writer.data["count"] == 3
        assert writer.fname == "api/v2/job_templates/my_prefix1"
        assert writer.prefixUsed == True
async def test_post():
    """ Test Post Method """
    writer = SimpleWriter()
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_TEMPLATE_POST_PAYLOAD)
    worker = tower_api_worker.TowerApiWorker(TestData.config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.post(
            TestData.JOB_TEMPLATE_POST_URL,
            status=200,
            body=json.dumps(TestData.JOB_TEMPLATE_POST_RESPONSE),
            headers=headers,
        )
        res = await worker.start()
        assert writer.data["status"] == "successful"
        assert writer.data["url"] == "/api/v2/jobs/500"
        assert writer.data["artifacts"] == {
            "expose_to_cloud_redhat_com__snow_ticket": 12345
        }
async def test_get_multiple_pages():
    """ Test Get Method Multiple Pages"""
    writer = SimpleWriter()
    work_queue = asyncio.Queue()
    await work_queue.put(TestData.JOB_TEMPLATE_PAYLOAD_ALL_PAGES)
    worker = tower_api_worker.TowerApiWorker(TestData.config, writer,
                                             work_queue)
    headers = {"Content-Type": "application/json"}
    with aioresponses() as mocked:
        mocked.get(
            TestData.JOB_TEMPLATES_LIST_URL,
            status=200,
            body=json.dumps(TestData.JOB_TEMPLATES_PAGE1_RESPONSE),
            headers=headers,
        )
        mocked.get(
            TestData.JOB_TEMPLATES_LIST_URL_PAGE_2,
            status=200,
            body=json.dumps(TestData.JOB_TEMPLATES_PAGE2_RESPONSE),
            headers=headers,
        )
        res = await worker.start()
        assert writer.data["count"] == 3
        assert writer.called == 2