Esempio n. 1
0
    def __init__(self, ptm=None, vtm=None):

        self._ptm = ptm
        if self._ptm is None:
            # Set a default topology manager
            self._ptm = TopologyManager()

        self._vtm = vtm
        self._cleanups = callmany.CallMany()
        self._mappings = {}
Esempio n. 2
0
    def __init__(self, ptm, vtm):

        self._ptm = ptm
        if self._ptm is None:
            # Set a default topology manager
            self._ptm = TopologyManager()
            # Define the default tunnel zone
            self._tzone_name = 'tzone-%s' % str(uuid.uuid4())[:4]
        self._vtm = vtm
        self._cleanups = callmany.CallMany()
        self._mappings = {}
Esempio n. 3
0
    def __init__(self, ptm=None, vtm=None):

        self._ptm = ptm
        if self._ptm is None:
            # Set a default topology manager
            self._ptm = TopologyManager()

        self._vtm = vtm
        self._cleanups = callmany.CallMany()
        self._mappings = {}
Esempio n. 4
0
LOG = logging.getLogger(__name__)
"""
This example shows how to execute a test with a predifined physical topology
specified in the topologies/mmm_physical_test_bridge.yaml.

The virtual topology is created inside the test with direct calls to the
Neutron API. It uses the helper method in the NeutronTopologyManager to create
any kind of resources (networks, subnets and ports in this test).
This helper method schedules the deletion of resources created to be executed
during the teardown of the topology (which is executed at the end of the test
or if there's an exception) and ensures that no resources created are left
orphaned after the test.
"""

PTM = TopologyManager()
VTM = NeutronTopologyManager()


def setup_1():
    PTM.build()
    VTM.build()


def destroy_1():
    VTM.destroy()
    PTM.destroy()


@nottest
@with_setup(setup_1, destroy_1)
Esempio n. 5
0
class BindingManager(fixtures.Fixture):

    def __init__(self, ptm=None, vtm=None):

        self._ptm = ptm
        if self._ptm is None:
            # Set a default topology manager
            self._ptm = TopologyManager()

        self._vtm = vtm
        self._cleanups = callmany.CallMany()
        self._mappings = {}

    def set_binding_data(self, data):
        self._data = data

    def get_binding_data(self):
        return self._data

    def _add_hosts_to_tunnel_zone(self):
        _tzone_name = self._ptm.get_default_tunnel_zone_name()
        agents = service.get_all_containers('midolman')
        for agent in agents:
            self._ptm.add_host_to_tunnel_zone(
                agent.get_hostname(), _tzone_name)

    def _update_addresses(self, iface, vport):
        if isinstance(vport, dict) and 'port' in vport and len(vport['port']['fixed_ips']) > 0:
            # This is a neutron port, discover which ip should be used
            n_subnet_id = vport['port']['fixed_ips'][0]['subnet_id']
            base_port = {'port': dict()}
            if 'ipv4_addr' in iface:
                # ip specified in the binding, override that from the vport
                # and update the neutron db
                base_port['port']['fixed_ips'] = [
                    {'subnet_id': n_subnet_id,
                     'ip_address': iface['ipv4_addr'][0].split('/')[0]}
                ]
                if 'hw_addr' in iface:
                    base_port['port']['mac_address'] = iface['hw_addr']

                self._vtm.api.update_port(vport['port']['id'], base_port)
            else:
                # ip from neutron dhcp, get the correct subnet cidr for
                # setting the actual interface ip
                subnet = self._vtm.get_resource(n_subnet_id)
                iface['hw_addr'] = vport['port']['mac_address']

                ipv4_addr = vport['port']['fixed_ips'][0]['ip_address']
                ipv4_cidr = subnet['subnet']['cidr'].split('/')[1]
                iface['ipv4_addr'] = [ipv4_addr + '/' + ipv4_cidr]
        # If not a neutron port, both ip and hw addr should be specified
        return dict(iface)

    def bind(self):
        # Schedule deletion of virtual and physical topologies
        self.addCleanup(self._ptm.destroy)
        self._ptm.build(self._data)
        self.addCleanup(self._vtm.destroy)
        self._vtm.build(self._data)
        self._add_hosts_to_tunnel_zone()
        for binding in self._data['bindings']:
            vport = self._vtm.get_resource(binding['vport'])
            bind_iface = binding['interface']
            if isinstance(bind_iface, dict):
                # We are specifying the vms inside the binding
                iface_def = self._update_addresses(bind_iface['definition'], vport)
                iface_type = bind_iface['type']
                hostname = bind_iface['hostname']
                host = service.get_container_by_hostname(hostname)
                iface = getattr(host, "create_%s" % iface_type)(**iface_def)
                self.addCleanup(getattr(host, "destroy_%s" % iface_type), iface)
            else:
                # It's a vm already created and saved as a resource
                iface = self._ptm.get_resource(binding['interface'])

            vport_id = self._get_port_id(vport)

            # Do the actual binding
            binding = iface.compute_host.bind_port(iface, vport_id)
            self.addCleanup(iface.compute_host.unbind_port, iface)
            self._mappings[vport_id] = iface
            await_port_active(vport_id)

    def unbind(self):
        self.cleanUp()
        self._cleanups = callmany.CallMany()
        self._mappings = {}

    def get_interface_on_vport(self, vport_name):
        """
        Given a virtual port (Neutron or Midonet), it returs the interface
        associated to this port.
        :param vport: A neutron or midonet virtual port object
        :rtype: mdts.services.interface.Interface
        """
        vport = self._vtm.get_resource(vport_name)
        return self._mappings[self._get_port_id(vport)]

    def _get_port_id(self, vport):
        """
        Helper method to get the virtual port id depending on the type of object
        :param vport: A neutron or midonet virtual port object
        :rtype: uuid
        """
        return vport['port']['id'] if isinstance(vport, dict) else vport.get_id()
Esempio n. 6
0
class BindingManager(fixtures.Fixture):
    def __init__(self, ptm=None, vtm=None):

        self._ptm = ptm
        if self._ptm is None:
            # Set a default topology manager
            self._ptm = TopologyManager()

        self._vtm = vtm
        self._cleanups = callmany.CallMany()
        self._mappings = {}

    def set_binding_data(self, data):
        self._data = data

    def get_binding_data(self):
        return self._data

    def _add_hosts_to_tunnel_zone(self):
        _tzone_name = self._ptm.get_default_tunnel_zone_name()
        agents = service.get_all_containers('midolman')
        for agent in agents:
            self._ptm.add_host_to_tunnel_zone(agent.get_hostname(),
                                              _tzone_name)

    def _update_addresses(self, iface, vport):
        if isinstance(vport, dict) and 'port' in vport and len(
                vport['port']['fixed_ips']) > 0:
            # This is a neutron port, discover which ip should be used
            n_subnet_id = vport['port']['fixed_ips'][0]['subnet_id']
            base_port = {'port': dict()}
            if 'ipv4_addr' in iface:
                # ip specified in the binding, override that from the vport
                # and update the neutron db
                base_port['port']['fixed_ips'] = [{
                    'subnet_id':
                    n_subnet_id,
                    'ip_address':
                    iface['ipv4_addr'][0].split('/')[0]
                }]
                if 'hw_addr' in iface:
                    base_port['port']['mac_address'] = iface['hw_addr']

                self._vtm.api.update_port(vport['port']['id'], base_port)
            else:
                # ip from neutron dhcp, get the correct subnet cidr for
                # setting the actual interface ip
                subnet = self._vtm.get_resource(n_subnet_id)
                iface['hw_addr'] = vport['port']['mac_address']

                ipv4_addr = vport['port']['fixed_ips'][0]['ip_address']
                ipv4_cidr = subnet['subnet']['cidr'].split('/')[1]
                iface['ipv4_addr'] = [ipv4_addr + '/' + ipv4_cidr]
        # If not a neutron port, both ip and hw addr should be specified
        return dict(iface)

    def bind(self):
        # Schedule deletion of virtual and physical topologies
        self.addCleanup(self._ptm.destroy)
        self._ptm.build(self._data)
        self.addCleanup(self._vtm.destroy)
        self._vtm.build(self._data)
        self._add_hosts_to_tunnel_zone()
        for binding in self._data['bindings']:
            vport = self._vtm.get_resource(binding['vport'])
            bind_iface = binding['interface']
            if isinstance(bind_iface, dict):
                # We are specifying the vms inside the binding
                iface_def = self._update_addresses(bind_iface['definition'],
                                                   vport)
                iface_type = bind_iface['type']
                hostname = bind_iface['hostname']
                host = service.get_container_by_hostname(hostname)
                iface = getattr(host, "create_%s" % iface_type)(**iface_def)
                self.addCleanup(getattr(host, "destroy_%s" % iface_type),
                                iface)
            else:
                # It's a vm already created and saved as a resource
                iface = self._ptm.get_resource(binding['interface'])

            vport_id = self._get_port_id(vport)

            # Do the actual binding
            binding = iface.compute_host.bind_port(iface, vport_id)
            self.addCleanup(iface.compute_host.unbind_port, iface)
            self._mappings[vport_id] = iface
            await_port_active(vport_id)

    def unbind(self):
        self.cleanUp()
        self._cleanups = callmany.CallMany()
        self._mappings = {}

    def get_interface_on_vport(self, vport_name):
        """
        Given a virtual port (Neutron or Midonet), it returs the interface
        associated to this port.
        :param vport: A neutron or midonet virtual port object
        :rtype: mdts.services.interface.Interface
        """
        vport = self._vtm.get_resource(vport_name)
        return self._mappings[self._get_port_id(vport)]

    def _get_port_id(self, vport):
        """
        Helper method to get the virtual port id depending on the type of object
        :param vport: A neutron or midonet virtual port object
        :rtype: uuid
        """
        return vport['port']['id'] if isinstance(vport,
                                                 dict) else vport.get_id()
Esempio n. 7
0
class BindingManager(fixtures.Fixture):

    def __init__(self, ptm, vtm):

        self._ptm = ptm
        if self._ptm is None:
            # Set a default topology manager
            self._ptm = TopologyManager()
            # Define the default tunnel zone
            self._tzone_name = 'tzone-%s' % str(uuid.uuid4())[:4]
        self._vtm = vtm
        self._cleanups = callmany.CallMany()
        self._mappings = {}

    def set_binding_data(self, data):
        self._data = data

    def get_binding_data(self):
        return self._data

    def bind(self):
        self._ptm.build()
        self._vtm.build()
        for binding in self._data['bindings']:
            vport = self._vtm.get_resource(binding['vport'])
            bind_iface = binding['interface']
            if type(bind_iface) is dict:
                # We are specifying the vms inside the binding
                iface_def = bind_iface['definition']
                iface_type = bind_iface['type']
                hostname = bind_iface['hostname']
                host = service.get_container_by_hostname(hostname)
                self._ptm.add_host_to_tunnel_zone(hostname, self._tzone_name)
                iface = getattr(host, "create_%s" % iface_type)(**iface_def)
            else:
                # It's a vm already created and saved as a resource
                iface = self._ptm.get_resource(binding['interface'])

            vport_id = self._get_port_id(vport)

            # Do the actual binding
            binding = iface.compute_host.bind_port(iface, vport_id)
            self.addCleanup(iface.compute_host.unbind_port, iface)
            self._mappings[vport_id] = iface
            await_port_active(vport_id)

        # Schedule deletion of virtual and physical topologies
        self.addCleanup(self._vtm.destroy)
        self.addCleanup(self._ptm.destroy)

    def unbind(self):
        self.cleanUp()
        self._cleanups = callmany.CallMany()
        self._mappings = {}

    def get_interface_on_vport(self, vport_name):
        """
        Given a virtual port (Neutron or Midonet), it returs the interface
        associated to this port.
        :param vport: A neutron or midonet virtual port object
        :rtype: mdts.services.interface.Interface
        """
        vport = self._vtm.get_resource(vport_name)
        return self._mappings[self._get_port_id(vport)]

    def _get_port_id(self, vport):
        """
        Helper method to get the virtual port id depending on the type of object
        :param vport: A neutron or midonet virtual port object
        :rtype: uuid
        """
        return vport['port']['id'] if type(vport) is dict else vport.get_id()