From c80416a6e7b25281cf512b389915bdde7b09d028 Mon Sep 17 00:00:00 2001 From: Susmitha Date: Wed, 25 May 2016 17:16:49 -0700 Subject: [PATCH] Changing the API default for lease expiry from days to minutes Added DB migration script --- .gitignore | 3 ++ .idea/vcs.xml | 6 ---- etc/pf9/pf9-mors.ini | 2 +- mors/lease_manager.py | 14 ++++---- mors/persistence.py | 12 +++---- .../002_Alter_tenant_lease_to_mins.py | 33 ++++++++++++++++++ mors_repo/versions/__init__.pyc | Bin 254 -> 0 bytes test/test_api.py | 10 +++--- test/test_persistence.py | 6 ++-- 9 files changed, 58 insertions(+), 28 deletions(-) delete mode 100644 .idea/vcs.xml create mode 100644 mors_repo/versions/002_Alter_tenant_lease_to_mins.py delete mode 100644 mors_repo/versions/__init__.pyc diff --git a/.gitignore b/.gitignore index 1dbc687..a6d1710 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ var/ *.egg-info/ .installed.cfg *.egg +*.pyc # PyInstaller # Usually these files are written by a python script from a template @@ -60,3 +61,5 @@ target/ #Ipython Notebook .ipynb_checkpoints + +.idea diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/etc/pf9/pf9-mors.ini b/etc/pf9/pf9-mors.ini index daf725f..18cf4b0 100644 --- a/etc/pf9/pf9-mors.ini +++ b/etc/pf9/pf9-mors.ini @@ -3,7 +3,7 @@ db_conn= context_factory= lease_handler= listen_port=8989 -sleep_seconds=300 +sleep_seconds=60 paste-ini=/etc/pf9/pf9-mors-api-paste.ini log_file=/var/log/pf9/pf9-mors.log repo=/opt/pf9/pf9-mors/lib/python2.7/site-packages/mors_repo diff --git a/mors/lease_manager.py b/mors/lease_manager.py index b590f2b..b0f1380 100644 --- a/mors/lease_manager.py +++ b/mors/lease_manager.py @@ -18,7 +18,7 @@ def get_tenant_lease_data(data): :param data: database row object """ return {'vm_lease_policy': {'tenant_uuid': data['tenant_uuid'], - 'expiry_days': data['expiry_days'], + 'expiry_mins': data['expiry_mins'], 'created_at': data['created_at'], 'created_by': data['created_by'], 'updated_at': data['updated_at'], @@ -55,7 +55,7 @@ class LeaseManager: logger.info("Adding tenant lease %s", tenant_obj) self.domain_mgr.add_tenant_lease( tenant_obj['tenant_uuid'], - tenant_obj['expiry_days'], + tenant_obj['expiry_mins'], context.user_id, datetime.utcnow()) @@ -63,7 +63,7 @@ class LeaseManager: logger.info("Update tenant lease %s", tenant_obj) self.domain_mgr.update_tenant_lease( tenant_obj['tenant_uuid'], - tenant_obj['expiry_days'], + tenant_obj['expiry_mins'], context.user_id, datetime.utcnow()) @@ -131,11 +131,11 @@ class LeaseManager: # Could have used a generator here, would save memory but wonder if it is a good idea given the error conditions # This is a simple implementation which goes and deletes VMs one by one - def _get_vms_to_delete_for_tenant(self, tenant_uuid, expiry_days): + def _get_vms_to_delete_for_tenant(self, tenant_uuid, expiry_mins): vms_to_delete = [] vm_ids_to_delete = set() now = datetime.utcnow() - add_days = timedelta(days=expiry_days) + add_seconds = timedelta(seconds=expiry_mins*60) instance_leases = self.get_tenant_and_associated_instance_leases(None, tenant_uuid)['all_vms'] for i_lease in instance_leases: if now > i_lease['expiry']: @@ -147,7 +147,7 @@ class LeaseManager: tenant_vms = self.lease_handler.get_all_vms(tenant_uuid) for vm in tenant_vms: - expiry_date = vm['created_at'] + add_days + expiry_date = vm['created_at'] + add_seconds if now > expiry_date and not (vm['instance_uuid'] in vm_ids_to_delete): logger.info("Instance %s queued up for deletion creation date %s", vm['instance_uuid'], vm['created_at']) @@ -159,7 +159,7 @@ class LeaseManager: return vms_to_delete def _delete_vms_for_tenant(self, t_lease): - tenant_vms_to_delete = self._get_vms_to_delete_for_tenant(t_lease['tenant_uuid'], t_lease['expiry_days']) + tenant_vms_to_delete = self._get_vms_to_delete_for_tenant(t_lease['tenant_uuid'], t_lease['expiry_mins']) # Keep it simple and delete them serially result = self.lease_handler.delete_vms(tenant_vms_to_delete) diff --git a/mors/persistence.py b/mors/persistence.py index 04bd4e8..cc84799 100644 --- a/mors/persistence.py +++ b/mors/persistence.py @@ -60,15 +60,15 @@ class DbPersistence: return conn.execute(self.tenant_lease.select(tenant_uuid == tenant_uuid)).first() @db_connect(transaction=True) - def add_tenant_lease(self, conn, tenant_uuid, expiry_days, created_by, created_at): - logger.debug("Adding tenant lease %s %d %s %s", tenant_uuid, expiry_days, str(created_at), created_by) - conn.execute(self.tenant_lease.insert(), tenant_uuid=tenant_uuid, expiry_days=expiry_days, + def add_tenant_lease(self, conn, tenant_uuid, expiry_mins, created_by, created_at): + logger.debug("Adding tenant lease %s %d %s %s", tenant_uuid, expiry_mins, str(created_at), created_by) + conn.execute(self.tenant_lease.insert(), tenant_uuid=tenant_uuid, expiry_mins=expiry_mins, created_at=created_at, created_by=created_by) @db_connect(transaction=True) - def update_tenant_lease(self, conn, tenant_uuid, expiry_days, updated_by, updated_at): - logger.debug("Updating tenant lease %s %d %s %s", tenant_uuid, expiry_days, str(updated_at), updated_by) - conn.execute(self.tenant_lease.update(tenant_uuid == tenant_uuid), expiry_days=expiry_days, + def update_tenant_lease(self, conn, tenant_uuid, expiry_mins, updated_by, updated_at): + logger.debug("Updating tenant lease %s %d %s %s", tenant_uuid, expiry_mins, str(updated_at), updated_by) + conn.execute(self.tenant_lease.update(tenant_uuid == tenant_uuid), expiry_mins=expiry_mins, updated_at=updated_at, updated_by=updated_by) @db_connect(transaction=True) diff --git a/mors_repo/versions/002_Alter_tenant_lease_to_mins.py b/mors_repo/versions/002_Alter_tenant_lease_to_mins.py new file mode 100644 index 0000000..23d7fb1 --- /dev/null +++ b/mors_repo/versions/002_Alter_tenant_lease_to_mins.py @@ -0,0 +1,33 @@ +# Copyright Platform9 Systems Inc. 2016 +from sqlalchemy import MetaData, String, Table + +def upgrade(migrate_engine): + meta = MetaData(bind=migrate_engine) + table = Table('tenant_lease', meta, autoload=True) + + tenant_leases = list(table.select().execute()) + for tenant_lease in tenant_leases: + old_val = tenant_lease['expiry_days'] + new_val = old_val*24*60 + table.update().where( + table.c.expiry_days == old_val).values( + expiry_days=str(new_val)).execute() + + col = getattr(table.c, 'expiry_days') + col.alter(name='expiry_mins') + +def downgrade(migrate_engine): + meta = MetaData(bind=migrate_engine) + table = Table('tenant_lease', meta, autoload=True) + + tenant_leases = list(table.select().execute()) + for tenant_lease in tenant_leases: + old_val = tenant_lease['expiry_mins'] + new_val = old_val/(24*60) + table.update().where( + table.c.expiry_mins == old_val).values( + expiry_mins=str(new_val)).execute() + + col = getattr(table.c, 'expiry_mins') + col.alter(name='expiry_days') + diff --git a/mors_repo/versions/__init__.pyc b/mors_repo/versions/__init__.pyc deleted file mode 100644 index 81291aca91e97b2b18d54e6a5c6fa893d4e38c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmZ8c%WA_g5L9RnrO^NIC0V;^O%5gG3wmkDRR~Fuh4u1EG5Cw}S^a@rLVh4?NG~0j zS(qJ$-KX2z>+j`yknDj4%^fj6lPJc1s@eIjNZ3EgXYwGS9YxVF3WQ^HN@E7ufy4Kp zaQ)d14VQh>2DARyw8N$*m;if7lk5cgWfHO%#s*WbicgRSC!FlGpO)SloSXmVNYyq5 vibByoIof4Fonp2n;si<`#mNgDsq|(o|mP)-NB`$?5I