summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorTodd Willey <todd@ansolabs.com>2010-07-26 17:00:50 -0400
committerTodd Willey <todd@ansolabs.com>2010-07-26 17:00:50 -0400
commitfd2d4e3f3dba426eedc22b326d2bb0cb6a19eb76 (patch)
tree2d1f8c47bbc995e71eb4a32003bad424e39f11da /nova
parentd6e74751fa156f3879ff2136caccf2a40d4b9e8c (diff)
downloadnova-fd2d4e3f3dba426eedc22b326d2bb0cb6a19eb76.tar.gz
nova-fd2d4e3f3dba426eedc22b326d2bb0cb6a19eb76.tar.xz
nova-fd2d4e3f3dba426eedc22b326d2bb0cb6a19eb76.zip
Expiry awareness for SessionToken.
Diffstat (limited to 'nova')
-rw-r--r--nova/compute/model.py33
-rw-r--r--nova/tests/model_unittest.py9
-rw-r--r--nova/utils.py9
3 files changed, 39 insertions, 12 deletions
diff --git a/nova/compute/model.py b/nova/compute/model.py
index 331b68349..3aa6fc841 100644
--- a/nova/compute/model.py
+++ b/nova/compute/model.py
@@ -40,6 +40,7 @@ True
True
"""
+import datetime
import logging
import time
import redis
@@ -241,10 +242,24 @@ class SessionToken(datastore.BasicModel):
return self.token
def default_state(self):
- return {'user': None, 'session_type': None, 'token': self.token}
+ now = datetime.datetime.utcnow()
+ diff = datetime.timedelta(hours=1)
+ expires = now + diff
+ return {'user': None, 'session_type': None, 'token': self.token,
+ 'expiry': expires.strftime(utils.TIME_FORMAT)}
+
+ def save(self):
+ """Call into superclass to save object, then save associations"""
+ if not self['user']:
+ raise exception.Invalid("SessionToken requires a User association")
+ success = super(SessionToken, self).save()
+ if success:
+ self.associate_with("user", self['user'])
+ return True
@classmethod
def generate(cls, userid, session_type=None):
+ """make a new token for the given user"""
token = str(uuid.uuid4())
while cls.lookup(token):
token = str(uuid.uuid4())
@@ -254,14 +269,14 @@ class SessionToken(datastore.BasicModel):
instance.save()
return instance
- def save(self):
- """Call into superclass to save object, then save associations"""
- if not self['user']:
- raise exception.Invalid("SessionToken requires a User association")
- success = super(SessionToken, self).save()
- if success:
- self.associate_with("user", self['user'])
- return True
+ def update_expiry(self, **kwargs):
+ """updates the expirty attribute, but doesn't save"""
+ if not kwargs:
+ kwargs['hours'] = 1
+ time = datetime.datetime.utcnow()
+ diff = datetime.timedelta(**kwargs)
+ expires = time + diff
+ self['expiry'] = expires.strftime(utils.TIME_FORMAT)
if __name__ == "__main__":
diff --git a/nova/tests/model_unittest.py b/nova/tests/model_unittest.py
index 7823991b9..0755d8578 100644
--- a/nova/tests/model_unittest.py
+++ b/nova/tests/model_unittest.py
@@ -16,6 +16,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+from datetime import datetime
import logging
import time
from twisted.internet import defer
@@ -256,3 +257,11 @@ class ModelTestCase(test.TrialTestCase):
instance = yield model.SessionToken.generate('username', 'TokenType')
found = yield model.SessionToken.lookup(instance.identifier)
self.assert_(found)
+
+ def test_update_expiry(self):
+ instance = model.SessionToken('tk12341234')
+ oldtime = datetime.utcnow()
+ instance['expiry'] = oldtime.strftime(utils.TIME_FORMAT)
+ instance.update_expiry()
+ expiry = utils.parse_isotime(instance['expiry'])
+ self.assert_(expiry > datetime.utcnow())
diff --git a/nova/utils.py b/nova/utils.py
index 9ecceafe0..a1eb0a092 100644
--- a/nova/utils.py
+++ b/nova/utils.py
@@ -20,7 +20,7 @@
System-level utilities and helper functions.
"""
-from datetime import datetime
+from datetime import datetime, timedelta
import inspect
import logging
import os
@@ -32,7 +32,7 @@ import sys
from nova import flags
FLAGS = flags.FLAGS
-
+TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
def fetchfile(url, target):
logging.debug("Fetching %s" % url)
@@ -118,4 +118,7 @@ def get_my_ip():
def isotime(at=None):
if not at:
at = datetime.utcnow()
- return at.strftime("%Y-%m-%dT%H:%M:%SZ")
+ return at.strftime(TIME_FORMAT)
+
+def parse_isotime(timestr):
+ return datetime.strptime(timestr, TIME_FORMAT)