trunk merge
This commit is contained in:
		
							
								
								
									
										1
									
								
								Authors
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Authors
									
									
									
									
									
								
							@@ -62,6 +62,7 @@ Joshua McKenty <jmckenty@gmail.com>
 | 
			
		||||
Justin Santa Barbara <justin@fathomdb.com>
 | 
			
		||||
Justin Shepherd <jshepher@rackspace.com>
 | 
			
		||||
Kei Masumoto <masumotok@nttdata.co.jp>
 | 
			
		||||
Keisuke Tagami <tagami.keisuke@lab.ntt.co.jp>
 | 
			
		||||
masumoto<masumotok@nttdata.co.jp>
 | 
			
		||||
Ken Pepple <ken.pepple@gmail.com>
 | 
			
		||||
Kevin Bringard <kbringard@attinteractive.com>
 | 
			
		||||
 
 | 
			
		||||
@@ -110,7 +110,6 @@ class AbstractScheduler(driver.Scheduler):
 | 
			
		||||
        flavor_id = instance_type['flavorid']
 | 
			
		||||
        reservation_id = instance_properties['reservation_id']
 | 
			
		||||
        files = kwargs['injected_files']
 | 
			
		||||
        ipgroup = None  # Not supported in OS API ... yet
 | 
			
		||||
        child_zone = zone_info['child_zone']
 | 
			
		||||
        child_blob = zone_info['child_blob']
 | 
			
		||||
        zone = db.zone_get(context, child_zone)
 | 
			
		||||
@@ -124,8 +123,17 @@ class AbstractScheduler(driver.Scheduler):
 | 
			
		||||
        except novaclient_exceptions.BadRequest, e:
 | 
			
		||||
            raise exception.NotAuthorized(_("Bad credentials attempting "
 | 
			
		||||
                    "to talk to zone at %(url)s.") % locals())
 | 
			
		||||
        nova.servers.create(name, image_ref, flavor_id, ipgroup, meta, files,
 | 
			
		||||
                child_blob, reservation_id=reservation_id)
 | 
			
		||||
        # NOTE(Vek): Novaclient has two different calling conventions
 | 
			
		||||
        #            for this call, depending on whether you're using
 | 
			
		||||
        #            1.0 or 1.1 API: in 1.0, there's an ipgroups
 | 
			
		||||
        #            argument after flavor_id which isn't present in
 | 
			
		||||
        #            1.1.  To work around this, all the extra
 | 
			
		||||
        #            arguments are passed as keyword arguments
 | 
			
		||||
        #            (there's a reasonable default for ipgroups in the
 | 
			
		||||
        #            novaclient call).
 | 
			
		||||
        nova.servers.create(name, image_ref, flavor_id,
 | 
			
		||||
                            meta=meta, files=files, zone_blob=child_blob,
 | 
			
		||||
                            reservation_id=reservation_id)
 | 
			
		||||
 | 
			
		||||
    def _provision_resource_from_blob(self, context, build_plan_item,
 | 
			
		||||
            instance_id, request_spec, kwargs):
 | 
			
		||||
@@ -269,9 +277,6 @@ class AbstractScheduler(driver.Scheduler):
 | 
			
		||||
        # Filter local hosts based on requirements ...
 | 
			
		||||
        filtered_hosts = self.filter_hosts(topic, request_spec,
 | 
			
		||||
                unfiltered_hosts)
 | 
			
		||||
        if not filtered_hosts:
 | 
			
		||||
            LOG.warn(_("No hosts available"))
 | 
			
		||||
            return []
 | 
			
		||||
 | 
			
		||||
        # weigh the selected hosts.
 | 
			
		||||
        # weighted_hosts = [{weight=weight, hostname=hostname,
 | 
			
		||||
 
 | 
			
		||||
@@ -103,23 +103,6 @@ def update_service_capabilities(context, service_name, host, capabilities):
 | 
			
		||||
    return rpc.fanout_cast(context, 'scheduler', kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _wrap_method(function, self):
 | 
			
		||||
    """Wrap method to supply self."""
 | 
			
		||||
    def _wrap(*args, **kwargs):
 | 
			
		||||
        return function(self, *args, **kwargs)
 | 
			
		||||
    return _wrap
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _process(func, context, zone):
 | 
			
		||||
    """Worker stub for green thread pool. Give the worker
 | 
			
		||||
    an authenticated nova client and zone info. This call
 | 
			
		||||
    is done on behalf of the user."""
 | 
			
		||||
    nova = novaclient.Client(zone.username, zone.password, None,
 | 
			
		||||
                             zone.api_url, token=context.auth_token)
 | 
			
		||||
    nova.authenticate()
 | 
			
		||||
    return func(nova, zone)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def call_zone_method(context, method_name, errors_to_ignore=None,
 | 
			
		||||
                     novaclient_collection_name='zones', zones=None,
 | 
			
		||||
                     *args, **kwargs):
 | 
			
		||||
@@ -169,9 +152,35 @@ def child_zone_helper(context, zone_list, func):
 | 
			
		||||
    For example, if you are calling server.pause(), the list will
 | 
			
		||||
    be whatever the response from server.pause() is. One entry
 | 
			
		||||
    per child zone called."""
 | 
			
		||||
 | 
			
		||||
    def _wrap_method(function, arg1):
 | 
			
		||||
        """Wrap method to supply an argument."""
 | 
			
		||||
        def _wrap(*args, **kwargs):
 | 
			
		||||
            return function(arg1, *args, **kwargs)
 | 
			
		||||
        return _wrap
 | 
			
		||||
 | 
			
		||||
    def _process(func, context, zone):
 | 
			
		||||
        """Worker stub for green thread pool. Give the worker
 | 
			
		||||
        an authenticated nova client and zone info."""
 | 
			
		||||
        try:
 | 
			
		||||
            nova = novaclient.Client(zone.username, zone.password, None,
 | 
			
		||||
                    zone.api_url, token=context.auth_token)
 | 
			
		||||
            nova.authenticate()
 | 
			
		||||
        except novaclient_exceptions.BadRequest, e:
 | 
			
		||||
            url = zone.api_url
 | 
			
		||||
            LOG.warn(_("Failed request to zone; URL=%(url)s: %(e)s")
 | 
			
		||||
                    % locals())
 | 
			
		||||
            # This is being returned instead of raised, so that when
 | 
			
		||||
            # results are processed in unmarshal_result() after the
 | 
			
		||||
            # greenpool.imap completes, the exception can be raised
 | 
			
		||||
            # there if no other zones had a response.
 | 
			
		||||
            return exception.ZoneRequestError()
 | 
			
		||||
        else:
 | 
			
		||||
            return func(nova, zone)
 | 
			
		||||
 | 
			
		||||
    green_pool = greenpool.GreenPool()
 | 
			
		||||
    return [result for result in green_pool.imap(
 | 
			
		||||
                    _wrap_method(_process, context, func), zone_list)]
 | 
			
		||||
                    _wrap_method(_process, func, context), zone_list)]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _issue_novaclient_command(nova, zone, collection,
 | 
			
		||||
@@ -263,6 +272,8 @@ class reroute_compute(object):
 | 
			
		||||
        if not FLAGS.enable_zone_routing:
 | 
			
		||||
            raise exception.InstanceNotFound(instance_id=item_uuid)
 | 
			
		||||
 | 
			
		||||
        self.item_uuid = item_uuid
 | 
			
		||||
 | 
			
		||||
        zones = db.zone_get_all(context)
 | 
			
		||||
        if not zones:
 | 
			
		||||
            raise exception.InstanceNotFound(instance_id=item_uuid)
 | 
			
		||||
@@ -345,9 +356,13 @@ class reroute_compute(object):
 | 
			
		||||
        dict {'server':{k:v}}. Others may return a list of them, like
 | 
			
		||||
        {'servers':[{k,v}]}"""
 | 
			
		||||
        reduced_response = []
 | 
			
		||||
        found_exception = None
 | 
			
		||||
        for zone_response in zone_responses:
 | 
			
		||||
            if not zone_response:
 | 
			
		||||
                continue
 | 
			
		||||
            if isinstance(zone_response, BaseException):
 | 
			
		||||
                found_exception = zone_response
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            server = zone_response.__dict__
 | 
			
		||||
 | 
			
		||||
@@ -358,7 +373,9 @@ class reroute_compute(object):
 | 
			
		||||
            reduced_response.append(dict(server=server))
 | 
			
		||||
        if reduced_response:
 | 
			
		||||
            return reduced_response[0]  # first for now.
 | 
			
		||||
        return {}
 | 
			
		||||
        elif found_exception:
 | 
			
		||||
            raise found_exception
 | 
			
		||||
        raise exception.InstanceNotFound(instance_id=self.item_uuid)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def redirect_handler(f):
 | 
			
		||||
 
 | 
			
		||||
@@ -55,5 +55,17 @@ class BaseScheduler(abstract_scheduler.AbstractScheduler):
 | 
			
		||||
        scheduling objectives
 | 
			
		||||
        """
 | 
			
		||||
        # NOTE(sirp): The default logic is the same as the NoopCostFunction
 | 
			
		||||
        return [dict(weight=1, hostname=hostname, capabilities=capabilities)
 | 
			
		||||
                for hostname, capabilities in hosts]
 | 
			
		||||
        hosts = [dict(weight=1, hostname=hostname, capabilities=capabilities)
 | 
			
		||||
                 for hostname, capabilities in hosts]
 | 
			
		||||
 | 
			
		||||
        # NOTE(Vek): What we actually need to return is enough hosts
 | 
			
		||||
        #            for all the instances!
 | 
			
		||||
        num_instances = request_spec.get('num_instances', 1)
 | 
			
		||||
        instances = []
 | 
			
		||||
        while num_instances > len(hosts):
 | 
			
		||||
            instances.extend(hosts)
 | 
			
		||||
            num_instances -= len(hosts)
 | 
			
		||||
        if num_instances > 0:
 | 
			
		||||
            instances.extend(hosts[:num_instances])
 | 
			
		||||
 | 
			
		||||
        return instances
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ from nova import test
 | 
			
		||||
from nova.compute import api as compute_api
 | 
			
		||||
from nova.scheduler import driver
 | 
			
		||||
from nova.scheduler import abstract_scheduler
 | 
			
		||||
from nova.scheduler import base_scheduler
 | 
			
		||||
from nova.scheduler import zone_manager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -65,6 +66,11 @@ class FakeAbstractScheduler(abstract_scheduler.AbstractScheduler):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FakeBaseScheduler(base_scheduler.BaseScheduler):
 | 
			
		||||
    # No need to stub anything at the moment
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FakeZoneManager(zone_manager.ZoneManager):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.service_states = {
 | 
			
		||||
@@ -365,3 +371,52 @@ class AbstractSchedulerTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(fixture._decrypt_blob(test_data),
 | 
			
		||||
                         json.dumps(test_data))
 | 
			
		||||
 | 
			
		||||
    def test_empty_local_hosts(self):
 | 
			
		||||
        """
 | 
			
		||||
        Create a nested set of FakeZones, try to build multiple instances
 | 
			
		||||
        and ensure that a select call returns the appropriate build plan.
 | 
			
		||||
        """
 | 
			
		||||
        sched = FakeAbstractScheduler()
 | 
			
		||||
        self.stubs.Set(sched, '_call_zone_method', fake_call_zone_method)
 | 
			
		||||
        self.stubs.Set(nova.db, 'zone_get_all', fake_zone_get_all)
 | 
			
		||||
 | 
			
		||||
        zm = FakeZoneManager()
 | 
			
		||||
        # patch this to have no local hosts
 | 
			
		||||
        zm.service_states = {}
 | 
			
		||||
        sched.set_zone_manager(zm)
 | 
			
		||||
 | 
			
		||||
        fake_context = {}
 | 
			
		||||
        build_plan = sched.select(fake_context,
 | 
			
		||||
                {'instance_type': {'memory_mb': 512},
 | 
			
		||||
                    'num_instances': 4})
 | 
			
		||||
 | 
			
		||||
        # 0 from local zones, 12 from remotes
 | 
			
		||||
        self.assertEqual(12, len(build_plan))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BaseSchedulerTestCase(test.TestCase):
 | 
			
		||||
    """Test case for Base Scheduler."""
 | 
			
		||||
 | 
			
		||||
    def test_weigh_hosts(self):
 | 
			
		||||
        """
 | 
			
		||||
        Try to weigh a short list of hosts and make sure enough
 | 
			
		||||
        entries for a larger number instances are returned.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        sched = FakeBaseScheduler()
 | 
			
		||||
 | 
			
		||||
        # Fake out a list of hosts
 | 
			
		||||
        zm = FakeZoneManager()
 | 
			
		||||
        hostlist = [(host, services['compute'])
 | 
			
		||||
                    for host, services in zm.service_states.items()
 | 
			
		||||
                    if 'compute' in services]
 | 
			
		||||
 | 
			
		||||
        # Call weigh_hosts()
 | 
			
		||||
        num_instances = len(hostlist) * 2 + len(hostlist) / 2
 | 
			
		||||
        instlist = sched.weigh_hosts('compute',
 | 
			
		||||
                                     dict(num_instances=num_instances),
 | 
			
		||||
                                     hostlist)
 | 
			
		||||
 | 
			
		||||
        # Should be enough entries to cover all instances
 | 
			
		||||
        self.assertEqual(len(instlist), num_instances)
 | 
			
		||||
 
 | 
			
		||||
@@ -486,11 +486,9 @@ class CloudTestCase(test.TestCase):
 | 
			
		||||
        inst2 = db.instance_create(self.context, args2)
 | 
			
		||||
        db.instance_destroy(self.context, inst1.id)
 | 
			
		||||
        result = self.cloud.describe_instances(self.context)
 | 
			
		||||
        self.assertEqual(len(result['reservationSet']), 1)
 | 
			
		||||
        result1 = result['reservationSet'][0]['instancesSet']
 | 
			
		||||
        self.assertEqual(result1[0]['instanceId'],
 | 
			
		||||
                         ec2utils.id_to_ec2_id(inst1.id))
 | 
			
		||||
        result2 = result['reservationSet'][1]['instancesSet']
 | 
			
		||||
        self.assertEqual(result2[0]['instanceId'],
 | 
			
		||||
                         ec2utils.id_to_ec2_id(inst2.id))
 | 
			
		||||
 | 
			
		||||
    def _block_device_mapping_create(self, instance_id, mappings):
 | 
			
		||||
 
 | 
			
		||||
@@ -37,61 +37,20 @@ from nova.compute import power_state
 | 
			
		||||
from nova.compute import vm_states
 | 
			
		||||
from nova.virt.libvirt import connection
 | 
			
		||||
from nova.virt.libvirt import firewall
 | 
			
		||||
from nova.tests import fake_network
 | 
			
		||||
 | 
			
		||||
libvirt = None
 | 
			
		||||
FLAGS = flags.FLAGS
 | 
			
		||||
 | 
			
		||||
_fake_network_info = fake_network.fake_get_instance_nw_info
 | 
			
		||||
_ipv4_like = fake_network.ipv4_like
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _concurrency(wait, done, target):
 | 
			
		||||
    wait.wait()
 | 
			
		||||
    done.send()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _create_network_info(count=1, ipv6=None):
 | 
			
		||||
    if ipv6 is None:
 | 
			
		||||
        ipv6 = FLAGS.use_ipv6
 | 
			
		||||
    fake = 'fake'
 | 
			
		||||
    fake_ip = '10.11.12.13'
 | 
			
		||||
    fake_ip_2 = '0.0.0.1'
 | 
			
		||||
    fake_ip_3 = '0.0.0.1'
 | 
			
		||||
    fake_vlan = 100
 | 
			
		||||
    fake_bridge_interface = 'eth0'
 | 
			
		||||
    network = {'bridge': fake,
 | 
			
		||||
               'cidr': fake_ip,
 | 
			
		||||
               'cidr_v6': fake_ip,
 | 
			
		||||
               'gateway_v6': fake,
 | 
			
		||||
               'vlan': fake_vlan,
 | 
			
		||||
               'bridge_interface': fake_bridge_interface}
 | 
			
		||||
    mapping = {'mac': fake,
 | 
			
		||||
               'dhcp_server': '10.0.0.1',
 | 
			
		||||
               'gateway': fake,
 | 
			
		||||
               'gateway6': fake,
 | 
			
		||||
               'ips': [{'ip': fake_ip}, {'ip': fake_ip}]}
 | 
			
		||||
    if ipv6:
 | 
			
		||||
        mapping['ip6s'] = [{'ip': fake_ip},
 | 
			
		||||
                           {'ip': fake_ip_2},
 | 
			
		||||
                           {'ip': fake_ip_3}]
 | 
			
		||||
    return [(network, mapping) for x in xrange(0, count)]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _setup_networking(instance_id, ip='1.2.3.4', mac='56:12:12:12:12:12'):
 | 
			
		||||
    ctxt = context.get_admin_context()
 | 
			
		||||
    network_ref = db.project_get_networks(ctxt,
 | 
			
		||||
                                           'fake',
 | 
			
		||||
                                           associate=True)[0]
 | 
			
		||||
    vif = {'address': mac,
 | 
			
		||||
           'network_id': network_ref['id'],
 | 
			
		||||
           'instance_id': instance_id}
 | 
			
		||||
    vif_ref = db.virtual_interface_create(ctxt, vif)
 | 
			
		||||
 | 
			
		||||
    fixed_ip = {'address': ip,
 | 
			
		||||
                'network_id': network_ref['id'],
 | 
			
		||||
                'virtual_interface_id': vif_ref['id']}
 | 
			
		||||
    db.fixed_ip_create(ctxt, fixed_ip)
 | 
			
		||||
    db.fixed_ip_update(ctxt, ip, {'allocated': True,
 | 
			
		||||
                                  'instance_id': instance_id})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CacheConcurrencyTestCase(test.TestCase):
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super(CacheConcurrencyTestCase, self).setUp()
 | 
			
		||||
@@ -163,7 +122,6 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        self.context = context.get_admin_context()
 | 
			
		||||
        self.flags(instances_path='')
 | 
			
		||||
        self.call_libvirt_dependant_setup = False
 | 
			
		||||
        self.test_ip = '10.11.12.13'
 | 
			
		||||
 | 
			
		||||
    test_instance = {'memory_kb':     '1024000',
 | 
			
		||||
                     'basepath':      '/some/path',
 | 
			
		||||
@@ -277,12 +235,12 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        instance_ref = db.instance_create(self.context, self.test_instance)
 | 
			
		||||
 | 
			
		||||
        result = conn._prepare_xml_info(instance_ref,
 | 
			
		||||
                                        _create_network_info(),
 | 
			
		||||
                                        _fake_network_info(self.stubs, 1),
 | 
			
		||||
                                        False)
 | 
			
		||||
        self.assertTrue(len(result['nics']) == 1)
 | 
			
		||||
 | 
			
		||||
        result = conn._prepare_xml_info(instance_ref,
 | 
			
		||||
                                        _create_network_info(2),
 | 
			
		||||
                                        _fake_network_info(self.stubs, 2),
 | 
			
		||||
                                        False)
 | 
			
		||||
        self.assertTrue(len(result['nics']) == 2)
 | 
			
		||||
 | 
			
		||||
@@ -407,7 +365,7 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_multi_nic(self):
 | 
			
		||||
        instance_data = dict(self.test_instance)
 | 
			
		||||
        network_info = _create_network_info(2)
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 2)
 | 
			
		||||
        conn = connection.LibvirtConnection(True)
 | 
			
		||||
        instance_ref = db.instance_create(self.context, instance_data)
 | 
			
		||||
        xml = conn.to_xml(instance_ref, network_info, False)
 | 
			
		||||
@@ -417,15 +375,14 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        parameters = interfaces[0].findall('./filterref/parameter')
 | 
			
		||||
        self.assertEquals(interfaces[0].get('type'), 'bridge')
 | 
			
		||||
        self.assertEquals(parameters[0].get('name'), 'IP')
 | 
			
		||||
        self.assertEquals(parameters[0].get('value'), '10.11.12.13')
 | 
			
		||||
        self.assertTrue(_ipv4_like(parameters[0].get('value'), '192.168'))
 | 
			
		||||
        self.assertEquals(parameters[1].get('name'), 'DHCPSERVER')
 | 
			
		||||
        self.assertEquals(parameters[1].get('value'), '10.0.0.1')
 | 
			
		||||
        self.assertTrue(_ipv4_like(parameters[1].get('value'), '192.168.*.1'))
 | 
			
		||||
 | 
			
		||||
    def _check_xml_and_container(self, instance):
 | 
			
		||||
        user_context = context.RequestContext(self.user_id,
 | 
			
		||||
                                              self.project_id)
 | 
			
		||||
        instance_ref = db.instance_create(user_context, instance)
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip)
 | 
			
		||||
 | 
			
		||||
        self.flags(libvirt_type='lxc')
 | 
			
		||||
        conn = connection.LibvirtConnection(True)
 | 
			
		||||
@@ -433,7 +390,7 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        uri = conn.get_uri()
 | 
			
		||||
        self.assertEquals(uri, 'lxc:///')
 | 
			
		||||
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        xml = conn.to_xml(instance_ref, network_info)
 | 
			
		||||
        tree = xml_to_tree(xml)
 | 
			
		||||
 | 
			
		||||
@@ -457,8 +414,6 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        network_ref = db.project_get_networks(context.get_admin_context(),
 | 
			
		||||
                                             self.project_id)[0]
 | 
			
		||||
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip)
 | 
			
		||||
 | 
			
		||||
        type_uri_map = {'qemu': ('qemu:///system',
 | 
			
		||||
                             [(lambda t: t.find('.').get('type'), 'qemu'),
 | 
			
		||||
                              (lambda t: t.find('./os/type').text, 'hvm'),
 | 
			
		||||
@@ -504,9 +459,11 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        common_checks = [
 | 
			
		||||
            (lambda t: t.find('.').tag, 'domain'),
 | 
			
		||||
            (lambda t: t.find(parameter).get('name'), 'IP'),
 | 
			
		||||
            (lambda t: t.find(parameter).get('value'), '10.11.12.13'),
 | 
			
		||||
            (lambda t: _ipv4_like(t.find(parameter).get('value'), '192.168'),
 | 
			
		||||
             True),
 | 
			
		||||
            (lambda t: t.findall(parameter)[1].get('name'), 'DHCPSERVER'),
 | 
			
		||||
            (lambda t: t.findall(parameter)[1].get('value'), '10.0.0.1'),
 | 
			
		||||
            (lambda t: _ipv4_like(t.findall(parameter)[1].get('value'),
 | 
			
		||||
                                  '192.168.*.1'), True),
 | 
			
		||||
            (lambda t: t.find('./devices/serial/source').get(
 | 
			
		||||
                'path').split('/')[1], 'console.log'),
 | 
			
		||||
            (lambda t: t.find('./memory').text, '2097152')]
 | 
			
		||||
@@ -531,7 +488,7 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
            uri = conn.get_uri()
 | 
			
		||||
            self.assertEquals(uri, expected_uri)
 | 
			
		||||
 | 
			
		||||
            network_info = _create_network_info()
 | 
			
		||||
            network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
            xml = conn.to_xml(instance_ref, network_info, rescue)
 | 
			
		||||
            tree = xml_to_tree(xml)
 | 
			
		||||
            for i, (check, expected_result) in enumerate(checks):
 | 
			
		||||
@@ -646,7 +603,7 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
        self.create_fake_libvirt_mock()
 | 
			
		||||
        instance_ref = db.instance_create(self.context, self.test_instance)
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
 | 
			
		||||
        # Start test
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
@@ -830,7 +787,7 @@ class LibvirtConnTestCase(test.TestCase):
 | 
			
		||||
        conn.firewall_driver.setattr('setup_basic_filtering', fake_none)
 | 
			
		||||
        conn.firewall_driver.setattr('prepare_instance_filter', fake_none)
 | 
			
		||||
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            conn.spawn(self.context, instance, network_info)
 | 
			
		||||
@@ -923,7 +880,6 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
                """setup_basic_rules in nwfilter calls this."""
 | 
			
		||||
                pass
 | 
			
		||||
        self.fake_libvirt_connection = FakeLibvirtConnection()
 | 
			
		||||
        self.test_ip = '10.11.12.13'
 | 
			
		||||
        self.fw = firewall.IptablesFirewallDriver(
 | 
			
		||||
                      get_connection=lambda: self.fake_libvirt_connection)
 | 
			
		||||
 | 
			
		||||
@@ -987,10 +943,6 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
    def test_static_filters(self):
 | 
			
		||||
        instance_ref = self._create_instance_ref()
 | 
			
		||||
        src_instance_ref = self._create_instance_ref()
 | 
			
		||||
        src_ip = '10.11.12.14'
 | 
			
		||||
        src_mac = '56:12:12:12:12:13'
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip, src_mac)
 | 
			
		||||
        _setup_networking(src_instance_ref['id'], src_ip)
 | 
			
		||||
 | 
			
		||||
        admin_ctxt = context.get_admin_context()
 | 
			
		||||
        secgroup = db.security_group_create(admin_ctxt,
 | 
			
		||||
@@ -1061,10 +1013,17 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
                return '', ''
 | 
			
		||||
            print cmd, kwargs
 | 
			
		||||
 | 
			
		||||
        def get_fixed_ips(*args, **kwargs):
 | 
			
		||||
            ips = []
 | 
			
		||||
            for network, info in network_info:
 | 
			
		||||
                ips.extend(info['ips'])
 | 
			
		||||
            return [ip['ip'] for ip in ips]
 | 
			
		||||
 | 
			
		||||
        from nova.network import linux_net
 | 
			
		||||
        linux_net.iptables_manager.execute = fake_iptables_execute
 | 
			
		||||
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        self.stubs.Set(db, 'instance_get_fixed_addresses', get_fixed_ips)
 | 
			
		||||
        self.fw.prepare_instance_filter(instance_ref, network_info)
 | 
			
		||||
        self.fw.apply_instance_filter(instance_ref, network_info)
 | 
			
		||||
 | 
			
		||||
@@ -1078,7 +1037,8 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
        instance_chain = None
 | 
			
		||||
        for rule in self.out_rules:
 | 
			
		||||
            # This is pretty crude, but it'll do for now
 | 
			
		||||
            if '-d 10.11.12.13 -j' in rule:
 | 
			
		||||
            # last two octets change
 | 
			
		||||
            if re.search('-d 192.168.[0-9]{1,3}.[0-9]{1,3} -j', rule):
 | 
			
		||||
                instance_chain = rule.split(' ')[-1]
 | 
			
		||||
                break
 | 
			
		||||
        self.assertTrue(instance_chain, "The instance chain wasn't added")
 | 
			
		||||
@@ -1101,10 +1061,11 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
        self.assertTrue(len(filter(regex.match, self.out_rules)) > 0,
 | 
			
		||||
                        "ICMP Echo Request acceptance rule wasn't added")
 | 
			
		||||
 | 
			
		||||
        regex = re.compile('-A .* -j ACCEPT -p tcp -m multiport '
 | 
			
		||||
                           '--dports 80:81 -s %s' % (src_ip,))
 | 
			
		||||
        self.assertTrue(len(filter(regex.match, self.out_rules)) > 0,
 | 
			
		||||
                        "TCP port 80/81 acceptance rule wasn't added")
 | 
			
		||||
        for ip in get_fixed_ips():
 | 
			
		||||
            regex = re.compile('-A .* -j ACCEPT -p tcp -m multiport '
 | 
			
		||||
                               '--dports 80:81 -s %s' % ip)
 | 
			
		||||
            self.assertTrue(len(filter(regex.match, self.out_rules)) > 0,
 | 
			
		||||
                            "TCP port 80/81 acceptance rule wasn't added")
 | 
			
		||||
 | 
			
		||||
        regex = re.compile('-A .* -j ACCEPT -p tcp '
 | 
			
		||||
                           '-m multiport --dports 80:81 -s 192.168.10.0/24')
 | 
			
		||||
@@ -1114,24 +1075,27 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_filters_for_instance_with_ip_v6(self):
 | 
			
		||||
        self.flags(use_ipv6=True)
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        rulesv4, rulesv6 = self.fw._filters_for_instance("fake", network_info)
 | 
			
		||||
        self.assertEquals(len(rulesv4), 2)
 | 
			
		||||
        self.assertEquals(len(rulesv6), 3)
 | 
			
		||||
        self.assertEquals(len(rulesv6), 1)
 | 
			
		||||
 | 
			
		||||
    def test_filters_for_instance_without_ip_v6(self):
 | 
			
		||||
        self.flags(use_ipv6=False)
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        rulesv4, rulesv6 = self.fw._filters_for_instance("fake", network_info)
 | 
			
		||||
        self.assertEquals(len(rulesv4), 2)
 | 
			
		||||
        self.assertEquals(len(rulesv6), 0)
 | 
			
		||||
 | 
			
		||||
    def test_multinic_iptables(self):
 | 
			
		||||
        ipv4_rules_per_network = 2
 | 
			
		||||
        ipv6_rules_per_network = 3
 | 
			
		||||
        ipv4_rules_per_addr = 1
 | 
			
		||||
        ipv4_addr_per_network = 2
 | 
			
		||||
        ipv6_rules_per_addr = 1
 | 
			
		||||
        ipv6_addr_per_network = 1
 | 
			
		||||
        networks_count = 5
 | 
			
		||||
        instance_ref = self._create_instance_ref()
 | 
			
		||||
        network_info = _create_network_info(networks_count)
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, networks_count,
 | 
			
		||||
                                                      ipv4_addr_per_network)
 | 
			
		||||
        ipv4_len = len(self.fw.iptables.ipv4['filter'].rules)
 | 
			
		||||
        ipv6_len = len(self.fw.iptables.ipv6['filter'].rules)
 | 
			
		||||
        inst_ipv4, inst_ipv6 = self.fw.instance_rules(instance_ref,
 | 
			
		||||
@@ -1142,9 +1106,9 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
        ipv4_network_rules = len(ipv4) - len(inst_ipv4) - ipv4_len
 | 
			
		||||
        ipv6_network_rules = len(ipv6) - len(inst_ipv6) - ipv6_len
 | 
			
		||||
        self.assertEquals(ipv4_network_rules,
 | 
			
		||||
                          ipv4_rules_per_network * networks_count)
 | 
			
		||||
                  ipv4_rules_per_addr * ipv4_addr_per_network * networks_count)
 | 
			
		||||
        self.assertEquals(ipv6_network_rules,
 | 
			
		||||
                          ipv6_rules_per_network * networks_count)
 | 
			
		||||
                  ipv6_rules_per_addr * ipv6_addr_per_network * networks_count)
 | 
			
		||||
 | 
			
		||||
    def test_do_refresh_security_group_rules(self):
 | 
			
		||||
        instance_ref = self._create_instance_ref()
 | 
			
		||||
@@ -1170,8 +1134,7 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
                               fakefilter.nwfilterLookupByName
 | 
			
		||||
        instance_ref = self._create_instance_ref()
 | 
			
		||||
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip)
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        self.fw.setup_basic_filtering(instance_ref, network_info)
 | 
			
		||||
        self.fw.prepare_instance_filter(instance_ref, network_info)
 | 
			
		||||
        self.fw.apply_instance_filter(instance_ref, network_info)
 | 
			
		||||
@@ -1186,13 +1149,12 @@ class IptablesFirewallTestCase(test.TestCase):
 | 
			
		||||
    def test_provider_firewall_rules(self):
 | 
			
		||||
        # setup basic instance data
 | 
			
		||||
        instance_ref = self._create_instance_ref()
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip)
 | 
			
		||||
        # 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
 | 
			
		||||
        network_info = _create_network_info(1)
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        self.fw.setup_basic_filtering(instance_ref, network_info)
 | 
			
		||||
        self.assertTrue('provider' in self.fw.iptables.ipv4['filter'].chains)
 | 
			
		||||
        rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
 | 
			
		||||
@@ -1256,7 +1218,6 @@ class NWFilterTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
        self.fake_libvirt_connection = Mock()
 | 
			
		||||
 | 
			
		||||
        self.test_ip = '10.11.12.13'
 | 
			
		||||
        self.fw = firewall.NWFilterFirewall(
 | 
			
		||||
                                         lambda: self.fake_libvirt_connection)
 | 
			
		||||
 | 
			
		||||
@@ -1372,11 +1333,9 @@ class NWFilterTestCase(test.TestCase):
 | 
			
		||||
        instance_ref = self._create_instance()
 | 
			
		||||
        inst_id = instance_ref['id']
 | 
			
		||||
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip)
 | 
			
		||||
 | 
			
		||||
        def _ensure_all_called():
 | 
			
		||||
        def _ensure_all_called(mac):
 | 
			
		||||
            instance_filter = 'nova-instance-%s-%s' % (instance_ref['name'],
 | 
			
		||||
                                                       'fake')
 | 
			
		||||
                                                   mac.translate(None, ':'))
 | 
			
		||||
            secgroup_filter = 'nova-secgroup-%s' % self.security_group['id']
 | 
			
		||||
            for required in [secgroup_filter, 'allow-dhcp-server',
 | 
			
		||||
                             'no-arp-spoofing', 'no-ip-spoofing',
 | 
			
		||||
@@ -1392,17 +1351,22 @@ class NWFilterTestCase(test.TestCase):
 | 
			
		||||
                                       self.security_group.id)
 | 
			
		||||
        instance = db.instance_get(self.context, inst_id)
 | 
			
		||||
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        # since there is one (network_info) there is one vif
 | 
			
		||||
        # pass this vif's mac to _ensure_all_called()
 | 
			
		||||
        # to set the instance_filter properly
 | 
			
		||||
        mac = network_info[0][1]['mac']
 | 
			
		||||
 | 
			
		||||
        self.fw.setup_basic_filtering(instance, network_info)
 | 
			
		||||
        self.fw.prepare_instance_filter(instance, network_info)
 | 
			
		||||
        self.fw.apply_instance_filter(instance, network_info)
 | 
			
		||||
        _ensure_all_called()
 | 
			
		||||
        _ensure_all_called(mac)
 | 
			
		||||
        self.teardown_security_group()
 | 
			
		||||
        db.instance_destroy(context.get_admin_context(), instance_ref['id'])
 | 
			
		||||
 | 
			
		||||
    def test_create_network_filters(self):
 | 
			
		||||
        instance_ref = self._create_instance()
 | 
			
		||||
        network_info = _create_network_info(3)
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 3)
 | 
			
		||||
        result = self.fw._create_network_filters(instance_ref,
 | 
			
		||||
                                                 network_info,
 | 
			
		||||
                                                 "fake")
 | 
			
		||||
@@ -1425,8 +1389,7 @@ class NWFilterTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
        instance = db.instance_get(self.context, inst_id)
 | 
			
		||||
 | 
			
		||||
        _setup_networking(instance_ref['id'], self.test_ip)
 | 
			
		||||
        network_info = _create_network_info()
 | 
			
		||||
        network_info = _fake_network_info(self.stubs, 1)
 | 
			
		||||
        self.fw.setup_basic_filtering(instance, network_info)
 | 
			
		||||
        self.fw.prepare_instance_filter(instance, network_info)
 | 
			
		||||
        self.fw.apply_instance_filter(instance, network_info)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										347
									
								
								nova/tests/test_linux_net.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										347
									
								
								nova/tests/test_linux_net.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,347 @@
 | 
			
		||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
			
		||||
 | 
			
		||||
# Copyright 2011 NTT
 | 
			
		||||
# 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 nova import context
 | 
			
		||||
from nova import db
 | 
			
		||||
from nova import exception
 | 
			
		||||
from nova import flags
 | 
			
		||||
from nova import log as logging
 | 
			
		||||
from nova import test
 | 
			
		||||
from nova import utils
 | 
			
		||||
from nova.network import manager as network_manager
 | 
			
		||||
from nova.network import linux_net
 | 
			
		||||
 | 
			
		||||
import mox
 | 
			
		||||
 | 
			
		||||
FLAGS = flags.FLAGS
 | 
			
		||||
 | 
			
		||||
LOG = logging.getLogger('nova.tests.network')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
HOST = "testhost"
 | 
			
		||||
 | 
			
		||||
instances = [{'id': 0,
 | 
			
		||||
              'host': 'fake_instance00',
 | 
			
		||||
              'hostname': 'fake_instance00'},
 | 
			
		||||
             {'id': 1,
 | 
			
		||||
              'host': 'fake_instance01',
 | 
			
		||||
              'hostname': 'fake_instance01'}]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
addresses = [{"address": "10.0.0.1"},
 | 
			
		||||
             {"address": "10.0.0.2"},
 | 
			
		||||
             {"address": "10.0.0.3"},
 | 
			
		||||
             {"address": "10.0.0.4"},
 | 
			
		||||
             {"address": "10.0.0.5"},
 | 
			
		||||
             {"address": "10.0.0.6"}]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
networks = [{'id': 0,
 | 
			
		||||
             'uuid': "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
 | 
			
		||||
             'label': 'test0',
 | 
			
		||||
             'injected': False,
 | 
			
		||||
             'multi_host': False,
 | 
			
		||||
             'cidr': '192.168.0.0/24',
 | 
			
		||||
             'cidr_v6': '2001:db8::/64',
 | 
			
		||||
             'gateway_v6': '2001:db8::1',
 | 
			
		||||
             'netmask_v6': '64',
 | 
			
		||||
             'netmask': '255.255.255.0',
 | 
			
		||||
             'bridge': 'fa0',
 | 
			
		||||
             'bridge_interface': 'fake_fa0',
 | 
			
		||||
             'gateway': '192.168.0.1',
 | 
			
		||||
             'broadcast': '192.168.0.255',
 | 
			
		||||
             'dns1': '192.168.0.1',
 | 
			
		||||
             'dns2': '192.168.0.2',
 | 
			
		||||
             'dhcp_server': '0.0.0.0',
 | 
			
		||||
             'dhcp_start': '192.168.100.1',
 | 
			
		||||
             'vlan': None,
 | 
			
		||||
             'host': None,
 | 
			
		||||
             'project_id': 'fake_project',
 | 
			
		||||
             'vpn_public_address': '192.168.0.2'},
 | 
			
		||||
            {'id': 1,
 | 
			
		||||
             'uuid': "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
 | 
			
		||||
             'label': 'test1',
 | 
			
		||||
             'injected': False,
 | 
			
		||||
             'multi_host': False,
 | 
			
		||||
             'cidr': '192.168.1.0/24',
 | 
			
		||||
             'cidr_v6': '2001:db9::/64',
 | 
			
		||||
             'gateway_v6': '2001:db9::1',
 | 
			
		||||
             'netmask_v6': '64',
 | 
			
		||||
             'netmask': '255.255.255.0',
 | 
			
		||||
             'bridge': 'fa1',
 | 
			
		||||
             'bridge_interface': 'fake_fa1',
 | 
			
		||||
             'gateway': '192.168.1.1',
 | 
			
		||||
             'broadcast': '192.168.1.255',
 | 
			
		||||
             'dns1': '192.168.0.1',
 | 
			
		||||
             'dns2': '192.168.0.2',
 | 
			
		||||
             'dhcp_server': '0.0.0.0',
 | 
			
		||||
             'dhcp_start': '192.168.100.1',
 | 
			
		||||
             'vlan': None,
 | 
			
		||||
             'host': None,
 | 
			
		||||
             'project_id': 'fake_project',
 | 
			
		||||
             'vpn_public_address': '192.168.1.2'}]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
fixed_ips = [{'id': 0,
 | 
			
		||||
              'network_id': 0,
 | 
			
		||||
              'address': '192.168.0.100',
 | 
			
		||||
              'instance_id': 0,
 | 
			
		||||
              'allocated': True,
 | 
			
		||||
              'virtual_interface_id': 0,
 | 
			
		||||
              'virtual_interface': addresses[0],
 | 
			
		||||
              'instance': instances[0],
 | 
			
		||||
              'floating_ips': []},
 | 
			
		||||
             {'id': 1,
 | 
			
		||||
              'network_id': 1,
 | 
			
		||||
              'address': '192.168.1.100',
 | 
			
		||||
              'instance_id': 0,
 | 
			
		||||
              'allocated': True,
 | 
			
		||||
              'virtual_interface_id': 1,
 | 
			
		||||
              'virtual_interface': addresses[1],
 | 
			
		||||
              'instance': instances[0],
 | 
			
		||||
              'floating_ips': []},
 | 
			
		||||
             {'id': 2,
 | 
			
		||||
              'network_id': 1,
 | 
			
		||||
              'address': '192.168.0.101',
 | 
			
		||||
              'instance_id': 1,
 | 
			
		||||
              'allocated': True,
 | 
			
		||||
              'virtual_interface_id': 2,
 | 
			
		||||
              'virtual_interface': addresses[2],
 | 
			
		||||
              'instance': instances[1],
 | 
			
		||||
              'floating_ips': []},
 | 
			
		||||
             {'id': 3,
 | 
			
		||||
              'network_id': 0,
 | 
			
		||||
              'address': '192.168.1.101',
 | 
			
		||||
              'instance_id': 1,
 | 
			
		||||
              'allocated': True,
 | 
			
		||||
              'virtual_interface_id': 3,
 | 
			
		||||
              'virtual_interface': addresses[3],
 | 
			
		||||
              'instance': instances[1],
 | 
			
		||||
              'floating_ips': []},
 | 
			
		||||
             {'id': 4,
 | 
			
		||||
              'network_id': 0,
 | 
			
		||||
              'address': '192.168.0.102',
 | 
			
		||||
              'instance_id': 0,
 | 
			
		||||
              'allocated': True,
 | 
			
		||||
              'virtual_interface_id': 4,
 | 
			
		||||
              'virtual_interface': addresses[4],
 | 
			
		||||
              'instance': instances[0],
 | 
			
		||||
              'floating_ips': []},
 | 
			
		||||
             {'id': 5,
 | 
			
		||||
              'network_id': 1,
 | 
			
		||||
              'address': '192.168.1.102',
 | 
			
		||||
              'instance_id': 1,
 | 
			
		||||
              'allocated': True,
 | 
			
		||||
              'virtual_interface_id': 5,
 | 
			
		||||
              'virtual_interface': addresses[5],
 | 
			
		||||
              'instance': instances[1],
 | 
			
		||||
              'floating_ips': []}]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
vifs = [{'id': 0,
 | 
			
		||||
         'address': 'DE:AD:BE:EF:00:00',
 | 
			
		||||
         'uuid': '00000000-0000-0000-0000-0000000000000000',
 | 
			
		||||
         'network_id': 0,
 | 
			
		||||
         'network': networks[0],
 | 
			
		||||
         'instance_id': 0},
 | 
			
		||||
        {'id': 1,
 | 
			
		||||
         'address': 'DE:AD:BE:EF:00:01',
 | 
			
		||||
         'uuid': '00000000-0000-0000-0000-0000000000000001',
 | 
			
		||||
         'network_id': 1,
 | 
			
		||||
         'network': networks[1],
 | 
			
		||||
         'instance_id': 0},
 | 
			
		||||
        {'id': 2,
 | 
			
		||||
         'address': 'DE:AD:BE:EF:00:02',
 | 
			
		||||
         'uuid': '00000000-0000-0000-0000-0000000000000002',
 | 
			
		||||
         'network_id': 1,
 | 
			
		||||
         'network': networks[1],
 | 
			
		||||
         'instance_id': 1},
 | 
			
		||||
        {'id': 3,
 | 
			
		||||
         'address': 'DE:AD:BE:EF:00:03',
 | 
			
		||||
         'uuid': '00000000-0000-0000-0000-0000000000000003',
 | 
			
		||||
         'network_id': 0,
 | 
			
		||||
         'network': networks[0],
 | 
			
		||||
         'instance_id': 1},
 | 
			
		||||
        {'id': 4,
 | 
			
		||||
         'address': 'DE:AD:BE:EF:00:04',
 | 
			
		||||
         'uuid': '00000000-0000-0000-0000-0000000000000004',
 | 
			
		||||
         'network_id': 0,
 | 
			
		||||
         'network': networks[0],
 | 
			
		||||
         'instance_id': 0},
 | 
			
		||||
        {'id': 5,
 | 
			
		||||
         'address': 'DE:AD:BE:EF:00:05',
 | 
			
		||||
         'uuid': '00000000-0000-0000-0000-0000000000000005',
 | 
			
		||||
         'network_id': 1,
 | 
			
		||||
         'network': networks[1],
 | 
			
		||||
         'instance_id': 1}]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LinuxNetworkTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super(LinuxNetworkTestCase, self).setUp()
 | 
			
		||||
        network_driver = FLAGS.network_driver
 | 
			
		||||
        self.driver = utils.import_object(network_driver)
 | 
			
		||||
        self.driver.db = db
 | 
			
		||||
 | 
			
		||||
    def test_update_dhcp_for_nw00(self):
 | 
			
		||||
        self.flags(use_single_default_gateway=True)
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_associated_fixed_ips')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'virtual_interface_get_by_instance')
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[0],
 | 
			
		||||
                                                        fixed_ips[3]])
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[0],
 | 
			
		||||
                                                        fixed_ips[3]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[0], vifs[1]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[2], vifs[3]])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
 | 
			
		||||
        self.driver.update_dhcp(None, "eth0", networks[0])
 | 
			
		||||
 | 
			
		||||
    def test_update_dhcp_for_nw01(self):
 | 
			
		||||
        self.flags(use_single_default_gateway=True)
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_associated_fixed_ips')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'virtual_interface_get_by_instance')
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[1],
 | 
			
		||||
                                                        fixed_ips[2]])
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[1],
 | 
			
		||||
                                                        fixed_ips[2]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[0], vifs[1]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[2], vifs[3]])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
 | 
			
		||||
        self.driver.update_dhcp(None, "eth0", networks[0])
 | 
			
		||||
 | 
			
		||||
    def test_get_dhcp_hosts_for_nw00(self):
 | 
			
		||||
        self.flags(use_single_default_gateway=True)
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_associated_fixed_ips')
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[0],
 | 
			
		||||
                                                        fixed_ips[3]])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
 | 
			
		||||
        expected = \
 | 
			
		||||
        "10.0.0.1,fake_instance00.novalocal,"\
 | 
			
		||||
            "192.168.0.100,net:NW-i00000000-0\n"\
 | 
			
		||||
        "10.0.0.4,fake_instance01.novalocal,"\
 | 
			
		||||
            "192.168.1.101,net:NW-i00000001-0"
 | 
			
		||||
        actual_hosts = self.driver.get_dhcp_hosts(None, networks[1])
 | 
			
		||||
 | 
			
		||||
        self.assertEquals(actual_hosts, expected)
 | 
			
		||||
 | 
			
		||||
    def test_get_dhcp_hosts_for_nw01(self):
 | 
			
		||||
        self.flags(use_single_default_gateway=True)
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_associated_fixed_ips')
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[1],
 | 
			
		||||
                                                        fixed_ips[2]])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
 | 
			
		||||
        expected = \
 | 
			
		||||
        "10.0.0.2,fake_instance00.novalocal,"\
 | 
			
		||||
            "192.168.1.100,net:NW-i00000000-1\n"\
 | 
			
		||||
        "10.0.0.3,fake_instance01.novalocal,"\
 | 
			
		||||
            "192.168.0.101,net:NW-i00000001-1"
 | 
			
		||||
        actual_hosts = self.driver.get_dhcp_hosts(None, networks[0])
 | 
			
		||||
 | 
			
		||||
        self.assertEquals(actual_hosts, expected)
 | 
			
		||||
 | 
			
		||||
    def test_get_dhcp_opts_for_nw00(self):
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_associated_fixed_ips')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'virtual_interface_get_by_instance')
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[0],
 | 
			
		||||
                                                        fixed_ips[3],
 | 
			
		||||
                                                        fixed_ips[4]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[0],
 | 
			
		||||
                                                         vifs[1],
 | 
			
		||||
                                                         vifs[4]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[2],
 | 
			
		||||
                                                         vifs[3],
 | 
			
		||||
                                                         vifs[5]])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
 | 
			
		||||
        expected_opts = 'NW-i00000001-0,3'
 | 
			
		||||
        actual_opts = self.driver.get_dhcp_opts(None, networks[0])
 | 
			
		||||
 | 
			
		||||
        self.assertEquals(actual_opts, expected_opts)
 | 
			
		||||
 | 
			
		||||
    def test_get_dhcp_opts_for_nw01(self):
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_associated_fixed_ips')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'virtual_interface_get_by_instance')
 | 
			
		||||
 | 
			
		||||
        db.network_get_associated_fixed_ips(mox.IgnoreArg(),
 | 
			
		||||
                                            mox.IgnoreArg())\
 | 
			
		||||
                                            .AndReturn([fixed_ips[1],
 | 
			
		||||
                                                        fixed_ips[2],
 | 
			
		||||
                                                        fixed_ips[5]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[0],
 | 
			
		||||
                                                         vifs[1],
 | 
			
		||||
                                                         vifs[4]])
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg())\
 | 
			
		||||
                                             .AndReturn([vifs[2],
 | 
			
		||||
                                                         vifs[3],
 | 
			
		||||
                                                         vifs[5]])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
 | 
			
		||||
        expected_opts = "NW-i00000000-1,3"
 | 
			
		||||
        actual_opts = self.driver.get_dhcp_opts(None, networks[1])
 | 
			
		||||
 | 
			
		||||
        self.assertEquals(actual_opts, expected_opts)
 | 
			
		||||
 | 
			
		||||
    def test_dhcp_opts_not_default_gateway_network(self):
 | 
			
		||||
        expected = "NW-i00000000-0,3"
 | 
			
		||||
        actual = self.driver._host_dhcp_opts(fixed_ips[0])
 | 
			
		||||
        self.assertEquals(actual, expected)
 | 
			
		||||
 | 
			
		||||
    def test_host_dhcp_without_default_gateway_network(self):
 | 
			
		||||
        expected = ("10.0.0.1,fake_instance00.novalocal,192.168.0.100")
 | 
			
		||||
        actual = self.driver._host_dhcp(fixed_ips[0])
 | 
			
		||||
        self.assertEquals(actual, expected)
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
			
		||||
# License for the specific language governing permissions and limitations
 | 
			
		||||
# under the License.
 | 
			
		||||
import mox
 | 
			
		||||
 | 
			
		||||
from nova import context
 | 
			
		||||
from nova import db
 | 
			
		||||
@@ -21,9 +22,7 @@ from nova import exception
 | 
			
		||||
from nova import log as logging
 | 
			
		||||
from nova import test
 | 
			
		||||
from nova.network import manager as network_manager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import mox
 | 
			
		||||
from nova.tests import fake_network
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOG = logging.getLogger('nova.tests.network')
 | 
			
		||||
@@ -58,7 +57,7 @@ networks = [{'id': 0,
 | 
			
		||||
             'dns1': '192.168.0.1',
 | 
			
		||||
             'dns2': '192.168.0.2',
 | 
			
		||||
             'vlan': None,
 | 
			
		||||
             'host': None,
 | 
			
		||||
             'host': HOST,
 | 
			
		||||
             'project_id': 'fake_project',
 | 
			
		||||
             'vpn_public_address': '192.168.0.2'},
 | 
			
		||||
            {'id': 1,
 | 
			
		||||
@@ -78,7 +77,7 @@ networks = [{'id': 0,
 | 
			
		||||
             'dns1': '192.168.0.1',
 | 
			
		||||
             'dns2': '192.168.0.2',
 | 
			
		||||
             'vlan': None,
 | 
			
		||||
             'host': None,
 | 
			
		||||
             'host': HOST,
 | 
			
		||||
             'project_id': 'fake_project',
 | 
			
		||||
             'vpn_public_address': '192.168.1.2'}]
 | 
			
		||||
 | 
			
		||||
@@ -138,60 +137,50 @@ class FlatNetworkTestCase(test.TestCase):
 | 
			
		||||
                                              is_admin=False)
 | 
			
		||||
 | 
			
		||||
    def test_get_instance_nw_info(self):
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'fixed_ip_get_by_instance')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'virtual_interface_get_by_instance')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'instance_type_get')
 | 
			
		||||
        fake_get_instance_nw_info = fake_network.fake_get_instance_nw_info
 | 
			
		||||
 | 
			
		||||
        db.fixed_ip_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                    mox.IgnoreArg()).AndReturn(fixed_ips)
 | 
			
		||||
        db.virtual_interface_get_by_instance(mox.IgnoreArg(),
 | 
			
		||||
                                             mox.IgnoreArg()).AndReturn(vifs)
 | 
			
		||||
        db.instance_type_get(mox.IgnoreArg(),
 | 
			
		||||
                                   mox.IgnoreArg()).AndReturn(flavor)
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
        nw_info = fake_get_instance_nw_info(self.stubs, 0, 2)
 | 
			
		||||
        self.assertFalse(nw_info)
 | 
			
		||||
 | 
			
		||||
        nw_info = self.network.get_instance_nw_info(None, 0, 0, None)
 | 
			
		||||
 | 
			
		||||
        self.assertTrue(nw_info)
 | 
			
		||||
 | 
			
		||||
        for i, nw in enumerate(nw_info):
 | 
			
		||||
            i8 = i + 8
 | 
			
		||||
            check = {'bridge': 'fa%s' % i,
 | 
			
		||||
        for i, (nw, info) in enumerate(nw_info):
 | 
			
		||||
            check = {'bridge': 'fake_br%d' % i,
 | 
			
		||||
                     'cidr': '192.168.%s.0/24' % i,
 | 
			
		||||
                     'cidr_v6': '2001:db%s::/64' % i8,
 | 
			
		||||
                     'cidr_v6': '2001:db8:0:%x::/64' % i,
 | 
			
		||||
                     'id': i,
 | 
			
		||||
                     'multi_host': False,
 | 
			
		||||
                     'injected': 'DONTCARE',
 | 
			
		||||
                     'bridge_interface': 'fake_fa%s' % i,
 | 
			
		||||
                     'injected': False,
 | 
			
		||||
                     'bridge_interface': 'fake_eth%d' % i,
 | 
			
		||||
                     'vlan': None}
 | 
			
		||||
 | 
			
		||||
            self.assertDictMatch(nw[0], check)
 | 
			
		||||
            self.assertDictMatch(nw, check)
 | 
			
		||||
 | 
			
		||||
            check = {'broadcast': '192.168.%s.255' % i,
 | 
			
		||||
                     'dhcp_server': '192.168.%s.1' % i,
 | 
			
		||||
                     'dns': 'DONTCARE',
 | 
			
		||||
                     'gateway': '192.168.%s.1' % i,
 | 
			
		||||
                     'gateway6': '2001:db%s::1' % i8,
 | 
			
		||||
            check = {'broadcast': '192.168.%d.255' % i,
 | 
			
		||||
                     'dhcp_server': '192.168.%d.1' % i,
 | 
			
		||||
                     'dns': ['192.168.%d.3' % n, '192.168.%d.4' % n],
 | 
			
		||||
                     'gateway': '192.168.%d.1' % i,
 | 
			
		||||
                     'gateway6': '2001:db8:0:%x::1' % i,
 | 
			
		||||
                     'ip6s': 'DONTCARE',
 | 
			
		||||
                     'ips': 'DONTCARE',
 | 
			
		||||
                     'label': 'test%s' % i,
 | 
			
		||||
                     'mac': 'DE:AD:BE:EF:00:0%s' % i,
 | 
			
		||||
                     'vif_uuid': ('00000000-0000-0000-0000-000000000000000%s' %
 | 
			
		||||
                                  i),
 | 
			
		||||
                     'rxtx_cap': 'DONTCARE',
 | 
			
		||||
                     'label': 'test%d' % i,
 | 
			
		||||
                     'mac': 'DE:AD:BE:EF:00:%02x' % i,
 | 
			
		||||
                     'vif_uuid':
 | 
			
		||||
                        '00000000-0000-0000-0000-00000000000000%02d' % i,
 | 
			
		||||
                     'rxtx_cap': 3,
 | 
			
		||||
                     'should_create_vlan': False,
 | 
			
		||||
                     'should_create_bridge': False}
 | 
			
		||||
            self.assertDictMatch(nw[1], check)
 | 
			
		||||
            self.assertDictMatch(info, check)
 | 
			
		||||
 | 
			
		||||
            check = [{'enabled': 'DONTCARE',
 | 
			
		||||
                      'ip': '2001:db%s::dcad:beff:feef:%s' % (i8, i),
 | 
			
		||||
                      'ip': '2001:db8::dcad:beff:feef:%s' % i,
 | 
			
		||||
                      'netmask': '64'}]
 | 
			
		||||
            self.assertDictListMatch(nw[1]['ip6s'], check)
 | 
			
		||||
            self.assertDictListMatch(info['ip6s'], check)
 | 
			
		||||
 | 
			
		||||
            check = [{'enabled': '1',
 | 
			
		||||
                      'ip': '192.168.%s.100' % i,
 | 
			
		||||
                      'netmask': '255.255.255.0'}]
 | 
			
		||||
            self.assertDictListMatch(nw[1]['ips'], check)
 | 
			
		||||
            num_fixed_ips = len(info['ips'])
 | 
			
		||||
            check = [{'enabled': 'DONTCARE',
 | 
			
		||||
                      'ip': '192.168.%d.1%02d' % (i, ip_num),
 | 
			
		||||
                      'netmask': '255.255.255.0'}
 | 
			
		||||
                      for ip_num in xrange(num_fixed_ips)]
 | 
			
		||||
            self.assertDictListMatch(info['ips'], check)
 | 
			
		||||
 | 
			
		||||
    def test_validate_networks(self):
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get_all_by_uuids')
 | 
			
		||||
@@ -252,6 +241,34 @@ class FlatNetworkTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
        self.network.validate_networks(None, requested_networks)
 | 
			
		||||
 | 
			
		||||
    def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_update')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'instance_get')
 | 
			
		||||
        self.mox.StubOutWithMock(db,
 | 
			
		||||
                              'virtual_interface_get_by_instance_and_network')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
 | 
			
		||||
 | 
			
		||||
        db.fixed_ip_update(mox.IgnoreArg(),
 | 
			
		||||
                           mox.IgnoreArg(),
 | 
			
		||||
                           mox.IgnoreArg())
 | 
			
		||||
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
 | 
			
		||||
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
 | 
			
		||||
 | 
			
		||||
        db.instance_get(mox.IgnoreArg(),
 | 
			
		||||
                        mox.IgnoreArg()).AndReturn({'security_groups':
 | 
			
		||||
                                                             [{'id': 0}]})
 | 
			
		||||
        db.fixed_ip_associate_pool(mox.IgnoreArg(),
 | 
			
		||||
                                   mox.IgnoreArg(),
 | 
			
		||||
                                   mox.IgnoreArg()).AndReturn('192.168.0.101')
 | 
			
		||||
        db.network_get(mox.IgnoreArg(),
 | 
			
		||||
                       mox.IgnoreArg()).AndReturn(networks[0])
 | 
			
		||||
        db.network_update(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
        self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
 | 
			
		||||
                                              networks[0]['id'])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VlanNetworkTestCase(test.TestCase):
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
@@ -392,6 +409,32 @@ class VlanNetworkTestCase(test.TestCase):
 | 
			
		||||
                          mox.IgnoreArg(),
 | 
			
		||||
                          mox.IgnoreArg())
 | 
			
		||||
 | 
			
		||||
    def test_add_fixed_ip_instance_without_vpn_requested_networks(self):
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'network_get')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'fixed_ip_associate_pool')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'instance_get')
 | 
			
		||||
        self.mox.StubOutWithMock(db,
 | 
			
		||||
                              'virtual_interface_get_by_instance_and_network')
 | 
			
		||||
        self.mox.StubOutWithMock(db, 'fixed_ip_update')
 | 
			
		||||
 | 
			
		||||
        db.fixed_ip_update(mox.IgnoreArg(),
 | 
			
		||||
                           mox.IgnoreArg(),
 | 
			
		||||
                           mox.IgnoreArg())
 | 
			
		||||
        db.virtual_interface_get_by_instance_and_network(mox.IgnoreArg(),
 | 
			
		||||
                mox.IgnoreArg(), mox.IgnoreArg()).AndReturn({'id': 0})
 | 
			
		||||
 | 
			
		||||
        db.instance_get(mox.IgnoreArg(),
 | 
			
		||||
                        mox.IgnoreArg()).AndReturn({'security_groups':
 | 
			
		||||
                                                             [{'id': 0}]})
 | 
			
		||||
        db.fixed_ip_associate_pool(mox.IgnoreArg(),
 | 
			
		||||
                                   mox.IgnoreArg(),
 | 
			
		||||
                                   mox.IgnoreArg()).AndReturn('192.168.0.101')
 | 
			
		||||
        db.network_get(mox.IgnoreArg(),
 | 
			
		||||
                       mox.IgnoreArg()).AndReturn(networks[0])
 | 
			
		||||
        self.mox.ReplayAll()
 | 
			
		||||
        self.network.add_fixed_ip_to_instance(self.context, 1, HOST,
 | 
			
		||||
                                              networks[0]['id'])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CommonNetworkTestCase(test.TestCase):
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								po/cs.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/cs.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-02-07 12:45+0000\n"
 | 
			
		||||
"Last-Translator: David Pravec <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:22+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: Czech <cs@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:43+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2789,21 +2789,3 @@ msgstr ""
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr "AMQP server na %s:%d není dosažitelný. Zkusím znovu za %d sekund."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Příkaz: %s\n"
 | 
			
		||||
#~ "Vrácená hodnota: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								po/de.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-06-06 07:58+0000\n"
 | 
			
		||||
"Last-Translator: Christian Berendt <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:23+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: German <de@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2798,42 +2798,6 @@ msgstr ""
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Kommando: %s\n"
 | 
			
		||||
#~ "Exit Code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "(%s) publish (key: %s) %s"
 | 
			
		||||
#~ msgstr "(%s) öffentlich (Schlüssel: %s) %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting from %s: %s"
 | 
			
		||||
#~ msgstr "Beziehe von %s: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Der AMQP server %s:%d ist nicht erreichbar. Erneuter Versuch in %d Sekunden."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "volume %s: creating lv of size %sG"
 | 
			
		||||
#~ msgstr "Volume %s: erstelle LV mit %sG"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Data store %s is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Datastore %s ist nicht erreichbar. Versuche es erneut in %d Sekunden."
 | 
			
		||||
 | 
			
		||||
#~ msgid "Full set of FLAGS:"
 | 
			
		||||
#~ msgstr "Alle vorhandenen FLAGS:"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										484
									
								
								po/es.po
									
									
									
									
									
								
							
							
						
						
									
										484
									
								
								po/es.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-01 03:23+0000\n"
 | 
			
		||||
"Last-Translator: Juan Alfredo Salas Santillana <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:22+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: Spanish <es@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2838,221 +2838,16 @@ msgstr "Agregando usuario %(user)s al proyecto %(project)s"
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr "Eliminando el usuario %(user)s del proyecto %(project)s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Comando: %s\n"
 | 
			
		||||
#~ "Código de salida: %s\n"
 | 
			
		||||
#~ "Stdout: %s\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "(%s) publish (key: %s) %s"
 | 
			
		||||
#~ msgstr "(%s) públicar (clave: %s) %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "El servidor AMQP en %s:%d no se puede alcanzar. Se reintentará en %d "
 | 
			
		||||
#~ "segundos."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Binding %s to %s with key %s"
 | 
			
		||||
#~ msgstr "Asociando %s a %s con clave %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting from %s: %s"
 | 
			
		||||
#~ msgstr "Obteniendo desde %s: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Starting %s node"
 | 
			
		||||
#~ msgstr "Inciando nodo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Data store %s is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "El almacen de datos %s es inalcanzable. Reintentandolo en %d segundos."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Serving %s"
 | 
			
		||||
#~ msgstr "Sirviendo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Couldn't get IP, using 127.0.0.1 %s"
 | 
			
		||||
#~ msgstr "No puedo obtener IP, usando 127.0.0.1 %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Access key %s has had %d failed authentications and will be locked out for "
 | 
			
		||||
#~ "%d minutes."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "La clave de acceso %s ha tenido %d fallos de autenticación y se bloqueará "
 | 
			
		||||
#~ "por %d minutos."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "arg: %s\t\tval: %s"
 | 
			
		||||
#~ msgstr "arg: %s \t \t val: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Authenticated Request For %s:%s)"
 | 
			
		||||
#~ msgstr "Solicitud de autenticación para %s:%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s for project %s"
 | 
			
		||||
#~ msgstr "Añadiendo rol %s al usuario %s para el proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s for project %s"
 | 
			
		||||
#~ msgstr "Eliminando rol %s del usuario %s para el proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized request for controller=%s and action=%s"
 | 
			
		||||
#~ msgstr "Solicitud no autorizada para controller=%s y action=%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting x509 for user: %s on project: %s"
 | 
			
		||||
#~ msgstr "Obteniendo x509 para el usuario: %s en el proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Create project %s managed by %s"
 | 
			
		||||
#~ msgstr "Creación del proyecto %s gestionada por %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing user %s from project %s"
 | 
			
		||||
#~ msgstr "Eliminando usuario %s del proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding user %s to project %s"
 | 
			
		||||
#~ msgstr "Añadiendo usuario %s al proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unsupported API request: controller = %s,action = %s"
 | 
			
		||||
#~ msgstr "Solicitud de API no soportada: controller=%s,action=%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Associate address %s to instance %s"
 | 
			
		||||
#~ msgstr "Asociar dirección %s a la instancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Attach volume %s to instacne %s at %s"
 | 
			
		||||
#~ msgstr "Asociar volumen %s a la instancia %s en %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Registered image %s with id %s"
 | 
			
		||||
#~ msgstr "Registrada imagen %s con id %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is already a member of the group %s"
 | 
			
		||||
#~ msgstr "El usuario %s ya es miembro de el grupo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is not a member of project %s"
 | 
			
		||||
#~ msgstr "El usuario %s no es miembro del proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "failed authorization: no project named %s (user=%s)"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "fallo de autorización: no existe proyecto con el nombre %s (usuario=%s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Failed authorization: user %s not admin and not member of project %s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Fallo de autorización: el usuario %s no es administrador y no es miembro del "
 | 
			
		||||
#~ "proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created user %s (admin: %r)"
 | 
			
		||||
#~ msgstr "Creado usuario %s (administrador: %r)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created project %s with manager %s"
 | 
			
		||||
#~ msgstr "Proyecto %s creado con administrador %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s on project %s"
 | 
			
		||||
#~ msgstr "Eliminando rol %s al usuario %s en el proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s in project %s"
 | 
			
		||||
#~ msgstr "Añadiendo rol %s al usuario %s en el proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Remove user %s from project %s"
 | 
			
		||||
#~ msgstr "Eliminar usuario %s del proyecto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Admin status set to %r for user %s"
 | 
			
		||||
#~ msgstr "El estado del administrador se ha fijado a %r para el usuario %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Going to try and terminate %s"
 | 
			
		||||
#~ msgstr "Se va a probar y terminar %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Casting to scheduler for %s/%s's instance %s"
 | 
			
		||||
#~ msgstr "Llamando al planificar para %s/%s insntancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Quota exceeeded for %s, tried to run %s instances"
 | 
			
		||||
#~ msgstr "Quota superada por %s, intentando lanzar %s instancias"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "check_instance_lock: arguments: |%s| |%s| |%s|"
 | 
			
		||||
#~ msgstr "check_instance_lock: arguments: |%s| |%s| |%s|"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Input partition size not evenly divisible by sector size: %d / %d"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "El tamaño de la partición de entrada no es divisible de forma uniforme por "
 | 
			
		||||
#~ "el tamaño del sector: %d / %d"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Bytes for local storage not evenly divisible by sector size: %d / %d"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Los bytes del almacenamiento local no son divisibles de forma uniforme por "
 | 
			
		||||
#~ "el tamaño del sector: %d / %d"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "volume %s: creating lv of size %sG"
 | 
			
		||||
#~ msgstr "volumen %s: creando lv de tamaño %sG"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Disassociating address %s"
 | 
			
		||||
#~ msgstr "Desasociando la dirección %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "trying to reboot a non-running instance: %s (state: %s excepted: %s)"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "intentando reiniciar una instancia que no está en ejecución: %s (estado: %s "
 | 
			
		||||
#~ "esperado: %s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "trying to snapshot a non-running instance: %s (state: %s excepted: %s)"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "intentando crear un snapshot de una instancia que no está en ejecución: %s "
 | 
			
		||||
#~ "(estado: %s esperado: %s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Detach volume %s from mountpoint %s on instance %s"
 | 
			
		||||
#~ msgstr "Desvinculando volumen %s del punto de montaje %s en la instancia %s"
 | 
			
		||||
 | 
			
		||||
#~ msgid "unexpected exception getting connection"
 | 
			
		||||
#~ msgstr "excepción inexperada al obtener la conexión"
 | 
			
		||||
 | 
			
		||||
#~ msgid "unexpected error during update"
 | 
			
		||||
#~ msgstr "error inesperado durante la actualización"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Cannot get blockstats for \"%s\" on \"%s\""
 | 
			
		||||
#~ msgstr "No puedo obtener estadísticas del bloque para \"%s\" en \"%s\""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "updating %s..."
 | 
			
		||||
#~ msgstr "actualizando %s..."
 | 
			
		||||
@@ -3061,285 +2856,14 @@ msgstr "Eliminando el usuario %(user)s del proyecto %(project)s"
 | 
			
		||||
#~ msgid "Found instance: %s"
 | 
			
		||||
#~ msgstr "Encontrada interfaz: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Cannot get ifstats for \"%s\" on \"%s\""
 | 
			
		||||
#~ msgstr "No puedo obtener estadísticas de la interfaz para \"%s\" en \"%s\""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No instance for id %s"
 | 
			
		||||
#~ msgstr "No hay instancia con id %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "no keypair for user %s, name %s"
 | 
			
		||||
#~ msgstr "no hay par de claves para el usuario %s, nombre %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No service for %s, %s"
 | 
			
		||||
#~ msgstr "No hay servicio para %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No volume for id %s"
 | 
			
		||||
#~ msgstr "No hay volumen para el id %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No security group named %s for project: %s"
 | 
			
		||||
#~ msgstr "No hay un grupo de seguridad con nombre %s para el proyecto: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Parallax returned HTTP error %d from request for /images/detail"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Parallax ha devuelto un error HTTP %d para la petición para /images/detail"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Parallax returned HTTP error %d from request for /images"
 | 
			
		||||
#~ msgstr "Parallax ha devuelto un error HTTP %d a la petición para /images"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "IP %s leased to bad mac %s vs %s"
 | 
			
		||||
#~ msgstr "IP %s asociada a una mac incorrecta %s vs %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized attempt to get object %s from bucket %s"
 | 
			
		||||
#~ msgstr "Intento no autorizado de obtener el objeto %s en el cubo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting object: %s / %s"
 | 
			
		||||
#~ msgstr "Obteniendo objeto: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Putting object: %s / %s"
 | 
			
		||||
#~ msgstr "Colocando objeto: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized attempt to upload object %s to bucket %s"
 | 
			
		||||
#~ msgstr "Intento no autorizado de subir el objeto %s al cubo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Deleting object: %s / %s"
 | 
			
		||||
#~ msgstr "Eliminando objeto: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Toggling publicity flag of image %s %r"
 | 
			
		||||
#~ msgstr "Cambiando los atributos de publicidad de la imagen %s %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Creating disk for %s by attaching disk file %s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Creando disco para %s a través de la asignación del fichero de disco %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "WMI job succeeded: %s, Elapsed=%s "
 | 
			
		||||
#~ msgstr "Trabajo WMI ha tenido exito: %s, Transcurrido=%s "
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created switch port %s on switch %s"
 | 
			
		||||
#~ msgstr "Creado puerto %s en el switch %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: deleting instance files %s"
 | 
			
		||||
#~ msgstr "instancia %s: eliminando los ficheros de la instancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Finished retreving %s -- placed in %s"
 | 
			
		||||
#~ msgstr "Finalizada la obtención de %s -- coloado en %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Failed to change vm state of %s to %s"
 | 
			
		||||
#~ msgstr "Fallo al cambiar el estado de la vm de %s a %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Successfully changed vm state of %s to %s"
 | 
			
		||||
#~ msgstr "Cambio de estado de la vm con éxito de %s a %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Got Info for vm %s: state=%s, mem=%s, num_cpu=%s,                     "
 | 
			
		||||
#~ "cpu_time=%s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Obtenida información para vm %s: state=%s, mem=%s, num_cpu=%s, cpu_time=%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: ignoring error injecting data into image %s (%s)"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "instancia %s: ignorando el error al inyectar datos en la imagen %s (%s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Contents of file %s: %r"
 | 
			
		||||
#~ msgstr "Contenidos del fichero %s: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: injecting net into image %s"
 | 
			
		||||
#~ msgstr "instancia %s: inyectando red en la imagen %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: injecting key into image %s"
 | 
			
		||||
#~ msgstr "instancia %s: inyectando clave en la imagen %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "data: %r, fpath: %r"
 | 
			
		||||
#~ msgstr "datos: %r, fpath: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Task [%s] %s status: %s    %s"
 | 
			
		||||
#~ msgstr "Tarea [%s] %s estado: %s %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Task [%s] %s status: success    %s"
 | 
			
		||||
#~ msgstr "Tarea [%s] %s estado: éxito %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Calling %s %s"
 | 
			
		||||
#~ msgstr "Llamando %s %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "%s: _db_content => %s"
 | 
			
		||||
#~ msgstr "%s: _db_content => %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created VBD %s for VM %s, VDI %s."
 | 
			
		||||
#~ msgstr "Creado VBD %s for VM %s, VDI %s."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Creating VBD for VM %s, VDI %s ... "
 | 
			
		||||
#~ msgstr "Creando VBD para VM %s, VDI %s... "
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created VIF %s for VM %s, network %s."
 | 
			
		||||
#~ msgstr "Creado VIF %s para VM %s, red %s."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Creating VIF for VM %s, network %s."
 | 
			
		||||
#~ msgstr "Creando VIF para VM %s, red %s."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created VM %s as %s."
 | 
			
		||||
#~ msgstr "Creada VM %s cómo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Asking xapi to upload %s as '%s'"
 | 
			
		||||
#~ msgstr "Solicitando a xapi la subida de %s cómo %s'"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "VHD %s has parent %s"
 | 
			
		||||
#~ msgstr "VHD %s tiene cómo padre a %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Asking xapi to fetch %s as %s"
 | 
			
		||||
#~ msgstr "Solicitando a xapi obtener %s cómo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "PV Kernel in VDI:%d"
 | 
			
		||||
#~ msgstr "PV Kernel en VDI:%d"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unexpected number of VDIs (%s) found for VM %s"
 | 
			
		||||
#~ msgstr "Número no esperado de VDIs (%s) encontrados para VM %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Parent %s doesn't match original parent %s, waiting for coalesce..."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "El padre %s no concuerda con el padre original %s, esperando la unión..."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "suspend: instance not present %s"
 | 
			
		||||
#~ msgstr "suspendido: instancia no encontrada: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Introduced %s as %s."
 | 
			
		||||
#~ msgstr "Introducido %s cómo %s."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "resume: instance not present %s"
 | 
			
		||||
#~ msgstr "reanudar: instancia no encontrada %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Instance not found %s"
 | 
			
		||||
#~ msgstr "instancia no encontrada %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Ignoring exception %s when getting PBDs for %s"
 | 
			
		||||
#~ msgstr "Ignorando excepción %s al obtener PBDs de %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to create VDI on SR %s for instance %s"
 | 
			
		||||
#~ msgstr "Inpoisble crear VDI en SR %s para la instancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to obtain target information %s, %s"
 | 
			
		||||
#~ msgstr "Imposible obtener información del destino %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Ignoring exception %s when forgetting SR %s"
 | 
			
		||||
#~ msgstr "Ignorando excepción %s al olvidar SR %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Ignoring exception %s when unplugging PBD %s"
 | 
			
		||||
#~ msgstr "Ignorando excepción %s al desconectar PBD %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Attach_volume: %s, %s, %s"
 | 
			
		||||
#~ msgstr "Attach_volume: %s, %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to use SR %s for instance %s"
 | 
			
		||||
#~ msgstr "Imposible utilizar SR %s para la instancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Mountpoint %s attached to instance %s"
 | 
			
		||||
#~ msgstr "Punto de montaje %s unido a la instancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Detach_volume: %s, %s"
 | 
			
		||||
#~ msgstr "Detach_volume: %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Mountpoint %s detached from instance %s"
 | 
			
		||||
#~ msgstr "Punto d emontaje %s desasociado de la instancia %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Quota exceeeded for %s, tried to create %sG volume"
 | 
			
		||||
#~ msgstr "Quota excedida para %s, intentando crear el volumen %sG"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Volume quota exceeded. You cannot create a volume of size %s"
 | 
			
		||||
#~ msgstr "Quota de volumen superada. No puedes crear un volumen de tamaño %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: attach failed %s, removing"
 | 
			
		||||
#~ msgstr "instalación %s: asociación fallida %s, eliminando"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: attaching volume %s to %s"
 | 
			
		||||
#~ msgstr "instancia %s: asociando volumen %s a %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Snapshotting VM %s with label '%s'..."
 | 
			
		||||
#~ msgstr "Creando snapshot de la VM %s con la etiqueta '%s'..."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created snapshot %s from VM %s."
 | 
			
		||||
#~ msgstr "Creando snapshot %s de la VM %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to Snapshot %s: %s"
 | 
			
		||||
#~ msgstr "Incapaz de realizar snapshot %s: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding sitewide role %s to user %s"
 | 
			
		||||
#~ msgstr "Añadiendo rol global %s al usuario %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing sitewide role %s from user %s"
 | 
			
		||||
#~ msgstr "Eliminando rol global %s del usuario %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Del: disk %s vm %s"
 | 
			
		||||
#~ msgstr "Del: disco %s vm %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Spawning VM %s created %s."
 | 
			
		||||
#~ msgstr "Iniciando VM %s creado %s."
 | 
			
		||||
 | 
			
		||||
#~ msgid "No such process"
 | 
			
		||||
#~ msgstr "No existe el proceso"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								po/it.po
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								po/it.po
									
									
									
									
									
								
							@@ -14,7 +14,7 @@ msgstr ""
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-22 04:48+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-23 05:21+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										479
									
								
								po/ja.po
									
									
									
									
									
								
							
							
						
						
									
										479
									
								
								po/ja.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-05-10 10:26+0000\n"
 | 
			
		||||
"Last-Translator: Akira YOSHIYAMA <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:22+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: \n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2840,44 +2840,6 @@ msgstr "ユーザ %(user)s をプロジェクト %(project)s に追加します
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr "ユーザ %(user)s をプロジェクト %(project)s から削除します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "コマンド: %s\n"
 | 
			
		||||
#~ "終了コード: %s\n"
 | 
			
		||||
#~ "標準出力: %r\n"
 | 
			
		||||
#~ "標準エラー出力: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "(%s) publish (key: %s) %s"
 | 
			
		||||
#~ msgstr "(%s) パブリッシュ (key: %s) %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Binding %s to %s with key %s"
 | 
			
		||||
#~ msgstr "%s を %s にキー %s でバインドします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting from %s: %s"
 | 
			
		||||
#~ msgstr "%s から %s を取得"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr "AMQPサーバ %s:%d に接続できません。 %d 秒後に再度試みます。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Starting %s node"
 | 
			
		||||
#~ msgstr "ノード %s を開始します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Data store %s is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr "データストア %s に接続できません。 %d 秒後に再接続します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Serving %s"
 | 
			
		||||
#~ msgstr "%s サービスの開始"
 | 
			
		||||
@@ -2889,166 +2851,6 @@ msgstr "ユーザ %(user)s をプロジェクト %(project)s から削除しま
 | 
			
		||||
#~ msgid "pidfile %s does not exist. Daemon not running?\n"
 | 
			
		||||
#~ msgstr "pidfile %s が存在しません。デーモンは実行中ですか?\n"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Couldn't get IP, using 127.0.0.1 %s"
 | 
			
		||||
#~ msgstr "IPを取得できません。127.0.0.1 を %s として使います。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Access key %s has had %d failed authentications and will be locked out for "
 | 
			
		||||
#~ "%d minutes."
 | 
			
		||||
#~ msgstr "アクセスキー %s は %d 回認証に失敗したため、%d 分間ロックされます。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Authenticated Request For %s:%s)"
 | 
			
		||||
#~ msgstr "リクエストを認証しました: %s:%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "arg: %s\t\tval: %s"
 | 
			
		||||
#~ msgstr "引数(arg): %s\t値(val): %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized request for controller=%s and action=%s"
 | 
			
		||||
#~ msgstr "許可されていないリクエスト: controller=%s, action %sです。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s for project %s"
 | 
			
		||||
#~ msgstr "Adding role: ロール %s をユーザ %s、プロジェクト %s に追加します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding sitewide role %s to user %s"
 | 
			
		||||
#~ msgstr "Adding sitewide role: サイトワイドのロール %s をユーザ %s に追加します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s for project %s"
 | 
			
		||||
#~ msgstr "Removing role: ロール %s をユーザ %s プロジェクト %s から削除します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing sitewide role %s from user %s"
 | 
			
		||||
#~ msgstr "Removing sitewide role: サイトワイドのロール %s をユーザ %s から削除します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting x509 for user: %s on project: %s"
 | 
			
		||||
#~ msgstr "Getting X509: x509の取得: ユーザ %s, プロジェクト %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Create project %s managed by %s"
 | 
			
		||||
#~ msgstr "Create project: プロジェクト %s (%s により管理される)を作成します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding user %s to project %s"
 | 
			
		||||
#~ msgstr "Adding user: ユーザ %s をプロジェクト %s に追加します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing user %s from project %s"
 | 
			
		||||
#~ msgstr "Removing user: ユーザ %s をプロジェクト %s から削除します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unsupported API request: controller = %s,action = %s"
 | 
			
		||||
#~ msgstr "サポートされていないAPIリクエストです。 controller = %s,action = %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Attach volume %s to instacne %s at %s"
 | 
			
		||||
#~ msgstr "Attach volume: ボリューム%s をインスタンス %s にデバイス %s でアタッチします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Associate address %s to instance %s"
 | 
			
		||||
#~ msgstr "Associate address: アドレス %s をインスタンス %s に関連付けます。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Registered image %s with id %s"
 | 
			
		||||
#~ msgstr "Registered image: イメージ %s をid %s で登録します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is already a member of the group %s"
 | 
			
		||||
#~ msgstr "ユーザ %s は既にグループ %s のメンバーです。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "failed authorization: no project named %s (user=%s)"
 | 
			
		||||
#~ msgstr "Failed authorization: 認証に失敗しました。プロジェクト名 %s (ユーザ = %s) は存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Failed authorization: user %s not admin and not member of project %s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Failed authorization: 認証に失敗しました: ユーザ %s は管理者ではなくかつプロジェクト %s のメンバーではありません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is not a member of project %s"
 | 
			
		||||
#~ msgstr "ユーザ %s はプロジェクト %s のメンバーではありません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s in project %s"
 | 
			
		||||
#~ msgstr "Adding role: ロール %s をユーザ %s (プロジェクト %s の) に追加します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s on project %s"
 | 
			
		||||
#~ msgstr "Removing role: ロール %s をユーザ %s (プロジェクト %s の)から削除します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created project %s with manager %s"
 | 
			
		||||
#~ msgstr "Created project: プロジェクト %s (マネージャ %s)を作成します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Remove user %s from project %s"
 | 
			
		||||
#~ msgstr "Remove user: ユーザ %s をプロジェクト %s から削除します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created user %s (admin: %r)"
 | 
			
		||||
#~ msgstr "Created user: ユーザ %s (admin: %r) を作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Admin status set to %r for user %s"
 | 
			
		||||
#~ msgstr "Admin status set: 管理者ステータス %r をユーザ %s に設定します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Quota exceeeded for %s, tried to run %s instances"
 | 
			
		||||
#~ msgstr "%s のクオータ上限を超えました。%s インスタンスを実行しようとしました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Casting to scheduler for %s/%s's instance %s"
 | 
			
		||||
#~ msgstr "スケジューラに対して %s/%s のインスタンス %s を送信します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Going to try and terminate %s"
 | 
			
		||||
#~ msgstr "%s を終了します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Input partition size not evenly divisible by sector size: %d / %d"
 | 
			
		||||
#~ msgstr "インプットパーティションサイズがセクターサイズで割り切れません。 %d / %d"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Bytes for local storage not evenly divisible by sector size: %d / %d"
 | 
			
		||||
#~ msgstr "ローカルストレージのバイト数がセクターサイズで割り切れません: %d / %d"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "check_instance_lock: arguments: |%s| |%s| |%s|"
 | 
			
		||||
#~ msgstr "check_instance_lock: arguments: |%s| |%s| |%s|"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Disassociating address %s"
 | 
			
		||||
#~ msgstr "アドレス %s の関連付けを解除(disassociate)しています。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "trying to reboot a non-running instance: %s (state: %s excepted: %s)"
 | 
			
		||||
#~ msgstr "実行していないインスタンスの再起動を試みます。%s (状態: %s 期待する状態: %s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "trying to snapshot a non-running instance: %s (state: %s excepted: %s)"
 | 
			
		||||
#~ msgstr "実行していないインスタンスのスナップショット取得を試みます。%s (状態: %s 期待する状態: %s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: attaching volume %s to %s"
 | 
			
		||||
#~ msgstr "attaching volume: インスタンス %s についてボリューム %s を %s にアタッチします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: attach failed %s, removing"
 | 
			
		||||
#~ msgstr "インスタンス %s: %sのアタッチに失敗しました。リムーブします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Detach volume %s from mountpoint %s on instance %s"
 | 
			
		||||
#~ msgstr "Detach volume: ボリューム %s をマウントポイント %s (インスタンス%s)からデタッチします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "updating %s..."
 | 
			
		||||
#~ msgstr "%s の情報の更新…"
 | 
			
		||||
@@ -3056,14 +2858,6 @@ msgstr "ユーザ %(user)s をプロジェクト %(project)s から削除しま
 | 
			
		||||
#~ msgid "unexpected error during update"
 | 
			
		||||
#~ msgstr "更新の最中に予期しないエラーが発生しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Cannot get blockstats for \"%s\" on \"%s\""
 | 
			
		||||
#~ msgstr "ブロックデバイス \"%s\"  の統計を \"%s\" について取得できません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Cannot get ifstats for \"%s\" on \"%s\""
 | 
			
		||||
#~ msgstr "インタフェース \"%s\" の統計を \"%s\" について取得できません。"
 | 
			
		||||
 | 
			
		||||
#~ msgid "unexpected exception getting connection"
 | 
			
		||||
#~ msgstr "接続に際し予期しないエラーが発生しました。"
 | 
			
		||||
 | 
			
		||||
@@ -3071,279 +2865,14 @@ msgstr "ユーザ %(user)s をプロジェクト %(project)s から削除しま
 | 
			
		||||
#~ msgid "Found instance: %s"
 | 
			
		||||
#~ msgstr "インスタンス %s が見つかりました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No service for %s, %s"
 | 
			
		||||
#~ msgstr "%s, %s のserviceが存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No instance for id %s"
 | 
			
		||||
#~ msgstr "id %s のinstanceが存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "no keypair for user %s, name %s"
 | 
			
		||||
#~ msgstr "ユーザ %s, ネーム%s に該当するキーペアが存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No volume for id %s"
 | 
			
		||||
#~ msgstr "id %s に該当するボリュームが存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "No security group named %s for project: %s"
 | 
			
		||||
#~ msgstr "セキュリティグループ名 %s がプロジェクト %s に存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Parallax returned HTTP error %d from request for /images"
 | 
			
		||||
#~ msgstr "Parallax がHTTPエラー%d を /images に対するリクエストに対して返しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Parallax returned HTTP error %d from request for /images/detail"
 | 
			
		||||
#~ msgstr "Parallax がHTTPエラー %d を /images/detail に対するリクエストに対して返しました"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "IP %s leased to bad mac %s vs %s"
 | 
			
		||||
#~ msgstr "IP %s が期待した mac %s ではなく %s にリースされました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "IP %s released from bad mac %s vs %s"
 | 
			
		||||
#~ msgstr "IP %s がmac %s ではない mac %s への割当から開放されました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting object: %s / %s"
 | 
			
		||||
#~ msgstr "オブジェクトの取得: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized attempt to get object %s from bucket %s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Unauthorized attempt to get object: オブジェクト %s のバケット %s からの取得は許可されていません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Putting object: %s / %s"
 | 
			
		||||
#~ msgstr "オブジェクトの格納:: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized attempt to upload object %s to bucket %s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Unauthorized attempt to upload: オブジェクト %s のバケット %s へのアップロードは許可されていません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Deleting object: %s / %s"
 | 
			
		||||
#~ msgstr "オブジェクトを削除しています。: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Toggling publicity flag of image %s %r"
 | 
			
		||||
#~ msgstr "Toggling publicity flag: イメージ %s の公開フラグを %r に更新します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Casting to %s %s for %s"
 | 
			
		||||
#~ msgstr "メッセージのcast: %s %s for %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Nested received %s, %s"
 | 
			
		||||
#~ msgstr "ネスとした受信: %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Creating disk for %s by attaching disk file %s"
 | 
			
		||||
#~ msgstr "%s のディスクをディスクファイル %s をアタッチして作成します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created switch port %s on switch %s"
 | 
			
		||||
#~ msgstr "スイッチポート %s をスイッチ %s に作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "WMI job succeeded: %s, Elapsed=%s "
 | 
			
		||||
#~ msgstr "WMIジョブが成功しました: %s, 経過時間=%s "
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Del: disk %s vm %s"
 | 
			
		||||
#~ msgstr "Del:  削除: disk %s vm %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Got Info for vm %s: state=%s, mem=%s, num_cpu=%s,                     "
 | 
			
		||||
#~ "cpu_time=%s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "vm %s の情報の取得: state=%s, mem=%s, num_cpu=%s,                     cpu_time=%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Successfully changed vm state of %s to %s"
 | 
			
		||||
#~ msgstr "vmの状態の %s から %s への変更に成功しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Failed to change vm state of %s to %s"
 | 
			
		||||
#~ msgstr "VMの状態の %s から %s への変更に失敗しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Finished retreving %s -- placed in %s"
 | 
			
		||||
#~ msgstr "%s を取得しました。格納先: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: deleting instance files %s"
 | 
			
		||||
#~ msgstr "インスタンス %s: インスタンスファイル %s を削除しています。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "data: %r, fpath: %r"
 | 
			
		||||
#~ msgstr "データ:%r  ファイルパス: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Contents of file %s: %r"
 | 
			
		||||
#~ msgstr "ファイル %s の中身: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: injecting key into image %s"
 | 
			
		||||
#~ msgstr "インスタンス %s にキー %s をインジェクトします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: injecting net into image %s"
 | 
			
		||||
#~ msgstr "インスタンス %s のネットワーク設定をイメージ %s にインジェクトします。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "instance %s: ignoring error injecting data into image %s (%s)"
 | 
			
		||||
#~ msgstr "インスタンス %s: データをイメージ %s にインジェクトする際にエラーが発生しました。(%s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Task [%s] %s status: success    %s"
 | 
			
		||||
#~ msgstr "タスク [%s] %s ステータス: success    %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Task [%s] %s status: %s    %s"
 | 
			
		||||
#~ msgstr "タスク [%s] %s ステータス: %s    %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "%s: _db_content => %s"
 | 
			
		||||
#~ msgstr "%s: _db_content => %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Calling %s %s"
 | 
			
		||||
#~ msgstr "呼び出し: %s %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created VM %s as %s."
 | 
			
		||||
#~ msgstr "VM %s を %s として作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Creating VBD for VM %s, VDI %s ... "
 | 
			
		||||
#~ msgstr "VM %s, VDI %s のVBDを作成します… "
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created VBD %s for VM %s, VDI %s."
 | 
			
		||||
#~ msgstr "VBD %s を VM %s, VDI %s に対して作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Creating VIF for VM %s, network %s."
 | 
			
		||||
#~ msgstr "VM %s, ネットワーク %s を作成します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created VIF %s for VM %s, network %s."
 | 
			
		||||
#~ msgstr "VIF %s を VM %s, ネットワーク %s に作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Snapshotting VM %s with label '%s'..."
 | 
			
		||||
#~ msgstr "VM %s のスナップショットをラベル '%s' で作成します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created snapshot %s from VM %s."
 | 
			
		||||
#~ msgstr "スナップショット %s を VM %s について作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Asking xapi to upload %s as '%s'"
 | 
			
		||||
#~ msgstr "xapiに対して %s を '%s' としてアップロードするように指示します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Asking xapi to fetch %s as %s"
 | 
			
		||||
#~ msgstr "xapi に対して %s を %s として取得するように指示します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "PV Kernel in VDI:%d"
 | 
			
		||||
#~ msgstr "VDIのPV Kernel: %d"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "VHD %s has parent %s"
 | 
			
		||||
#~ msgstr "VHD %s のペアレントは %s です。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Parent %s doesn't match original parent %s, waiting for coalesce..."
 | 
			
		||||
#~ msgstr "ペアレント %s がオリジナルのペアレント %s と一致しません。合致するのを待ちます…"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unexpected number of VDIs (%s) found for VM %s"
 | 
			
		||||
#~ msgstr "予期しない数 (%s) のVDIがVM %s に存在します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Spawning VM %s created %s."
 | 
			
		||||
#~ msgstr "VM %s の生成(spawning) により %s を作成しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to Snapshot %s: %s"
 | 
			
		||||
#~ msgstr "%s のスナップショットに失敗しました: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "suspend: instance not present %s"
 | 
			
		||||
#~ msgstr "suspend: インスタンス %s は存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "resume: instance not present %s"
 | 
			
		||||
#~ msgstr "resume: インスタンス %s は存在しません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Instance not found %s"
 | 
			
		||||
#~ msgstr "インスタンス %s が見つかりません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Introduced %s as %s."
 | 
			
		||||
#~ msgstr "%s を %s として introduce しました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Ignoring exception %s when getting PBDs for %s"
 | 
			
		||||
#~ msgstr "例外 %s が %s のPBDを取得する際に発生しましたが無視します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Ignoring exception %s when unplugging PBD %s"
 | 
			
		||||
#~ msgstr "例外 %s が %s のPBDをunplugする際に発生しましたが無視します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Ignoring exception %s when forgetting SR %s"
 | 
			
		||||
#~ msgstr "例外 %s がSR %s をforgetする際に発生しましたが無視します。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to obtain target information %s, %s"
 | 
			
		||||
#~ msgstr "ターゲットの情報を取得できません。 %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Attach_volume: %s, %s, %s"
 | 
			
		||||
#~ msgstr "Attach_volume: ボリュームのアタッチ: %s, %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to create VDI on SR %s for instance %s"
 | 
			
		||||
#~ msgstr "SR %s にインスタンス %s のVDIを作成できません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unable to use SR %s for instance %s"
 | 
			
		||||
#~ msgstr "SR %s をインスタンス %s に対して利用できません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Mountpoint %s attached to instance %s"
 | 
			
		||||
#~ msgstr "マウントポイント %s をインスタンス %s にアタッチしました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Detach_volume: %s, %s"
 | 
			
		||||
#~ msgstr "Detach_volume: ボリュームのデタッチ: %s, %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Mountpoint %s detached from instance %s"
 | 
			
		||||
#~ msgstr "マウントポイント %s をインスタンス %s からデタッチしました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Quota exceeeded for %s, tried to create %sG volume"
 | 
			
		||||
#~ msgstr "%sのクオータを超えています。サイズ %sG のボリュームの作成を行おうとしました。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Volume quota exceeded. You cannot create a volume of size %s"
 | 
			
		||||
#~ msgstr "ボリュームのクオータを超えています。%sの大きさのボリュームは作成できません。"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "volume %s: creating lv of size %sG"
 | 
			
		||||
#~ msgstr "ボリューム%sの%sGのlv (論理ボリューム)  を作成します。"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Wrong number of arguments."
 | 
			
		||||
#~ msgstr "引数の数が異なります。"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										187
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
							
						
						
									
										187
									
								
								po/pt_BR.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-07-25 17:40+0000\n"
 | 
			
		||||
"Last-Translator: msinhore <msinhore@gmail.com>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-09-02 12:17+0000\n"
 | 
			
		||||
"Last-Translator: Robson Negreiros Bezerra <Unknown>\n"
 | 
			
		||||
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-09-03 05:50+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13830)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -453,11 +453,13 @@ msgid ""
 | 
			
		||||
"Detach volume %(volume_id)s from mountpoint %(mp)s on instance "
 | 
			
		||||
"%(instance_id)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Desconectando volume %(volume_id)s do ponto de montagem %(mp)s na instância "
 | 
			
		||||
"%(instance_id)s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/compute/manager.py:588
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Detaching volume from unknown instance %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Desconectando volume da instância desconhecida %s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/simple.py:53
 | 
			
		||||
#, python-format
 | 
			
		||||
@@ -708,7 +710,7 @@ msgstr "Ligação %(queue)s para %(exchange)s com chave %(routing_key)s"
 | 
			
		||||
#: ../nova/fakerabbit.py:121
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Getting from %(queue)s: %(message)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Recebendo de %(queue)s: %(message)s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:135 ../nova/virt/hyperv.py:171
 | 
			
		||||
#, python-format
 | 
			
		||||
@@ -808,7 +810,7 @@ msgstr "Kernel/Ramdisk %s destruidos"
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:361
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Asking xapi to fetch %(url)s as %(access)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Requisitando à xapi a busca da url %(url)s como %(access)s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:386 ../nova/virt/xenapi/vm_utils.py:402
 | 
			
		||||
#, python-format
 | 
			
		||||
@@ -880,58 +882,59 @@ msgstr ""
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:590
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "No VDIs found for VM %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nenhum VDIs encontrado para MV %s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:594
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Unexpected number of VDIs (%(num_vdis)s) found for VM %(vm_ref)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Número de VDIs inesperado (%(num_vdis)s) encontrado para MV %(vm_ref)s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:653
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:188
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Creating VBD for VDI %s ... "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Criando VBD para VDI %s ... "
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:655
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:190
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Creating VBD for VDI %s done."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "O VBD para VDI %s foi criado."
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:657
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:192
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Plugging VBD %s ... "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Conectando VBD %s ... "
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:659
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:194
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Plugging VBD %s done."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "O VDB %s foi conectado."
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:661
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "VBD %(vbd)s plugged as %(orig_dev)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "VBD %(vbd)s conectado como %(orig_dev)s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:664
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "VBD %(vbd)s plugged into wrong dev, remapping to %(dev)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "VBD %(vbd)s conectado no device errado, remapeando para %(dev)s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:668
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:197
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Destroying VBD for VDI %s ... "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Destruindo VBD para o VDI %s ... "
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:671
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:200
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Destroying VBD for VDI %s done."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "O VBD para o VDI %s foi destruído."
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:683
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:211
 | 
			
		||||
@@ -952,7 +955,7 @@ msgstr ""
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:223
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Ignoring XenAPI.Failure in VBD.unplug: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Ignorando XenAPI.Failure em VBD.unplug: %s"
 | 
			
		||||
 | 
			
		||||
#: ../nova/virt/xenapi/vm_utils.py:704
 | 
			
		||||
#: ../plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py:66
 | 
			
		||||
@@ -2824,47 +2827,6 @@ msgstr ""
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Comando: %s\n"
 | 
			
		||||
#~ "Código de retorno: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "(%s) publish (key: %s) %s"
 | 
			
		||||
#~ msgstr "(%s) publicar (key: %s) %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Servidor AMQP em %s:%d inatingível. Tentando novamente em %d segundos."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Binding %s to %s with key %s"
 | 
			
		||||
#~ msgstr "Atribuindo %s para %s com chave %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting from %s: %s"
 | 
			
		||||
#~ msgstr "Obtendo de %s: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Starting %s node"
 | 
			
		||||
#~ msgstr "Iniciando nó %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Data store %s is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Repositório de dados %s não pode ser atingido. Tentando novamente em %d "
 | 
			
		||||
#~ "segundos."
 | 
			
		||||
 | 
			
		||||
#~ msgid "Full set of FLAGS:"
 | 
			
		||||
#~ msgstr "Conjunto completo de FLAGS:"
 | 
			
		||||
 | 
			
		||||
@@ -2876,115 +2838,6 @@ msgstr ""
 | 
			
		||||
#~ msgid "Serving %s"
 | 
			
		||||
#~ msgstr "Servindo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Couldn't get IP, using 127.0.0.1 %s"
 | 
			
		||||
#~ msgstr "Não foi possível obter IP, usando 127.0.0.1 %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Access key %s has had %d failed authentications and will be locked out for "
 | 
			
		||||
#~ "%d minutes."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Chave de acesso %s tem %d falhas de autenticação e vai ser bloqueada por %d "
 | 
			
		||||
#~ "minutos."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "arg: %s\t\tval: %s"
 | 
			
		||||
#~ msgstr "argumento: %s\t\tvalor: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Authenticated Request For %s:%s)"
 | 
			
		||||
#~ msgstr "Pedido de Autenticação Para: %s:%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding sitewide role %s to user %s"
 | 
			
		||||
#~ msgstr "Adicionando papel em todo site %s ao usuário %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s for project %s"
 | 
			
		||||
#~ msgstr "Adicionando papel %s ao usuário %s para o projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unauthorized request for controller=%s and action=%s"
 | 
			
		||||
#~ msgstr "Requisição não autorizada para controlador=%s e ação=%s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s for project %s"
 | 
			
		||||
#~ msgstr "Removendo papel %s do usuário %s para o projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting x509 for user: %s on project: %s"
 | 
			
		||||
#~ msgstr "Obtendo x509 para usuário: %s do projeto: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Create project %s managed by %s"
 | 
			
		||||
#~ msgstr "Criar projeto %s gerenciado por %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing user %s from project %s"
 | 
			
		||||
#~ msgstr "Excluindo usuário %s do projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding user %s to project %s"
 | 
			
		||||
#~ msgstr "Adicionando usuário %s ao projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Unsupported API request: controller = %s,action = %s"
 | 
			
		||||
#~ msgstr "Requisição de API não suportada: controlador = %s,ação = %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing sitewide role %s from user %s"
 | 
			
		||||
#~ msgstr "Removendo papel %s em todo site do usuário %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Associate address %s to instance %s"
 | 
			
		||||
#~ msgstr "Atribuir endereço %s à instância %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Attach volume %s to instacne %s at %s"
 | 
			
		||||
#~ msgstr "Anexar volume %s para instância %s em %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Registered image %s with id %s"
 | 
			
		||||
#~ msgstr "Registrada imagem %s com id %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is already a member of the group %s"
 | 
			
		||||
#~ msgstr "Usuário %s já pertence ao grupo %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is not a member of project %s"
 | 
			
		||||
#~ msgstr "Usuário %s não é membro do projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "failed authorization: no project named %s (user=%s)"
 | 
			
		||||
#~ msgstr "falha de autorização: nenhum projeto de nome %s (usuário=%s)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Failed authorization: user %s not admin and not member of project %s"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Falha de autorização: usuário %s não é administrador nem membro do projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created project %s with manager %s"
 | 
			
		||||
#~ msgstr "Criado projeto %s com gerente %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s on project %s"
 | 
			
		||||
#~ msgstr "Removendo papel %s do usuário %s no projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s in project %s"
 | 
			
		||||
#~ msgstr "Adicionando papel %s ao usuário %s no projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Remove user %s from project %s"
 | 
			
		||||
#~ msgstr "Remover usuário %s do projeto %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created user %s (admin: %r)"
 | 
			
		||||
#~ msgstr "Criado usuário %s (administrador: %r)"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No such process"
 | 
			
		||||
#~ msgstr "Processo inexistente"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										126
									
								
								po/ru.po
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								po/ru.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-07-09 07:20+0000\n"
 | 
			
		||||
"Last-Translator: ilya kislicyn <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:22+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: Russian <ru@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2793,58 +2793,6 @@ msgstr ""
 | 
			
		||||
#~ msgid "Starting %s"
 | 
			
		||||
#~ msgstr "Запускается %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "arg: %s\t\tval: %s"
 | 
			
		||||
#~ msgstr "arg: %s\t\tval: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s for project %s"
 | 
			
		||||
#~ msgstr "Добавление роли %s для пользователя %s для проекта %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s for project %s"
 | 
			
		||||
#~ msgstr "Удаление роли %s пользователя %s для проекта %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Create project %s managed by %s"
 | 
			
		||||
#~ msgstr "Создать проект %s под управлением %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing user %s from project %s"
 | 
			
		||||
#~ msgstr "Удаление пользователя %s с проекта %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding user %s to project %s"
 | 
			
		||||
#~ msgstr "Добавление пользователя %s к проекту %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is already a member of the group %s"
 | 
			
		||||
#~ msgstr "Пользователь %s уже член группы %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "User %s is not a member of project %s"
 | 
			
		||||
#~ msgstr "Пользователь %s не является членом группы %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created project %s with manager %s"
 | 
			
		||||
#~ msgstr "Создан проект %s под управлением %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing role %s from user %s on project %s"
 | 
			
		||||
#~ msgstr "Удаление роли %s пользователя %s в проекте %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Remove user %s from project %s"
 | 
			
		||||
#~ msgstr "Удалить пользователя %s из проекта %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Created user %s (admin: %r)"
 | 
			
		||||
#~ msgstr "Создан пользователь %s (администратор: %r)"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding role %s to user %s in project %s"
 | 
			
		||||
#~ msgstr "Добавление роли %s для пользователя %s в проект %s"
 | 
			
		||||
 | 
			
		||||
#~ msgid "unexpected error during update"
 | 
			
		||||
#~ msgstr "неожиданная ошибка во время обновления"
 | 
			
		||||
 | 
			
		||||
@@ -2852,75 +2800,9 @@ msgstr ""
 | 
			
		||||
#~ msgid "updating %s..."
 | 
			
		||||
#~ msgstr "обновление %s..."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting object: %s / %s"
 | 
			
		||||
#~ msgstr "Получение объекта: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Deleting object: %s / %s"
 | 
			
		||||
#~ msgstr "Удаление объекта: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "%s: _db_content => %s"
 | 
			
		||||
#~ msgstr "%s: _db_content => %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Calling %s %s"
 | 
			
		||||
#~ msgstr "Звонок %s %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Команда: %s\n"
 | 
			
		||||
#~ "Код завершения: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr "AMQP сервер %s:%d недоступен. Повторная попытка через %d секунд."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Putting object: %s / %s"
 | 
			
		||||
#~ msgstr "Вставка объекта: %s / %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Starting %s node"
 | 
			
		||||
#~ msgstr "Запускается нода %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Data store %s is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr "Хранилище данных %s недоступно. Повторная попытка через %d секунд."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Couldn't get IP, using 127.0.0.1 %s"
 | 
			
		||||
#~ msgstr "Не удалось получить IP, используем 127.0.0.1 %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "pidfile %s does not exist. Daemon not running?\n"
 | 
			
		||||
#~ msgstr "pidfile %s не обнаружен. Демон не запущен?\n"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting from %s: %s"
 | 
			
		||||
#~ msgstr "Получение из %s: %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Access key %s has had %d failed authentications and will be locked out for "
 | 
			
		||||
#~ "%d minutes."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Ключ доступа %s имеет %d неудачных попыток аутентификации и будет "
 | 
			
		||||
#~ "заблокирован на %d минут."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Authenticated Request For %s:%s)"
 | 
			
		||||
#~ msgstr "Запрос аутентификации для %s:%s)"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Wrong number of arguments."
 | 
			
		||||
#~ msgstr "Неверное число аргументов."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								po/tl.po
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								po/tl.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-02-17 03:24+0000\n"
 | 
			
		||||
"Last-Translator: John Michael Baterna <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:21+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: Tagalog <tl@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2789,8 +2789,3 @@ msgstr ""
 | 
			
		||||
#, python-format
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Hindi makita o maabot ang AMQP server sa %s:%d. Muling subukan sa %d segundo."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								po/uk.po
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								po/uk.po
									
									
									
									
									
								
							@@ -8,14 +8,14 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: nova\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-02-21 10:03-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-02-03 22:02+0000\n"
 | 
			
		||||
"Last-Translator: Wladimir Rossinski <Unknown>\n"
 | 
			
		||||
"PO-Revision-Date: 2011-08-23 11:21+0000\n"
 | 
			
		||||
"Last-Translator: Thierry Carrez <thierry.carrez+lp@gmail.com>\n"
 | 
			
		||||
"Language-Team: Ukrainian <uk@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-03 04:44+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13573)\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2011-08-24 04:47+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build 13697)\n"
 | 
			
		||||
 | 
			
		||||
#: ../nova/scheduler/chance.py:37 ../nova/scheduler/zone.py:55
 | 
			
		||||
#: ../nova/scheduler/simple.py:75 ../nova/scheduler/simple.py:110
 | 
			
		||||
@@ -2788,10 +2788,6 @@ msgstr ""
 | 
			
		||||
msgid "Removing user %(user)s from project %(project)s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "AMQP server on %s:%d is unreachable. Trying again in %d seconds."
 | 
			
		||||
#~ msgstr "AMQP сервер %s:%d недоступний. Спроба під'єднання через %d секунд."
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Starting %s"
 | 
			
		||||
#~ msgstr "Запускається %s"
 | 
			
		||||
@@ -2799,33 +2795,3 @@ msgstr ""
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Serving %s"
 | 
			
		||||
#~ msgstr "Обслуговування %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Couldn't get IP, using 127.0.0.1 %s"
 | 
			
		||||
#~ msgstr "Не вдалось отримати IP, використовуючи 127.0.0.1 %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Removing user %s from project %s"
 | 
			
		||||
#~ msgstr "Вилучення користувача %s з проекту %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Adding user %s to project %s"
 | 
			
		||||
#~ msgstr "Долучення користувача %s до проекту %s"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Command: %s\n"
 | 
			
		||||
#~ "Exit code: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "%s\n"
 | 
			
		||||
#~ "Команда: %s\n"
 | 
			
		||||
#~ "Код завершення: %s\n"
 | 
			
		||||
#~ "Stdout: %r\n"
 | 
			
		||||
#~ "Stderr: %r"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid "Getting from %s: %s"
 | 
			
		||||
#~ msgstr "Отримання з %s: %s"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user