Пример #1
0
    def test_statefulset_with_image_version(
        self,
        mock_controller_revisions_for_service_instance,
        mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS,
        mock_load_service_namespace_config,
        mock_pods_for_service_instance,
        mock_mesh_status,
        mock_pod,
    ):
        mock_job_config = mock.Mock(
            get_persistent_volumes=mock.Mock(return_value=[mock.Mock]),
        )
        mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS[
            "kubernetes"
        ].loader.return_value = mock_job_config
        mock_controller_revisions_for_service_instance.return_value = [
            Struct(
                metadata=Struct(
                    name="controller_revision_1",
                    creation_timestamp=datetime.datetime(2021, 4, 1),
                    labels={
                        "paasta.yelp.com/git_sha": "aaa000",
                        "paasta.yelp.com/config_sha": "config000",
                        "paasta.yelp.com/image_version": "extrastuff",
                    },
                ),
            ),
        ]

        mock_pod.metadata.owner_references = []
        mock_pods_for_service_instance.return_value = [mock_pod]

        with asynctest.patch(
            "paasta_tools.instance.kubernetes.get_pod_status", autospec=True
        ) as mock_get_pod_status:
            mock_get_pod_status.return_value = {}
            status = pik.kubernetes_status_v2(
                service="service",
                instance="instance",
                verbose=0,
                include_smartstack=False,
                include_envoy=False,
                instance_type="kubernetes",
                settings=mock.Mock(),
            )

        assert len(status["versions"]) == 1
        assert status["versions"][0] == {
            "name": "controller_revision_1",
            "type": "ControllerRevision",
            "replicas": 1,
            "ready_replicas": 1,
            "create_timestamp": datetime.datetime(2021, 4, 1).timestamp(),
            "git_sha": "aaa000",
            "image_version": "extrastuff",
            "config_sha": "config000",
            "pods": [mock.ANY],
        }
Пример #2
0
    def test_event_timeout(
        self,
        mock_replicasets_for_service_instance,
        mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS,
        mock_load_service_namespace_config,
        mock_pods_for_service_instance,
        mock_mesh_status,
        mock_get_pod_event_messages,
        mock_pod,
    ):
        mock_job_config = mock.Mock(
            get_persistent_volumes=mock.Mock(return_value=[]),
        )
        mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS[
            "kubernetes"
        ].loader.return_value = mock_job_config
        mock_replicasets_for_service_instance.return_value = [
            Struct(
                spec=Struct(replicas=1),
                metadata=Struct(
                    name="replicaset_1",
                    creation_timestamp=datetime.datetime(2021, 3, 5),
                    deletion_timestamp=None,
                    labels={
                        "paasta.yelp.com/git_sha": "aaa000",
                        "paasta.yelp.com/config_sha": "config000",
                    },
                ),
            ),
        ]
        mock_pods_for_service_instance.return_value = [mock_pod]
        mock_load_service_namespace_config.return_value = {}
        mock_job_config.get_registrations.return_value = ["service.instance"]
        mock_get_pod_event_messages.side_effect = asyncio.TimeoutError

        status = pik.kubernetes_status_v2(
            service="service",
            instance="instance",
            verbose=0,
            include_smartstack=False,
            include_envoy=False,
            instance_type="kubernetes",
            settings=mock.Mock(),
        )

        # Verify  we did not throw an exception
        assert status
        assert all(
            p["events"] == [{"error": "Could not retrieve events. Please try again."}]
            for p in status["versions"][0]["pods"]
        )
Пример #3
0
    def test_replicaset(
        self,
        mock_replicasets_for_service_instance,
        mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS,
        mock_load_service_namespace_config,
        mock_pods_for_service_instance,
        mock_mesh_status,
        mock_pod,
    ):
        mock_job_config = mock.Mock(
            get_persistent_volumes=mock.Mock(return_value=[]), )
        mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS[
            "kubernetes"].loader.return_value = mock_job_config
        mock_replicasets_for_service_instance.return_value = [
            Struct(
                spec=Struct(replicas=1),
                metadata=Struct(
                    name="replicaset_1",
                    creation_timestamp=datetime.datetime(2021, 3, 5),
                    deletion_timestamp=None,
                    labels={
                        "paasta.yelp.com/git_sha": "aaa000",
                        "paasta.yelp.com/config_sha": "config000",
                    },
                ),
            ),
        ]
        mock_pods_for_service_instance.return_value = [mock_pod]

        mock_load_service_namespace_config.return_value = {}
        mock_job_config.get_registrations.return_value = ["service.instance"]

        status = pik.kubernetes_status_v2(
            service="service",
            instance="instance",
            verbose=0,
            include_smartstack=False,
            include_envoy=False,
            instance_type="kubernetes",
            settings=mock.Mock(),
        )

        assert status == {
            "app_name":
            mock_job_config.get_sanitised_deployment_name.return_value,
            "desired_state":
            mock_job_config.get_desired_state.return_value,
            "desired_instances":
            mock_job_config.get_instances.return_value,
            "bounce_method":
            mock_job_config.get_bounce_method.return_value,
            "versions": [{
                "type":
                "ReplicaSet",
                "name":
                "replicaset_1",
                "replicas":
                1,
                "ready_replicas":
                0,
                "create_timestamp":
                datetime.datetime(2021, 3, 5).timestamp(),
                "git_sha":
                "aaa000",
                "config_sha":
                "config000",
                "pods": [
                    {
                        "name":
                        "pod_1",
                        "ip":
                        "1.2.3.4",
                        "create_timestamp":
                        datetime.datetime(2021, 3, 6).timestamp(),
                        "delete_timestamp":
                        None,
                        "host":
                        "4.3.2.1",
                        "phase":
                        "Running",
                        "reason":
                        None,
                        "message":
                        None,
                        "scheduled":
                        True,
                        "ready":
                        True,
                        "containers": [
                            {
                                "healthcheck_grace_period":
                                1,
                                "name":
                                "main_container",
                                "restart_count":
                                0,
                                "state":
                                "running",
                                "reason":
                                None,
                                "message":
                                None,
                                "last_state":
                                None,
                                "last_reason":
                                None,
                                "last_message":
                                None,
                                "last_duration":
                                None,
                                "timestamp":
                                datetime.datetime(2021, 3, 6).timestamp(),
                            },
                        ],
                    },
                ],
            }],
        }
Пример #4
0
def test_kubernetes_status_v2(
    mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS,
    mock_pods_for_service_instance,
    mock_replicasets_for_service_instance,
):
    mock_job_config = mock.Mock()
    mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS[
        "kubernetes"].loader.return_value = mock_job_config
    mock_replicasets_for_service_instance.return_value = [
        Struct(
            spec=Struct(replicas=1),
            metadata=Struct(
                name="replicaset_1",
                creation_timestamp=datetime.datetime(2021, 3, 5),
                labels={
                    "paasta.yelp.com/git_sha": "aaa000",
                    "paasta.yelp.com/config_sha": "config000",
                },
            ),
        ),
    ]
    mock_pods_for_service_instance.return_value = [
        Struct(
            metadata=Struct(
                owner_references=[
                    Struct(kind="ReplicaSet", name="replicaset_1")
                ],
                name="pod_1",
                creation_timestamp=datetime.datetime(2021, 3, 6),
            ),
            status=Struct(pod_ip="1.2.3.4"),
        ),
    ]

    status = pik.kubernetes_status_v2(
        service="service",
        instance="instance",
        verbose=0,
        include_smartstack=False,
        include_envoy=False,
        instance_type="kubernetes",
        settings=mock.Mock(),
    )

    assert status == {
        "app_name":
        mock_job_config.get_sanitised_deployment_name.return_value,
        "desired_state":
        mock_job_config.get_desired_state.return_value,
        "desired_instances":
        mock_job_config.get_instances.return_value,
        "bounce_method":
        mock_job_config.get_bounce_method.return_value,
        "replicasets": [{
            "name":
            "replicaset_1",
            "replicas":
            1,
            "ready_replicas":
            0,
            "create_timestamp":
            datetime.datetime(2021, 3, 5).timestamp(),
            "git_sha":
            "aaa000",
            "config_sha":
            "config000",
            "pods": [{
                "name":
                "pod_1",
                "ip":
                "1.2.3.4",
                "create_timestamp":
                datetime.datetime(2021, 3, 6).timestamp(),
            }],
        }],
    }
Пример #5
0
def test_kubernetes_status_v2(
    mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS,
    mock_load_service_namespace_config,
    mock_pods_for_service_instance,
    mock_replicasets_for_service_instance,
    mock_mesh_status,
):
    mock_job_config = mock.Mock()
    mock_LONG_RUNNING_INSTANCE_TYPE_HANDLERS[
        "kubernetes"].loader.return_value = mock_job_config
    mock_replicasets_for_service_instance.return_value = [
        Struct(
            spec=Struct(replicas=1),
            metadata=Struct(
                name="replicaset_1",
                creation_timestamp=datetime.datetime(2021, 3, 5),
                deletion_timestamp=None,
                labels={
                    "paasta.yelp.com/git_sha": "aaa000",
                    "paasta.yelp.com/config_sha": "config000",
                },
            ),
        ),
    ]
    mock_pods_for_service_instance.return_value = [
        Struct(
            metadata=Struct(
                owner_references=[
                    Struct(kind="ReplicaSet", name="replicaset_1")
                ],
                name="pod_1",
                creation_timestamp=datetime.datetime(2021, 3, 6),
                deletion_timestamp=None,
            ),
            status=Struct(
                pod_ip="1.2.3.4",
                host_ip="4.3.2.1",
                phase="Running",
                reason=None,
                message=None,
                conditions=[
                    Struct(
                        type="Ready",
                        status="True",
                    ),
                    Struct(
                        type="PodScheduled",
                        status="True",
                    ),
                ],
                container_statuses=[
                    Struct(
                        name="main_container",
                        restart_count=0,
                        state=Struct(
                            running=Struct(
                                started_at=datetime.datetime(2021, 3, 6)),
                            waiting=None,
                            terminated=None,
                        ),
                        last_state=Struct(
                            running=None,
                            waiting=None,
                            terminated=None,
                        ),
                    ),
                ],
            ),
            spec=Struct(containers=[
                Struct(
                    name="main_container",
                    liveness_probe=Struct(
                        initial_delay_seconds=1,
                        failure_threshold=2,
                        period_seconds=3,
                        timeout_seconds=4,
                    ),
                )
            ]),
        ),
    ]

    mock_load_service_namespace_config.return_value = {}
    mock_job_config.get_registrations.return_value = ["service.instance"]

    status = pik.kubernetes_status_v2(
        service="service",
        instance="instance",
        verbose=0,
        include_smartstack=False,
        include_envoy=False,
        instance_type="kubernetes",
        settings=mock.Mock(),
    )

    assert status == {
        "app_name":
        mock_job_config.get_sanitised_deployment_name.return_value,
        "desired_state":
        mock_job_config.get_desired_state.return_value,
        "desired_instances":
        mock_job_config.get_instances.return_value,
        "bounce_method":
        mock_job_config.get_bounce_method.return_value,
        "replicasets": [{
            "name":
            "replicaset_1",
            "replicas":
            1,
            "ready_replicas":
            0,
            "create_timestamp":
            datetime.datetime(2021, 3, 5).timestamp(),
            "git_sha":
            "aaa000",
            "config_sha":
            "config000",
            "pods": [{
                "name":
                "pod_1",
                "ip":
                "1.2.3.4",
                "create_timestamp":
                datetime.datetime(2021, 3, 6).timestamp(),
                "delete_timestamp":
                None,
                "host":
                "4.3.2.1",
                "phase":
                "Running",
                "reason":
                None,
                "message":
                None,
                "scheduled":
                True,
                "ready":
                True,
                "containers": [{
                    "healthcheck_grace_period":
                    1,
                    "name":
                    "main_container",
                    "restart_count":
                    0,
                    "state":
                    "running",
                    "reason":
                    None,
                    "message":
                    None,
                    "last_state":
                    None,
                    "last_reason":
                    None,
                    "last_message":
                    None,
                    "last_duration":
                    None,
                    "timestamp":
                    datetime.datetime(2021, 3, 6).timestamp(),
                }],
            }],
        }],
    }