@@ -80,52 +80,94 @@ def test_do_start(self, mock_parse_nodes, mock_active, mock_start, mock_qdevice_
80
80
mock_qdevice_configured .assert_called_once_with ()
81
81
mock_info .assert_called_once_with ("The cluster stack started on node1" )
82
82
83
- @mock .patch ('logging.Logger.info ' )
84
- @mock .patch ('crmsh.service_manager.ServiceManager.service_is_active ' )
83
+ @mock .patch ('crmsh.ui_cluster.Cluster._wait_for_dc ' )
84
+ @mock .patch ('crmsh.ui_cluster.Cluster._node_ready_to_stop_cluster_service ' )
85
85
@mock .patch ('crmsh.ui_cluster.parse_option_for_nodes' )
86
- def test_do_stop_already_stopped (self , mock_parse_nodes , mock_active , mock_info ):
86
+ def test_do_stop_return (self , mock_parse_nodes , mock_node_ready_to_stop_cluster_service , mock_dc ):
87
+ mock_parse_nodes .return_value = ["node1" , "node2" ]
88
+ mock_node_ready_to_stop_cluster_service .side_effect = [False , False ]
89
+
87
90
context_inst = mock .Mock ()
88
- mock_parse_nodes .return_value = ["node1" ]
89
- mock_active .side_effect = [False , False ]
90
- self .ui_cluster_inst .do_stop (context_inst , "node1" )
91
- mock_active .assert_has_calls ([
92
- mock .call ("corosync.service" , remote_addr = "node1" ),
93
- mock .call ("sbd.service" , remote_addr = "node1" )
94
- ])
95
- mock_info .assert_called_once_with ("The cluster stack already stopped on node1" )
91
+ self .ui_cluster_inst .do_stop (context_inst , "node1" , "node2" )
92
+
93
+ mock_parse_nodes .assert_called_once_with (context_inst , "node1" , "node2" )
94
+ mock_node_ready_to_stop_cluster_service .assert_has_calls ([mock .call ("node1" ), mock .call ("node2" )])
95
+ mock_dc .assert_not_called ()
96
96
97
97
@mock .patch ('logging.Logger.debug' )
98
98
@mock .patch ('logging.Logger.info' )
99
- @mock .patch ('crmsh.service_manager.ServiceManager.stop_service' )
100
- @mock .patch ('crmsh.utils.set_dlm_option' )
101
- @mock .patch ('crmsh.utils.is_quorate' )
102
- @mock .patch ('crmsh.utils.is_dlm_running' )
103
- @mock .patch ('crmsh.utils.get_dc' )
104
- @mock .patch ('crmsh.utils.check_function_with_timeout' )
105
- @mock .patch ('crmsh.utils.get_property' )
106
- @mock .patch ('crmsh.service_manager.ServiceManager.service_is_active' )
99
+ @mock .patch ('crmsh.ui_cluster.ServiceManager' )
100
+ @mock .patch ('crmsh.ui_cluster.Cluster._set_dlm' )
101
+ @mock .patch ('crmsh.ui_cluster.Cluster._wait_for_dc' )
102
+ @mock .patch ('crmsh.ui_cluster.Cluster._node_ready_to_stop_cluster_service' )
107
103
@mock .patch ('crmsh.ui_cluster.parse_option_for_nodes' )
108
- def test_do_stop (self , mock_parse_nodes , mock_active , mock_get_property , mock_check , mock_get_dc , mock_dlm_running , mock_is_quorate , mock_set_dlm , mock_stop , mock_info , mock_debug ):
104
+ def test_do_stop (self , mock_parse_nodes , mock_node_ready_to_stop_cluster_service , mock_dc ,
105
+ mock_set_dlm , mock_service_manager , mock_info , mock_debug ):
106
+ mock_parse_nodes .return_value = ["node1" , "node2" ]
107
+ mock_node_ready_to_stop_cluster_service .side_effect = [True , False ]
108
+ mock_service_manager_inst = mock .Mock ()
109
+ mock_service_manager .return_value = mock_service_manager_inst
110
+ mock_service_manager_inst .stop_service .side_effect = [["node1" ], ["node1" ], ["node1" ]]
111
+ mock_service_manager_inst .service_is_active .return_value = True
112
+
109
113
context_inst = mock .Mock ()
110
- mock_stop .side_effect = [["node1" ], ["ndoe1" ], ["node1" ]]
111
- mock_parse_nodes .return_value = ["node1" ]
112
- mock_active .side_effect = [True , True , True ]
113
- mock_dlm_running .return_value = True
114
- mock_is_quorate .return_value = False
115
- mock_get_property .return_value = "20s"
114
+ self .ui_cluster_inst .do_stop (context_inst , "node1" , "node2" )
116
115
117
- self .ui_cluster_inst .do_stop (context_inst , "node1" )
116
+ mock_parse_nodes .assert_called_once_with (context_inst , "node1" , "node2" )
117
+ mock_node_ready_to_stop_cluster_service .assert_has_calls ([mock .call ("node1" ), mock .call ("node2" )])
118
+ mock_debug .assert_called_once_with ("stop node list: ['node1']" )
119
+ mock_dc .assert_called_once_with ("node1" )
120
+ mock_set_dlm .assert_called_once_with ("node1" )
121
+ mock_service_manager_inst .stop_service .assert_has_calls ([
122
+ mock .call ("pacemaker" , node_list = ["node1" ]),
123
+ mock .call ("corosync-qdevice.service" , node_list = ["node1" ]),
124
+ mock .call ("corosync" , node_list = ["node1" ]),
125
+ ])
126
+ mock_info .assert_called_once_with ("The cluster stack stopped on node1" )
118
127
119
- mock_active .assert_has_calls ([
128
+ @mock .patch ('logging.Logger.info' )
129
+ @mock .patch ('crmsh.ui_cluster.ServiceManager' )
130
+ def test_node_ready_to_stop_cluster_service_corosync (self , mock_service_manager , mock_info ):
131
+ mock_service_manager_inst = mock .Mock ()
132
+ mock_service_manager .return_value = mock_service_manager_inst
133
+ mock_service_manager_inst .service_is_active .side_effect = [False , True , False ]
134
+ res = self .ui_cluster_inst ._node_ready_to_stop_cluster_service ("node1" )
135
+ assert res is False
136
+ mock_service_manager_inst .service_is_active .assert_has_calls ([
120
137
mock .call ("corosync.service" , remote_addr = "node1" ),
138
+ mock .call ("sbd.service" , remote_addr = "node1" ),
121
139
mock .call ("pacemaker.service" , remote_addr = "node1" ),
122
- mock .call ("corosync-qdevice.service" )
123
140
])
124
- mock_stop .assert_has_calls ([
125
- mock .call ("pacemaker" , node_list = ["node1" ]),
126
- mock .call ("corosync-qdevice.service" , node_list = ["node1" ]),
127
- mock .call ("corosync" , node_list = ["node1" ])
141
+ mock_service_manager_inst .stop_service .assert_called_once_with ("corosync" , remote_addr = "node1" )
142
+ mock_info .assert_called_once_with ("The cluster stack stopped on node1" )
143
+
144
+ @mock .patch ('logging.Logger.info' )
145
+ @mock .patch ('crmsh.ui_cluster.ServiceManager' )
146
+ def test_node_ready_to_stop_cluster_service_pacemaker (self , mock_service_manager , mock_info ):
147
+ mock_service_manager_inst = mock .Mock ()
148
+ mock_service_manager .return_value = mock_service_manager_inst
149
+ mock_service_manager_inst .service_is_active .side_effect = [True , True , False ]
150
+ res = self .ui_cluster_inst ._node_ready_to_stop_cluster_service ("node1" )
151
+ assert res is False
152
+ mock_service_manager_inst .service_is_active .assert_has_calls ([
153
+ mock .call ("corosync.service" , remote_addr = "node1" ),
154
+ mock .call ("sbd.service" , remote_addr = "node1" ),
155
+ mock .call ("pacemaker.service" , remote_addr = "node1" ),
128
156
])
157
+ mock_service_manager_inst .stop_service .assert_called_once_with ("corosync" , remote_addr = "node1" )
129
158
mock_info .assert_called_once_with ("The cluster stack stopped on node1" )
130
- mock_debug .assert_called_once_with ("Quorum is lost; Set enable_quorum_fencing=0 and enable_quorum_lockspace=0 for dlm" )
131
- mock_check .assert_called_once_with (mock_get_dc , wait_timeout = 25 )
159
+
160
+ @mock .patch ('logging.Logger.info' )
161
+ @mock .patch ('crmsh.ui_cluster.ServiceManager' )
162
+ def test_node_ready_to_stop_cluster_service (self , mock_service_manager , mock_info ):
163
+ mock_service_manager_inst = mock .Mock ()
164
+ mock_service_manager .return_value = mock_service_manager_inst
165
+ mock_service_manager_inst .service_is_active .side_effect = [True , True , True ]
166
+ res = self .ui_cluster_inst ._node_ready_to_stop_cluster_service ("node1" )
167
+ assert res is True
168
+ mock_service_manager_inst .service_is_active .assert_has_calls ([
169
+ mock .call ("corosync.service" , remote_addr = "node1" ),
170
+ mock .call ("sbd.service" , remote_addr = "node1" ),
171
+ mock .call ("pacemaker.service" , remote_addr = "node1" ),
172
+ ])
173
+ mock_info .assert_not_called ()
0 commit comments