def test_get_node_portmap(self): with task_manager.acquire(self.context, self.node.uuid) as task: portmap = neutron.get_node_portmap(task) self.assertEqual( {self.ports[0].uuid: self.ports[0].local_link_connection}, portmap )
def configure_tenant_networks(self, task): """Configure tenant networks for a node. :param task: A TaskManager instance. :raises: NetworkError """ node = task.node ports = task.ports LOG.info(_LI('Mapping instance ports to %s'), node.uuid) # TODO(russell_h): this is based on the broken assumption that the # number of Neutron ports will match the number of physical ports. # Instead, we should probably list ports for this instance in # Neutron and update all of those with the appropriate portmap. if not ports: msg = _("No ports are associated with node %s") % node.uuid LOG.error(msg) raise exception.NetworkError(msg) ports = [p for p in ports if not p.portgroup_id] portgroups = task.portgroups portmap = neutron.get_node_portmap(task) client = neutron.get_client(task.context.auth_token) pobj_without_vif = 0 for port_like_obj in ports + portgroups: vif_port_id = ( port_like_obj.internal_info.get('tenant_vif_port_id') or port_like_obj.extra.get('vif_port_id')) if not vif_port_id: pobj_without_vif += 1 continue LOG.debug( 'Mapping tenant port %(vif_port_id)s to node ' '%(node_id)s', { 'vif_port_id': vif_port_id, 'node_id': node.uuid }) local_link_info = [] client_id_opt = None if isinstance(port_like_obj, objects.Portgroup): pg_ports = [ p for p in task.ports if p.portgroup_id == port_like_obj.id ] for port in pg_ports: local_link_info.append(portmap[port.uuid]) else: # We iterate only on ports or portgroups, no need to check # that it is a port local_link_info.append(portmap[port_like_obj.uuid]) client_id = port_like_obj.extra.get('client-id') if client_id: client_id_opt = ({ 'opt_name': 'client-id', 'opt_value': client_id }) body = { 'port': { 'device_owner': 'baremetal:none', 'device_id': node.instance_uuid or node.uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'binding:host_id': node.uuid, 'binding:profile': { 'local_link_information': local_link_info, }, } } if client_id_opt: body['port']['extra_dhcp_opts'] = [client_id_opt] try: client.update_port(vif_port_id, body) except neutron_exceptions.ConnectionFailed as e: msg = (_('Could not add public network VIF %(vif)s ' 'to node %(node)s, possible network issue. %(exc)s') % { 'vif': vif_port_id, 'node': node.uuid, 'exc': e }) LOG.error(msg) raise exception.NetworkError(msg) if pobj_without_vif == len(ports + portgroups): msg = _("No neutron ports or portgroups are associated with " "node %s") % node.uuid LOG.error(msg) raise exception.NetworkError(msg)
def configure_tenant_networks(self, task): """Configure tenant networks for a node. :param task: A TaskManager instance. :raises: NetworkError """ node = task.node ports = task.ports LOG.info(_LI('Mapping instance ports to %s'), node.uuid) # TODO(russell_h): this is based on the broken assumption that the # number of Neutron ports will match the number of physical ports. # Instead, we should probably list ports for this instance in # Neutron and update all of those with the appropriate portmap. if not ports: msg = _("No ports are associated with node %s") % node.uuid LOG.error(msg) raise exception.NetworkError(msg) ports = [p for p in ports if not p.portgroup_id] portgroups = task.portgroups portmap = neutron.get_node_portmap(task) client = neutron.get_client(task.context.auth_token) pobj_without_vif = 0 for port_like_obj in ports + portgroups: vif_port_id = port_like_obj.extra.get('vif_port_id') if not vif_port_id: pobj_without_vif += 1 continue LOG.debug('Mapping tenant port %(vif_port_id)s to node ' '%(node_id)s', {'vif_port_id': vif_port_id, 'node_id': node.uuid}) local_link_info = [] client_id_opt = None if isinstance(port_like_obj, objects.Portgroup): pg_ports = [p for p in task.ports if p.portgroup_id == port_like_obj.id] for port in pg_ports: local_link_info.append(portmap[port.uuid]) else: # We iterate only on ports or portgroups, no need to check # that it is a port local_link_info.append(portmap[port_like_obj.uuid]) client_id = port_like_obj.extra.get('client-id') if client_id: client_id_opt = ( {'opt_name': 'client-id', 'opt_value': client_id}) body = { 'port': { 'device_owner': 'baremetal:none', 'device_id': node.instance_uuid or node.uuid, 'admin_state_up': True, 'binding:vnic_type': 'baremetal', 'binding:host_id': node.uuid, 'binding:profile': { 'local_link_information': local_link_info, }, } } if client_id_opt: body['port']['extra_dhcp_opts'] = [client_id_opt] try: client.update_port(vif_port_id, body) except neutron_exceptions.ConnectionFailed as e: msg = (_('Could not add public network VIF %(vif)s ' 'to node %(node)s, possible network issue. %(exc)s') % {'vif': vif_port_id, 'node': node.uuid, 'exc': e}) LOG.error(msg) raise exception.NetworkError(msg) if pobj_without_vif == len(ports + portgroups): msg = _("No neutron ports or portgroups are associated with " "node %s") % node.uuid LOG.error(msg) raise exception.NetworkError(msg)