Esempio n. 1
0
 def test_restore_machine_removing_locking_on_failure(self, log, nginx):
     redis_lock = redis.StrictRedis().lock('restore_lock',
                                           timeout=600,
                                           blocking_timeout=1)
     self.assertTrue(redis_lock.acquire(blocking=False))
     redis_lock.release()
     FakeManager.fail_ids = [2]
     restorer = healing.RestoreMachine(self.config)
     nginx_manager = nginx.Nginx.return_value
     restorer = healing.RestoreMachine(self.config)
     restorer.start()
     time.sleep(1)
     restorer.stop()
     tasks = [
         task['_id'] for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }})
     ]
     self.assertListEqual([
         'restore_10.2.2.2', 'restore_10.3.3.3', 'restore_10.4.4.4',
         'restore_10.5.5.5'
     ], tasks)
     self.assertEqual(log.info.call_args_list, [call("Machine 0 restored")])
     self.assertEqual(nginx_manager.wait_healthcheck.call_args_list,
                      [call('10.1.1.1', timeout=600)])
     self.assertTrue(redis_lock.acquire(blocking=False))
     redis_lock.release()
Esempio n. 2
0
 def test_restore_machine_removing_locking_on_success(self, log, nginx):
     redis_lock = redis.StrictRedis().lock('restore_lock',
                                           timeout=600,
                                           blocking_timeout=1)
     self.assertTrue(redis_lock.acquire(blocking=False))
     redis_lock.release()
     restorer = healing.RestoreMachine(self.config)
     nginx_manager = nginx.Nginx.return_value
     restorer = healing.RestoreMachine(self.config)
     restorer.start()
     time.sleep(1)
     restorer.stop()
     nginx_expected_calls = [
         call('10.1.1.1', timeout=600),
         call('10.3.3.3', timeout=600),
         call('10.4.4.4', timeout=600),
         call('10.5.5.5', timeout=600)
     ]
     self.assertEqual(nginx_expected_calls,
                      nginx_manager.wait_healthcheck.call_args_list)
     tasks = [
         task['_id'] for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }})
     ]
     self.assertListEqual(tasks, ['restore_10.2.2.2'])
     self.assertTrue(redis_lock.acquire(blocking=False))
     redis_lock.release()
Esempio n. 3
0
    def test_restore_machine_store_healing_events(self, log, nginx,
                                                  extend_lock):
        time_now = datetime.datetime.utcnow()

        def healing_time(x):
            return time_now + datetime.timedelta(seconds=x)

        with patch.object(tasks.datetime.datetime, 'utcnow') as mock_time_now:
            time_side_effect = []
            for x in range(18):
                time_side_effect.append(time_now +
                                        datetime.timedelta(seconds=10 * x))
            mock_time_now.side_effect = time_side_effect
            FakeManager.fail_ids = [4]
            restorer = healing.RestoreMachine(self.config)
            restorer.start()
            time.sleep(1)
            restorer.stop()
            expected_healings = [{
                'end_time': healing_time(40),
                'machine': '10.1.1.1',
                'start_time': healing_time(30),
                'status': 'success'
            }, {
                'end_time': healing_time(80),
                'machine': '10.3.3.3',
                'start_time': healing_time(70),
                'status': 'success'
            }, {
                'end_time': healing_time(120),
                'machine': '10.4.4.4',
                'start_time': healing_time(110),
                'status': 'success'
            }]
            foo_instances_healings = []
            filter_fields = {
                "status": 1,
                "start_time": 1,
                "machine": 1,
                "end_time": 1
            }
            healing_collection = self.storage.db[
                self.storage.healing_collection]
            for event in healing_collection.find({"instance": "foo"},
                                                 filter_fields):
                del event['_id']
                foo_instances_healings.append(event)
            self.assertListEqual(foo_instances_healings, expected_healings)
            expected_healings = [{
                'end_time': healing_time(160),
                'machine': '10.5.5.5',
                'start_time': healing_time(150),
                'status': 'iaas restore error'
            }]
            bar_instances_healings = []
            for event in healing_collection.find({"instance": "bar"},
                                                 filter_fields):
                del event['_id']
                bar_instances_healings.append(event)
            self.assertListEqual(bar_instances_healings, expected_healings)
Esempio n. 4
0
 def test_restore_machine_extending_time_btw_restores(
         self, log, nginx, extend_lock, update_healing, store_healing):
     time_now = datetime.datetime.utcnow()
     with patch.object(tasks.datetime.datetime, 'utcnow') as mock_time_now:
         time_side_effect = []
         for x in range(9):
             time_side_effect.append(time_now +
                                     datetime.timedelta(seconds=10 * x))
         mock_time_now.side_effect = time_side_effect
         nginx_manager = nginx.Nginx.return_value
         restorer = healing.RestoreMachine(self.config)
         restorer.start()
         time.sleep(1)
         restorer.stop()
         self.assertEqual(extend_lock.call_args_list, [
             call(extra_time=10),
             call(extra_time=10),
             call(extra_time=10)
         ])
         nginx_expected_calls = [
             call('10.1.1.1', timeout=600),
             call('10.3.3.3', timeout=600),
             call('10.4.4.4', timeout=600),
             call('10.5.5.5', timeout=600)
         ]
         self.assertEqual(nginx_expected_calls,
                          nginx_manager.wait_healthcheck.call_args_list)
         tasks_restore = []
         for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }}):
             tasks_restore.append(task['_id'])
         self.assertListEqual(tasks_restore, ['restore_10.2.2.2'])
Esempio n. 5
0
 def test_restore_machine_success(self, log, nginx):
     nginx_manager = nginx.Nginx.return_value
     restorer = healing.RestoreMachine(self.config)
     restorer.start()
     time.sleep(1)
     restorer.stop()
     self.assertEqual(log.info.call_args_list, [
         call("Machine 0 restored"),
         call("Machine 2 restored"),
         call("Machine 3 restored"),
         call("Machine 4 restored")
     ])
     nginx_expected_calls = [
         call('10.1.1.1', timeout=600),
         call('10.3.3.3', timeout=600),
         call('10.4.4.4', timeout=600),
         call('10.5.5.5', timeout=600)
     ]
     self.assertEqual(nginx_expected_calls,
                      nginx_manager.wait_healthcheck.call_args_list)
     tasks = [
         task['_id'] for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }})
     ]
     self.assertListEqual(tasks, ['restore_10.2.2.2'])
Esempio n. 6
0
 def test_restore_machine_dry_mode(self, log, nginx):
     self.config['RESTORE_MACHINE_DRY_MODE'] = "1"
     nginx_manager = nginx.Nginx.return_value
     restorer = healing.RestoreMachine(self.config)
     restorer.start()
     time.sleep(1)
     restorer.stop()
     self.assertListEqual(log.info.call_args_list, [])
     self.assertListEqual(nginx_manager.wait_healthcheck.call_args_list, [])
     tasks = [
         task['_id'] for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }})
     ]
     self.assertListEqual(tasks, ['restore_10.2.2.2'])
Esempio n. 7
0
 def test_restore_machine_iaas_fail(self, log, nginx):
     FakeManager.fail_ids = [2]
     restorer = healing.RestoreMachine(self.config)
     nginx_manager = nginx.Nginx.return_value
     restorer.start()
     time.sleep(1)
     restorer.stop()
     tasks = [
         task['_id'] for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }})
     ]
     self.assertListEqual([
         'restore_10.2.2.2', 'restore_10.3.3.3', 'restore_10.4.4.4',
         'restore_10.5.5.5'
     ], tasks)
     self.assertEqual(log.info.call_args_list, [call("Machine 0 restored")])
     self.assertEqual(nginx_manager.wait_healthcheck.call_args_list,
                      [call('10.1.1.1', timeout=600)])
     log.reset_mock()
     nginx.reset_mock()
     redis.StrictRedis().delete("restore_machine:last_run")
     restorer = healing.RestoreMachine(self.config)
     restorer.start()
     time.sleep(1)
     restorer.stop()
     tasks = [
         task['_id'] for task in self.storage.find_task(
             {"_id": {
                 "$regex": "restore_.+"
             }})
     ]
     self.assertEqual(log.info.call_args_list, [call("Machine 4 restored")])
     self.assertEqual(nginx_manager.wait_healthcheck.call_args_list,
                      [call('10.5.5.5', timeout=600)])
     self.assertListEqual(
         ['restore_10.2.2.2', 'restore_10.3.3.3', 'restore_10.4.4.4'],
         tasks)
     log.reset_mock()
     nginx.reset_mock()
     redis.StrictRedis().delete("restore_machine:last_run")
     FakeManager.fail_ids = []
     with freeze_time("2016-02-03 12:06:00"):
         restorer = healing.RestoreMachine(self.config)
         restorer.start()
         time.sleep(1)
         restorer.stop()
         tasks = [
             task['_id'] for task in self.storage.find_task(
                 {"_id": {
                     "$regex": "restore_.+"
                 }})
         ]
         self.assertEqual(log.info.call_args_list, [
             call("Machine 1 restored"),
             call("Machine 2 restored"),
             call("Machine 3 restored")
         ])
         nginx_expected_calls = [
             call('10.2.2.2', timeout=600),
             call('10.3.3.3', timeout=600),
             call('10.4.4.4', timeout=600)
         ]
         self.assertEqual(nginx_expected_calls,
                          nginx_manager.wait_healthcheck.call_args_list)
         self.assertListEqual(tasks, [])