Exemple #1
0
    def attach(self, instance, vif, container_id):
        vif_type = vif['type']
        if_remote_name = 'ns%s' % vif['id'][:11]
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        LOG.debug('attach vif_type=%(vif_type)s instance=%(instance)s '
                  'vif=%(vif)s',
                  {'vif_type': vif_type, 'instance': instance,
                   'vif': vif})

        try:
            utils.execute('ip', 'link', 'set', if_remote_name, 'netns',
                          container_id, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'address', vif['address'],
                          run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'addr',
                          'add', ip, 'dev', if_remote_name, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'up', run_as_root=True)
            if gateway is not None:
                utils.execute('ip', 'netns', 'exec', container_id,
                              'ip', 'route', 'replace', 'default', 'via',
                              gateway, 'dev', if_remote_name, run_as_root=True)
        except Exception:
            LOG.exception("Failed to attach vif")
Exemple #2
0
    def plug_bridge(self, instance, vif):
        if_local_name = 'tap%s' % vif['id'][:11]
        if_remote_name = 'ns%s' % vif['id'][:11]
        bridge = vif['network']['bridge']
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        # Device already exists so return.
        if linux_net.device_exists(if_local_name):
            return
        undo_mgr = utils.UndoManager()

        try:
            utils.execute('ip', 'link', 'add', 'name', if_local_name, 'type',
                          'veth', 'peer', 'name', if_remote_name,
                          run_as_root=True)
            undo_mgr.undo_with(lambda: utils.execute(
                'ip', 'link', 'delete', if_local_name, run_as_root=True))
            # NOTE(samalba): Deleting the interface will delete all
            # associated resources (remove from the bridge, its pair, etc...)
            utils.execute('brctl', 'addif', bridge, if_local_name,
                          run_as_root=True)
            utils.execute('ip', 'link', 'set', if_local_name, 'up',
                          run_as_root=True)
        except Exception:
            LOG.exception("Failed to configure network")
            msg = _('Failed to setup the network, rolling back')
            undo_mgr.rollback_and_reraise(msg=msg, instance=instance)
Exemple #3
0
    def attach(self, instance, vif, container_id):
        vif_type = vif['type']
        if_remote_name = 'ns%s' % vif['id'][:11]
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        LOG.debug(
            'attach vif_type=%(vif_type)s instance=%(instance)s '
            'vif=%(vif)s', {
                'vif_type': vif_type,
                'instance': instance,
                'vif': vif
            })

        try:
            utils.execute('ip',
                          'link',
                          'set',
                          if_remote_name,
                          'netns',
                          container_id,
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ip',
                          'link',
                          'set',
                          if_remote_name,
                          'address',
                          vif['address'],
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ifconfig',
                          if_remote_name,
                          ip,
                          run_as_root=True)
            if gateway is not None:
                utils.execute('ip',
                              'netns',
                              'exec',
                              container_id,
                              'ip',
                              'route',
                              'replace',
                              'default',
                              'via',
                              gateway,
                              'dev',
                              if_remote_name,
                              run_as_root=True)
        except Exception:
            LOG.exception("Failed to attach vif")
Exemple #4
0
 def _setup_network(self, instance, network_info):
     if not network_info:
         return
     container_id = self._find_container_by_name(instance['name']).get('id')
     if not container_id:
         return
     network_info = network_info[0]['network']
     netns_path = '/var/run/netns'
     if not os.path.exists(netns_path):
         utils.execute(
             'mkdir', '-p', netns_path, run_as_root=True)
     nspid = self._find_container_pid(container_id)
     if not nspid:
         msg = _('Cannot find any PID under container "{0}"')
         raise RuntimeError(msg.format(container_id))
     netns_path = os.path.join(netns_path, container_id)
     utils.execute(
         'ln', '-sf', '/proc/{0}/ns/net'.format(nspid),
         '/var/run/netns/{0}'.format(container_id),
         run_as_root=True)
     rand = random.randint(0, 100000)
     if_local_name = 'pvnetl{0}'.format(rand)
     if_remote_name = 'pvnetr{0}'.format(rand)
     bridge = network_info['bridge']
     gateway = network.find_gateway(instance, network_info)
     ip = network.find_fixed_ip(instance, network_info)
     undo_mgr = utils.UndoManager()
     try:
         utils.execute(
             'ip', 'link', 'add', 'name', if_local_name, 'type',
             'veth', 'peer', 'name', if_remote_name,
             run_as_root=True)
         undo_mgr.undo_with(lambda: utils.execute(
             'ip', 'link', 'delete', if_local_name, run_as_root=True))
         # NOTE(samalba): Deleting the interface will delete all associated
         # resources (remove from the bridge, its pair, etc...)
         utils.execute(
             'brctl', 'addif', bridge, if_local_name,
             run_as_root=True)
         utils.execute(
             'ip', 'link', 'set', if_local_name, 'up',
             run_as_root=True)
         utils.execute(
             'ip', 'link', 'set', if_remote_name, 'netns', nspid,
             run_as_root=True)
         utils.execute(
             'ip', 'netns', 'exec', container_id, 'ifconfig',
             if_remote_name, ip,
             run_as_root=True)
         utils.execute(
             'ip', 'netns', 'exec', container_id,
             'ip', 'route', 'replace', 'default', 'via', gateway, 'dev',
             if_remote_name, run_as_root=True)
     except Exception:
         msg = _('Failed to setup the network, rolling back')
         undo_mgr.rollback_and_reraise(msg=msg, instance=instance)
Exemple #5
0
    def attach(self, instance, vif, container_id):
        vif_type = vif['type']
        if_remote_name = 'ns%s' % vif['id'][:11]
        gateway = network.find_gateway(instance, vif['network'])
        dhcp = network.find_dhcp(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])
        mtu = network.find_mtu(instance, vif['network'])


        LOG.debug('attach vif_type=%(vif_type)s instance=%(instance)s '
                  'vif=%(vif)s',
                  {'vif_type': vif_type, 'instance': instance,
                   'vif': vif})

        try:
            utils.execute('ip', 'link', 'set', if_remote_name, 'netns',
                          container_id, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'address', vif['address'],
                          run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'addr',
                          'add', ip, 'dev', if_remote_name, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'up', run_as_root=True)

            # Setup MTU on if_remote_name is required if it is a non
            # default value
            # mtu = CONF.network_device_mtu
            if vif.get('mtu') is not None:
                mtu = vif.get('mtu')
            if mtu is not None:
                utils.execute('ip', 'netns', 'exec', container_id, 'ip',
                              'link', 'set', if_remote_name, 'mtu', mtu,
                              run_as_root=True)

            if gateway is not None:
                utils.execute('ip', 'netns', 'exec', container_id,
                              'ip', 'route', 'replace', 'default', 'via',
                              gateway, 'dev', if_remote_name, run_as_root=True)

            if dhcp is not None:
                utils.execute('ip', 'netns', 'exec', container_id,
                              'ip', 'route', 'replace', '169.254.169.254/32', 'via',
                              dhcp, run_as_root=True)

            # Disable TSO, for now no config option
            utils.execute('ip', 'netns', 'exec', container_id, 'ethtool',
                          '--offload', if_remote_name, 'tso', 'off',
                          run_as_root=True)

        except Exception:
            LOG.exception("Failed to attach vif")
Exemple #6
0
    def plug_bridge(self, instance, vif):
        if_local_name = 'tap%s' % vif['id'][:11]
        if_remote_name = 'ns%s' % vif['id'][:11]
        bridge = vif['network']['bridge']
        gateway = network.find_gateway(instance, vif['network'])

        net = vif['network']
        if net.get_meta('should_create_vlan', False):
            vlan = net.get_meta('vlan'),
            iface = (CONF.vlan_interface or
                     vif['network'].get_meta('bridge_interface'))
            linux_net.LinuxBridgeInterfaceDriver.ensure_vlan_bridge(
                vlan,
                bridge,
                iface,
                net_attrs=vif,
                mtu=vif.get('mtu'))
            iface = 'vlan%s' % vlan
        else:
            iface = (CONF.flat_interface or
                     vif['network'].get_meta('bridge_interface'))
            LOG.debug('Ensuring bridge for %s - %s' % (iface, bridge))
            linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(
                bridge,
                iface,
                net_attrs=vif,
                gateway=gateway)

        # Device already exists so return.
        if linux_net.device_exists(if_local_name):
            return
        undo_mgr = utils.UndoManager()

        try:
            utils.execute('ip', 'link', 'add', 'name', if_local_name, 'type',
                          'veth', 'peer', 'name', if_remote_name,
                          run_as_root=True)
            undo_mgr.undo_with(lambda: utils.execute(
                'ip', 'link', 'delete', if_local_name, run_as_root=True))
            # NOTE(samalba): Deleting the interface will delete all
            # associated resources (remove from the bridge, its pair, etc...)
            utils.execute('ip', 'link', 'set', if_local_name, 'address',
                          self._fe_random_mac(), run_as_root=True)
            utils.execute('brctl', 'addif', bridge, if_local_name,
                          run_as_root=True)
            utils.execute('ip', 'link', 'set', if_local_name, 'up',
                          run_as_root=True)
        except Exception:
            LOG.exception("Failed to configure network")
            msg = _('Failed to setup the network, rolling back')
            undo_mgr.rollback_and_reraise(msg=msg, instance=instance)
Exemple #7
0
    def plug_bridge(self, instance, vif):
        LOG.info('5555')
        if_local_name = 'tap%s' % vif['id'][:11]
        if_remote_name = 'ns%s' % vif['id'][:11]
        bridge = vif['network']['bridge']
        gateway = network.find_gateway(instance, vif['network'])

        vlan = vif.get('vlan')
        if vlan is not None:
            iface = (CONF.vlan_interface or
                     vif['network'].get_meta('bridge_interface'))
            linux_net.LinuxBridgeInterfaceDriver.ensure_vlan_bridge(
                vlan,
                bridge,
                iface,
                net_attrs=vif,
                mtu=vif.get('mtu'))
            iface = 'vlan%s' % vlan
        else:
            iface = (CONF.flat_interface or
                     vif['network'].get_meta('bridge_interface'))
            LOG.debug('Ensuring bridge for %s - %s' % (iface, bridge))
            linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(
                bridge,
                iface,
                net_attrs=vif,
                gateway=gateway)

        # Device already exists so return.
        if linux_net.device_exists(if_local_name):
            return
        undo_mgr = utils.UndoManager()

        try:
            utils.execute('ip', 'link', 'add', 'name', if_local_name, 'type',
                          'veth', 'peer', 'name', if_remote_name,
                          run_as_root=True)
            undo_mgr.undo_with(lambda: utils.execute(
                'ip', 'link', 'delete', if_local_name, run_as_root=True))
            # NOTE(samalba): Deleting the interface will delete all
            # associated resources (remove from the bridge, its pair, etc...)
            utils.execute('ip', 'link', 'set', if_local_name, 'address',
                          self._fe_random_mac(), run_as_root=True)
            utils.execute('brctl', 'addif', bridge, if_local_name,
                          run_as_root=True)
            utils.execute('ip', 'link', 'set', if_local_name, 'up',
                          run_as_root=True)
        except Exception:
            LOG.exception("Failed to configure network")
            msg = _('Failed to setup the network, rolling back')
            undo_mgr.rollback_and_reraise(msg=msg, instance=instance)
Exemple #8
0
    def attach(self, instance, vif, container_id):
        vif_type = vif['type']
        if_remote_name = 'ns%s' % vif['id'][:11]
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        LOG.debug('attach vif_type=%(vif_type)s instance=%(instance)s '
                  'vif=%(vif)s',
                  {'vif_type': vif_type, 'instance': instance,
                   'vif': vif})

        try:
            utils.execute('ip', 'link', 'set', if_remote_name, 'netns',
                          container_id, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'address', vif['address'],
                          run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'addr',
                          'add', ip, 'dev', if_remote_name, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'up', run_as_root=True)

            # Setup MTU on if_remote_name is required if it is a non
            # default value
            mtu = CONF.network_device_mtu
            if vif.get('mtu') is not None:
                mtu = vif.get('mtu')
            if mtu is not None:
                utils.execute('ip', 'netns', 'exec', container_id, 'ip',
                              'link', 'set', if_remote_name, 'mtu', mtu,
                              run_as_root=True)

            if gateway is not None:
                utils.execute('ip', 'netns', 'exec', container_id,
                              'ip', 'route', 'replace', 'default', 'via',
                              gateway, 'dev', if_remote_name, run_as_root=True)

            # Disable TSO, for now no config option
            utils.execute('ip', 'netns', 'exec', container_id, 'ethtool',
                          '--offload', if_remote_name, 'tso', 'off',
                          run_as_root=True)

        except Exception:
            LOG.exception("Failed to attach vif")
Exemple #9
0
    def plug_ovs(self, instance, vif, container_id):
        if_local_name = 'tap%s' % vif['id'][:11]
        if_remote_name = 'ns%s' % vif['id'][:11]
        bridge = vif['network']['bridge']
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        # Device already exists so return.
        if linux_net.device_exists(if_local_name):
            return
        undo_mgr = utils.UndoManager()

        try:
            utils.execute('ip', 'link', 'add', 'name', if_local_name, 'type',
                          'veth', 'peer', 'name', if_remote_name,
                          run_as_root=True)
            linux_net.create_ovs_vif_port(bridge, if_local_name,
                                          network.get_ovs_interfaceid(vif),
                                          vif['address'],
                                          instance['uuid'])
            utils.execute('ip', 'link', 'set', if_local_name, 'up',
                          run_as_root=True)
            utils.execute('ip', 'link', 'set', if_remote_name, 'netns',
                          container_id, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ip', 'link',
                          'set', if_remote_name, 'address', vif['address'],
                          run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id, 'ifconfig',
                          if_remote_name, ip, run_as_root=True)
            utils.execute('ip', 'netns', 'exec', container_id,
                          'ip', 'route', 'replace', 'default', 'via',
                          gateway, 'dev', if_remote_name, run_as_root=True)

        except Exception:
            LOG.exception("Failed to configure network")
            msg = _('Failed to setup the network, rolling back')
            undo_mgr.rollback_and_reraise(msg=msg, instance=instance)
Exemple #10
0
 def test_find_gateway(self):
     instance = {'uuid': uuid.uuid4()}
     network_info = test_utils.get_test_network_info()
     first_net = network_info[0]['network']
     first_net['subnets'][0]['gateway']['address'] = '10.0.0.1'
     self.assertEqual('10.0.0.1', network.find_gateway(instance, first_net))
Exemple #11
0
 def test_find_gateway(self):
     instance = {'uuid': uuid.uuid4()}
     network_info = test_utils.get_test_network_info()
     first_net = network_info[0]['network']
     first_net['subnets'][0]['gateway']['address'] = '10.0.0.1'
     self.assertEqual('10.0.0.1', network.find_gateway(instance, first_net))
Exemple #12
0
    def plug_ovs(self, instance, vif, container_id):
        if_local_name = 'tap%s' % vif['id'][:11]
        if_remote_name = 'ns%s' % vif['id'][:11]
        bridge = vif['network']['bridge']
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        # Device already exists so return.
        if linux_net.device_exists(if_local_name):
            return
        undo_mgr = utils.UndoManager()

        try:
            utils.execute('ip',
                          'link',
                          'add',
                          'name',
                          if_local_name,
                          'type',
                          'veth',
                          'peer',
                          'name',
                          if_remote_name,
                          run_as_root=True)
            linux_net.create_ovs_vif_port(bridge, if_local_name,
                                          network.get_ovs_interfaceid(vif),
                                          vif['address'], instance['uuid'])
            utils.execute('ip',
                          'link',
                          'set',
                          if_local_name,
                          'up',
                          run_as_root=True)
            utils.execute('ip',
                          'link',
                          'set',
                          if_remote_name,
                          'netns',
                          container_id,
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ip',
                          'link',
                          'set',
                          if_remote_name,
                          'address',
                          vif['address'],
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ifconfig',
                          if_remote_name,
                          ip,
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ip',
                          'route',
                          'replace',
                          'default',
                          'via',
                          gateway,
                          'dev',
                          if_remote_name,
                          run_as_root=True)

        except Exception:
            LOG.exception("Failed to configure network")
            msg = _('Failed to setup the network, rolling back')
            undo_mgr.rollback_and_reraise(msg=msg, instance=instance)
Exemple #13
0
    def plug_bridge(self, instance, vif, container_id):
        if_local_name = 'tap%s' % vif['id'][:11]
        if_remote_name = 'ns%s' % vif['id'][:11]
        bridge = vif['network']['bridge']
        gateway = network.find_gateway(instance, vif['network'])
        ip = network.find_fixed_ip(instance, vif['network'])

        # Device already exists so return.
        if linux_net.device_exists(if_local_name):
            return
        undo_mgr = utils.UndoManager()

        try:
            utils.execute('ip',
                          'link',
                          'add',
                          'name',
                          if_local_name,
                          'type',
                          'veth',
                          'peer',
                          'name',
                          if_remote_name,
                          run_as_root=True)
            undo_mgr.undo_with(lambda: utils.execute(
                'ip', 'link', 'delete', if_local_name, run_as_root=True))
            # NOTE(samalba): Deleting the interface will delete all
            # associated resources (remove from the bridge, its pair, etc...)
            utils.execute('brctl',
                          'addif',
                          bridge,
                          if_local_name,
                          run_as_root=True)
            utils.execute('ip',
                          'link',
                          'set',
                          if_local_name,
                          'up',
                          run_as_root=True)
            utils.execute('ip',
                          'link',
                          'set',
                          if_remote_name,
                          'netns',
                          container_id,
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ip',
                          'link',
                          'set',
                          if_remote_name,
                          'address',
                          vif['address'],
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ifconfig',
                          if_remote_name,
                          ip,
                          run_as_root=True)
            utils.execute('ip',
                          'netns',
                          'exec',
                          container_id,
                          'ip',
                          'route',
                          'replace',
                          'default',
                          'via',
                          gateway,
                          'dev',
                          if_remote_name,
                          run_as_root=True)
        except Exception:
            LOG.exception("Failed to configure network")
            msg = _('Failed to setup the network, rolling back')
            undo_mgr.rollback_and_reraise(msg=msg, instance=instance)