示例#1
0
def nsx_redo_metadata_cfg_for_edge(context, plugin, edge_id):
    binding = nsxv_db.get_nsxv_router_binding_by_edge(context.session, edge_id)
    if binding:
        az_name = binding['availability_zone']

        conf_az = nsx_az.NsxVAvailabilityZones()
        az = conf_az.availability_zones[az_name]
        if not az.supports_metadata():
            LOG.error('Edge %(edge)s belongs to az %(az)s which does not '
                      'support metadata',
                      {'az': az_name, 'edge': edge_id})

        edge_internal_ips, md_rtr_ids = _get_internal_edge_ips(context,
                                                               az_name)

        if binding['router_id'] in md_rtr_ids:
            LOG.error('Edge %s is a metadata proxy', edge_id)
            return

        if (binding['router_id'].startswith(
                vcns_constants.BACKUP_ROUTER_PREFIX) or
                binding['router_id'].startswith(
                    vcns_constants.PLR_EDGE_PREFIX)or
                binding['router_id'].startswith(
                    lb_common.RESOURCE_ID_PFX)):
            LOG.error('Edge %s is not a metadata delivery appliance', edge_id)
            return

        _handle_edge(context, plugin, az_name, edge_id, edge_internal_ips)
    else:
        LOG.error('No edge binding found for edge %s', edge_id)
示例#2
0
def _get_edge_az_and_size(edge_id):
    edgeapi = utils.NeutronDbClient()
    binding = nsxv_db.get_nsxv_router_binding_by_edge(
        edgeapi.context.session, edge_id)
    if binding:
        return binding['availability_zone'], binding['appliance_size']
    # default fallback
    return nsx_az.DEFAULT_NAME, nsxv_constants.LARGE
示例#3
0
 def delete_l2_gateway(self, context, l2_gateway):
     """Delete a L2 gateway."""
     self._admin_check(context, 'DELETE')
     device = self._get_device(context, l2_gateway)
     edge_id = device.get('device_name')
     rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
         context.session, edge_id)
     if rtr_binding:
         self._edge_manager.delete_lrouter(context,
                                           rtr_binding['router_id'])
示例#4
0
 def delete_l2_gateway(self, context, l2_gateway):
     """Delete a L2 gateway."""
     self._admin_check(context, 'DELETE')
     device = self._get_device(context, l2_gateway)
     edge_id = device.get('device_name')
     rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
                     context.session, edge_id)
     if rtr_binding:
         self._edge_manager.delete_lrouter(context,
                                           rtr_binding['router_id'])
示例#5
0
    def delete(self, context, lb, completor):
        # Discard any ports which are associated with LB
        filters = {
            'device_id': [lb['id']],
            'device_owner': [constants.DEVICE_OWNER_NEUTRON_PREFIX + 'LB']
        }
        lb_ports = self.core_plugin.get_ports(context.elevated(),
                                              filters=filters)
        for lb_port in lb_ports:
            self.core_plugin.delete_port(context.elevated(), lb_port['id'])

        binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb['id'])
        if binding:
            edge_binding = nsxv_db.get_nsxv_router_binding_by_edge(
                context.session, binding['edge_id'])

            # set LB default rule
            lb_common.set_lb_firewall_default_rule(self.vcns,
                                                   binding['edge_id'], 'deny')
            if edge_binding:
                old_lb = lb_common.is_lb_on_router_edge(
                    context, self.core_plugin, binding['edge_id'])
                if not old_lb:
                    resource_id = lb_common.get_lb_resource_id(lb['id'])
                    self.core_plugin.edge_manager.delete_lrouter(context,
                                                                 resource_id,
                                                                 dist=False)
                else:
                    # Edge was created on an exclusive router with the old code
                    try:
                        lb_common.del_vip_fw_rule(self.vcns,
                                                  binding['edge_id'],
                                                  binding['edge_fw_rule_id'])
                    except nsxv_exc.VcnsApiException as e:
                        LOG.error(
                            'Failed to delete loadbalancer %(lb)s '
                            'FW rule. exception is %(exc)s', {
                                'lb': lb['id'],
                                'exc': e
                            })
                    try:
                        lb_common.del_vip_as_secondary_ip(
                            self.vcns, binding['edge_id'], lb['vip_address'])
                    except Exception as e:
                        LOG.error(
                            'Failed to delete loadbalancer %(lb)s '
                            'interface IP. exception is %(exc)s', {
                                'lb': lb['id'],
                                'exc': e
                            })

            nsxv_db.del_nsxv_lbaas_loadbalancer_binding(
                context.session, lb['id'])
        completor(success=True)
示例#6
0
def get_lb_edge_name(context, lb_id):
    """Look for the resource name of the edge hosting the LB.

    For older loadbalancers this may be a router edge
    """
    binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
        context.session, lb_id)
    if binding:
        edge_binding = nsxv_db.get_nsxv_router_binding_by_edge(
            context.session, binding['edge_id'])
        if edge_binding:
            return edge_binding['router_id']
    # fallback
    return get_lb_resource_id(lb_id)
示例#7
0
def _recreate_rtr_metadata_cfg(context, plugin, az_name, edge_id):
    rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
        context.session, edge_id)
    md_handler = plugin.metadata_proxy_handler[az_name]
    if md_handler:
        try:
            md_handler.configure_router_edge(
                context, rtr_binding['router_id'])
            LOG.info('Added metadata components for edge %s',
                     edge_id)
        except Exception as e:
            LOG.error('Recreation of metadata components for edge '
                      '%(edge)s failed with error %(e)s',
                      {'edge': edge_id, 'e': e})
示例#8
0
def get_lb_edge_name(context, lb_id):
    """Look for the resource name of the edge hosting the LB.

    For older loadbalancers this may be a router edge
    """
    binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
        context.session, lb_id)
    if binding:
        edge_binding = nsxv_db.get_nsxv_router_binding_by_edge(
            context.session, binding['edge_id'])
        if edge_binding:
            return edge_binding['router_id']
    # fallback
    return get_lb_resource_id(lb_id)
示例#9
0
def is_lb_on_router_edge(context, core_plugin, edge_id):
    binding = nsxv_db.get_nsxv_router_binding_by_edge(
        context.session, edge_id)
    router_id = binding['router_id']
    if router_id.startswith(RESOURCE_ID_PFX):
        # New lbaas edge
        return False

    # verify that this is a router (and an exclusive one)
    try:
        router = core_plugin.get_router(context, router_id)
        if router.get('router_type') == 'exclusive':
            return True
    except Exception:
        pass
    LOG.error("Edge %(edge)s router %(rtr)s is not an lbaas edge, but also "
              "not an exclusive router",
              {'edge': edge_id, 'rtr': router_id})
    return False
示例#10
0
def nsx_list_name_mismatches(resource, event, trigger, **kwargs):
    edges = nsxv.get_edges()[1]
    edges = edges['edgePage'].get('data', [])
    plugin_nsx_mismatch = []
    edgeapi = utils.NeutronDbClient()
    for edge in edges:
        rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
                edgeapi.context.session, edge['id'])

        if (edge['name'].startswith('backup-')
            and rtr_binding['router_id'] != edge['name']):
            plugin_nsx_mismatch.append(
                    {'edge_id': edge['id'],
                     'edge_name': edge['name'],
                     'router_id': rtr_binding['router_id']})

    LOG.info(formatters.output_formatter(
            constants.BACKUP_EDGES, plugin_nsx_mismatch,
            ['edge_id', 'edge_name', 'router_id']))
示例#11
0
def is_lb_on_router_edge(context, core_plugin, edge_id):
    binding = nsxv_db.get_nsxv_router_binding_by_edge(
        context.session, edge_id)
    router_id = binding['router_id']
    if router_id.startswith(RESOURCE_ID_PFX):
        # New lbaas edge
        return False

    # verify that this is a router (and an exclusive one)
    try:
        router = core_plugin.get_router(context, router_id)
        if router.get('router_type') == 'exclusive':
            return True
    except Exception:
        pass
    LOG.error("Edge %(edge)s router %(rtr)s is not an lbaas edge, but also "
              "not an exclusive router",
              {'edge': edge_id, 'rtr': router_id})
    return False
示例#12
0
def nsx_list_name_mismatches(resource, event, trigger, **kwargs):
    edges = utils.get_nsxv_backend_edges()
    plugin_nsx_mismatch = []
    backend_edge_ids = []
    edgeapi = utils.NeutronDbClient()
    # Look for edges with the wrong names:
    for edge in edges:
        backend_edge_ids.append(edge['id'])
        rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
            edgeapi.context.session, edge['id'])

        if (rtr_binding and edge['name'].startswith('backup-')
                and rtr_binding['router_id'] != edge['name']):
            plugin_nsx_mismatch.append({
                'edge_id': edge['id'],
                'edge_name': edge['name'],
                'router_id': rtr_binding['router_id']
            })

    LOG.info(
        formatters.output_formatter(
            constants.BACKUP_EDGES + ' with name mismatch:',
            plugin_nsx_mismatch, ['edge_id', 'edge_name', 'router_id']))

    # Also look for missing edges
    like_filters = {'router_id': vcns_const.BACKUP_ROUTER_PREFIX + "%"}
    rtr_bindings = nsxv_db.get_nsxv_router_bindings(edgeapi.context.session,
                                                    like_filters=like_filters)
    plugin_nsx_missing = []

    for rtr_binding in rtr_bindings:
        if rtr_binding['edge_id'] not in backend_edge_ids:
            plugin_nsx_missing.append({
                'edge_id': rtr_binding['edge_id'],
                'router_id': rtr_binding['router_id'],
                'db_status': rtr_binding['status']
            })

    LOG.info(
        formatters.output_formatter(
            constants.BACKUP_EDGES + ' missing from backend:',
            plugin_nsx_missing, ['edge_id', 'router_id', 'db_status']))
示例#13
0
def nsx_list_name_mismatches(resource, event, trigger, **kwargs):
    edges = nsxv.get_edges()[1]
    edges = edges['edgePage'].get('data', [])
    plugin_nsx_mismatch = []
    edgeapi = utils.NeutronDbClient()
    for edge in edges:
        rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
            edgeapi.context.session, edge['id'])

        if (rtr_binding and edge['name'].startswith('backup-')
                and rtr_binding['router_id'] != edge['name']):
            plugin_nsx_mismatch.append({
                'edge_id': edge['id'],
                'edge_name': edge['name'],
                'router_id': rtr_binding['router_id']
            })

    LOG.info(
        formatters.output_formatter(constants.BACKUP_EDGES,
                                    plugin_nsx_mismatch,
                                    ['edge_id', 'edge_name', 'router_id']))
示例#14
0
def get_nsxv_backup_edges(scope="all"):
    edges = utils.get_nsxv_backend_edges()
    backup_edges = []
    edgeapi = utils.NeutronDbClient()
    for edge in edges:
        if edge['name'].startswith("backup-"):
            # Make sure it is really a backup edge
            edge_vnic_binds = nsxv_db.get_edge_vnic_bindings_by_edge(
                edgeapi.context.session, edge['id'])
            if scope != "all":
                # Make sure the backup edge exists in neutron
                # Return backup edges existing in both neutron and backend
                # when scope != all
                edge_in_neutron = nsxv_db.get_nsxv_router_binding_by_edge(
                    edgeapi.context.session, edge['id'])
                if not edge_vnic_binds and edge_in_neutron:
                    extend_edge_info(edge)
                    backup_edges.append(edge)
            else:
                if not edge_vnic_binds:
                    extend_edge_info(edge)
                    backup_edges.append(edge)
    return backup_edges
示例#15
0
def nsx_fix_name_mismatch(resource, event, trigger, **kwargs):
    errmsg = ("Need to specify edge-id property. Add --property "
              "edge-id=<edge-id>")
    if not kwargs.get('property'):
        LOG.error("%s", errmsg)
        return
    properties = admin_utils.parse_multi_keyval_opt(kwargs['property'])
    edgeapi = utils.NeutronDbClient()
    edge_id = properties.get('edge-id')
    if not edge_id:
        LOG.error("%s", errmsg)
        return
    try:
        # edge[0] is response status code
        # edge[1] is response body
        edge = nsxv.get_edge(edge_id)[1]
    except exceptions.NeutronException as e:
        LOG.error("%s", str(e))
    else:
        if edge['name'].startswith('backup-'):

            rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
                    edgeapi.context.session, edge['id'])

            if rtr_binding['router_id'] == edge['name']:
                LOG.error('Edge %s no mismatch with NSX', edge_id)
                return

            try:
                with locking.LockManager.get_lock(edge_id):
                    # Update edge at NSXv backend
                    if rtr_binding['router_id'].startswith('dhcp-'):
                        # Edge is a DHCP edge - just use router_id as name
                        edge['name'] = rtr_binding['router_id']
                    else:
                        # This is a router - if shared, prefix with 'shared-'
                        nsx_attr = (edgeapi.context.session.query(
                            nsxv_models.NsxvRouterExtAttributes).filter_by(
                                router_id=rtr_binding['router_id']).first())
                        if nsx_attr and nsx_attr['router_type'] == 'shared':
                            edge['name'] = ('shared-' + _uuid())[
                                           :vcns_const.EDGE_NAME_LEN]
                        elif (nsx_attr and
                              nsx_attr['router_type'] == 'exclusive'):
                            rtr_db = (edgeapi.context.session.query(
                                l3_db.Router).filter_by(
                                    id=rtr_binding['router_id']).first())
                            if rtr_db:
                                edge['name'] = (
                                    rtr_db['name'][
                                        :nsxv_constants.ROUTER_NAME_LENGTH -
                                        len(rtr_db['id'])] +
                                    '-' + rtr_db['id'])
                            else:
                                LOG.error(
                                    'No database entry for router id %s',
                                    rtr_binding['router_id'])

                        else:
                            LOG.error(
                                'Could not determine the name for '
                                'Edge %s', edge_id)
                            return

                    if not kwargs.get('force'):
                        confirm = admin_utils.query_yes_no(
                            "Do you want to rename edge %s to %s" %
                            (edge_id, edge['name']),
                            default="no")

                        if not confirm:
                            LOG.info("Edge rename aborted by user")
                            return
                    LOG.info("Edge rename started")
                    # remove some keys that will fail the NSX transaction
                    edge_utils.remove_irrelevant_keys_from_edge_request(edge)
                    try:
                        LOG.error("Update edge...")
                        nsxv.update_edge(edge_id, edge)
                    except Exception as e:
                        LOG.error("Update failed - %s", (e))
            except Exception as e:
                LOG.error("%s", str(e))
        else:
            LOG.error(
                'Edge %s has no backup prefix on NSX', edge_id)
            return
示例#16
0
def nsx_fix_name_mismatch(resource, event, trigger, **kwargs):
    errmsg = ("Need to specify edge-id property. Add --property "
              "edge-id=<edge-id>")
    if not kwargs.get('property'):
        LOG.error(_LE("%s"), errmsg)
        return
    properties = admin_utils.parse_multi_keyval_opt(kwargs['property'])
    edgeapi = utils.NeutronDbClient()
    edge_id = properties.get('edge-id')
    if not edge_id:
        LOG.error(_LE("%s"), errmsg)
        return
    try:
        # edge[0] is response status code
        # edge[1] is response body
        edge = nsxv.get_edge(edge_id)[1]
    except exceptions.NeutronException as e:
        LOG.error(_LE("%s"), str(e))
    else:
        if edge['name'].startswith('backup-'):

            rtr_binding = nsxv_db.get_nsxv_router_binding_by_edge(
                    edgeapi.context.session, edge['id'])

            if rtr_binding['router_id'] == edge['name']:
                LOG.error(
                    _LE('Edge %s no mismatch with NSX'), edge_id)
                return

            try:
                with locking.LockManager.get_lock(edge_id):
                    # Update edge at NSXv backend
                    if rtr_binding['router_id'].startswith('dhcp-'):
                        # Edge is a DHCP edge - just use router_id as name
                        edge['name'] = rtr_binding['router_id']
                    else:
                        # This is a router - if shared, prefix with 'shared-'
                        nsx_attr = (edgeapi.context.session.query(
                            nsxv_models.NsxvRouterExtAttributes).filter_by(
                                router_id=rtr_binding['router_id']).first())
                        if nsx_attr and nsx_attr['router_type'] == 'shared':
                            edge['name'] = ('shared-' + _uuid())[
                                           :vcns_const.EDGE_NAME_LEN]
                        elif (nsx_attr
                              and nsx_attr['router_type'] == 'exclusive'):
                            rtr_db = (edgeapi.context.session.query(
                                l3_db.Router).filter_by(
                                    id=rtr_binding['router_id']).first())
                            if rtr_db:
                                edge['name'] = (
                                    rtr_db['name'][
                                        :nsxv_constants.ROUTER_NAME_LENGTH -
                                        len(rtr_db['id'])] +
                                    '-' + rtr_db['id'])
                            else:
                                LOG.error(
                                    _LE('No database entry for router id %s'),
                                    rtr_binding['router_id'])

                        else:
                            LOG.error(
                                _LE('Could not determine the name for '
                                    'Edge %s'), edge_id)
                            return

                    confirm = admin_utils.query_yes_no(
                        "Do you want to rename edge %s to %s" % (edge_id,
                                                                 edge['name']),
                        default="no")

                    if not confirm:
                        LOG.info(_LI("Edge rename aborted by user"))
                        return
                    LOG.info(_LI("Edge rename started"))
                    # remove some keys that will fail the NSX transaction
                    edge_utils.remove_irrelevant_keys_from_edge_request(edge)
                    try:
                        LOG.error(_LE("Update edge..."))
                        nsxv.update_edge(edge_id, edge)
                    except Exception as e:
                        LOG.error(_LE("Update failed - %s"), (e))
            except Exception as e:
                LOG.error(_LE("%s"), str(e))
        else:
            LOG.error(
                _LE('Edge %s has no backup prefix on NSX'), edge_id)
            return