Changing the API default for lease expiry from days to minutes

Added DB migration script
This commit is contained in:
Susmitha 2016-05-25 17:16:49 -07:00
parent 844a2c307f
commit c80416a6e7
9 changed files with 58 additions and 28 deletions

3
.gitignore vendored
View File

@ -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

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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')

Binary file not shown.

View File

@ -49,7 +49,7 @@ instance_id1 = "instanceid-1-t-1"
instance_id2 = "instanceid-2-t-1"
instance_id3 = "instanceid-3-t-2"
expiry_day1 = 4
expiry_mins1 = 4
port = 8080
@ -94,7 +94,7 @@ def initialize():
@test(depends_on=[initialize])
def test_create_tenant():
r = requests.post('http://127.0.0.1:' + port + '/v1/tenant/' + tenant_id1,
json={"vm_lease_policy": {"tenant_uuid": tenant_id1, "expiry_days": expiry_day1}},
json={"vm_lease_policy": {"tenant_uuid": tenant_id1, "expiry_mins": expiry_mins1}},
headers=headers)
logger.debug(r.text)
assert_equal(r.status_code, 200)
@ -103,7 +103,7 @@ def test_create_tenant():
@test(depends_on=[test_create_tenant])
def test_update_tenant():
r = requests.put('http://127.0.0.1:' + port + '/v1/tenant/' + tenant_id1,
json={"vm_lease_policy": {"tenant_uuid": tenant_id1, "expiry_days": 3}}, headers=headers)
json={"vm_lease_policy": {"tenant_uuid": tenant_id1, "expiry_mins": 3}}, headers=headers)
logger.debug(r.text)
assert_equal(r.status_code, 200)
@ -127,7 +127,7 @@ def test_get_tenant():
def test_create_tenant_neg():
# Try creating again and it should result in error
r = requests.post('http://127.0.0.1:' + port + '/v1/tenant/' + tenant_id1,
json={"vm_lease_policy": {"tenant_uuid": tenant_id1, "expiry_days": expiry_day1}},
json={"vm_lease_policy": {"tenant_uuid": tenant_id1, "expiry_mins": expiry_mins1}},
headers=headers)
logger.debug(r.text)
assert_equal(r.status_code, 409)
@ -187,7 +187,7 @@ def test_delete_instance_lease():
@test(depends_on=[test_deleted_instance])
def test_create_tenant2():
r = requests.post('http://127.0.0.1:' + port + '/v1/tenant/' + tenant_id2,
json={"vm_lease_policy": {"tenant_uuid": tenant_id2, "expiry_days": expiry_day1}},
json={"vm_lease_policy": {"tenant_uuid": tenant_id2, "expiry_mins": expiry_mins1}},
headers=headers)
logger.debug(r.text)
assert_equal(r.status_code, 200)

View File

@ -22,10 +22,10 @@ def teardown_module(mod):
def test_apis():
tenant_id = "aasdsadfsadf"
tenant_user1 = "a@xyz.com"
expiry_day1 = 3
expiry_mins1 = 3
tenant_created_date = datetime.utcnow()
db_persistence.add_tenant_lease(tenant_id, expiry_day1, tenant_user1, tenant_created_date)
db_persistence.add_tenant_lease(tenant_id, expiry_mins1, tenant_user1, tenant_created_date)
t_lease = db_persistence.get_tenant_lease(tenant_id)
assert (t_lease.tenant_uuid == tenant_id)
assert (t_lease.created_by == tenant_user1)
@ -34,7 +34,7 @@ def test_apis():
# Now try update
tenant_user2 = "b@xyz.com"
tenant_updated_date = datetime.utcnow()
db_persistence.update_tenant_lease(tenant_id, expiry_day1, tenant_user2, tenant_updated_date)
db_persistence.update_tenant_lease(tenant_id, expiry_mins1, tenant_user2, tenant_updated_date)
t_lease = db_persistence.get_tenant_lease(tenant_id)
assert (t_lease.tenant_uuid == tenant_id)
assert (t_lease.created_by == tenant_user1)