コード例 #1
0
def test_setup_kube_deployments_rate_limit():
    with mock.patch(
            "paasta_tools.setup_kubernetes_job.create_application_object",
            autospec=True,
    ) as mock_create_application_object, mock.patch(
            "paasta_tools.setup_kubernetes_job.list_all_deployments",
            autospec=True), mock.patch("paasta_tools.setup_kubernetes_job.log",
                                       autospec=True) as mock_log_obj:
        mock_client = mock.Mock()
        mock_service_instances = ["kurupt.fm", "kurupt.garage", "kurupt.radio"]
        fake_app = mock.Mock(create=mock.Mock())
        mock_create_application_object.return_value = (True, fake_app)

        # Rate limit: 2 calls allowed
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
            rate_limit=2,
        )
        assert fake_app.create.call_count == 2
        mock_log_obj.info.assert_any_call(
            "Not doing any further updates as we reached the limit (2)")

        # No rate limit
        fake_app.reset_mock()
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
            rate_limit=0,
        )
        assert fake_app.create.call_count == 3
コード例 #2
0
def test_setup_kube_deployment_invalid_job_name():
    with mock.patch(
            "paasta_tools.setup_kubernetes_job.create_application_object",
            autospec=True) as mock_create_application_object, mock.patch(
                "paasta_tools.setup_kubernetes_job.list_all_deployments",
                autospec=True) as mock_list_all_deployments, mock.patch(
                    "paasta_tools.setup_kubernetes_job.log", autospec=True):
        mock_client = mock.Mock()
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="f_m",
                git_sha="",
                image_version=None,
                config_sha="",
                replicas=0,
            )
        ]
        mock_service_instances = ["kuruptf_m"]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert mock_create_application_object.call_count == 0
コード例 #3
0
def test_setup_kube_deployments_skip_malformed_apps():
    with mock.patch(
            "paasta_tools.setup_kubernetes_job.create_application_object",
            autospec=True,
    ) as mock_create_application_object, mock.patch(
            "paasta_tools.setup_kubernetes_job.list_all_deployments",
            autospec=True), mock.patch("paasta_tools.setup_kubernetes_job.log",
                                       autospec=True) as mock_log_obj:
        mock_client = mock.Mock()
        mock_service_instances = ["fake.instance", "mock.instance"]
        fake_app = mock.Mock(create=mock.Mock())
        fake_app.create = mock.Mock(
            side_effect=[Exception("Kaboom!"),
                         mock.Mock(create=mock.Mock())])
        fake_app.__str__ = mock.Mock(return_value="fake_app")
        mock_create_application_object.return_value = (True, fake_app)

        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
            rate_limit=0,
        )
        assert fake_app.create.call_count == 2
        assert len(mock_log_obj.exception.call_args_list) == 1
        assert mock_log_obj.exception.call_args_list[0] == mock.call(
            "Error while processing: fake_app")
コード例 #4
0
def test_setup_kube_deployment():
    with mock.patch(
            'paasta_tools.setup_kubernetes_job.reconcile_kubernetes_deployment',
            autospec=True,
    ) as mock_reconcile_kubernetes_deployment, mock.patch(
            'paasta_tools.setup_kubernetes_job.list_all_deployments',
            autospec=True,
    ) as mock_list_all_deployments:
        mock_client = mock.Mock()
        mock_service_instances: Sequence[str] = []
        assert setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir='/nail/blah',
        ) is True

        mock_reconcile_kubernetes_deployment.return_value = (0, 0)
        mock_service_instances = ['kurupt.fm', 'kurupt.garage']
        assert setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir='/nail/blah',
        ) is True
        mock_reconcile_kubernetes_deployment.assert_has_calls([
            mock.call(
                kube_client=mock_client,
                service='kurupt',
                instance='fm',
                kube_deployments=mock_list_all_deployments.return_value,
                soa_dir='/nail/blah',
            ),
            mock.call(
                kube_client=mock_client,
                service='kurupt',
                instance='garage',
                kube_deployments=mock_list_all_deployments.return_value,
                soa_dir='/nail/blah',
            ),
        ])

        mock_reconcile_kubernetes_deployment.return_value = (1, 0)
        assert setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir='/nail/blah',
        ) is False
コード例 #5
0
def test_setup_kube_deployment_create_update():
    fake_create = mock.MagicMock()
    fake_update = mock.MagicMock()
    fake_update_related_api_objects = mock.MagicMock()

    def simple_create_application_object(
        kube_client, service, instance, cluster, soa_dir
    ):
        fake_app = mock.MagicMock(spec=Application)
        fake_app.kube_deployment = KubeDeployment(
            service=service, instance=instance, git_sha="1", config_sha="1", replicas=1
        )
        fake_app.create = fake_create
        fake_app.update = fake_update
        fake_app.update_related_api_objects = fake_update_related_api_objects
        fake_app.item = None
        fake_app.soa_config = None
        fake_app.__str__ = lambda app: "fake_app"
        return True, fake_app

    with mock.patch(
        "paasta_tools.setup_kubernetes_job.create_application_object",
        autospec=True,
        side_effect=simple_create_application_object,
    ) as mock_create_application_object, mock.patch(
        "paasta_tools.setup_kubernetes_job.list_all_deployments", autospec=True
    ) as mock_list_all_deployments, mock.patch(
        "paasta_tools.setup_kubernetes_job.log", autospec=True
    ) as mock_log_obj:
        mock_client = mock.Mock()
        # No instances created
        mock_service_instances: Sequence[str] = []
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert mock_create_application_object.call_count == 0
        mock_log_obj.info.assert_called_once_with('{"service_instance_updated": []}')
        mock_log_obj.info.reset_mock()

        # Create a new instance
        mock_service_instances = ["kurupt.fm"]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_create.call_count == 1
        assert fake_update.call_count == 0
        mock_log_obj.info.assert_called_with(
            '{"service_instance_updated": ["fake_app"]}'
        )
        mock_log_obj.info.reset_mock()

        # Update when gitsha changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt", instance="fm", git_sha="2", config_sha="1", replicas=1
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )

        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        mock_log_obj.info.assert_called_with(
            '{"service_instance_updated": ["fake_app"]}'
        )
        mock_log_obj.info.reset_mock()

        # Update when configsha changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt", instance="fm", git_sha="1", config_sha="2", replicas=1
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        mock_log_obj.info.assert_called_with(
            '{"service_instance_updated": ["fake_app"]}'
        )
        mock_log_obj.info.reset_mock()

        # Update when replica changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt", instance="fm", git_sha="1", config_sha="1", replicas=2
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        mock_log_obj.info.assert_called_with(
            '{"service_instance_updated": ["fake_app"]}'
        )
        mock_log_obj.info.reset_mock()

        # Update one and Create One
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm", "kurupt.garage"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="garage",
                git_sha="2",
                config_sha="2",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 1
        mock_log_obj.info.assert_called_with(
            '{"service_instance_updated": ["fake_app", "fake_app"]}'
        )
        mock_log_obj.info.reset_mock()

        # Always attempt to update related API objects
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.garage"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="garage",
                git_sha="1",
                config_sha="1",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 0
        assert fake_create.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        mock_log_obj.info.assert_called_with(
            '{"service_instance_updated": ["fake_app"]}'
        )
コード例 #6
0
def test_setup_kube_deployment_create_update():
    fake_create = mock.MagicMock()
    fake_update = mock.MagicMock()

    def simple_create_application_object(kube_client, service, instance,
                                         soa_dir):
        fake_app = mock.MagicMock(spec=Application)
        fake_app.kube_deployment = KubeDeployment(service=service,
                                                  instance=instance,
                                                  git_sha="1",
                                                  config_sha="1",
                                                  replicas=1)
        fake_app.create = fake_create
        fake_app.update = fake_update
        return True, fake_app

    with mock.patch(
            "paasta_tools.setup_kubernetes_job.create_application_object",
            autospec=True,
            side_effect=simple_create_application_object,
    ) as mock_create_application_object, mock.patch(
            "paasta_tools.setup_kubernetes_job.list_all_deployments",
            autospec=True) as mock_list_all_deployments:
        mock_client = mock.Mock()
        # No instances created
        mock_service_instances: Sequence[str] = []
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )
        assert mock_create_application_object.call_count == 0

        # Create a new instance
        mock_service_instances = ["kurupt.fm"]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )
        assert fake_create.call_count == 1
        assert fake_update.call_count == 0

        # Update when gitsha changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(service="kurupt",
                           instance="fm",
                           git_sha="2",
                           config_sha="1",
                           replicas=1)
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )

        assert fake_update.call_count == 1
        assert fake_create.call_count == 0

        # Update when configsha changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(service="kurupt",
                           instance="fm",
                           git_sha="1",
                           config_sha="2",
                           replicas=1)
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0

        # Update when replica changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(service="kurupt",
                           instance="fm",
                           git_sha="1",
                           config_sha="1",
                           replicas=2)
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0

        # Update one and Create One
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.fm", "kurupt.garage"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="garage",
                git_sha="2",
                config_sha="2",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 1

        # not create existing instances
        fake_create.reset_mock()
        fake_update.reset_mock()
        mock_service_instances = ["kurupt.garage"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="garage",
                git_sha="1",
                config_sha="1",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 0
        assert fake_create.call_count == 0
コード例 #7
0
def test_setup_kube_deployment_create_update():
    fake_create = mock.MagicMock()
    fake_update = mock.MagicMock()
    fake_update_related_api_objects = mock.MagicMock()

    def simple_create_application_object(kube_client, service, instance,
                                         cluster, soa_dir):
        fake_app = mock.MagicMock(spec=Application)
        fake_app.kube_deployment = KubeDeployment(
            service=service,
            instance=instance,
            git_sha="1",
            image_version="extrastuff-1",
            config_sha="1",
            replicas=1,
        )
        fake_app.create = fake_create
        fake_app.update = fake_update
        fake_app.update_related_api_objects = fake_update_related_api_objects
        fake_app.item = None
        fake_app.soa_config = None
        fake_app.__str__ = lambda app: "fake_app"
        return True, fake_app

    with mock.patch(
            "paasta_tools.setup_kubernetes_job.create_application_object",
            autospec=True,
            side_effect=simple_create_application_object,
    ) as mock_create_application_object, mock.patch(
            "paasta_tools.setup_kubernetes_job.list_all_deployments",
            autospec=True) as mock_list_all_deployments, mock.patch(
                "paasta_tools.setup_kubernetes_job.log",
                autospec=True) as mock_log_obj, mock.patch(
                    "paasta_tools.setup_kubernetes_job.metrics_lib.NoMetrics",
                    autospec=True) as mock_no_metrics:
        mock_client = mock.Mock()
        # No instances created
        mock_service_instances: Sequence[str] = []
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert mock_create_application_object.call_count == 0
        assert fake_update.call_count == 0
        assert fake_update_related_api_objects.call_count == 0
        assert mock_log_obj.info.call_count == 0
        mock_log_obj.info.reset_mock()

        # Create a new instance
        mock_service_instances = ["kurupt.fm"]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
            metrics_interface=mock_no_metrics,
        )
        assert fake_create.call_count == 1
        assert fake_update.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        assert mock_no_metrics.emit_event.call_count == 1
        mock_log_obj.info.reset_mock()
        mock_no_metrics.reset_mock()

        # Update when gitsha changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        fake_update_related_api_objects.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="fm",
                git_sha="2",
                image_version="extrastuff-1",
                config_sha="1",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
            metrics_interface=mock_no_metrics,
        )

        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        mock_no_metrics.emit_event.assert_called_with(
            name="deploy",
            dimensions={
                "paasta_cluster": "fake_cluster",
                "paasta_service": "kurupt",
                "paasta_instance": "fm",
                "deploy_event": "update",
            },
        )
        mock_log_obj.info.reset_mock()
        mock_no_metrics.reset_mock()

        # Update when image_version changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        fake_update_related_api_objects.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="fm",
                git_sha="1",
                image_version="extrastuff-2",
                config_sha="1",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        mock_log_obj.info.reset_mock()

        # Update when configsha changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        fake_update_related_api_objects.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="fm",
                git_sha="1",
                image_version="extrastuff-1",
                config_sha="2",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        mock_log_obj.info.reset_mock()

        # Update when replica changed
        fake_create.reset_mock()
        fake_update.reset_mock()
        fake_update_related_api_objects.reset_mock()
        mock_service_instances = ["kurupt.fm"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="fm",
                git_sha="1",
                image_version="extrastuff-1",
                config_sha="1",
                replicas=2,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        mock_log_obj.info.reset_mock()

        # Update one and Create One
        fake_create.reset_mock()
        fake_update.reset_mock()
        fake_update_related_api_objects.reset_mock()
        mock_service_instances = ["kurupt.fm", "kurupt.garage"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="garage",
                git_sha="2",
                image_version="extrastuff-1",
                config_sha="2",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 1
        assert fake_create.call_count == 1
        assert fake_update_related_api_objects.call_count == 2
        mock_log_obj.info.reset_mock()

        # Always attempt to update related API objects
        fake_create.reset_mock()
        fake_update.reset_mock()
        fake_update_related_api_objects.reset_mock()
        mock_service_instances = ["kurupt.garage"]
        mock_list_all_deployments.return_value = [
            KubeDeployment(
                service="kurupt",
                instance="garage",
                git_sha="1",
                image_version="extrastuff-1",
                config_sha="1",
                replicas=1,
            )
        ]
        setup_kube_deployments(
            kube_client=mock_client,
            service_instances=mock_service_instances,
            cluster="fake_cluster",
            soa_dir="/nail/blah",
        )
        assert fake_update.call_count == 0
        assert fake_create.call_count == 0
        assert fake_update_related_api_objects.call_count == 1
        assert mock_log_obj.info.call_args_list[0] == mock.call(
            "fake_app is up-to-date!")