Example #1
0
    def test_before_deploy_receives_restart(self, mock_executioner):
        """
        Test that the correct database entires are made by BeforeDeploy worker
        when the worker succeeds on its actions
        """
        # Worker receives a packet, most likely from the webapp
        # Example packet:
        #
        #  {
        #    'application': 'staging',
        #    '....': '....',
        #  }a
        #
        #
        packet = {
            'environment': 'staging',
            'application': 'adsws',
            'action': 'restart'
        }

        # Override the run test returned value. This means the logic of the test
        # does not have to be mocked
        mock_r = mock.Mock(retcode=0)
        mock_r.out.splitlines.return_value = []

        mock_x = mock_executioner.return_value
        mock_x.cmd.return_value = mock_r

        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route='in', exchange='test', payload=json.dumps(packet))

        # Worker runs the tests
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'in',
            'publish': 'ads.deploy.deploy',
            'header_frame': None,
            'status': 'database',
            'error': 'error',
            'status': 'database',
            'TEST_RUN': True
        }
        before_deploy_worker = BeforeDeploy(params=params)
        before_deploy_worker.run()
        before_deploy_worker.connection.close()

        # Worker sends a packet to the next worker
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count('in'), 0)
            self.assertEqual(w.message_count('ads.deploy.deploy'), 0)
            self.assertEqual(w.message_count('ads.deploy.restart'), 1)
            self.assertEqual(w.message_count('database'), 1)
            self.assertEqual(w.message_count('error'), 0)

        # Start the DB Writer worker
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'database',
            'TEST_RUN': True
        }
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        db_worker.connection.close()

        # remove irrelevant keys before checking things
        packet.pop('action')

        # check database entries
        with self.app.session_scope() as session:

            all_deployments = session.query(Deployment).all()
            self.assertEqual(
                len(all_deployments),
                1,
                msg='More (or less) than 1 deployment entry: {}'
                    .format(all_deployments)
            )
            deployment = all_deployments[0]

            for key in packet:
                self.assertEqual(
                    packet[key],
                    getattr(deployment, key)
                )
            self.assertEqual(deployment.deployed, None)
            self.assertEqual(
                deployment.msg,
                'Deploy to be restarted'
            )
Example #2
0
    def test_before_deploy_fails(self, mock_is_timedout):
        """
        Test that the correct database entires are made by BeforeDeploy worker
        when the worker fails on its actions
        """
        # Worker receives a packet, most likely from the webapp
        # Example packet:
        #
        #  {
        #    'application': 'staging',
        #    '....': '....',
        #  }
        #
        #
        packet = {
            'environment': 'staging',
            'application': 'adsws',
            'version': 'v1.0.0',
        }

        # Override the run test returned value. This means the logic of the test
        # does not have to be mocked
        mock_is_timedout.return_value = True

        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route='in', exchange='test', payload=json.dumps(packet))

        # Worker runs the tests
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'in',
            'publish': 'ads.deploy.deploy',
            'header_frame': None,
            'error': 'error',
            'status': 'database',
            'TEST_RUN': True
        }
        before_deploy_worker = BeforeDeploy(params=params)
        before_deploy_worker.run()
        before_deploy_worker.connection.close()

        # Worker sends a packet to the next worker
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count('in'), 0)
            self.assertEqual(w.message_count('ads.deploy.deploy'), 0)
            self.assertEqual(w.message_count('database'), 1)
            self.assertEqual(w.message_count('error'), 1)

        # Start the DB Writer worker
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'database',
            'TEST_RUN': True
        }
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        db_worker.connection.close()

        with self.app.session_scope() as session:

            all_deployments = session.query(Deployment).all()
            self.assertEqual(
                len(all_deployments),
                1,
                msg='More (or less) than 1 deployment entry: {}'
                    .format(all_deployments)
            )
            deployment = all_deployments[0]

            for key in packet:
                self.assertEqual(
                    packet[key],
                    getattr(deployment, key)
                )
            self.assertEqual(deployment.deployed, False)
            self.assertEqual(
                deployment.msg,
                'BeforeDeploy: waiting too long for the environment to come up'
            )
    def test_db_writes_on_test_pass(self, mocked_run_test):
        """
        Check that the database is being written to when a test passes
        """
        # Stub data
        packet = {
            'application': 'adsws',
            'environment': 'staging',
            'tag': 'v1.0.0',
            'commit': 'gf9gd8f',
        }
        expected_packet = packet.copy()
        expected_packet['tested'] = True
        mocked_run_test.return_value = expected_packet

        # Start the IntegrationTester worker
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'in',
            'publish': 'out',
            'status': 'database',
            'TEST_RUN': True
        }

        # Push to rabbitmq
        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route='in', exchange='test', payload=json.dumps(packet))

        test_worker = IntegrationTestWorker(params=params)
        test_worker.run()
        test_worker.connection.close()

        # Assert there is a packet on the publish queue
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count('out'), 1)
            self.assertEqual(w.message_count('database'), 1)

        # Start the DB Writer worker
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'database',
            'TEST_RUN': True
        }
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        db_worker.connection.close()

        with self.app.session_scope() as session:

            all_deployments = session.query(Deployment).all()
            self.assertEqual(
                len(all_deployments),
                1,
                msg='More (or less) than 1 deployment entry: {}'
                    .format(all_deployments)
            )
            deployment = all_deployments[0]

            for key in packet:
                self.assertEqual(
                    packet[key],
                    getattr(deployment, key)
                )
            self.assertEqual(deployment.tested, True)
    def test_before_deploy_fails(self, mock_is_timedout):
        """
        Test that the correct database entires are made by BeforeDeploy worker
        when the worker fails on its actions
        """
        # Worker receives a packet, most likely from the webapp
        # Example packet:
        #
        #  {
        #    'application': 'staging',
        #    '....': '....',
        #  }
        #
        #
        packet = {"environment": "staging", "application": "adsws", "tag": "v1.0.0", "commit": "gf9gd8f"}

        # Override the run test returned value. This means the logic of the test
        # does not have to be mocked
        mock_is_timedout.return_value = True

        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route="in", exchange="test", payload=json.dumps(packet))

        # Worker runs the tests
        params = {
            "RABBITMQ_URL": RABBITMQ_URL,
            "exchange": "test",
            "subscribe": "in",
            "publish": "ads.deploy.deploy",
            "header_frame": None,
            "error": "error",
            "status": "database",
            "TEST_RUN": True,
        }
        before_deploy_worker = BeforeDeploy(params=params)
        before_deploy_worker.run()
        before_deploy_worker.connection.close()

        # Worker sends a packet to the next worker
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count("in"), 0)
            self.assertEqual(w.message_count("ads.deploy.deploy"), 0)
            self.assertEqual(w.message_count("database"), 1)
            self.assertEqual(w.message_count("error"), 1)

        # Start the DB Writer worker
        params = {"RABBITMQ_URL": RABBITMQ_URL, "exchange": "test", "subscribe": "database", "TEST_RUN": True}
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        db_worker.connection.close()

        with self.app.session_scope() as session:

            all_deployments = session.query(Deployment).all()
            self.assertEqual(
                len(all_deployments), 1, msg="More (or less) than 1 deployment entry: {}".format(all_deployments)
            )
            deployment = all_deployments[0]

            for key in packet:
                self.assertEqual(packet[key], getattr(deployment, key))
            self.assertEqual(deployment.deployed, False)
            self.assertEqual(deployment.msg, "BeforeDeploy: waiting too long for the environment to come up")
    def test_before_deploy_receives_restart(self, mock_executioner):
        """
        Test that the correct database entires are made by BeforeDeploy worker
        when the worker succeeds on its actions
        """
        # Worker receives a packet, most likely from the webapp
        # Example packet:
        #
        #  {
        #    'application': 'staging',
        #    '....': '....',
        #  }a
        #
        #
        packet = {
            "environment": "staging",
            "application": "adsws",
            "tag": "v1.0.0",
            "commit": "gf9gd8f",
            "action": "restart",
        }

        # Override the run test returned value. This means the logic of the test
        # does not have to be mocked
        mock_r = mock.Mock(retcode=0)
        mock_r.out.splitlines.return_value = []

        mock_x = mock_executioner.return_value
        mock_x.cmd.return_value = mock_r

        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route="in", exchange="test", payload=json.dumps(packet))

        # Worker runs the tests
        params = {
            "RABBITMQ_URL": RABBITMQ_URL,
            "exchange": "test",
            "subscribe": "in",
            "publish": "ads.deploy.deploy",
            "header_frame": None,
            "status": "database",
            "error": "error",
            "status": "database",
            "TEST_RUN": True,
        }
        before_deploy_worker = BeforeDeploy(params=params)
        before_deploy_worker.run()
        before_deploy_worker.connection.close()

        # Worker sends a packet to the next worker
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count("in"), 0)
            self.assertEqual(w.message_count("ads.deploy.deploy"), 0)
            self.assertEqual(w.message_count("ads.deploy.restart"), 1)
            self.assertEqual(w.message_count("database"), 1)
            self.assertEqual(w.message_count("error"), 0)

        # Start the DB Writer worker
        params = {"RABBITMQ_URL": RABBITMQ_URL, "exchange": "test", "subscribe": "database", "TEST_RUN": True}
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        db_worker.connection.close()

        # remove irrelevant keys before checking things
        packet.pop("action")

        # check database entries
        with self.app.session_scope() as session:

            all_deployments = session.query(Deployment).all()
            self.assertEqual(
                len(all_deployments), 1, msg="More (or less) than 1 deployment entry: {}".format(all_deployments)
            )
            deployment = all_deployments[0]

            for key in packet:
                self.assertEqual(packet[key], getattr(deployment, key))
            self.assertEqual(deployment.deployed, None)
            self.assertEqual(deployment.msg, "Deploy to be restarted")
Example #6
0
    def test_restart_fails(self, mock_executioner):
        """
        Test that when a restart is requested, and the restart worker fails,
        the messages are updated
        """
        # Worker receives a packet, most likely from the webapp
        # Example packet:
        #
        #  {
        #    'application': 'staging',
        #    '....': '....',
        #  }
        #
        #
        packet = {
            'environment': 'staging',
            'application': 'adsws',
            'tag': 'v1.0.0',
            'commit': 'gf9gd8f',
        }

        # Override the run test returned value. This means the logic of the test
        # does not have to be mocked. retcode = 1 means it has failed
        mock_r = mock.MagicMock(retcode=1)
        mock_r.__str__.return_value = 'restart failed'

        mock_x = mock_executioner.return_value
        mock_x.cmd.return_value = mock_r

        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route='in', exchange='test', payload=json.dumps(packet))

        # Worker runs the tests
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'in',
            'publish': 'out',
            'header_frame': None,
            'error': 'error',
            'status': 'database',
            'TEST_RUN': True
        }
        restart_worker = Restart(params=params)
        restart_worker.run()
        restart_worker.connection.close()

        # Worker sends a packet to the next worker
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count('in'), 0)
            self.assertEqual(w.message_count('out'), 0)
            self.assertEqual(w.message_count('database'), 2)
            self.assertEqual(w.message_count('error'), 1)

        # Start the DB Writer worker
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'database',
            'TEST_RUN': True
        }

        # First message should be starting of the deployment
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        with self.app.session_scope() as session:
            deployment = session.query(Deployment)\
                .filter(Deployment.commit == 'gf9gd8f').one()
            self.assertEqual(
                deployment.msg,
                'staging-adsws restart-soft starts'
            )
            self.assertIsNone(deployment.deployed)

        db_worker.run()
        with self.app.session_scope() as session:
            deployment = session.query(Deployment)\
                .filter(Deployment.commit == 'gf9gd8f').one()

            for key in packet:
                self.assertEqual(
                    packet[key],
                    getattr(deployment, key)
                )
            self.assertFalse(deployment.deployed)
            self.assertEqual(
                deployment.msg,
                'restart failed'
            )
Example #7
0
    def test_deploy_fails(self, mock_executioner):
        """
        Test that when the deploy fails the correct entries are sent and stored
        in the backend database
        """
        # Worker receives a packet, most likely from the webapp
        # Example packet:
        #
        #  {
        #    'application': 'staging',
        #    'environment': 'adsws',
        #    'version': 'v1.0.3'
        #  }
        #
        #
        packet = {
            'environment': 'adsws',
            'application': 'staging',
            'version': 'v1.0.0'
        }

        # Stub the database with some early entries
        first_deployment = Deployment(
            environment=packet['environment'],
            application=packet['application'],
            version='v0.0.1',
            deployed=True
        )
        with self.app.session_scope() as session:
            session.add(first_deployment)
            session.commit()

        # Override the run test returned value. This means the logic of the test
        # does not have to be mocked. retcode = 1 means it has failed
        mock_r = mock.Mock(retcode=1, command='r-command', err='r-err',
                           out='r-out')

        mock_x = mock_executioner.return_value
        mock_x.cmd.return_value = mock_r

        with MiniRabbit(RABBITMQ_URL) as w:
            w.publish(route='in', exchange='test', payload=json.dumps(packet))

        # Worker runs the tests
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'in',
            'publish': 'out',
            'header_frame': None,
            'error': 'error',
            'status': 'database',
            'TEST_RUN': True
        }
        deploy_worker = Deploy(params=params)
        deploy_worker.run()
        deploy_worker.connection.close()

        # Worker sends a packet to the next worker
        with MiniRabbit(RABBITMQ_URL) as w:
            self.assertEqual(w.message_count('in'), 0)
            self.assertEqual(w.message_count('out'), 0)
            self.assertEqual(w.message_count('database'), 2)
            self.assertEqual(w.message_count('error'), 1)

        # Start the DB Writer worker
        params = {
            'RABBITMQ_URL': RABBITMQ_URL,
            'exchange': 'test',
            'subscribe': 'database',
            'TEST_RUN': True
        }

        # First message should be starting of the deployment
        db_worker = DatabaseWriterWorker(params=params)
        db_worker.app = self.app
        db_worker.run()
        with self.app.session_scope() as session:
            deployment = session.query(Deployment)\
                .filter(Deployment.version == 'v1.0.0').one()
            self.assertEqual(
                deployment.msg,
                'staging-adsws deployment starts'
            )
            self.assertIsNone(deployment.deployed)

            deployment = session.query(Deployment)\
                .filter(Deployment.version == 'v0.0.1').one()
            self.assertTrue(deployment.deployed)

        db_worker.run()
        with self.app.session_scope() as session:
            deployment = session.query(Deployment)\
                .filter(Deployment.version == 'v1.0.0').one()

            for key in packet:
                self.assertEqual(
                    packet[key],
                    getattr(deployment, key)
                )
            self.assertFalse(deployment.deployed)
            self.assertEqual(
                deployment.msg,
                'deployment failed; command: r-command, reason: r-err, stdout: r-out'
            )

            deployment = session.query(Deployment)\
                .filter(Deployment.version == 'v0.0.1').one()

            self.assertTrue(deployment.deployed)