¡@

Home 

OpenStack Study: nova_ipam_lib.py

OpenStack Index

**** CubicPower OpenStack Study ****

# Copyright 2011 Nicira Networks, Inc

# 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.

import netaddr

from nova import ipv6

from nova.objects import fixed_ip as fixed_ip_obj

from nova.objects import floating_ip as floating_ip_obj

from nova.objects import network as network_obj

from nova.objects import virtual_interface as vif_obj

**** CubicPower OpenStack Study ****

def get_ipam_lib(net_man):

    return NeutronNovaIPAMLib(net_man)

**** CubicPower OpenStack Study ****

class NeutronNovaIPAMLib(object):

"""Implements Neutron IP Address Management (IPAM) interface

using the local Nova database. This implementation is inline

with how IPAM is used by other NetworkManagers.

"""

**** CubicPower OpenStack Study ****

    def __init__(self, net_manager):

        """Holds a reference to the "parent" network manager, used

           to take advantage of various FlatManager methods to avoid

           code duplication.

        """

        self.net_manager = net_manager

**** CubicPower OpenStack Study ****

    def get_subnets_by_net_id(self, context, tenant_id, net_id, _vif_id=None):

        """Returns information about the IPv4 and IPv6 subnets

           associated with a Neutron Network UUID.

        """

        n = network_obj.Network.get_by_uuid(context.elevated(), net_id)

        subnet_v4 = {

            'network_id': n.uuid,

            'cidr': n.cidr,

            'gateway': n.gateway,

            'broadcast': n.broadcast,

            'netmask': n.netmask,

            'version': 4,

            'dns1': n.dns1,

            'dns2': n.dns2}

        #TODO(tr3buchet): I'm noticing we've assumed here that all dns is v4.

        #                 this is probably bad as there is no way to add v6

        #                 dns to nova

        subnet_v6 = {

            'network_id': n.uuid,

            'cidr': n.cidr_v6,

            'gateway': n.gateway_v6,

            'broadcast': None,

            'netmask': n.netmask_v6,

            'version': 6,

            'dns1': None,

            'dns2': None}

        def ips_to_strs(net):

            for key, value in net.items():

                if isinstance(value, netaddr.ip.BaseIP):

                    net[key] = str(value)

            return net

        return [ips_to_strs(subnet_v4), ips_to_strs(subnet_v6)]

**** CubicPower OpenStack Study ****

        def ips_to_strs(net):

            for key, value in net.items():

                if isinstance(value, netaddr.ip.BaseIP):

                    net[key] = str(value)

            return net

        return [ips_to_strs(subnet_v4), ips_to_strs(subnet_v6)]

**** CubicPower OpenStack Study ****

    def get_routes_by_ip_block(self, context, block_id, project_id):

        """Returns the list of routes for the IP block."""

        return []

**** CubicPower OpenStack Study ****

    def get_v4_ips_by_interface(self, context, net_id, vif_id, project_id):

        """Returns a list of IPv4 address strings associated with

           the specified virtual interface, based on the fixed_ips table.

        """

        # TODO(tr3buchet): link fixed_ips to vif by uuid so only 1 db call

        vif_rec = vif_obj.VirtualInterface.get_by_uuid(context, vif_id)

        if not vif_rec:

            return []

        fixed_ips = fixed_ip_obj.FixedIPList.get_by_virtual_interface_id(

            context, vif_rec.id)

        return [str(fixed_ip.address) for fixed_ip in fixed_ips]

**** CubicPower OpenStack Study ****

    def get_v6_ips_by_interface(self, context, net_id, vif_id, project_id):

        """Returns a list containing a single IPv6 address strings

           associated with the specified virtual interface.

        """

        admin_context = context.elevated()

        network = network_obj.Network.get_by_uuid(admin_context, net_id)

        vif_rec = vif_obj.VirtualInterface.get_by_uuid(context, vif_id)

        if network.cidr_v6 and vif_rec and vif_rec.address:

            ip = ipv6.to_global(network.cidr_v6,

                                vif_rec.address,

                                project_id)

            return [ip]

        return []

**** CubicPower OpenStack Study ****

    def get_floating_ips_by_fixed_address(self, context, fixed_address):

        return floating_ip_obj.FloatingIPList.get_by_fixed_address(

            context, fixed_address)