Merge "NSXV status for out of sync LBs"
This commit is contained in:
commit
586a98bf4e
@ -386,7 +386,8 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
|||||||
self.octavia_stats_collector = (
|
self.octavia_stats_collector = (
|
||||||
octavia_listener.NSXOctaviaStatisticsCollector(
|
octavia_listener.NSXOctaviaStatisticsCollector(
|
||||||
self,
|
self,
|
||||||
self._get_octavia_stats_getter()))
|
self._get_octavia_stats_getter(),
|
||||||
|
self._get_octavia_status_getter()))
|
||||||
|
|
||||||
def init_complete(self, resource, event, trigger, payload=None):
|
def init_complete(self, resource, event, trigger, payload=None):
|
||||||
with locking.LockManager.get_lock('plugin-init-complete'):
|
with locking.LockManager.get_lock('plugin-init-complete'):
|
||||||
@ -446,6 +447,9 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
|||||||
def _get_octavia_stats_getter(self):
|
def _get_octavia_stats_getter(self):
|
||||||
return listener_mgr.stats_getter
|
return listener_mgr.stats_getter
|
||||||
|
|
||||||
|
def _get_octavia_status_getter(self):
|
||||||
|
return loadbalancer_mgr.status_getter
|
||||||
|
|
||||||
def _validate_nsx_version(self):
|
def _validate_nsx_version(self):
|
||||||
ver = self.nsx_v.vcns.get_version()
|
ver = self.nsx_v.vcns.get_version()
|
||||||
if version.LooseVersion(ver) < version.LooseVersion('6.2.3'):
|
if version.LooseVersion(ver) < version.LooseVersion('6.2.3'):
|
||||||
|
@ -30,6 +30,7 @@ from vmware_nsx.plugins.nsx_v.vshield.common import (
|
|||||||
constants as vcns_const)
|
constants as vcns_const)
|
||||||
from vmware_nsx.plugins.nsx_v.vshield.common import exceptions as nsxv_exc
|
from vmware_nsx.plugins.nsx_v.vshield.common import exceptions as nsxv_exc
|
||||||
from vmware_nsx.services.lbaas import base_mgr
|
from vmware_nsx.services.lbaas import base_mgr
|
||||||
|
from vmware_nsx.services.lbaas import lb_const
|
||||||
from vmware_nsx.services.lbaas.nsx_v import lbaas_common as lb_common
|
from vmware_nsx.services.lbaas.nsx_v import lbaas_common as lb_common
|
||||||
from vmware_nsx.services.lbaas.octavia import constants as oct_const
|
from vmware_nsx.services.lbaas.octavia import constants as oct_const
|
||||||
|
|
||||||
@ -228,3 +229,59 @@ class EdgeLoadBalancerManagerFromDict(base_mgr.EdgeLoadbalancerBaseManager):
|
|||||||
|
|
||||||
def validate_availability_zone(self, availability_zone_metadata):
|
def validate_availability_zone(self, availability_zone_metadata):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def status_getter(context, core_plugin):
|
||||||
|
lb_statuses = []
|
||||||
|
lsn_statuses = []
|
||||||
|
pool_statuses = []
|
||||||
|
member_statuses = []
|
||||||
|
|
||||||
|
lb_bindings = nsxv_db.get_nsxv_lbaas_loadbalancer_bindings(context.session)
|
||||||
|
for lb_binding in lb_bindings:
|
||||||
|
lb_status = lb_const.ONLINE
|
||||||
|
try:
|
||||||
|
_, lb_stats = core_plugin.nsx_v.vcns.get_loadbalancer_statistics(
|
||||||
|
lb_binding['edge_id'])
|
||||||
|
|
||||||
|
for vs in lb_stats.get('virtualServer', []):
|
||||||
|
if vs['name'].startswith('vip_'):
|
||||||
|
vs_id = vs['name'].replace('vip_', '')
|
||||||
|
vs_status = lb_const.OFFLINE
|
||||||
|
if vs['status'] == 'OPEN':
|
||||||
|
vs_status = lb_const.ONLINE
|
||||||
|
lsn_statuses.append({
|
||||||
|
'id': vs_id, 'operating_status': vs_status})
|
||||||
|
|
||||||
|
for pool in lb_stats.get('pool', []):
|
||||||
|
if pool['name'].startswith('pool_'):
|
||||||
|
pool_id = pool['name'].replace('pool_', '')
|
||||||
|
pool_status = lb_const.OFFLINE
|
||||||
|
if pool['status'] == 'UP':
|
||||||
|
pool_status = lb_const.ONLINE
|
||||||
|
pool_statuses.append({
|
||||||
|
'id': pool_id,
|
||||||
|
'operating_status': pool_status})
|
||||||
|
|
||||||
|
for member in pool.get('member', []):
|
||||||
|
if member['name'].startswith('member-'):
|
||||||
|
member_status = lb_const.OFFLINE
|
||||||
|
if member['status'] == 'UP':
|
||||||
|
member_status = lb_const.ONLINE
|
||||||
|
member_statuses.append({
|
||||||
|
'pool_id': pool_id,
|
||||||
|
'member_ip': member.get('ipAddress'),
|
||||||
|
'operating_status': member_status})
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
lb_status = lb_const.OFFLINE
|
||||||
|
LOG.error('Failed to fetch loadbalancer status from edge %s with '
|
||||||
|
'exception %s', lb_binding['edge_id'], e)
|
||||||
|
|
||||||
|
lb_statuses.append({'id': lb_binding['loadbalancer_id'],
|
||||||
|
'operating_status': lb_status})
|
||||||
|
|
||||||
|
return {lb_const.LOADBALANCERS: lb_statuses,
|
||||||
|
lb_const.LISTENERS: lsn_statuses,
|
||||||
|
lb_const.POOLS: pool_statuses,
|
||||||
|
lb_const.MEMBERS: member_statuses}
|
||||||
|
@ -30,8 +30,8 @@ from octavia.db import api as db_apis
|
|||||||
from octavia.db import repositories
|
from octavia.db import repositories
|
||||||
from octavia_lib.api.drivers import driver_lib
|
from octavia_lib.api.drivers import driver_lib
|
||||||
from octavia_lib.api.drivers import exceptions
|
from octavia_lib.api.drivers import exceptions
|
||||||
|
|
||||||
from octavia_lib.api.drivers import provider_base as driver_base
|
from octavia_lib.api.drivers import provider_base as driver_base
|
||||||
|
from octavia_lib.common import constants as o_const
|
||||||
|
|
||||||
from vmware_nsx.services.lbaas import lb_const
|
from vmware_nsx.services.lbaas import lb_const
|
||||||
from vmware_nsx.services.lbaas.octavia import constants as d_const
|
from vmware_nsx.services.lbaas.octavia import constants as d_const
|
||||||
@ -724,6 +724,14 @@ class NSXOctaviaDriverEndpoint(driver_lib.DriverLibrary):
|
|||||||
LOG.error("Failed to update Octavia listener statistics. "
|
LOG.error("Failed to update Octavia listener statistics. "
|
||||||
"Stats %s, Error %s", statistics, e.fault_string)
|
"Stats %s, Error %s", statistics, e.fault_string)
|
||||||
|
|
||||||
|
@log_helpers.log_method_call
|
||||||
|
def get_active_loadbalancers(self, ctxt):
|
||||||
|
# refresh the driver lib session
|
||||||
|
self.db_session = db_apis.get_session()
|
||||||
|
lbs, _ = self.repositories.load_balancer.get_all(
|
||||||
|
self.db_session, provisioning_status=o_const.ACTIVE)
|
||||||
|
return [lb.id for lb in lbs]
|
||||||
|
|
||||||
|
|
||||||
@log_helpers.log_method_call
|
@log_helpers.log_method_call
|
||||||
def vmware_nsx_provider_agent(exit_event):
|
def vmware_nsx_provider_agent(exit_event):
|
||||||
|
@ -30,9 +30,11 @@ from oslo_log import log as logging
|
|||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
from oslo_messaging.rpc import dispatcher
|
from oslo_messaging.rpc import dispatcher
|
||||||
|
|
||||||
|
from vmware_nsx.services.lbaas import lb_const
|
||||||
from vmware_nsx.services.lbaas.octavia import constants
|
from vmware_nsx.services.lbaas.octavia import constants
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
STATUS_CHECKER_COUNT = 10
|
||||||
|
|
||||||
|
|
||||||
class NSXOctaviaListener(object):
|
class NSXOctaviaListener(object):
|
||||||
@ -304,6 +306,10 @@ class NSXOctaviaListenerEndpoint(object):
|
|||||||
kw = {'status': status}
|
kw = {'status': status}
|
||||||
self.client.cast({}, 'update_loadbalancer_status', **kw)
|
self.client.cast({}, 'update_loadbalancer_status', **kw)
|
||||||
|
|
||||||
|
def get_active_loadbalancers(self):
|
||||||
|
kw = {}
|
||||||
|
return self.client.call({}, 'get_active_loadbalancers', **kw)
|
||||||
|
|
||||||
@log_helpers.log_method_call
|
@log_helpers.log_method_call
|
||||||
def loadbalancer_create(self, ctxt, loadbalancer):
|
def loadbalancer_create(self, ctxt, loadbalancer):
|
||||||
ctx = neutron_context.Context(None, loadbalancer['project_id'])
|
ctx = neutron_context.Context(None, loadbalancer['project_id'])
|
||||||
@ -729,6 +735,7 @@ class NSXOctaviaStatisticsCollector(object):
|
|||||||
self.core_plugin = core_plugin
|
self.core_plugin = core_plugin
|
||||||
self.listener_stats_getter = listener_stats_getter
|
self.listener_stats_getter = listener_stats_getter
|
||||||
self.loadbalancer_status_getter = loadbalancer_status_getter
|
self.loadbalancer_status_getter = loadbalancer_status_getter
|
||||||
|
self.status_checker_counter = 0
|
||||||
if cfg.CONF.octavia_stats_interval:
|
if cfg.CONF.octavia_stats_interval:
|
||||||
eventlet.spawn_n(self.thread_runner,
|
eventlet.spawn_n(self.thread_runner,
|
||||||
cfg.CONF.octavia_stats_interval)
|
cfg.CONF.octavia_stats_interval)
|
||||||
@ -761,4 +768,24 @@ class NSXOctaviaStatisticsCollector(object):
|
|||||||
if self.loadbalancer_status_getter:
|
if self.loadbalancer_status_getter:
|
||||||
loadbalancer_status = self.loadbalancer_status_getter(
|
loadbalancer_status = self.loadbalancer_status_getter(
|
||||||
context, self.core_plugin)
|
context, self.core_plugin)
|
||||||
|
|
||||||
|
if self.status_checker_counter == 0:
|
||||||
|
self.status_checker_counter = STATUS_CHECKER_COUNT
|
||||||
|
octavia_lb_ids = []
|
||||||
|
try:
|
||||||
|
octavia_lb_ids = endpoint.get_active_loadbalancers()
|
||||||
|
except Exception as e:
|
||||||
|
LOG.error('Fetching loadbalancer list from Octavia failed '
|
||||||
|
'with error %e', e)
|
||||||
|
if octavia_lb_ids:
|
||||||
|
nsx_lb_ids = [
|
||||||
|
lb['id'] for lb in
|
||||||
|
loadbalancer_status[lb_const.LOADBALANCERS]]
|
||||||
|
missing_ids = list(set(octavia_lb_ids) - set(nsx_lb_ids))
|
||||||
|
loadbalancer_status[lb_const.LOADBALANCERS] += [
|
||||||
|
{'id': lb_id, 'operating_status': lb_const.OFFLINE}
|
||||||
|
for lb_id in missing_ids]
|
||||||
|
else:
|
||||||
|
self.status_checker_counter -= 1
|
||||||
|
|
||||||
endpoint.update_loadbalancer_status(loadbalancer_status)
|
endpoint.update_loadbalancer_status(loadbalancer_status)
|
||||||
|
Loading…
Reference in New Issue
Block a user