Changes all uses of utcnow to use the version in utils. This is a simple wrapper for datetime.datetime.utcnow that allows us to use fake values for tests.

There are still a few places in the Zone code that is using datetime.now(), I'd prefer to move this to utils.utcnow() as well but I want to chat with sandy first to make sure that there won't be any issues.
This commit is contained in:
Vishvananda Ishaya
2011-06-03 15:11:01 +00:00
committed by Tarmac
11 changed files with 32 additions and 37 deletions

View File

@@ -53,7 +53,6 @@
CLI interface for nova management. CLI interface for nova management.
""" """
import datetime
import gettext import gettext
import glob import glob
import json import json
@@ -690,7 +689,7 @@ class ServiceCommands(object):
"""Show a list of all running services. Filter by host & service name. """Show a list of all running services. Filter by host & service name.
args: [host] [service]""" args: [host] [service]"""
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
now = datetime.datetime.utcnow() now = utils.utcnow()
services = db.service_get_all(ctxt) services = db.service_get_all(ctxt)
if host: if host:
services = [s for s in services if s['host'] == host] services = [s for s in services if s['host'] == host]

View File

@@ -11,9 +11,8 @@
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License.import datetime # under the License.
import datetime
import uuid import uuid
from nova import flags from nova import flags
@@ -64,7 +63,7 @@ def notify(publisher_id, event_type, priority, payload):
{'message_id': str(uuid.uuid4()), {'message_id': str(uuid.uuid4()),
'publisher_id': 'compute.host1', 'publisher_id': 'compute.host1',
'timestamp': datetime.datetime.utcnow(), 'timestamp': utils.utcnow(),
'priority': 'WARN', 'priority': 'WARN',
'event_type': 'compute.create_instance', 'event_type': 'compute.create_instance',
'payload': {'instance_id': 12, ... }} 'payload': {'instance_id': 12, ... }}
@@ -79,5 +78,5 @@ def notify(publisher_id, event_type, priority, payload):
event_type=event_type, event_type=event_type,
priority=priority, priority=priority,
payload=payload, payload=payload,
timestamp=str(datetime.datetime.utcnow())) timestamp=str(utils.utcnow()))
driver.notify(msg) driver.notify(msg)

View File

@@ -28,6 +28,7 @@ from nova import exception
from nova import flags from nova import flags
from nova import log as logging from nova import log as logging
from nova import rpc from nova import rpc
from nova import utils
from nova.compute import power_state from nova.compute import power_state
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
@@ -61,7 +62,7 @@ class Scheduler(object):
"""Check whether a service is up based on last heartbeat.""" """Check whether a service is up based on last heartbeat."""
last_heartbeat = service['updated_at'] or service['created_at'] last_heartbeat = service['updated_at'] or service['created_at']
# Timestamps in DB are UTC. # Timestamps in DB are UTC.
elapsed = datetime.datetime.utcnow() - last_heartbeat elapsed = utils.utcnow() - last_heartbeat
return elapsed < datetime.timedelta(seconds=FLAGS.service_down_time) return elapsed < datetime.timedelta(seconds=FLAGS.service_down_time)
def hosts_up(self, context, topic): def hosts_up(self, context, topic):

View File

@@ -21,10 +21,9 @@
Simple Scheduler Simple Scheduler
""" """
import datetime
from nova import db from nova import db
from nova import flags from nova import flags
from nova import utils
from nova.scheduler import driver from nova.scheduler import driver
from nova.scheduler import chance from nova.scheduler import chance
@@ -54,7 +53,7 @@ class SimpleScheduler(chance.ChanceScheduler):
# TODO(vish): this probably belongs in the manager, if we # TODO(vish): this probably belongs in the manager, if we
# can generalize this somehow # can generalize this somehow
now = datetime.datetime.utcnow() now = utils.utcnow()
db.instance_update(context, instance_id, {'host': host, db.instance_update(context, instance_id, {'host': host,
'scheduled_at': now}) 'scheduled_at': now})
return host return host
@@ -66,7 +65,7 @@ class SimpleScheduler(chance.ChanceScheduler):
if self.service_is_up(service): if self.service_is_up(service):
# NOTE(vish): this probably belongs in the manager, if we # NOTE(vish): this probably belongs in the manager, if we
# can generalize this somehow # can generalize this somehow
now = datetime.datetime.utcnow() now = utils.utcnow()
db.instance_update(context, db.instance_update(context,
instance_id, instance_id,
{'host': service['host'], {'host': service['host'],
@@ -90,7 +89,7 @@ class SimpleScheduler(chance.ChanceScheduler):
# TODO(vish): this probably belongs in the manager, if we # TODO(vish): this probably belongs in the manager, if we
# can generalize this somehow # can generalize this somehow
now = datetime.datetime.utcnow() now = utils.utcnow()
db.volume_update(context, volume_id, {'host': host, db.volume_update(context, volume_id, {'host': host,
'scheduled_at': now}) 'scheduled_at': now})
return host return host
@@ -103,7 +102,7 @@ class SimpleScheduler(chance.ChanceScheduler):
if self.service_is_up(service): if self.service_is_up(service):
# NOTE(vish): this probably belongs in the manager, if we # NOTE(vish): this probably belongs in the manager, if we
# can generalize this somehow # can generalize this somehow
now = datetime.datetime.utcnow() now = utils.utcnow()
db.volume_update(context, db.volume_update(context,
volume_id, volume_id,
{'host': service['host'], {'host': service['host'],

View File

@@ -17,16 +17,17 @@
ZoneManager oversees all communications with child Zones. ZoneManager oversees all communications with child Zones.
""" """
import datetime
import novaclient import novaclient
import thread import thread
import traceback import traceback
from datetime import datetime
from eventlet import greenpool from eventlet import greenpool
from nova import db from nova import db
from nova import flags from nova import flags
from nova import log as logging from nova import log as logging
from nova import utils
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
flags.DEFINE_integer('zone_db_check_interval', 60, flags.DEFINE_integer('zone_db_check_interval', 60,
@@ -42,7 +43,7 @@ class ZoneState(object):
self.name = None self.name = None
self.capabilities = None self.capabilities = None
self.attempt = 0 self.attempt = 0
self.last_seen = datetime.min self.last_seen = datetime.datetime.min
self.last_exception = None self.last_exception = None
self.last_exception_time = None self.last_exception_time = None
@@ -56,7 +57,7 @@ class ZoneState(object):
def update_metadata(self, zone_metadata): def update_metadata(self, zone_metadata):
"""Update zone metadata after successful communications with """Update zone metadata after successful communications with
child zone.""" child zone."""
self.last_seen = datetime.now() self.last_seen = utils.utcnow()
self.attempt = 0 self.attempt = 0
self.name = zone_metadata.get("name", "n/a") self.name = zone_metadata.get("name", "n/a")
self.capabilities = ", ".join(["%s=%s" % (k, v) self.capabilities = ", ".join(["%s=%s" % (k, v)
@@ -72,7 +73,7 @@ class ZoneState(object):
"""Something went wrong. Check to see if zone should be """Something went wrong. Check to see if zone should be
marked as offline.""" marked as offline."""
self.last_exception = exception self.last_exception = exception
self.last_exception_time = datetime.now() self.last_exception_time = utils.utcnow()
api_url = self.api_url api_url = self.api_url
logging.warning(_("'%(exception)s' error talking to " logging.warning(_("'%(exception)s' error talking to "
"zone %(api_url)s") % locals()) "zone %(api_url)s") % locals())
@@ -104,7 +105,7 @@ def _poll_zone(zone):
class ZoneManager(object): class ZoneManager(object):
"""Keeps the zone states updated.""" """Keeps the zone states updated."""
def __init__(self): def __init__(self):
self.last_zone_db_check = datetime.min self.last_zone_db_check = datetime.datetime.min
self.zone_states = {} # { <zone_id> : ZoneState } self.zone_states = {} # { <zone_id> : ZoneState }
self.service_states = {} # { <host> : { <service> : { cap k : v }}} self.service_states = {} # { <host> : { <service> : { cap k : v }}}
self.green_pool = greenpool.GreenPool() self.green_pool = greenpool.GreenPool()
@@ -158,10 +159,10 @@ class ZoneManager(object):
def ping(self, context=None): def ping(self, context=None):
"""Ping should be called periodically to update zone status.""" """Ping should be called periodically to update zone status."""
diff = datetime.now() - self.last_zone_db_check diff = utils.utcnow() - self.last_zone_db_check
if diff.seconds >= FLAGS.zone_db_check_interval: if diff.seconds >= FLAGS.zone_db_check_interval:
logging.debug(_("Updating zone cache from db.")) logging.debug(_("Updating zone cache from db."))
self.last_zone_db_check = datetime.now() self.last_zone_db_check = utils.utcnow()
self._refresh_from_db(context) self._refresh_from_db(context)
self._poll_zones(context) self._poll_zones(context)

View File

@@ -23,7 +23,6 @@ inline callbacks.
""" """
import datetime
import functools import functools
import os import os
import shutil import shutil
@@ -37,6 +36,7 @@ from eventlet import greenthread
from nova import fakerabbit from nova import fakerabbit
from nova import flags from nova import flags
from nova import rpc from nova import rpc
from nova import utils
from nova import service from nova import service
from nova import wsgi from nova import wsgi
from nova.virt import fake from nova.virt import fake
@@ -69,7 +69,7 @@ class TestCase(unittest.TestCase):
# NOTE(vish): We need a better method for creating fixtures for tests # NOTE(vish): We need a better method for creating fixtures for tests
# now that we have some required db setup for the system # now that we have some required db setup for the system
# to work properly. # to work properly.
self.start = datetime.datetime.utcnow() self.start = utils.utcnow()
shutil.copyfile(os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db), shutil.copyfile(os.path.join(FLAGS.state_path, FLAGS.sqlite_clean_db),
os.path.join(FLAGS.state_path, FLAGS.sqlite_db)) os.path.join(FLAGS.state_path, FLAGS.sqlite_db))

View File

@@ -197,7 +197,7 @@ class ZoneSchedulerTestCase(test.TestCase):
service.topic = 'compute' service.topic = 'compute'
service.id = kwargs['id'] service.id = kwargs['id']
service.availability_zone = kwargs['zone'] service.availability_zone = kwargs['zone']
service.created_at = datetime.datetime.utcnow() service.created_at = utils.utcnow()
return service return service
def test_with_two_zones(self): def test_with_two_zones(self):
@@ -291,7 +291,7 @@ class SimpleDriverTestCase(test.TestCase):
dic['host'] = kwargs.get('host', 'dummy') dic['host'] = kwargs.get('host', 'dummy')
s_ref = db.service_create(self.context, dic) s_ref = db.service_create(self.context, dic)
if 'created_at' in kwargs.keys() or 'updated_at' in kwargs.keys(): if 'created_at' in kwargs.keys() or 'updated_at' in kwargs.keys():
t = datetime.datetime.utcnow() - datetime.timedelta(0) t = utils.utcnow() - datetime.timedelta(0)
dic['created_at'] = kwargs.get('created_at', t) dic['created_at'] = kwargs.get('created_at', t)
dic['updated_at'] = kwargs.get('updated_at', t) dic['updated_at'] = kwargs.get('updated_at', t)
db.service_update(self.context, s_ref['id'], dic) db.service_update(self.context, s_ref['id'], dic)
@@ -402,7 +402,7 @@ class SimpleDriverTestCase(test.TestCase):
FLAGS.compute_manager) FLAGS.compute_manager)
compute1.start() compute1.start()
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute') s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
now = datetime.datetime.utcnow() now = utils.utcnow()
delta = datetime.timedelta(seconds=FLAGS.service_down_time * 2) delta = datetime.timedelta(seconds=FLAGS.service_down_time * 2)
past = now - delta past = now - delta
db.service_update(self.context, s1['id'], {'updated_at': past}) db.service_update(self.context, s1['id'], {'updated_at': past})
@@ -543,7 +543,7 @@ class SimpleDriverTestCase(test.TestCase):
def test_wont_sechedule_if_specified_host_is_down(self): def test_wont_sechedule_if_specified_host_is_down(self):
compute1 = self.start_service('compute', host='host1') compute1 = self.start_service('compute', host='host1')
s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute') s1 = db.service_get_by_args(self.context, 'host1', 'nova-compute')
now = datetime.datetime.utcnow() now = utils.utcnow()
delta = datetime.timedelta(seconds=FLAGS.service_down_time * 2) delta = datetime.timedelta(seconds=FLAGS.service_down_time * 2)
past = now - delta past = now - delta
db.service_update(self.context, s1['id'], {'updated_at': past}) db.service_update(self.context, s1['id'], {'updated_at': past})
@@ -693,7 +693,7 @@ class SimpleDriverTestCase(test.TestCase):
dic = {'instance_id': instance_id, 'size': 1} dic = {'instance_id': instance_id, 'size': 1}
v_ref = db.volume_create(self.context, {'instance_id': instance_id, v_ref = db.volume_create(self.context, {'instance_id': instance_id,
'size': 1}) 'size': 1})
t1 = datetime.datetime.utcnow() - datetime.timedelta(1) t1 = utils.utcnow() - datetime.timedelta(1)
dic = {'created_at': t1, 'updated_at': t1, 'binary': 'nova-volume', dic = {'created_at': t1, 'updated_at': t1, 'binary': 'nova-volume',
'topic': 'volume', 'report_count': 0} 'topic': 'volume', 'report_count': 0}
s_ref = db.service_create(self.context, dic) s_ref = db.service_create(self.context, dic)
@@ -710,7 +710,7 @@ class SimpleDriverTestCase(test.TestCase):
"""Confirms src-compute node is alive.""" """Confirms src-compute node is alive."""
instance_id = self._create_instance() instance_id = self._create_instance()
i_ref = db.instance_get(self.context, instance_id) i_ref = db.instance_get(self.context, instance_id)
t = datetime.datetime.utcnow() - datetime.timedelta(10) t = utils.utcnow() - datetime.timedelta(10)
s_ref = self._create_compute_service(created_at=t, updated_at=t, s_ref = self._create_compute_service(created_at=t, updated_at=t,
host=i_ref['host']) host=i_ref['host'])
@@ -738,7 +738,7 @@ class SimpleDriverTestCase(test.TestCase):
"""Confirms exception raises in case dest host does not exist.""" """Confirms exception raises in case dest host does not exist."""
instance_id = self._create_instance() instance_id = self._create_instance()
i_ref = db.instance_get(self.context, instance_id) i_ref = db.instance_get(self.context, instance_id)
t = datetime.datetime.utcnow() - datetime.timedelta(10) t = utils.utcnow() - datetime.timedelta(10)
s_ref = self._create_compute_service(created_at=t, updated_at=t, s_ref = self._create_compute_service(created_at=t, updated_at=t,
host=i_ref['host']) host=i_ref['host'])
@@ -797,7 +797,7 @@ class SimpleDriverTestCase(test.TestCase):
# mocks for live_migration_common_check() # mocks for live_migration_common_check()
instance_id = self._create_instance() instance_id = self._create_instance()
i_ref = db.instance_get(self.context, instance_id) i_ref = db.instance_get(self.context, instance_id)
t1 = datetime.datetime.utcnow() - datetime.timedelta(10) t1 = utils.utcnow() - datetime.timedelta(10)
s_ref = self._create_compute_service(created_at=t1, updated_at=t1, s_ref = self._create_compute_service(created_at=t1, updated_at=t1,
host=dest) host=dest)

View File

@@ -19,7 +19,6 @@
Tests For Compute Tests For Compute
""" """
import datetime
import mox import mox
import stubout import stubout
@@ -217,12 +216,12 @@ class ComputeTestCase(test.TestCase):
instance_ref = db.instance_get(self.context, instance_id) instance_ref = db.instance_get(self.context, instance_id)
self.assertEqual(instance_ref['launched_at'], None) self.assertEqual(instance_ref['launched_at'], None)
self.assertEqual(instance_ref['deleted_at'], None) self.assertEqual(instance_ref['deleted_at'], None)
launch = datetime.datetime.utcnow() launch = utils.utcnow()
self.compute.run_instance(self.context, instance_id) self.compute.run_instance(self.context, instance_id)
instance_ref = db.instance_get(self.context, instance_id) instance_ref = db.instance_get(self.context, instance_id)
self.assert_(instance_ref['launched_at'] > launch) self.assert_(instance_ref['launched_at'] > launch)
self.assertEqual(instance_ref['deleted_at'], None) self.assertEqual(instance_ref['deleted_at'], None)
terminate = datetime.datetime.utcnow() terminate = utils.utcnow()
self.compute.terminate_instance(self.context, instance_id) self.compute.terminate_instance(self.context, instance_id)
self.context = self.context.elevated(True) self.context = self.context.elevated(True)
instance_ref = db.instance_get(self.context, instance_id) instance_ref = db.instance_get(self.context, instance_id)

View File

@@ -20,8 +20,6 @@
Tests For Console proxy. Tests For Console proxy.
""" """
import datetime
from nova import context from nova import context
from nova import db from nova import db
from nova import exception from nova import exception

View File

@@ -16,7 +16,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import datetime
import webob import webob
import webob.dec import webob.dec
import webob.exc import webob.exc

View File

@@ -307,7 +307,7 @@ def get_my_linklocal(interface):
def utcnow(): def utcnow():
"""Overridable version of datetime.datetime.utcnow.""" """Overridable version of utils.utcnow."""
if utcnow.override_time: if utcnow.override_time:
return utcnow.override_time return utcnow.override_time
return datetime.datetime.utcnow() return datetime.datetime.utcnow()