예제 #1
0
    def get_network(self, context, id, fields=None):
        """
        Retrieves all attributes of the network, NOT including
        the ports of that network.

        :returns: a sequence of mappings with the following signature:
                    {'id': UUID representing the network.
                     'name': Human-readable name identifying the network.
                     'tenant_id': Owner of network. only admin user
                                  can specify a tenant_id other than its own.
                     'admin_state_up': Sets admin state of network. if down,
                                       network does not forward packets.
                     'status': Indicates whether network is currently
                               operational (limit values to "ACTIVE", "DOWN",
                               "BUILD", and "ERROR"?
                     'subnets': Subnets associated with this network. Plan
                                to allow fully specified subnets as part of
                                network create.
                   }

        :raises: exception.NetworkNotFound
        :raises: exception.QuantumException
        """
        # goto to the plugin DB and fecth the network
        network = self._get_network(context, id)

        # verify the fabric status of the corresponding
        # logical switch(es) in nvp
        try:
            # FIXME(salvatore-orlando): This is not going to work unless
            # nova_id is stored in db once multiple clusters are enabled
            cluster = self._find_target_cluster(network)
            lswitches = nvplib.get_lswitches(cluster, id)
            net_op_status = constants.NET_STATUS_ACTIVE
            quantum_status = network.status
            for lswitch in lswitches:
                lswitch_status = lswitch.get('LogicalSwitchStatus', None)
                # FIXME(salvatore-orlando): Being unable to fetch the
                # logical switch status should be an exception.
                if (lswitch_status and
                    not lswitch_status.get('fabric_status', None)):
                    net_op_status = constants.NET_STATUS_DOWN
                    break
            LOG.debug(_("Current network status:%(net_op_status)s; "
                        "Status in Quantum DB:%(quantum_status)s")
                      % locals())
            if net_op_status != network.status:
                # update the network status
                with context.session.begin(subtransactions=True):
                    network.status = net_op_status
        except Exception:
            err_msg = _("Unable to get lswitches")
            LOG.exception(err_msg)
            raise nvp_exc.NvpPluginException(err_msg=err_msg)

        # Don't do field selection here otherwise we won't be able
        # to add provider networks fields
        net_result = self._make_network_dict(network, None)
        self._extend_network_dict_provider(context, net_result)
        return self._fields(net_result, fields)
예제 #2
0
 def _handle_lswitch_selection(self, cluster, network,
                               network_binding, max_ports,
                               allow_extra_lswitches):
     lswitches = nvplib.get_lswitches(cluster, network.id)
     try:
         # TODO find main_ls too!
         return [ls for ls in lswitches
                 if (ls['_relations']['LogicalSwitchStatus']
                     ['lport_count'] < max_ports)].pop(0)
     except IndexError:
         # Too bad, no switch available
         LOG.debug(_("No switch has available ports (%d checked)") %
                   len(lswitches))
     if allow_extra_lswitches:
         main_ls = [ls for ls in lswitches if ls['uuid'] == network.id]
         tag_dict = dict((x['scope'], x['tag']) for x in main_ls[0]['tags'])
         if not 'multi_lswitch' in tag_dict:
             nvplib.update_lswitch(cluster,
                                   main_ls[0]['uuid'],
                                   main_ls[0]['display_name'],
                                   network['tenant_id'],
                                   tags=[{'tag': 'True',
                                          'scope': 'multi_lswitch'}])
         selected_lswitch = nvplib.create_lswitch(
             cluster, network.tenant_id,
             "%s-ext-%s" % (network.name, len(lswitches)),
             network_binding.binding_type,
             network_binding.tz_uuid,
             network_binding.vlan_id,
             network.id)
         return selected_lswitch
     else:
         LOG.error(_("Maximum number of logical ports reached for "
                     "logical network %s") % network.id)
         raise nvp_exc.NvpNoMorePortsException(network=network.id)
예제 #3
0
 def _get_lswitch_cluster_pairs(self, netw_id, tenant_id):
     """Figure out the set of lswitches on each cluster that maps to this
        network id"""
     pairs = []
     for c in self.clusters.itervalues():
         lswitches = []
         try:
             results = nvplib.get_lswitches(c, netw_id)
             lswitches.extend([ls['uuid'] for ls in results])
         except q_exc.NetworkNotFound:
             continue
         pairs.append((c, lswitches))
     if len(pairs) == 0:
         raise q_exc.NetworkNotFound(net_id=netw_id)
     LOG.debug(_("Returning pairs for network: %s"), pairs)
     return pairs