~hudson-openstack/nova/trunk

« back to all changes in this revision

Viewing changes to nova/network/manager.py

  • Committer: Tarmac
  • Author(s): Dan Wendlandt, Brad Hall, danwent at gmail
  • Date: 2011-09-08 07:43:11 UTC
  • mfrom: (1476.2.39 nova-trunk)
  • Revision ID: tarmac-20110908074311-j8grm3qj79bx04ra
This code contains contains a new NetworkManager class that can leverage Quantum + Melange.  

Thierry suggested that I merge prop this to get feedback, even though it is too late to get a branch of this size in for D-4.  Feedback will help determine whether we can get this code in during the Diablo time frame or not.  This branch was developed stacked on top of the melange branch, which is still not merged, but I am merge-propping it without that branch so that the diff is correct.  

The vast majority of the code is in nova/network/quantum and is only invoked if the network manager is set to nova.network.quantum.QuantumManager

In addition to implementing networks with Quantum instead of the linux bridge, the QuantumManager also provides a new, more flexible model of associating vNICs with networks.  It supports the creation of networks that are specific to a project and networks that are "global".  When a VM is created, it gets a vNIC for each project network, as well as each global network.  For example, this could support giving a VM a "public" vNIC on a shared network and a "private" vNIC on a tenant-specific network.  

The branch also implements Tushar's 'os-create-server-ext' extension, so that the server create API call can indicate the set of networks the VM should be attached to (if this extension is used, it replaces the above mechanism for determining vNICs).  

QuantumManager can use either the traditional IPAM functionality in nova DB (i.e., the networks, fixed_ips tables) or melange.  Similar to FlatManager, QuantumManager does not currently support DHCP, gateway/NAT, or floating IPs.  

This branch requires additional testing before it is really ready for merge, but we thought it would be best to merge prop as soon as possible to identify any significant concerns people had. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
549
549
    def _allocate_mac_addresses(self, context, instance_id, networks):
550
550
        """Generates mac addresses and creates vif rows in db for them."""
551
551
        for network in networks:
552
 
            vif = {'address': self.generate_mac_address(),
 
552
            self.add_virtual_interface(context, instance_id, network['id'])
 
553
 
 
554
    def add_virtual_interface(self, context, instance_id, network_id):
 
555
        vif = {'address': self.generate_mac_address(),
553
556
                   'instance_id': instance_id,
554
 
                   'network_id': network['id'],
 
557
                   'network_id': network_id,
555
558
                   'uuid': str(utils.gen_uuid())}
556
 
            # try FLAG times to create a vif record with a unique mac_address
557
 
            for i in range(FLAGS.create_unique_mac_address_attempts):
558
 
                try:
559
 
                    self.db.virtual_interface_create(context, vif)
560
 
                    break
561
 
                except exception.VirtualInterfaceCreateException:
562
 
                    vif['address'] = self.generate_mac_address()
563
 
            else:
564
 
                self.db.virtual_interface_delete_by_instance(context,
 
559
        # try FLAG times to create a vif record with a unique mac_address
 
560
        for _ in xrange(FLAGS.create_unique_mac_address_attempts):
 
561
            try:
 
562
                return self.db.virtual_interface_create(context, vif)
 
563
            except exception.VirtualInterfaceCreateException:
 
564
                vif['address'] = self.generate_mac_address()
 
565
        else:
 
566
            self.db.virtual_interface_delete_by_instance(context,
565
567
                                                             instance_id)
566
 
                raise exception.VirtualInterfaceMacAddressException()
 
568
            raise exception.VirtualInterfaceMacAddressException()
567
569
 
568
570
    def generate_mac_address(self):
569
571
        """Generate an Ethernet MAC address."""
792
794
                self._create_fixed_ips(context, network['id'])
793
795
        return networks
794
796
 
 
797
    def delete_network(self, context, fixed_range, require_disassociated=True):
 
798
 
 
799
        network = db.network_get_by_cidr(context, fixed_range)
 
800
 
 
801
        if require_disassociated and network.project_id is not None:
 
802
            raise ValueError(_('Network must be disassociated from project %s'
 
803
                               ' before delete' % network.project_id))
 
804
        db.network_delete_safe(context, network.id)
 
805
 
795
806
    @property
796
807
    def _bottom_reserved_ips(self):  # pylint: disable=R0201
797
808
        """Number of reserved ips at the bottom of the range."""