These fixes are the result of trolling the pylint violations here
https://jenkins.openstack.org/job/nova-pylint-errors/violations/
This commit is contained in:
@@ -1,110 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
"""
|
|
||||||
Download images from Canonical Image Store
|
|
||||||
"""
|
|
||||||
|
|
||||||
import gettext
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import tempfile
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import urllib2
|
|
||||||
|
|
||||||
# If ../nova/__init__.py exists, add ../ to Python search path, so that
|
|
||||||
# it will override what happens to be installed in /usr/(local/)lib/python...
|
|
||||||
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
|
||||||
os.pardir,
|
|
||||||
os.pardir))
|
|
||||||
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|
||||||
sys.path.insert(0, possible_topdir)
|
|
||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
|
||||||
|
|
||||||
from nova import flags
|
|
||||||
from nova import log as logging
|
|
||||||
from nova import utils
|
|
||||||
from nova.objectstore import image
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
|
|
||||||
API_URL = 'https://imagestore.canonical.com/api/dashboard'
|
|
||||||
|
|
||||||
|
|
||||||
def get_images():
|
|
||||||
"""Get a list of the images from the imagestore URL."""
|
|
||||||
images = json.load(urllib2.urlopen(API_URL))['images']
|
|
||||||
images = [img for img in images if img['title'].find('amd64') > -1]
|
|
||||||
return images
|
|
||||||
|
|
||||||
|
|
||||||
def download(img):
|
|
||||||
"""Download an image to the local filesystem."""
|
|
||||||
# FIXME(ja): add checksum/signature checks
|
|
||||||
tempdir = tempfile.mkdtemp(prefix='cis-')
|
|
||||||
|
|
||||||
kernel_id = None
|
|
||||||
ramdisk_id = None
|
|
||||||
|
|
||||||
for f in img['files']:
|
|
||||||
if f['kind'] == 'kernel':
|
|
||||||
dest = os.path.join(tempdir, 'kernel')
|
|
||||||
subprocess.call(['curl', '--fail', f['url'], '-o', dest])
|
|
||||||
kernel_id = image.Image.add(dest,
|
|
||||||
description='kernel/' + img['title'], kernel=True)
|
|
||||||
|
|
||||||
for f in img['files']:
|
|
||||||
if f['kind'] == 'ramdisk':
|
|
||||||
dest = os.path.join(tempdir, 'ramdisk')
|
|
||||||
subprocess.call(['curl', '--fail', f['url'], '-o', dest])
|
|
||||||
ramdisk_id = image.Image.add(dest,
|
|
||||||
description='ramdisk/' + img['title'], ramdisk=True)
|
|
||||||
|
|
||||||
for f in img['files']:
|
|
||||||
if f['kind'] == 'image':
|
|
||||||
dest = os.path.join(tempdir, 'image')
|
|
||||||
subprocess.call(['curl', '--fail', f['url'], '-o', dest])
|
|
||||||
ramdisk_id = image.Image.add(dest,
|
|
||||||
description=img['title'], kernel=kernel_id, ramdisk=ramdisk_id)
|
|
||||||
|
|
||||||
shutil.rmtree(tempdir)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""Main entry point."""
|
|
||||||
utils.default_flagfile()
|
|
||||||
argv = FLAGS(sys.argv)
|
|
||||||
logging.setup()
|
|
||||||
images = get_images()
|
|
||||||
|
|
||||||
if len(argv) == 2:
|
|
||||||
for img in images:
|
|
||||||
if argv[1] == 'all' or argv[1] == img['title']:
|
|
||||||
download(img)
|
|
||||||
else:
|
|
||||||
print 'usage: %s (title|all)'
|
|
||||||
print 'available images:'
|
|
||||||
for img in images:
|
|
||||||
print img['title']
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@@ -85,7 +85,10 @@ class APIRouter(base_wsgi.Router):
|
|||||||
self._setup_routes(mapper)
|
self._setup_routes(mapper)
|
||||||
super(APIRouter, self).__init__(mapper)
|
super(APIRouter, self).__init__(mapper)
|
||||||
|
|
||||||
def _setup_routes(self, mapper, version):
|
def _setup_routes(self, mapper):
|
||||||
|
raise NotImplementedError(_("You must implement _setup_routes."))
|
||||||
|
|
||||||
|
def _setup_base_routes(self, mapper, version):
|
||||||
"""Routes common to all versions."""
|
"""Routes common to all versions."""
|
||||||
|
|
||||||
server_members = self.server_members
|
server_members = self.server_members
|
||||||
@@ -156,7 +159,7 @@ class APIRouterV10(APIRouter):
|
|||||||
"""Define routes specific to OpenStack API V1.0."""
|
"""Define routes specific to OpenStack API V1.0."""
|
||||||
|
|
||||||
def _setup_routes(self, mapper):
|
def _setup_routes(self, mapper):
|
||||||
super(APIRouterV10, self)._setup_routes(mapper, '1.0')
|
self._setup_base_routes(mapper, '1.0')
|
||||||
|
|
||||||
mapper.resource("shared_ip_group", "shared_ip_groups",
|
mapper.resource("shared_ip_group", "shared_ip_groups",
|
||||||
collection={'detail': 'GET'},
|
collection={'detail': 'GET'},
|
||||||
@@ -172,7 +175,7 @@ class APIRouterV11(APIRouter):
|
|||||||
"""Define routes specific to OpenStack API V1.1."""
|
"""Define routes specific to OpenStack API V1.1."""
|
||||||
|
|
||||||
def _setup_routes(self, mapper):
|
def _setup_routes(self, mapper):
|
||||||
super(APIRouterV11, self)._setup_routes(mapper, '1.1')
|
self._setup_base_routes(mapper, '1.1')
|
||||||
|
|
||||||
image_metadata_controller = image_metadata.create_resource()
|
image_metadata_controller = image_metadata.create_resource()
|
||||||
|
|
||||||
|
@@ -102,7 +102,7 @@ class FloatingIPController(object):
|
|||||||
def delete(self, req, id):
|
def delete(self, req, id):
|
||||||
context = req.environ['nova.context']
|
context = req.environ['nova.context']
|
||||||
ip = self.network_api.get_floating_ip(context, id)
|
ip = self.network_api.get_floating_ip(context, id)
|
||||||
|
|
||||||
if 'fixed_ip' in ip:
|
if 'fixed_ip' in ip:
|
||||||
try:
|
try:
|
||||||
self.disassociate(req, id, '')
|
self.disassociate(req, id, '')
|
||||||
|
@@ -14,8 +14,6 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import re
|
|
||||||
import webob
|
|
||||||
|
|
||||||
from webob import exc
|
from webob import exc
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
|
@@ -461,7 +461,11 @@ class ResourceExtension(object):
|
|||||||
"""Add top level resources to the OpenStack API in nova."""
|
"""Add top level resources to the OpenStack API in nova."""
|
||||||
|
|
||||||
def __init__(self, collection, controller, parent=None,
|
def __init__(self, collection, controller, parent=None,
|
||||||
collection_actions={}, member_actions={}):
|
collection_actions=None, member_actions=None):
|
||||||
|
if not collection_actions:
|
||||||
|
collection_actions = {}
|
||||||
|
if not member_actions:
|
||||||
|
member_actions = {}
|
||||||
self.collection = collection
|
self.collection = collection
|
||||||
self.controller = controller
|
self.controller = controller
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
@@ -122,8 +122,10 @@ class API(base.Base):
|
|||||||
if len(content) > content_limit:
|
if len(content) > content_limit:
|
||||||
raise quota.QuotaError(code="OnsetFileContentLimitExceeded")
|
raise quota.QuotaError(code="OnsetFileContentLimitExceeded")
|
||||||
|
|
||||||
def _check_metadata_properties_quota(self, context, metadata={}):
|
def _check_metadata_properties_quota(self, context, metadata=None):
|
||||||
"""Enforce quota limits on metadata properties."""
|
"""Enforce quota limits on metadata properties."""
|
||||||
|
if not metadata:
|
||||||
|
metadata = {}
|
||||||
num_metadata = len(metadata)
|
num_metadata = len(metadata)
|
||||||
quota_metadata = quota.allowed_metadata_items(context, num_metadata)
|
quota_metadata = quota.allowed_metadata_items(context, num_metadata)
|
||||||
if quota_metadata < num_metadata:
|
if quota_metadata < num_metadata:
|
||||||
@@ -149,7 +151,7 @@ class API(base.Base):
|
|||||||
min_count=None, max_count=None,
|
min_count=None, max_count=None,
|
||||||
display_name='', display_description='',
|
display_name='', display_description='',
|
||||||
key_name=None, key_data=None, security_group='default',
|
key_name=None, key_data=None, security_group='default',
|
||||||
availability_zone=None, user_data=None, metadata={},
|
availability_zone=None, user_data=None, metadata=None,
|
||||||
injected_files=None, admin_password=None, zone_blob=None,
|
injected_files=None, admin_password=None, zone_blob=None,
|
||||||
reservation_id=None):
|
reservation_id=None):
|
||||||
"""Verify all the input parameters regardless of the provisioning
|
"""Verify all the input parameters regardless of the provisioning
|
||||||
@@ -161,6 +163,8 @@ class API(base.Base):
|
|||||||
min_count = 1
|
min_count = 1
|
||||||
if not max_count:
|
if not max_count:
|
||||||
max_count = min_count
|
max_count = min_count
|
||||||
|
if not metadata:
|
||||||
|
metadata = {}
|
||||||
|
|
||||||
num_instances = quota.allowed_instances(context, max_count,
|
num_instances = quota.allowed_instances(context, max_count,
|
||||||
instance_type)
|
instance_type)
|
||||||
@@ -436,12 +440,16 @@ class API(base.Base):
|
|||||||
min_count=None, max_count=None,
|
min_count=None, max_count=None,
|
||||||
display_name='', display_description='',
|
display_name='', display_description='',
|
||||||
key_name=None, key_data=None, security_group='default',
|
key_name=None, key_data=None, security_group='default',
|
||||||
availability_zone=None, user_data=None, metadata={},
|
availability_zone=None, user_data=None, metadata=None,
|
||||||
injected_files=None, admin_password=None, zone_blob=None,
|
injected_files=None, admin_password=None, zone_blob=None,
|
||||||
reservation_id=None, block_device_mapping=None):
|
reservation_id=None, block_device_mapping=None):
|
||||||
"""Provision the instances by passing the whole request to
|
"""Provision the instances by passing the whole request to
|
||||||
the Scheduler for execution. Returns a Reservation ID
|
the Scheduler for execution. Returns a Reservation ID
|
||||||
related to the creation of all of these instances."""
|
related to the creation of all of these instances."""
|
||||||
|
|
||||||
|
if not metadata:
|
||||||
|
metadata = {}
|
||||||
|
|
||||||
num_instances, base_options, image = self._check_create_parameters(
|
num_instances, base_options, image = self._check_create_parameters(
|
||||||
context, instance_type,
|
context, instance_type,
|
||||||
image_href, kernel_id, ramdisk_id,
|
image_href, kernel_id, ramdisk_id,
|
||||||
@@ -466,7 +474,7 @@ class API(base.Base):
|
|||||||
min_count=None, max_count=None,
|
min_count=None, max_count=None,
|
||||||
display_name='', display_description='',
|
display_name='', display_description='',
|
||||||
key_name=None, key_data=None, security_group='default',
|
key_name=None, key_data=None, security_group='default',
|
||||||
availability_zone=None, user_data=None, metadata={},
|
availability_zone=None, user_data=None, metadata=None,
|
||||||
injected_files=None, admin_password=None, zone_blob=None,
|
injected_files=None, admin_password=None, zone_blob=None,
|
||||||
reservation_id=None, block_device_mapping=None):
|
reservation_id=None, block_device_mapping=None):
|
||||||
"""
|
"""
|
||||||
@@ -481,6 +489,9 @@ class API(base.Base):
|
|||||||
Returns a list of instance dicts.
|
Returns a list of instance dicts.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not metadata:
|
||||||
|
metadata = {}
|
||||||
|
|
||||||
num_instances, base_options, image = self._check_create_parameters(
|
num_instances, base_options, image = self._check_create_parameters(
|
||||||
context, instance_type,
|
context, instance_type,
|
||||||
image_href, kernel_id, ramdisk_id,
|
image_href, kernel_id, ramdisk_id,
|
||||||
|
@@ -3348,8 +3348,6 @@ def instance_metadata_update(context, instance_id, metadata, delete):
|
|||||||
try:
|
try:
|
||||||
meta_ref = instance_metadata_get_item(context, instance_id,
|
meta_ref = instance_metadata_get_item(context, instance_id,
|
||||||
meta_key, session)
|
meta_key, session)
|
||||||
|
|
||||||
# if the item doesn't exist, we also need to set key and instance_id
|
|
||||||
except exception.InstanceMetadataNotFound, e:
|
except exception.InstanceMetadataNotFound, e:
|
||||||
meta_ref = models.InstanceMetadata()
|
meta_ref = models.InstanceMetadata()
|
||||||
item.update({"key": meta_key, "instance_id": instance_id})
|
item.update({"key": meta_key, "instance_id": instance_id})
|
||||||
@@ -3447,6 +3445,7 @@ def instance_type_extra_specs_delete(context, instance_type_id, key):
|
|||||||
@require_context
|
@require_context
|
||||||
def instance_type_extra_specs_get_item(context, instance_type_id, key,
|
def instance_type_extra_specs_get_item(context, instance_type_id, key,
|
||||||
session=None):
|
session=None):
|
||||||
|
|
||||||
if not session:
|
if not session:
|
||||||
session = get_session()
|
session = get_session()
|
||||||
|
|
||||||
@@ -3470,10 +3469,8 @@ def instance_type_extra_specs_update_or_create(context, instance_type_id,
|
|||||||
spec_ref = None
|
spec_ref = None
|
||||||
for key, value in specs.iteritems():
|
for key, value in specs.iteritems():
|
||||||
try:
|
try:
|
||||||
spec_ref = instance_type_extra_specs_get_item(context,
|
spec_ref = instance_type_extra_specs_get_item(
|
||||||
instance_type_id,
|
context, instance_type_id, key, session)
|
||||||
key,
|
|
||||||
session)
|
|
||||||
except exception.InstanceTypeExtraSpecsNotFound, e:
|
except exception.InstanceTypeExtraSpecsNotFound, e:
|
||||||
spec_ref = models.InstanceTypeExtraSpecs()
|
spec_ref = models.InstanceTypeExtraSpecs()
|
||||||
spec_ref.update({"key": key, "value": value,
|
spec_ref.update({"key": key, "value": value,
|
||||||
|
@@ -155,7 +155,10 @@ class BaseRequestHandler(object):
|
|||||||
self.finish('<?xml version="1.0" encoding="UTF-8"?>\n' +
|
self.finish('<?xml version="1.0" encoding="UTF-8"?>\n' +
|
||||||
''.join(parts))
|
''.join(parts))
|
||||||
|
|
||||||
def _render_parts(self, value, parts=[]):
|
def _render_parts(self, value, parts=None):
|
||||||
|
if not parts:
|
||||||
|
parts = []
|
||||||
|
|
||||||
if isinstance(value, basestring):
|
if isinstance(value, basestring):
|
||||||
parts.append(utils.xhtml_escape(value))
|
parts.append(utils.xhtml_escape(value))
|
||||||
elif isinstance(value, int) or isinstance(value, long):
|
elif isinstance(value, int) or isinstance(value, long):
|
||||||
|
@@ -96,7 +96,8 @@ class LeastCostScheduler(zone_aware_scheduler.ZoneAwareScheduler):
|
|||||||
cost_fn_str=cost_fn_str)
|
cost_fn_str=cost_fn_str)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
weight = getattr(FLAGS, "%s_weight" % cost_fn.__name__)
|
flag_name = "%s_weight" % cost_fn.__name__
|
||||||
|
weight = getattr(FLAGS, flag_name)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise exception.SchedulerWeightFlagNotFound(
|
raise exception.SchedulerWeightFlagNotFound(
|
||||||
flag_name=flag_name)
|
flag_name=flag_name)
|
||||||
|
@@ -69,8 +69,10 @@ class SchedulerManager(manager.Manager):
|
|||||||
return self.zone_manager.get_zone_capabilities(context)
|
return self.zone_manager.get_zone_capabilities(context)
|
||||||
|
|
||||||
def update_service_capabilities(self, context=None, service_name=None,
|
def update_service_capabilities(self, context=None, service_name=None,
|
||||||
host=None, capabilities={}):
|
host=None, capabilities=None):
|
||||||
"""Process a capability update from a service node."""
|
"""Process a capability update from a service node."""
|
||||||
|
if not capability:
|
||||||
|
capability = {}
|
||||||
self.zone_manager.update_service_capabilities(service_name,
|
self.zone_manager.update_service_capabilities(service_name,
|
||||||
host, capabilities)
|
host, capabilities)
|
||||||
|
|
||||||
|
@@ -266,8 +266,8 @@ class ZoneAwareScheduler(driver.Scheduler):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if topic != "compute":
|
if topic != "compute":
|
||||||
raise NotImplemented(_("Zone Aware Scheduler only understands "
|
raise NotImplementedError(_("Zone Aware Scheduler only understands"
|
||||||
"Compute nodes (for now)"))
|
" Compute nodes (for now)"))
|
||||||
|
|
||||||
num_instances = request_spec.get('num_instances', 1)
|
num_instances = request_spec.get('num_instances', 1)
|
||||||
instance_type = request_spec['instance_type']
|
instance_type = request_spec['instance_type']
|
||||||
|
@@ -819,12 +819,15 @@ class FakeHttplibConnection(object):
|
|||||||
self.app = app
|
self.app = app
|
||||||
self.host = host
|
self.host = host
|
||||||
|
|
||||||
def request(self, method, path, body="", headers={}):
|
def request(self, method, path, body="", headers=None):
|
||||||
"""
|
"""
|
||||||
Requests made via this connection actually get translated and routed
|
Requests made via this connection actually get translated and routed
|
||||||
into our WSGI app, we then wait for the response and turn it back into
|
into our WSGI app, we then wait for the response and turn it back into
|
||||||
an `httplib.HTTPResponse`.
|
an `httplib.HTTPResponse`.
|
||||||
"""
|
"""
|
||||||
|
if not headers:
|
||||||
|
headers = {}
|
||||||
|
|
||||||
req = webob.Request.blank(path)
|
req = webob.Request.blank(path)
|
||||||
req.method = method
|
req.method = method
|
||||||
req.headers = headers
|
req.headers = headers
|
||||||
|
@@ -303,7 +303,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
db.compute_node_create(self.context, dic)
|
db.compute_node_create(self.context, dic)
|
||||||
return db.service_get(self.context, s_ref['id'])
|
return db.service_get(self.context, s_ref['id'])
|
||||||
|
|
||||||
def test_doesnt_report_disabled_hosts_as_up(self):
|
def test_doesnt_report_disabled_hosts_as_up_no_queue(self):
|
||||||
"""Ensures driver doesn't find hosts before they are enabled"""
|
"""Ensures driver doesn't find hosts before they are enabled"""
|
||||||
# NOTE(vish): constructing service without create method
|
# NOTE(vish): constructing service without create method
|
||||||
# because we are going to use it without queue
|
# because we are going to use it without queue
|
||||||
@@ -326,7 +326,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute1.kill()
|
compute1.kill()
|
||||||
compute2.kill()
|
compute2.kill()
|
||||||
|
|
||||||
def test_reports_enabled_hosts_as_up(self):
|
def test_reports_enabled_hosts_as_up_no_queue(self):
|
||||||
"""Ensures driver can find the hosts that are up"""
|
"""Ensures driver can find the hosts that are up"""
|
||||||
# NOTE(vish): constructing service without create method
|
# NOTE(vish): constructing service without create method
|
||||||
# because we are going to use it without queue
|
# because we are going to use it without queue
|
||||||
@@ -345,7 +345,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute1.kill()
|
compute1.kill()
|
||||||
compute2.kill()
|
compute2.kill()
|
||||||
|
|
||||||
def test_least_busy_host_gets_instance(self):
|
def test_least_busy_host_gets_instance_no_queue(self):
|
||||||
"""Ensures the host with less cores gets the next one"""
|
"""Ensures the host with less cores gets the next one"""
|
||||||
compute1 = service.Service('host1',
|
compute1 = service.Service('host1',
|
||||||
'nova-compute',
|
'nova-compute',
|
||||||
@@ -368,7 +368,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute1.kill()
|
compute1.kill()
|
||||||
compute2.kill()
|
compute2.kill()
|
||||||
|
|
||||||
def test_specific_host_gets_instance(self):
|
def test_specific_host_gets_instance_no_queue(self):
|
||||||
"""Ensures if you set availability_zone it launches on that zone"""
|
"""Ensures if you set availability_zone it launches on that zone"""
|
||||||
compute1 = service.Service('host1',
|
compute1 = service.Service('host1',
|
||||||
'nova-compute',
|
'nova-compute',
|
||||||
@@ -391,7 +391,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute1.kill()
|
compute1.kill()
|
||||||
compute2.kill()
|
compute2.kill()
|
||||||
|
|
||||||
def test_wont_sechedule_if_specified_host_is_down(self):
|
def test_wont_sechedule_if_specified_host_is_down_no_queue(self):
|
||||||
compute1 = service.Service('host1',
|
compute1 = service.Service('host1',
|
||||||
'nova-compute',
|
'nova-compute',
|
||||||
'compute',
|
'compute',
|
||||||
@@ -410,7 +410,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
db.instance_destroy(self.context, instance_id2)
|
db.instance_destroy(self.context, instance_id2)
|
||||||
compute1.kill()
|
compute1.kill()
|
||||||
|
|
||||||
def test_will_schedule_on_disabled_host_if_specified(self):
|
def test_will_schedule_on_disabled_host_if_specified_no_queue(self):
|
||||||
compute1 = service.Service('host1',
|
compute1 = service.Service('host1',
|
||||||
'nova-compute',
|
'nova-compute',
|
||||||
'compute',
|
'compute',
|
||||||
@@ -425,7 +425,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
db.instance_destroy(self.context, instance_id2)
|
db.instance_destroy(self.context, instance_id2)
|
||||||
compute1.kill()
|
compute1.kill()
|
||||||
|
|
||||||
def test_too_many_cores(self):
|
def test_too_many_cores_no_queue(self):
|
||||||
"""Ensures we don't go over max cores"""
|
"""Ensures we don't go over max cores"""
|
||||||
compute1 = service.Service('host1',
|
compute1 = service.Service('host1',
|
||||||
'nova-compute',
|
'nova-compute',
|
||||||
@@ -458,7 +458,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
compute1.kill()
|
compute1.kill()
|
||||||
compute2.kill()
|
compute2.kill()
|
||||||
|
|
||||||
def test_least_busy_host_gets_volume(self):
|
def test_least_busy_host_gets_volume_no_queue(self):
|
||||||
"""Ensures the host with less gigabytes gets the next one"""
|
"""Ensures the host with less gigabytes gets the next one"""
|
||||||
volume1 = service.Service('host1',
|
volume1 = service.Service('host1',
|
||||||
'nova-volume',
|
'nova-volume',
|
||||||
@@ -479,7 +479,7 @@ class SimpleDriverTestCase(test.TestCase):
|
|||||||
volume1.delete_volume(self.context, volume_id1)
|
volume1.delete_volume(self.context, volume_id1)
|
||||||
db.volume_destroy(self.context, volume_id2)
|
db.volume_destroy(self.context, volume_id2)
|
||||||
|
|
||||||
def test_doesnt_report_disabled_hosts_as_up(self):
|
def test_doesnt_report_disabled_hosts_as_up2(self):
|
||||||
"""Ensures driver doesn't find hosts before they are enabled"""
|
"""Ensures driver doesn't find hosts before they are enabled"""
|
||||||
compute1 = self.start_service('compute', host='host1')
|
compute1 = self.start_service('compute', host='host1')
|
||||||
compute2 = self.start_service('compute', host='host2')
|
compute2 = self.start_service('compute', host='host2')
|
||||||
@@ -992,7 +992,7 @@ class ZoneRedirectTest(test.TestCase):
|
|||||||
decorator = FakeRerouteCompute("foo", id_to_return=FAKE_UUID_NOT_FOUND)
|
decorator = FakeRerouteCompute("foo", id_to_return=FAKE_UUID_NOT_FOUND)
|
||||||
try:
|
try:
|
||||||
result = decorator(go_boom)(None, None, 1)
|
result = decorator(go_boom)(None, None, 1)
|
||||||
self.assertFail(_("Should have rerouted."))
|
self.fail(_("Should have rerouted."))
|
||||||
except api.RedirectResult, e:
|
except api.RedirectResult, e:
|
||||||
self.assertEquals(e.results['magic'], 'found me')
|
self.assertEquals(e.results['magic'], 'found me')
|
||||||
|
|
||||||
@@ -1080,10 +1080,10 @@ class DynamicNovaClientTest(test.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
class FakeZonesProxy(object):
|
class FakeZonesProxy(object):
|
||||||
def do_something(*args, **kwargs):
|
def do_something(self, *args, **kwargs):
|
||||||
return 42
|
return 42
|
||||||
|
|
||||||
def raises_exception(*args, **kwargs):
|
def raises_exception(self, *args, **kwargs):
|
||||||
raise Exception('testing')
|
raise Exception('testing')
|
||||||
|
|
||||||
|
|
||||||
|
@@ -62,7 +62,12 @@ class project_generator(object):
|
|||||||
|
|
||||||
|
|
||||||
class user_and_project_generator(object):
|
class user_and_project_generator(object):
|
||||||
def __init__(self, manager, user_state={}, project_state={}):
|
def __init__(self, manager, user_state=None, project_state=None):
|
||||||
|
if not user_state:
|
||||||
|
user_state = {}
|
||||||
|
if not project_state:
|
||||||
|
project_state = {}
|
||||||
|
|
||||||
self.manager = manager
|
self.manager = manager
|
||||||
if 'name' not in user_state:
|
if 'name' not in user_state:
|
||||||
user_state['name'] = 'test1'
|
user_state['name'] = 'test1'
|
||||||
|
@@ -76,9 +76,9 @@ class ComputeTestCase(test.TestCase):
|
|||||||
|
|
||||||
def _create_instance(self, params=None):
|
def _create_instance(self, params=None):
|
||||||
"""Create a test instance"""
|
"""Create a test instance"""
|
||||||
|
if not params:
|
||||||
if params is None:
|
|
||||||
params = {}
|
params = {}
|
||||||
|
|
||||||
inst = {}
|
inst = {}
|
||||||
inst['image_ref'] = 1
|
inst['image_ref'] = 1
|
||||||
inst['reservation_id'] = 'r-fakeres'
|
inst['reservation_id'] = 'r-fakeres'
|
||||||
@@ -91,8 +91,11 @@ class ComputeTestCase(test.TestCase):
|
|||||||
inst.update(params)
|
inst.update(params)
|
||||||
return db.instance_create(self.context, inst)['id']
|
return db.instance_create(self.context, inst)['id']
|
||||||
|
|
||||||
def _create_instance_type(self, params={}):
|
def _create_instance_type(self, params=None):
|
||||||
"""Create a test instance"""
|
"""Create a test instance"""
|
||||||
|
if not params:
|
||||||
|
params = {}
|
||||||
|
|
||||||
context = self.context.elevated()
|
context = self.context.elevated()
|
||||||
inst = {}
|
inst = {}
|
||||||
inst['name'] = 'm1.small'
|
inst['name'] = 'm1.small'
|
||||||
|
@@ -136,7 +136,7 @@ class InstanceTypeExtraSpecsTestCase(test.TestCase):
|
|||||||
"m1.small")
|
"m1.small")
|
||||||
self.assertEquals(instance_type['extra_specs'], {})
|
self.assertEquals(instance_type['extra_specs'], {})
|
||||||
|
|
||||||
def test_instance_type_get_with_extra_specs(self):
|
def test_instance_type_get_by_flavor_id_with_extra_specs(self):
|
||||||
instance_type = db.api.instance_type_get_by_flavor_id(
|
instance_type = db.api.instance_type_get_by_flavor_id(
|
||||||
context.get_admin_context(),
|
context.get_admin_context(),
|
||||||
105)
|
105)
|
||||||
|
@@ -1194,8 +1194,11 @@ class NWFilterTestCase(test.TestCase):
|
|||||||
'project_id': 'fake',
|
'project_id': 'fake',
|
||||||
'instance_type_id': 1})
|
'instance_type_id': 1})
|
||||||
|
|
||||||
def _create_instance_type(self, params={}):
|
def _create_instance_type(self, params=None):
|
||||||
"""Create a test instance"""
|
"""Create a test instance"""
|
||||||
|
if not params:
|
||||||
|
params = {}
|
||||||
|
|
||||||
context = self.context.elevated()
|
context = self.context.elevated()
|
||||||
inst = {}
|
inst = {}
|
||||||
inst['name'] = 'm1.small'
|
inst['name'] = 'm1.small'
|
||||||
|
@@ -654,6 +654,24 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
# Ensure that it will not unrescue a non-rescued instance.
|
# Ensure that it will not unrescue a non-rescued instance.
|
||||||
self.assertRaises(Exception, conn.unrescue, instance, None)
|
self.assertRaises(Exception, conn.unrescue, instance, None)
|
||||||
|
|
||||||
|
def test_revert_migration(self):
|
||||||
|
instance = self._create_instance()
|
||||||
|
|
||||||
|
class VMOpsMock():
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.revert_migration_called = False
|
||||||
|
|
||||||
|
def revert_migration(self, instance):
|
||||||
|
self.revert_migration_called = True
|
||||||
|
|
||||||
|
stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests)
|
||||||
|
|
||||||
|
conn = xenapi_conn.get_connection(False)
|
||||||
|
conn._vmops = VMOpsMock()
|
||||||
|
conn.revert_migration(instance)
|
||||||
|
self.assertTrue(conn._vmops.revert_migration_called)
|
||||||
|
|
||||||
def _create_instance(self, instance_id=1, spawn=True):
|
def _create_instance(self, instance_id=1, spawn=True):
|
||||||
"""Creates and spawns a test instance."""
|
"""Creates and spawns a test instance."""
|
||||||
stubs.stubout_loopingcall_start(self.stubs)
|
stubs.stubout_loopingcall_start(self.stubs)
|
||||||
|
@@ -294,7 +294,7 @@ class FakeConnection(driver.ComputeDriver):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def destroy(self, instance, network_info):
|
def destroy(self, instance, network_info, cleanup=True):
|
||||||
key = instance.name
|
key = instance.name
|
||||||
if key in self.instances:
|
if key in self.instances:
|
||||||
del self.instances[key]
|
del self.instances[key]
|
||||||
|
@@ -374,7 +374,7 @@ class HyperVConnection(driver.ComputeDriver):
|
|||||||
raise exception.InstanceNotFound(instance_id=instance.id)
|
raise exception.InstanceNotFound(instance_id=instance.id)
|
||||||
self._set_vm_state(instance.name, 'Reboot')
|
self._set_vm_state(instance.name, 'Reboot')
|
||||||
|
|
||||||
def destroy(self, instance, network_info):
|
def destroy(self, instance, network_info, cleanup=True):
|
||||||
"""Destroy the VM. Also destroy the associated VHD disk files"""
|
"""Destroy the VM. Also destroy the associated VHD disk files"""
|
||||||
LOG.debug(_("Got request to destroy vm %s"), instance.name)
|
LOG.debug(_("Got request to destroy vm %s"), instance.name)
|
||||||
vm = self._lookup(instance.name)
|
vm = self._lookup(instance.name)
|
||||||
|
@@ -68,7 +68,10 @@ class GlanceWriteThread(object):
|
|||||||
"""Ensures that image data is written to in the glance client and that
|
"""Ensures that image data is written to in the glance client and that
|
||||||
it is in correct ('active')state."""
|
it is in correct ('active')state."""
|
||||||
|
|
||||||
def __init__(self, input, glance_client, image_id, image_meta={}):
|
def __init__(self, input, glance_client, image_id, image_meta=None):
|
||||||
|
if not image_meta:
|
||||||
|
image_meta = {}
|
||||||
|
|
||||||
self.input = input
|
self.input = input
|
||||||
self.glance_client = glance_client
|
self.glance_client = glance_client
|
||||||
self.image_id = image_id
|
self.image_id = image_id
|
||||||
|
@@ -63,7 +63,7 @@ class VMWareVlanBridgeDriver(VIFDriver):
|
|||||||
vswitch_associated = network_utils.get_vswitch_for_vlan_interface(
|
vswitch_associated = network_utils.get_vswitch_for_vlan_interface(
|
||||||
session, vlan_interface)
|
session, vlan_interface)
|
||||||
if vswitch_associated is None:
|
if vswitch_associated is None:
|
||||||
raise exception.SwicthNotFoundForNetworkAdapter(
|
raise exception.SwitchNotFoundForNetworkAdapter(
|
||||||
adapter=vlan_interface)
|
adapter=vlan_interface)
|
||||||
# Check whether bridge already exists and retrieve the the ref of the
|
# Check whether bridge already exists and retrieve the the ref of the
|
||||||
# network whose name_label is "bridge"
|
# network whose name_label is "bridge"
|
||||||
|
@@ -95,9 +95,12 @@ def build_recursive_traversal_spec(client_factory):
|
|||||||
|
|
||||||
|
|
||||||
def build_property_spec(client_factory, type="VirtualMachine",
|
def build_property_spec(client_factory, type="VirtualMachine",
|
||||||
properties_to_collect=["name"],
|
properties_to_collect=None,
|
||||||
all_properties=False):
|
all_properties=False):
|
||||||
"""Builds the Property Spec."""
|
"""Builds the Property Spec."""
|
||||||
|
if not properties_to_collect:
|
||||||
|
properties_to_collect = ["name"]
|
||||||
|
|
||||||
property_spec = client_factory.create('ns0:PropertySpec')
|
property_spec = client_factory.create('ns0:PropertySpec')
|
||||||
property_spec.all = all_properties
|
property_spec.all = all_properties
|
||||||
property_spec.pathSet = properties_to_collect
|
property_spec.pathSet = properties_to_collect
|
||||||
@@ -155,8 +158,11 @@ def get_dynamic_property(vim, mobj, type, property_name):
|
|||||||
return property_value
|
return property_value
|
||||||
|
|
||||||
|
|
||||||
def get_objects(vim, type, properties_to_collect=["name"], all=False):
|
def get_objects(vim, type, properties_to_collect=None, all=False):
|
||||||
"""Gets the list of objects of the type specified."""
|
"""Gets the list of objects of the type specified."""
|
||||||
|
if not properties_to_collect:
|
||||||
|
properties_to_collect = ["name"]
|
||||||
|
|
||||||
client_factory = vim.client.factory
|
client_factory = vim.client.factory
|
||||||
object_spec = build_object_spec(client_factory,
|
object_spec = build_object_spec(client_factory,
|
||||||
vim.get_service_content().rootFolder,
|
vim.get_service_content().rootFolder,
|
||||||
|
@@ -33,11 +33,15 @@ QUEUE_BUFFER_SIZE = 10
|
|||||||
|
|
||||||
|
|
||||||
def start_transfer(read_file_handle, data_size, write_file_handle=None,
|
def start_transfer(read_file_handle, data_size, write_file_handle=None,
|
||||||
glance_client=None, image_id=None, image_meta={}):
|
glance_client=None, image_id=None, image_meta=None):
|
||||||
"""Start the data transfer from the reader to the writer.
|
"""Start the data transfer from the reader to the writer.
|
||||||
Reader writes to the pipe and the writer reads from the pipe. This means
|
Reader writes to the pipe and the writer reads from the pipe. This means
|
||||||
that the total transfer time boils down to the slower of the read/write
|
that the total transfer time boils down to the slower of the read/write
|
||||||
and not the addition of the two times."""
|
and not the addition of the two times."""
|
||||||
|
|
||||||
|
if not image_meta:
|
||||||
|
image_meta = {}
|
||||||
|
|
||||||
# The pipe that acts as an intermediate store of data for reader to write
|
# The pipe that acts as an intermediate store of data for reader to write
|
||||||
# to and writer to grab from.
|
# to and writer to grab from.
|
||||||
thread_safe_pipe = io_util.ThreadSafePipe(QUEUE_BUFFER_SIZE, data_size)
|
thread_safe_pipe = io_util.ThreadSafePipe(QUEUE_BUFFER_SIZE, data_size)
|
||||||
|
@@ -137,7 +137,7 @@ class VMWareESXConnection(driver.ComputeDriver):
|
|||||||
"""Reboot VM instance."""
|
"""Reboot VM instance."""
|
||||||
self._vmops.reboot(instance, network_info)
|
self._vmops.reboot(instance, network_info)
|
||||||
|
|
||||||
def destroy(self, instance, network_info):
|
def destroy(self, instance, network_info, cleanup=True):
|
||||||
"""Destroy VM instance."""
|
"""Destroy VM instance."""
|
||||||
self._vmops.destroy(instance, network_info)
|
self._vmops.destroy(instance, network_info)
|
||||||
|
|
||||||
|
@@ -797,7 +797,7 @@ def get_vdi_for_vm_safely(session, vm_ref):
|
|||||||
else:
|
else:
|
||||||
num_vdis = len(vdi_refs)
|
num_vdis = len(vdi_refs)
|
||||||
if num_vdis != 1:
|
if num_vdis != 1:
|
||||||
raise exception.Exception(_("Unexpected number of VDIs"
|
raise exception.Error(_("Unexpected number of VDIs"
|
||||||
"(%(num_vdis)s) found"
|
"(%(num_vdis)s) found"
|
||||||
" for VM %(vm_ref)s") % locals())
|
" for VM %(vm_ref)s") % locals())
|
||||||
|
|
||||||
|
@@ -217,7 +217,7 @@ class XenAPIConnection(driver.ComputeDriver):
|
|||||||
"""
|
"""
|
||||||
self._vmops.inject_file(instance, b64_path, b64_contents)
|
self._vmops.inject_file(instance, b64_path, b64_contents)
|
||||||
|
|
||||||
def destroy(self, instance, network_info):
|
def destroy(self, instance, network_info, cleanup=True):
|
||||||
"""Destroy VM instance"""
|
"""Destroy VM instance"""
|
||||||
self._vmops.destroy(instance, network_info)
|
self._vmops.destroy(instance, network_info)
|
||||||
|
|
||||||
|
1
setup.py
1
setup.py
@@ -123,7 +123,6 @@ setup(name='nova',
|
|||||||
'bin/nova-console',
|
'bin/nova-console',
|
||||||
'bin/nova-dhcpbridge',
|
'bin/nova-dhcpbridge',
|
||||||
'bin/nova-direct-api',
|
'bin/nova-direct-api',
|
||||||
'bin/nova-import-canonical-imagestore',
|
|
||||||
'bin/nova-logspool',
|
'bin/nova-logspool',
|
||||||
'bin/nova-manage',
|
'bin/nova-manage',
|
||||||
'bin/nova-network',
|
'bin/nova-network',
|
||||||
|
Reference in New Issue
Block a user