summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-11-09 18:16:24 -0500
committerBrian Lamar <brian.lamar@rackspace.com>2011-11-15 17:36:02 -0500
commitbcfff3dd530994d3ae22f945f429df3afc954cb0 (patch)
tree5746bf0af3e79d01bd9f2996668a404a212e1d67 /nova/compute
parentdd5c3f7badf24e21eb1b311639bcbc55512bc117 (diff)
Follow hostname RFCs
Updated hostname sanitization method to more closely follow RFC-952 and RFC-1123. Also moved it to nova.utils, where it seems to fit better. Fixes bug 885374 (Patch Set 1) Updated hostname sanitization with more efficient and [opinion] more readable implementation. Change-Id: I60d7ee89867c05950bec1fd53b072a1c6247ebea
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py62
1 files changed, 26 insertions, 36 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 1128da1de..0f3e0ae3d 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -51,34 +51,6 @@ flags.DEFINE_integer('find_host_timeout', 30,
'Timeout after NN seconds when looking for a host.')
-def generate_default_hostname(instance):
- """Default function to generate a hostname given an instance reference."""
- display_name = instance['display_name']
- if display_name is None:
- return 'server-%d' % (instance['id'],)
- table = ''
- deletions = ''
- for i in xrange(256):
- c = chr(i)
- if ('a' <= c <= 'z') or ('0' <= c <= '9') or (c == '-'):
- table += c
- elif c in " _":
- table += '-'
- elif ('A' <= c <= 'Z'):
- table += c.lower()
- else:
- table += '\0'
- deletions += c
- if isinstance(display_name, unicode):
- display_name = display_name.encode('latin-1', 'ignore')
- return display_name.translate(table, deletions)
-
-
-def generate_default_display_name(instance):
- """Generate a default display name"""
- return 'Server %s' % instance['id']
-
-
def _is_able_to_shutdown(instance):
vm_state = instance["vm_state"]
instance_id = instance["id"]
@@ -115,8 +87,7 @@ def _is_queued_delete(instance):
class API(base.Base):
"""API for interacting with the compute manager."""
- def __init__(self, image_service=None, network_api=None,
- volume_api=None, hostname_factory=generate_default_hostname,
+ def __init__(self, image_service=None, network_api=None, volume_api=None,
**kwargs):
self.image_service = image_service or \
nova.image.get_default_image_service()
@@ -127,7 +98,6 @@ class API(base.Base):
if not volume_api:
volume_api = volume.API()
self.volume_api = volume_api
- self.hostname_factory = hostname_factory
super(API, self).__init__(**kwargs)
def _check_injected_file_quota(self, context, injected_files):
@@ -489,17 +459,26 @@ class API(base.Base):
# Set sane defaults if not specified
updates = {}
- if (not hasattr(instance, 'display_name') or
- instance.display_name is None):
- updates['display_name'] = generate_default_display_name(instance)
- instance['display_name'] = updates['display_name']
- updates['hostname'] = self.hostname_factory(instance)
+
+ display_name = instance.get('display_name')
+ if display_name is None:
+ display_name = self._default_display_name(instance_id)
+
+ hostname = instance.get('hostname')
+ if hostname is None:
+ hostname = display_name
+
+ updates['display_name'] = display_name
+ updates['hostname'] = utils.sanitize_hostname(hostname)
updates['vm_state'] = vm_states.BUILDING
updates['task_state'] = task_states.SCHEDULING
instance = self.update(context, instance_id, **updates)
return instance
+ def _default_display_name(self, instance_id):
+ return "Server %s" % instance_id
+
def _schedule_run_instance(self,
rpc_method,
context, base_options,
@@ -783,6 +762,17 @@ class API(base.Base):
:returns: None
"""
+ display_name = kwargs.get('display_name')
+ if display_name is None:
+ display_name = self._default_display_name(instance_id)
+
+ hostname = kwargs.get('hostname')
+ if hostname is None:
+ hostname = display_name
+
+ kwargs['display_name'] = display_name
+ kwargs['hostname'] = utils.sanitize_hostname(hostname)
+
rv = self.db.instance_update(context, instance_id, kwargs)
return dict(rv.iteritems())