Merged trunk.
This commit is contained in:
@@ -56,11 +56,11 @@
|
|||||||
import gettext
|
import gettext
|
||||||
import glob
|
import glob
|
||||||
import json
|
import json
|
||||||
|
import netaddr
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import IPy
|
|
||||||
|
|
||||||
# If ../nova/__init__.py exists, add ../ to Python search path, so that
|
# 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...
|
# it will override what happens to be installed in /usr/(local/)lib/python...
|
||||||
@@ -257,6 +257,11 @@ class RoleCommands(object):
|
|||||||
"""adds role to user
|
"""adds role to user
|
||||||
if project is specified, adds project specific role
|
if project is specified, adds project specific role
|
||||||
arguments: user, role [project]"""
|
arguments: user, role [project]"""
|
||||||
|
if project:
|
||||||
|
projobj = self.manager.get_project(project)
|
||||||
|
if not projobj.has_member(user):
|
||||||
|
print "%s not a member of %s" % (user, project)
|
||||||
|
return
|
||||||
self.manager.add_role(user, role, project)
|
self.manager.add_role(user, role, project)
|
||||||
|
|
||||||
def has(self, user, role, project=None):
|
def has(self, user, role, project=None):
|
||||||
@@ -513,7 +518,7 @@ class FloatingIpCommands(object):
|
|||||||
def create(self, host, range):
|
def create(self, host, range):
|
||||||
"""Creates floating ips for host by range
|
"""Creates floating ips for host by range
|
||||||
arguments: host ip_range"""
|
arguments: host ip_range"""
|
||||||
for address in IPy.IP(range):
|
for address in netaddr.IPNetwork(range):
|
||||||
db.floating_ip_create(context.get_admin_context(),
|
db.floating_ip_create(context.get_admin_context(),
|
||||||
{'address': str(address),
|
{'address': str(address),
|
||||||
'host': host})
|
'host': host})
|
||||||
@@ -521,7 +526,7 @@ class FloatingIpCommands(object):
|
|||||||
def delete(self, ip_range):
|
def delete(self, ip_range):
|
||||||
"""Deletes floating ips by range
|
"""Deletes floating ips by range
|
||||||
arguments: range"""
|
arguments: range"""
|
||||||
for address in IPy.IP(ip_range):
|
for address in netaddr.IPNetwork(ip_range):
|
||||||
db.floating_ip_destroy(context.get_admin_context(),
|
db.floating_ip_destroy(context.get_admin_context(),
|
||||||
str(address))
|
str(address))
|
||||||
|
|
||||||
@@ -873,7 +878,7 @@ class InstanceTypeCommands(object):
|
|||||||
try:
|
try:
|
||||||
instance_types.create(name, memory, vcpus, local_gb,
|
instance_types.create(name, memory, vcpus, local_gb,
|
||||||
flavorid, swap, rxtx_quota, rxtx_cap)
|
flavorid, swap, rxtx_quota, rxtx_cap)
|
||||||
except exception.InvalidInputException:
|
except exception.InvalidInput:
|
||||||
print "Must supply valid parameters to create instance_type"
|
print "Must supply valid parameters to create instance_type"
|
||||||
print e
|
print e
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@@ -1071,6 +1076,70 @@ class ImageCommands(object):
|
|||||||
self._convert_images(machine_images)
|
self._convert_images(machine_images)
|
||||||
|
|
||||||
|
|
||||||
|
class AgentBuildCommands(object):
|
||||||
|
"""Class for managing agent builds."""
|
||||||
|
|
||||||
|
def create(self, os, architecture, version, url, md5hash,
|
||||||
|
hypervisor='xen'):
|
||||||
|
"""Creates a new agent build.
|
||||||
|
arguments: os architecture version url md5hash [hypervisor='xen']"""
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
agent_build = db.agent_build_create(ctxt,
|
||||||
|
{'hypervisor': hypervisor,
|
||||||
|
'os': os,
|
||||||
|
'architecture': architecture,
|
||||||
|
'version': version,
|
||||||
|
'url': url,
|
||||||
|
'md5hash': md5hash})
|
||||||
|
|
||||||
|
def delete(self, os, architecture, hypervisor='xen'):
|
||||||
|
"""Deletes an existing agent build.
|
||||||
|
arguments: os architecture [hypervisor='xen']"""
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
agent_build_ref = db.agent_build_get_by_triple(ctxt,
|
||||||
|
hypervisor, os, architecture)
|
||||||
|
db.agent_build_destroy(ctxt, agent_build_ref['id'])
|
||||||
|
|
||||||
|
def list(self, hypervisor=None):
|
||||||
|
"""Lists all agent builds.
|
||||||
|
arguments: <none>"""
|
||||||
|
fmt = "%-10s %-8s %12s %s"
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
by_hypervisor = {}
|
||||||
|
for agent_build in db.agent_build_get_all(ctxt):
|
||||||
|
buildlist = by_hypervisor.get(agent_build.hypervisor)
|
||||||
|
if not buildlist:
|
||||||
|
buildlist = by_hypervisor[agent_build.hypervisor] = []
|
||||||
|
|
||||||
|
buildlist.append(agent_build)
|
||||||
|
|
||||||
|
for key, buildlist in by_hypervisor.iteritems():
|
||||||
|
if hypervisor and key != hypervisor:
|
||||||
|
continue
|
||||||
|
|
||||||
|
print "Hypervisor: %s" % key
|
||||||
|
print fmt % ('-' * 10, '-' * 8, '-' * 12, '-' * 32)
|
||||||
|
for agent_build in buildlist:
|
||||||
|
print fmt % (agent_build.os, agent_build.architecture,
|
||||||
|
agent_build.version, agent_build.md5hash)
|
||||||
|
print ' %s' % agent_build.url
|
||||||
|
|
||||||
|
print
|
||||||
|
|
||||||
|
def modify(self, os, architecture, version, url, md5hash,
|
||||||
|
hypervisor='xen'):
|
||||||
|
"""Update an existing agent build.
|
||||||
|
arguments: os architecture version url md5hash [hypervisor='xen']
|
||||||
|
"""
|
||||||
|
ctxt = context.get_admin_context()
|
||||||
|
agent_build_ref = db.agent_build_get_by_triple(ctxt,
|
||||||
|
hypervisor, os, architecture)
|
||||||
|
db.agent_build_update(ctxt, agent_build_ref['id'],
|
||||||
|
{'version': version,
|
||||||
|
'url': url,
|
||||||
|
'md5hash': md5hash})
|
||||||
|
|
||||||
|
|
||||||
class ConfigCommands(object):
|
class ConfigCommands(object):
|
||||||
"""Class for exposing the flags defined by flag_file(s)."""
|
"""Class for exposing the flags defined by flag_file(s)."""
|
||||||
|
|
||||||
@@ -1083,6 +1152,7 @@ class ConfigCommands(object):
|
|||||||
|
|
||||||
CATEGORIES = [
|
CATEGORIES = [
|
||||||
('account', AccountCommands),
|
('account', AccountCommands),
|
||||||
|
('agent', AgentBuildCommands),
|
||||||
('config', ConfigCommands),
|
('config', ConfigCommands),
|
||||||
('db', DbCommands),
|
('db', DbCommands),
|
||||||
('fixed', FixedIpCommands),
|
('fixed', FixedIpCommands),
|
||||||
|
|||||||
111
nova/tests/test_adminapi.py
Normal file
111
nova/tests/test_adminapi.py
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
from eventlet import greenthread
|
||||||
|
|
||||||
|
from nova import context
|
||||||
|
from nova import db
|
||||||
|
from nova import flags
|
||||||
|
from nova import log as logging
|
||||||
|
from nova import rpc
|
||||||
|
from nova import test
|
||||||
|
from nova import utils
|
||||||
|
from nova.auth import manager
|
||||||
|
from nova.api.ec2 import admin
|
||||||
|
from nova.image import fake
|
||||||
|
|
||||||
|
|
||||||
|
FLAGS = flags.FLAGS
|
||||||
|
LOG = logging.getLogger('nova.tests.adminapi')
|
||||||
|
|
||||||
|
|
||||||
|
class AdminApiTestCase(test.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(AdminApiTestCase, self).setUp()
|
||||||
|
self.flags(connection_type='fake')
|
||||||
|
|
||||||
|
self.conn = rpc.Connection.instance()
|
||||||
|
|
||||||
|
# set up our cloud
|
||||||
|
self.api = admin.AdminController()
|
||||||
|
|
||||||
|
# set up services
|
||||||
|
self.compute = self.start_service('compute')
|
||||||
|
self.scheduter = self.start_service('scheduler')
|
||||||
|
self.network = self.start_service('network')
|
||||||
|
self.volume = self.start_service('volume')
|
||||||
|
self.image_service = utils.import_object(FLAGS.image_service)
|
||||||
|
|
||||||
|
self.manager = manager.AuthManager()
|
||||||
|
self.user = self.manager.create_user('admin', 'admin', 'admin', True)
|
||||||
|
self.project = self.manager.create_project('proj', 'admin', 'proj')
|
||||||
|
self.context = context.RequestContext(user=self.user,
|
||||||
|
project=self.project)
|
||||||
|
host = self.network.get_network_host(self.context.elevated())
|
||||||
|
|
||||||
|
def fake_show(meh, context, id):
|
||||||
|
return {'id': 1, 'properties': {'kernel_id': 1, 'ramdisk_id': 1,
|
||||||
|
'type': 'machine', 'image_state': 'available'}}
|
||||||
|
|
||||||
|
self.stubs.Set(fake._FakeImageService, 'show', fake_show)
|
||||||
|
self.stubs.Set(fake._FakeImageService, 'show_by_name', fake_show)
|
||||||
|
|
||||||
|
# NOTE(vish): set up a manual wait so rpc.cast has a chance to finish
|
||||||
|
rpc_cast = rpc.cast
|
||||||
|
|
||||||
|
def finish_cast(*args, **kwargs):
|
||||||
|
rpc_cast(*args, **kwargs)
|
||||||
|
greenthread.sleep(0.2)
|
||||||
|
|
||||||
|
self.stubs.Set(rpc, 'cast', finish_cast)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
network_ref = db.project_get_network(self.context,
|
||||||
|
self.project.id)
|
||||||
|
db.network_disassociate(self.context, network_ref['id'])
|
||||||
|
self.manager.delete_project(self.project)
|
||||||
|
self.manager.delete_user(self.user)
|
||||||
|
super(AdminApiTestCase, self).tearDown()
|
||||||
|
|
||||||
|
def test_block_external_ips(self):
|
||||||
|
"""Make sure provider firewall rules are created."""
|
||||||
|
result = self.api.block_external_addresses(self.context, '1.1.1.1/32')
|
||||||
|
self.api.remove_external_address_block(self.context, '1.1.1.1/32')
|
||||||
|
self.assertEqual('OK', result['status'])
|
||||||
|
self.assertEqual('Added 3 rules', result['message'])
|
||||||
|
|
||||||
|
def test_list_blocked_ips(self):
|
||||||
|
"""Make sure we can see the external blocks that exist."""
|
||||||
|
self.api.block_external_addresses(self.context, '1.1.1.2/32')
|
||||||
|
result = self.api.describe_external_address_blocks(self.context)
|
||||||
|
num = len(db.provider_fw_rule_get_all(self.context))
|
||||||
|
self.api.remove_external_address_block(self.context, '1.1.1.2/32')
|
||||||
|
# we only list IP, not tcp/udp/icmp rules
|
||||||
|
self.assertEqual(num / 3, len(result['externalIpBlockInfo']))
|
||||||
|
|
||||||
|
def test_remove_ip_block(self):
|
||||||
|
"""Remove ip blocks."""
|
||||||
|
result = self.api.block_external_addresses(self.context, '1.1.1.3/32')
|
||||||
|
self.assertEqual('OK', result['status'])
|
||||||
|
num0 = len(db.provider_fw_rule_get_all(self.context))
|
||||||
|
result = self.api.remove_external_address_block(self.context,
|
||||||
|
'1.1.1.3/32')
|
||||||
|
self.assertEqual('OK', result['status'])
|
||||||
|
self.assertEqual('Deleted 3 rules', result['message'])
|
||||||
|
num1 = len(db.provider_fw_rule_get_all(self.context))
|
||||||
|
self.assert_(num1 < num0)
|
||||||
@@ -281,6 +281,14 @@ class ComputeTestCase(test.TestCase):
|
|||||||
"File Contents")
|
"File Contents")
|
||||||
self.compute.terminate_instance(self.context, instance_id)
|
self.compute.terminate_instance(self.context, instance_id)
|
||||||
|
|
||||||
|
def test_agent_update(self):
|
||||||
|
"""Ensure instance can have its agent updated"""
|
||||||
|
instance_id = self._create_instance()
|
||||||
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
self.compute.agent_update(self.context, instance_id,
|
||||||
|
'http://127.0.0.1/agent', '00112233445566778899aabbccddeeff')
|
||||||
|
self.compute.terminate_instance(self.context, instance_id)
|
||||||
|
|
||||||
def test_snapshot(self):
|
def test_snapshot(self):
|
||||||
"""Ensure instance can be snapshotted"""
|
"""Ensure instance can be snapshotted"""
|
||||||
instance_id = self._create_instance()
|
instance_id = self._create_instance()
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
"""
|
"""
|
||||||
Unit Tests for flat network code
|
Unit Tests for flat network code
|
||||||
"""
|
"""
|
||||||
import IPy
|
import netaddr
|
||||||
import os
|
import os
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
@@ -45,8 +45,8 @@ class FlatNetworkTestCase(base.NetworkTestCase):
|
|||||||
|
|
||||||
self.context._project = self.projects[0]
|
self.context._project = self.projects[0]
|
||||||
self.context.project_id = self.projects[0].id
|
self.context.project_id = self.projects[0].id
|
||||||
pubnet = IPy.IP(flags.FLAGS.floating_range)
|
pubnet = netaddr.IPRange(flags.FLAGS.floating_range)
|
||||||
address = str(pubnet[0])
|
address = str(list(pubnet)[0])
|
||||||
try:
|
try:
|
||||||
db.floating_ip_get_by_address(context.get_admin_context(), address)
|
db.floating_ip_get_by_address(context.get_admin_context(), address)
|
||||||
except exception.NotFound:
|
except exception.NotFound:
|
||||||
|
|||||||
@@ -799,7 +799,9 @@ class IptablesFirewallTestCase(test.TestCase):
|
|||||||
self.network = utils.import_object(FLAGS.network_manager)
|
self.network = utils.import_object(FLAGS.network_manager)
|
||||||
|
|
||||||
class FakeLibvirtConnection(object):
|
class FakeLibvirtConnection(object):
|
||||||
pass
|
def nwfilterDefineXML(*args, **kwargs):
|
||||||
|
"""setup_basic_rules in nwfilter calls this."""
|
||||||
|
pass
|
||||||
self.fake_libvirt_connection = FakeLibvirtConnection()
|
self.fake_libvirt_connection = FakeLibvirtConnection()
|
||||||
self.fw = firewall.IptablesFirewallDriver(
|
self.fw = firewall.IptablesFirewallDriver(
|
||||||
get_connection=lambda: self.fake_libvirt_connection)
|
get_connection=lambda: self.fake_libvirt_connection)
|
||||||
@@ -1035,7 +1037,6 @@ class IptablesFirewallTestCase(test.TestCase):
|
|||||||
fakefilter.filterDefineXMLMock
|
fakefilter.filterDefineXMLMock
|
||||||
self.fw.nwfilter._conn.nwfilterLookupByName =\
|
self.fw.nwfilter._conn.nwfilterLookupByName =\
|
||||||
fakefilter.nwfilterLookupByName
|
fakefilter.nwfilterLookupByName
|
||||||
|
|
||||||
instance_ref = self._create_instance_ref()
|
instance_ref = self._create_instance_ref()
|
||||||
inst_id = instance_ref['id']
|
inst_id = instance_ref['id']
|
||||||
instance = db.instance_get(self.context, inst_id)
|
instance = db.instance_get(self.context, inst_id)
|
||||||
@@ -1057,6 +1058,70 @@ class IptablesFirewallTestCase(test.TestCase):
|
|||||||
|
|
||||||
db.instance_destroy(admin_ctxt, instance_ref['id'])
|
db.instance_destroy(admin_ctxt, instance_ref['id'])
|
||||||
|
|
||||||
|
def test_provider_firewall_rules(self):
|
||||||
|
# setup basic instance data
|
||||||
|
instance_ref = self._create_instance_ref()
|
||||||
|
nw_info = _create_network_info(1)
|
||||||
|
ip = '10.11.12.13'
|
||||||
|
network_ref = db.project_get_network(self.context, 'fake')
|
||||||
|
admin_ctxt = context.get_admin_context()
|
||||||
|
fixed_ip = {'address': ip, 'network_id': network_ref['id']}
|
||||||
|
db.fixed_ip_create(admin_ctxt, fixed_ip)
|
||||||
|
db.fixed_ip_update(admin_ctxt, ip, {'allocated': True,
|
||||||
|
'instance_id': instance_ref['id']})
|
||||||
|
# FRAGILE: peeks at how the firewall names chains
|
||||||
|
chain_name = 'inst-%s' % instance_ref['id']
|
||||||
|
|
||||||
|
# create a firewall via setup_basic_filtering like libvirt_conn.spawn
|
||||||
|
# should have a chain with 0 rules
|
||||||
|
self.fw.setup_basic_filtering(instance_ref, network_info=nw_info)
|
||||||
|
self.assertTrue('provider' in self.fw.iptables.ipv4['filter'].chains)
|
||||||
|
rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
|
||||||
|
if rule.chain == 'provider']
|
||||||
|
self.assertEqual(0, len(rules))
|
||||||
|
|
||||||
|
# add a rule and send the update message, check for 1 rule
|
||||||
|
provider_fw0 = db.provider_fw_rule_create(admin_ctxt,
|
||||||
|
{'protocol': 'tcp',
|
||||||
|
'cidr': '10.99.99.99/32',
|
||||||
|
'from_port': 1,
|
||||||
|
'to_port': 65535})
|
||||||
|
self.fw.refresh_provider_fw_rules()
|
||||||
|
rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
|
||||||
|
if rule.chain == 'provider']
|
||||||
|
self.assertEqual(1, len(rules))
|
||||||
|
|
||||||
|
# Add another, refresh, and make sure number of rules goes to two
|
||||||
|
provider_fw1 = db.provider_fw_rule_create(admin_ctxt,
|
||||||
|
{'protocol': 'udp',
|
||||||
|
'cidr': '10.99.99.99/32',
|
||||||
|
'from_port': 1,
|
||||||
|
'to_port': 65535})
|
||||||
|
self.fw.refresh_provider_fw_rules()
|
||||||
|
rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
|
||||||
|
if rule.chain == 'provider']
|
||||||
|
self.assertEqual(2, len(rules))
|
||||||
|
|
||||||
|
# create the instance filter and make sure it has a jump rule
|
||||||
|
self.fw.prepare_instance_filter(instance_ref, network_info=nw_info)
|
||||||
|
self.fw.apply_instance_filter(instance_ref)
|
||||||
|
inst_rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
|
||||||
|
if rule.chain == chain_name]
|
||||||
|
jump_rules = [rule for rule in inst_rules if '-j' in rule.rule]
|
||||||
|
provjump_rules = []
|
||||||
|
# IptablesTable doesn't make rules unique internally
|
||||||
|
for rule in jump_rules:
|
||||||
|
if 'provider' in rule.rule and rule not in provjump_rules:
|
||||||
|
provjump_rules.append(rule)
|
||||||
|
self.assertEqual(1, len(provjump_rules))
|
||||||
|
|
||||||
|
# remove a rule from the db, cast to compute to refresh rule
|
||||||
|
db.provider_fw_rule_destroy(admin_ctxt, provider_fw1['id'])
|
||||||
|
self.fw.refresh_provider_fw_rules()
|
||||||
|
rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
|
||||||
|
if rule.chain == 'provider']
|
||||||
|
self.assertEqual(1, len(rules))
|
||||||
|
|
||||||
|
|
||||||
class NWFilterTestCase(test.TestCase):
|
class NWFilterTestCase(test.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
"""
|
"""
|
||||||
Unit Tests for network code
|
Unit Tests for network code
|
||||||
"""
|
"""
|
||||||
import IPy
|
import netaddr
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from nova import test
|
from nova import test
|
||||||
@@ -164,3 +164,33 @@ class IptablesManagerTestCase(test.TestCase):
|
|||||||
self.assertTrue('-A %s -j run_tests.py-%s' \
|
self.assertTrue('-A %s -j run_tests.py-%s' \
|
||||||
% (chain, chain) in new_lines,
|
% (chain, chain) in new_lines,
|
||||||
"Built-in chain %s not wrapped" % (chain,))
|
"Built-in chain %s not wrapped" % (chain,))
|
||||||
|
|
||||||
|
def test_will_empty_chain(self):
|
||||||
|
self.manager.ipv4['filter'].add_chain('test-chain')
|
||||||
|
self.manager.ipv4['filter'].add_rule('test-chain', '-j DROP')
|
||||||
|
old_count = len(self.manager.ipv4['filter'].rules)
|
||||||
|
self.manager.ipv4['filter'].empty_chain('test-chain')
|
||||||
|
self.assertEqual(old_count - 1, len(self.manager.ipv4['filter'].rules))
|
||||||
|
|
||||||
|
def test_will_empty_unwrapped_chain(self):
|
||||||
|
self.manager.ipv4['filter'].add_chain('test-chain', wrap=False)
|
||||||
|
self.manager.ipv4['filter'].add_rule('test-chain', '-j DROP',
|
||||||
|
wrap=False)
|
||||||
|
old_count = len(self.manager.ipv4['filter'].rules)
|
||||||
|
self.manager.ipv4['filter'].empty_chain('test-chain', wrap=False)
|
||||||
|
self.assertEqual(old_count - 1, len(self.manager.ipv4['filter'].rules))
|
||||||
|
|
||||||
|
def test_will_not_empty_wrapped_when_unwrapped(self):
|
||||||
|
self.manager.ipv4['filter'].add_chain('test-chain')
|
||||||
|
self.manager.ipv4['filter'].add_rule('test-chain', '-j DROP')
|
||||||
|
old_count = len(self.manager.ipv4['filter'].rules)
|
||||||
|
self.manager.ipv4['filter'].empty_chain('test-chain', wrap=False)
|
||||||
|
self.assertEqual(old_count, len(self.manager.ipv4['filter'].rules))
|
||||||
|
|
||||||
|
def test_will_not_empty_unwrapped_when_wrapped(self):
|
||||||
|
self.manager.ipv4['filter'].add_chain('test-chain', wrap=False)
|
||||||
|
self.manager.ipv4['filter'].add_rule('test-chain', '-j DROP',
|
||||||
|
wrap=False)
|
||||||
|
old_count = len(self.manager.ipv4['filter'].rules)
|
||||||
|
self.manager.ipv4['filter'].empty_chain('test-chain')
|
||||||
|
self.assertEqual(old_count, len(self.manager.ipv4['filter'].rules))
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
"""
|
"""
|
||||||
Unit Tests for vlan network code
|
Unit Tests for vlan network code
|
||||||
"""
|
"""
|
||||||
import IPy
|
import netaddr
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from nova import context
|
from nova import context
|
||||||
@@ -44,8 +44,8 @@ class VlanNetworkTestCase(base.NetworkTestCase):
|
|||||||
# TODO(vish): better way of adding floating ips
|
# TODO(vish): better way of adding floating ips
|
||||||
self.context._project = self.projects[0]
|
self.context._project = self.projects[0]
|
||||||
self.context.project_id = self.projects[0].id
|
self.context.project_id = self.projects[0].id
|
||||||
pubnet = IPy.IP(flags.FLAGS.floating_range)
|
pubnet = netaddr.IPNetwork(flags.FLAGS.floating_range)
|
||||||
address = str(pubnet[0])
|
address = str(list(pubnet)[0])
|
||||||
try:
|
try:
|
||||||
db.floating_ip_get_by_address(context.get_admin_context(), address)
|
db.floating_ip_get_by_address(context.get_admin_context(), address)
|
||||||
except exception.NotFound:
|
except exception.NotFound:
|
||||||
|
|||||||
@@ -37,9 +37,8 @@ from nova import exception
|
|||||||
from nova.virt import xenapi_conn
|
from nova.virt import xenapi_conn
|
||||||
from nova.virt.xenapi import fake as xenapi_fake
|
from nova.virt.xenapi import fake as xenapi_fake
|
||||||
from nova.virt.xenapi import volume_utils
|
from nova.virt.xenapi import volume_utils
|
||||||
|
from nova.virt.xenapi import vmops
|
||||||
from nova.virt.xenapi import vm_utils
|
from nova.virt.xenapi import vm_utils
|
||||||
from nova.virt.xenapi.vmops import SimpleDH
|
|
||||||
from nova.virt.xenapi.vmops import VMOps
|
|
||||||
from nova.tests.db import fakes as db_fakes
|
from nova.tests.db import fakes as db_fakes
|
||||||
from nova.tests.xenapi import stubs
|
from nova.tests.xenapi import stubs
|
||||||
from nova.tests.glance import stubs as glance_stubs
|
from nova.tests.glance import stubs as glance_stubs
|
||||||
@@ -85,7 +84,8 @@ class XenAPIVolumeTestCase(test.TestCase):
|
|||||||
'ramdisk_id': 3,
|
'ramdisk_id': 3,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
|
|
||||||
def _create_volume(self, size='0'):
|
def _create_volume(self, size='0'):
|
||||||
"""Create a volume object."""
|
"""Create a volume object."""
|
||||||
@@ -192,7 +192,7 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
stubs.stubout_get_this_vm_uuid(self.stubs)
|
stubs.stubout_get_this_vm_uuid(self.stubs)
|
||||||
stubs.stubout_stream_disk(self.stubs)
|
stubs.stubout_stream_disk(self.stubs)
|
||||||
stubs.stubout_is_vdi_pv(self.stubs)
|
stubs.stubout_is_vdi_pv(self.stubs)
|
||||||
self.stubs.Set(VMOps, 'reset_network', reset_network)
|
self.stubs.Set(vmops.VMOps, 'reset_network', reset_network)
|
||||||
stubs.stub_out_vm_methods(self.stubs)
|
stubs.stub_out_vm_methods(self.stubs)
|
||||||
glance_stubs.stubout_glance_client(self.stubs)
|
glance_stubs.stubout_glance_client(self.stubs)
|
||||||
fake_utils.stub_out_utils_execute(self.stubs)
|
fake_utils.stub_out_utils_execute(self.stubs)
|
||||||
@@ -212,7 +212,8 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
'ramdisk_id': 3,
|
'ramdisk_id': 3,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
instance = db.instance_create(self.context, values)
|
instance = db.instance_create(self.context, values)
|
||||||
self.conn.spawn(instance)
|
self.conn.spawn(instance)
|
||||||
|
|
||||||
@@ -370,7 +371,8 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
|
|
||||||
def _test_spawn(self, image_ref, kernel_id, ramdisk_id,
|
def _test_spawn(self, image_ref, kernel_id, ramdisk_id,
|
||||||
instance_type_id="3", os_type="linux",
|
instance_type_id="3", os_type="linux",
|
||||||
instance_id=1, check_injection=False):
|
architecture="x86-64", instance_id=1,
|
||||||
|
check_injection=False):
|
||||||
stubs.stubout_loopingcall_start(self.stubs)
|
stubs.stubout_loopingcall_start(self.stubs)
|
||||||
values = {'id': instance_id,
|
values = {'id': instance_id,
|
||||||
'project_id': self.project.id,
|
'project_id': self.project.id,
|
||||||
@@ -380,11 +382,14 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
'ramdisk_id': ramdisk_id,
|
'ramdisk_id': ramdisk_id,
|
||||||
'instance_type_id': instance_type_id,
|
'instance_type_id': instance_type_id,
|
||||||
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
||||||
'os_type': os_type}
|
'os_type': os_type,
|
||||||
|
'architecture': architecture}
|
||||||
instance = db.instance_create(self.context, values)
|
instance = db.instance_create(self.context, values)
|
||||||
self.conn.spawn(instance)
|
self.conn.spawn(instance)
|
||||||
self.create_vm_record(self.conn, os_type, instance_id)
|
self.create_vm_record(self.conn, os_type, instance_id)
|
||||||
self.check_vm_record(self.conn, check_injection)
|
self.check_vm_record(self.conn, check_injection)
|
||||||
|
self.assertTrue(instance.os_type)
|
||||||
|
self.assertTrue(instance.architecture)
|
||||||
|
|
||||||
def test_spawn_not_enough_memory(self):
|
def test_spawn_not_enough_memory(self):
|
||||||
FLAGS.xenapi_image_service = 'glance'
|
FLAGS.xenapi_image_service = 'glance'
|
||||||
@@ -409,7 +414,7 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
def test_spawn_vhd_glance_linux(self):
|
def test_spawn_vhd_glance_linux(self):
|
||||||
FLAGS.xenapi_image_service = 'glance'
|
FLAGS.xenapi_image_service = 'glance'
|
||||||
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
||||||
os_type="linux")
|
os_type="linux", architecture="x86-64")
|
||||||
self.check_vm_params_for_linux()
|
self.check_vm_params_for_linux()
|
||||||
|
|
||||||
def test_spawn_vhd_glance_swapdisk(self):
|
def test_spawn_vhd_glance_swapdisk(self):
|
||||||
@@ -438,7 +443,7 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
def test_spawn_vhd_glance_windows(self):
|
def test_spawn_vhd_glance_windows(self):
|
||||||
FLAGS.xenapi_image_service = 'glance'
|
FLAGS.xenapi_image_service = 'glance'
|
||||||
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
self._test_spawn(glance_stubs.FakeGlance.IMAGE_VHD, None, None,
|
||||||
os_type="windows")
|
os_type="windows", architecture="i386")
|
||||||
self.check_vm_params_for_windows()
|
self.check_vm_params_for_windows()
|
||||||
|
|
||||||
def test_spawn_glance(self):
|
def test_spawn_glance(self):
|
||||||
@@ -589,7 +594,8 @@ class XenAPIVMTestCase(test.TestCase):
|
|||||||
'ramdisk_id': 3,
|
'ramdisk_id': 3,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
instance = db.instance_create(self.context, values)
|
instance = db.instance_create(self.context, values)
|
||||||
self.conn.spawn(instance)
|
self.conn.spawn(instance)
|
||||||
return instance
|
return instance
|
||||||
@@ -599,8 +605,8 @@ class XenAPIDiffieHellmanTestCase(test.TestCase):
|
|||||||
"""Unit tests for Diffie-Hellman code."""
|
"""Unit tests for Diffie-Hellman code."""
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(XenAPIDiffieHellmanTestCase, self).setUp()
|
super(XenAPIDiffieHellmanTestCase, self).setUp()
|
||||||
self.alice = SimpleDH()
|
self.alice = vmops.SimpleDH()
|
||||||
self.bob = SimpleDH()
|
self.bob = vmops.SimpleDH()
|
||||||
|
|
||||||
def test_shared(self):
|
def test_shared(self):
|
||||||
alice_pub = self.alice.get_public()
|
alice_pub = self.alice.get_public()
|
||||||
@@ -664,7 +670,8 @@ class XenAPIMigrateInstance(test.TestCase):
|
|||||||
'local_gb': 5,
|
'local_gb': 5,
|
||||||
'instance_type_id': '3', # m1.large
|
'instance_type_id': '3', # m1.large
|
||||||
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
'mac_address': 'aa:bb:cc:dd:ee:ff',
|
||||||
'os_type': 'linux'}
|
'os_type': 'linux',
|
||||||
|
'architecture': 'x86-64'}
|
||||||
|
|
||||||
fake_utils.stub_out_utils_execute(self.stubs)
|
fake_utils.stub_out_utils_execute(self.stubs)
|
||||||
stubs.stub_out_migration_methods(self.stubs)
|
stubs.stub_out_migration_methods(self.stubs)
|
||||||
@@ -703,6 +710,7 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
|
|||||||
self.fake_instance = FakeInstance()
|
self.fake_instance = FakeInstance()
|
||||||
self.fake_instance.id = 42
|
self.fake_instance.id = 42
|
||||||
self.fake_instance.os_type = 'linux'
|
self.fake_instance.os_type = 'linux'
|
||||||
|
self.fake_instance.architecture = 'x86-64'
|
||||||
|
|
||||||
def assert_disk_type(self, disk_type):
|
def assert_disk_type(self, disk_type):
|
||||||
dt = vm_utils.VMHelper.determine_disk_image_type(
|
dt = vm_utils.VMHelper.determine_disk_image_type(
|
||||||
@@ -747,6 +755,28 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
|
|||||||
self.assert_disk_type(vm_utils.ImageType.DISK_VHD)
|
self.assert_disk_type(vm_utils.ImageType.DISK_VHD)
|
||||||
|
|
||||||
|
|
||||||
|
class CompareVersionTestCase(test.TestCase):
|
||||||
|
def test_less_than(self):
|
||||||
|
"""Test that cmp_version compares a as less than b"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.4', '1.2.3.5') < 0)
|
||||||
|
|
||||||
|
def test_greater_than(self):
|
||||||
|
"""Test that cmp_version compares a as greater than b"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.5', '1.2.3.4') > 0)
|
||||||
|
|
||||||
|
def test_equal(self):
|
||||||
|
"""Test that cmp_version compares a as equal to b"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.4', '1.2.3.4') == 0)
|
||||||
|
|
||||||
|
def test_non_lexical(self):
|
||||||
|
"""Test that cmp_version compares non-lexically"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3.10', '1.2.3.4') > 0)
|
||||||
|
|
||||||
|
def test_length(self):
|
||||||
|
"""Test that cmp_version compares by length as last resort"""
|
||||||
|
self.assertTrue(vmops.cmp_version('1.2.3', '1.2.3.4') < 0)
|
||||||
|
|
||||||
|
|
||||||
class FakeXenApi(object):
|
class FakeXenApi(object):
|
||||||
"""Fake XenApi for testing HostState."""
|
"""Fake XenApi for testing HostState."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user