1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
import orchestrator
from .fixtures import wait
import pytest
from unittest.mock import patch, PropertyMock
from rook.module import RookOrchestrator
from rook.rook_cluster import RookCluster
# we use this intermediate class as .rook_cluster property
# is read only in the paretn class RookCluster
class FakeRookCluster(RookCluster):
def __init__(self):
pass
class TestRook(object):
@pytest.mark.parametrize("pods, expected_daemon_types", [
(
[
{
'name': 'ceph-rook-exporter',
'hostname': 'host1',
"labels": {'app': 'rook-ceph-exporter',
'ceph_daemon_id': 'exporter'},
'phase': 'Pending',
'container_image_name': 'quay.io/ceph/ceph:v18',
'container_image_id': 'docker-pullable://quay.io/ceph/ceph@sha256:f239715e1c7756e32a202a572e2763a4ce15248e09fc6e8990985f8a09ffa784',
'refreshed': 'pod1_ts',
'started': 'pod1_ts',
'created': 'pod1_1ts',
},
{
'name': 'rook-ceph-mgr-a-68c7b9b6d8-vjjhl',
'hostname': 'host1',
"labels": {'app': 'rook-ceph-mgr',
'ceph_daemon_type': 'mgr',
'ceph_daemon_id': 'a'},
'phase': 'Failed',
'container_image_name': 'quay.io/ceph/ceph:v18',
'container_image_id': '',
'refreshed': 'pod2_ts',
'started': 'pod2_ts',
'created': 'pod2_1ts',
},
{
'name': 'rook-ceph-mon-a-65fb8694b4-mmtl5',
'hostname': 'host1',
"labels": {'app': 'rook-ceph-mon',
'ceph_daemon_type': 'mon',
'ceph_daemon_id': 'b'},
'phase': 'Running',
'container_image_name': 'quay.io/ceph/ceph:v18',
'container_image_id': '',
'refreshed': 'pod3_ts',
'started': 'pod3_ts',
'created': 'pod3_1ts',
},
{
'name': 'rook-ceph-osd-0-58cbd7b65c-6cjnr',
'hostname': 'host1',
"labels": {'app': 'rook-ceph-osd',
'ceph-osd-id': '0',
'ceph_daemon_type': 'osd',
'ceph_daemon_id': '0'},
'phase': 'Succeeded',
'container_image_name': 'quay.io/ceph/ceph:v18',
'container_image_id': '',
'refreshed': 'pod4_ts',
'started': 'pod4_ts',
'created': 'pod4_1ts',
},
# unknown pod: has no labels are provided, it shouldn't
# be part of the output
{
'name': 'unknown-pod',
'hostname': '',
"labels": {'app': 'unkwon'},
'phase': 'Pending',
'container_image_name': 'quay.io/ceph/ceph:v18',
'container_image_id': '',
'refreshed': '',
'started': '',
'created': '',
}
],
['ceph-exporter', 'mgr', 'mon', 'osd']
)
])
def test_list_daemons(self, pods, expected_daemon_types):
status = {
'Pending': orchestrator.DaemonDescriptionStatus.starting,
'Running': orchestrator.DaemonDescriptionStatus.running,
'Succeeded': orchestrator.DaemonDescriptionStatus.stopped,
'Failed': orchestrator.DaemonDescriptionStatus.error,
'Unknown': orchestrator.DaemonDescriptionStatus.unknown,
}
fake_rook_cluster = FakeRookCluster()
ro = RookOrchestrator('rook', None, self)
with patch('rook.RookOrchestrator.rook_cluster',
new_callable=PropertyMock,
return_value=fake_rook_cluster):
with patch.object(fake_rook_cluster, 'describe_pods') as mock_describe_pods:
mock_describe_pods.return_value = pods
dds = wait(ro, ro.list_daemons())
assert len(dds) == len(expected_daemon_types)
for i in range(0, len(dds)):
assert dds[i].daemon_type == expected_daemon_types[i]
assert dds[i].hostname == pods[i]['hostname']
assert dds[i].status == status[pods[i]['phase']]
assert dds[i].container_image_name == pods[i]['container_image_name']
assert dds[i].container_image_id == pods[i]['container_image_id']
assert dds[i].created == pods[i]['created']
assert dds[i].last_configured == pods[i]['created']
assert dds[i].last_deployed == pods[i]['created']
assert dds[i].started == pods[i]['started']
assert dds[i].last_refresh == pods[i]['refreshed']
|