]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge pull request #43454 from Daniel-Pivonka/cephadm-daemon-postactions-bydaemon
authorSebastian Wagner <sewagner@redhat.com>
Mon, 1 Nov 2021 14:27:26 +0000 (15:27 +0100)
committerGitHub <noreply@github.com>
Mon, 1 Nov 2021 14:27:26 +0000 (15:27 +0100)
mgr/cephadm: track daemon deployment post actions by daemon name instead of type

Reviewed-by: Michael Fritch <mfritch@suse.com>
Reviewed-by: Sebastian Wagner <sewagner@redhat.com>
1  2 
src/pybind/mgr/cephadm/serve.py
src/pybind/mgr/cephadm/tests/test_cephadm.py

Simple merge
index f93ededbdee6ee6c460abf07d6d9fb787af2f165,3b37fb2048c30e1024050d17e13c966e7f13ea1f..d37852de1ae108bdbc206457f59cf87cc77153f5
@@@ -386,9 -420,69 +386,69 @@@ class TestCephadm(object)
                  with mock.patch("cephadm.module.CephadmOrchestrator.mon_command") as _mon_cmd:
                      CephadmServe(cephadm_module)._check_daemons()
                      _mon_cmd.assert_any_call(
 -                        {'prefix': 'dashboard set-grafana-api-url', 'value': 'https://1.2.3.4:3000'},
 +                        {'prefix': 'dashboard set-grafana-api-url', 'value': 'https://[1::4]:3000'},
                          None)
  
+     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
+     @mock.patch("cephadm.module.CephadmOrchestrator.get_mgr_ip", lambda _: '1.2.3.4')
+     def test_iscsi_post_actions_with_missing_daemon_in_cache(self, cephadm_module: CephadmOrchestrator):
+         # https://tracker.ceph.com/issues/52866
+         with with_host(cephadm_module, 'test1'):
+             with with_host(cephadm_module, 'test2'):
+                 with with_service(cephadm_module, IscsiServiceSpec(service_id='foobar', pool='pool', placement=PlacementSpec(host_pattern='*')), CephadmOrchestrator.apply_iscsi, 'test'):
+                     CephadmServe(cephadm_module)._apply_all_services()
+                     assert len(cephadm_module.cache.get_daemons_by_type('iscsi')) == 2
+                     # get a deamons from postaction list (ARRGH sets!!)
+                     tempset = cephadm_module.requires_post_actions.copy()
+                     tempdeamon1 = tempset.pop()
+                     tempdeamon2 = tempset.pop()
+                     # make sure post actions has 2 daemons in it
+                     assert len(cephadm_module.requires_post_actions) == 2
+                     # replicate a host cache that is not in sync when check_daemons is called
+                     tempdd1 = cephadm_module.cache.get_daemon(tempdeamon1)
+                     tempdd2 = cephadm_module.cache.get_daemon(tempdeamon2)
+                     host = 'test1'
+                     if 'test1' not in tempdeamon1:
+                         host = 'test2'
+                     cephadm_module.cache.rm_daemon(host, tempdeamon1)
+                     # Make sure, _check_daemons does a redeploy due to monmap change:
+                     cephadm_module.mock_store_set('_ceph_get', 'mon_map', {
+                         'modified': datetime_to_str(datetime_now()),
+                         'fsid': 'foobar',
+                     })
+                     cephadm_module.notify('mon_map', None)
+                     cephadm_module.mock_store_set('_ceph_get', 'mgr_map', {
+                         'modules': ['dashboard']
+                     })
+                     with mock.patch("cephadm.module.IscsiService.config_dashboard") as _cfg_db:
+                         CephadmServe(cephadm_module)._check_daemons()
+                         _cfg_db.assert_called_once_with([tempdd2])
+                         # post actions still has the other deamon in it and will run next _check_deamons
+                         assert len(cephadm_module.requires_post_actions) == 1
+                         # post actions was missed for a daemon
+                         assert tempdeamon1 in cephadm_module.requires_post_actions
+                         # put the daemon back in the cache
+                         cephadm_module.cache.add_daemon(host, tempdd1)
+                         _cfg_db.reset_mock()
+                         # replicate serve loop running again
+                         CephadmServe(cephadm_module)._check_daemons()
+                         # post actions should have been called again
+                         _cfg_db.asset_called()
+                         # post actions is now empty
+                         assert len(cephadm_module.requires_post_actions) == 0
      @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('[]'))
      def test_mon_add(self, cephadm_module):
          with with_host(cephadm_module, 'test'):