def test_archive_then_purge_by_date(self): server = self._create_server() server_id = server['id'] self._delete_server(server_id) results, deleted_ids = db.archive_deleted_rows(max_rows=1000) self.assertEqual([server_id], deleted_ids) pre_purge_results = self._get_table_counts() past = timeutils.utcnow() - datetime.timedelta(hours=1) admin_context = context.get_admin_context() deleted = sqlalchemy_api.purge_shadow_tables(admin_context, past) # Make sure we didn't delete anything if the marker is before # we started self.assertEqual(0, deleted) results = self._get_table_counts() # Nothing should be changed if we didn't purge anything self.assertEqual(pre_purge_results, results) future = timeutils.utcnow() + datetime.timedelta(hours=1) deleted = sqlalchemy_api.purge_shadow_tables(admin_context, future) # Make sure we deleted things when the marker is after # we started self.assertNotEqual(0, deleted) results = self._get_table_counts() # There should be no rows in any table if we purged everything self.assertFalse(any(results.values()))
def test_archive_then_purge_by_date(self): server = self._create_server() server_id = server['id'] self._delete_server(server_id) results, deleted_ids = db.archive_deleted_rows(max_rows=1000) self.assertEqual([server_id], deleted_ids) pre_purge_results = self._get_table_counts() past = timeutils.utcnow() - datetime.timedelta(hours=1) admin_context = context.get_admin_context() deleted = sqlalchemy_api.purge_shadow_tables(admin_context, past) # Make sure we didn't delete anything if the marker is before # we started self.assertEqual(0, deleted) results = self._get_table_counts() # Nothing should be changed if we didn't purge anything self.assertEqual(pre_purge_results, results) future = timeutils.utcnow() + datetime.timedelta(hours=1) deleted = sqlalchemy_api.purge_shadow_tables(admin_context, future) # Make sure we deleted things when the marker is after # we started self.assertNotEqual(0, deleted) results = self._get_table_counts() # There should be no rows in any table if we purged everything self.assertFalse(any(results.values()))
def test_archive_then_purge_by_date(self): # Enable the generation of task_log records by the instance usage audit # nova-compute periodic task. self.flags(instance_usage_audit=True) compute = self.computes['compute'] # Simulate a server that was created 30 days ago, needed to test the # task_log coverage. The task_log audit period defaults to 1 month, so # for a server to appear in the task_log, it must have been active # during the previous calendar month. month_ago = timeutils.utcnow() - datetime.timedelta(days=30) with osloutils_fixture.TimeFixture(month_ago): server = self._create_server() server_id = server['id'] admin_context = context.get_admin_context() # task_log records are generated by the _instance_usage_audit # periodic task. compute.manager._instance_usage_audit(admin_context) # Audit period defaults to 1 month, the last audit period will # be the previous calendar month. begin, end = nova_utils.last_completed_audit_period() # Verify that we have 1 task_log record per audit period. task_logs = objects.TaskLogList.get_all(admin_context, 'instance_usage_audit', begin, end) self.assertEqual(1, len(task_logs)) # Delete the server and archive deleted rows. self._delete_server(server) results, deleted_ids, archived = db.archive_deleted_rows(max_rows=1000, task_log=True) self.assertEqual([server_id], deleted_ids) self.assertEqual(sum(results.values()), archived) pre_purge_results = self._get_table_counts() # Make sure we didn't delete anything if the marker is before # we started past = timeutils.utcnow() - datetime.timedelta(days=31) deleted = sqlalchemy_api.purge_shadow_tables(admin_context, past) self.assertEqual(0, deleted) # Nothing should be changed if we didn't purge anything results = self._get_table_counts() self.assertEqual(pre_purge_results, results) # Make sure we deleted things when the marker is after # we started future = timeutils.utcnow() + datetime.timedelta(hours=1) deleted = sqlalchemy_api.purge_shadow_tables(admin_context, future) self.assertNotEqual(0, deleted) # There should be no rows in any table if we purged everything results = self._get_table_counts() self.assertFalse(any(results.values()))
def test_archive_then_purge_all(self): server = self._create_server() server_id = server['id'] self._delete_server(server_id) results, deleted_ids = db.archive_deleted_rows(max_rows=1000) self.assertEqual([server_id], deleted_ids) lines = [] def status(msg): lines.append(msg) admin_context = context.get_admin_context() deleted = sqlalchemy_api.purge_shadow_tables(admin_context, None, status_fn=status) self.assertNotEqual(0, deleted) self.assertNotEqual(0, len(lines)) for line in lines: self.assertIsNotNone( re.match(r'Deleted [1-9][0-9]* rows from .*', line)) results = self._get_table_counts() # No table should have any rows self.assertFalse(any(results.values()))
def test_purge_with_real_date(self): """Make sure the result of dateutil's parser works with the query we're making to sqlalchemy. """ server = self._create_server() server_id = server['id'] self._delete_server(server_id) results, deleted_ids = db.archive_deleted_rows(max_rows=1000) self.assertEqual([server_id], deleted_ids) date = dateutil_parser.parse('oct 21 2015', fuzzy=True) admin_context = context.get_admin_context() deleted = sqlalchemy_api.purge_shadow_tables(admin_context, date) self.assertEqual(0, deleted)
def test_purge_with_real_date(self): """Make sure the result of dateutil's parser works with the query we're making to sqlalchemy. """ server = self._create_server() server_id = server['id'] self._delete_server(server_id) results, deleted_ids = db.archive_deleted_rows(max_rows=1000) self.assertEqual([server_id], deleted_ids) date = dateutil_parser.parse('oct 21 2015', fuzzy=True) admin_context = context.get_admin_context() deleted = sqlalchemy_api.purge_shadow_tables(admin_context, date) self.assertEqual(0, deleted)
def test_archive_then_purge_all(self): # Enable the generation of task_log records by the instance usage audit # nova-compute periodic task. self.flags(instance_usage_audit=True) compute = self.computes['compute'] server = self._create_server() server_id = server['id'] admin_context = context.get_admin_context() future = timeutils.utcnow() + datetime.timedelta(days=30) with osloutils_fixture.TimeFixture(future): # task_log records are generated by the _instance_usage_audit # periodic task. compute.manager._instance_usage_audit(admin_context) # Audit period defaults to 1 month, the last audit period will # be the previous calendar month. begin, end = nova_utils.last_completed_audit_period() # Verify that we have 1 task_log record per audit period. task_logs = objects.TaskLogList.get_all(admin_context, 'instance_usage_audit', begin, end) self.assertEqual(1, len(task_logs)) self._delete_server(server) results, deleted_ids, archived = db.archive_deleted_rows(max_rows=1000, task_log=True) self.assertEqual([server_id], deleted_ids) lines = [] def status(msg): lines.append(msg) deleted = sqlalchemy_api.purge_shadow_tables(admin_context, None, status_fn=status) self.assertNotEqual(0, deleted) self.assertNotEqual(0, len(lines)) self.assertEqual(sum(results.values()), archived) for line in lines: self.assertIsNotNone( re.match(r'Deleted [1-9][0-9]* rows from .*', line)) # Ensure we purged task_log records. self.assertIn('shadow_task_log', str(lines)) results = self._get_table_counts() # No table should have any rows self.assertFalse(any(results.values()))
def test_archive_then_purge_all(self): server = self._create_server() server_id = server['id'] self._delete_server(server_id) results, deleted_ids = db.archive_deleted_rows(max_rows=1000) self.assertEqual([server_id], deleted_ids) lines = [] def status(msg): lines.append(msg) admin_context = context.get_admin_context() deleted = sqlalchemy_api.purge_shadow_tables(admin_context, None, status_fn=status) self.assertNotEqual(0, deleted) self.assertNotEqual(0, len(lines)) for line in lines: self.assertIsNotNone(re.match(r'Deleted [1-9][0-9]* rows from .*', line)) results = self._get_table_counts() # No table should have any rows self.assertFalse(any(results.values()))