Changing the API default for lease expiry from days to minutes
Added DB migration script
This commit is contained in:
parent
844a2c307f
commit
c80416a6e7
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue