Adds the NO_MONITOR operational status for members
When no health monitor is assigned to a member HAProxy returns "no_check" as the status for the server. This change will pull that forward into Octavia as member operational_status "NO_MONITOR" Closes-Bug: 1491936 Change-Id: Ifefd2bddf8999c75397bf7c693042003e0f8a382
This commit is contained in:
parent
ccd7865350
commit
c421056956
@ -117,7 +117,8 @@ class HAProxyQuery(object):
|
|||||||
# pxname: pool, svname: server_name, status: status
|
# pxname: pool, svname: server_name, status: status
|
||||||
|
|
||||||
# All the way up is UP, otherwise call it DOWN
|
# All the way up is UP, otherwise call it DOWN
|
||||||
if line['status'] != consts.UP:
|
if (line['status'] != consts.UP and
|
||||||
|
line['status'] != consts.NO_CHECK):
|
||||||
line['status'] = consts.DOWN
|
line['status'] = consts.DOWN
|
||||||
|
|
||||||
if line['pxname'] not in final_results:
|
if line['pxname'] not in final_results:
|
||||||
|
@ -66,7 +66,8 @@ ONLINE = 'ONLINE'
|
|||||||
OFFLINE = 'OFFLINE'
|
OFFLINE = 'OFFLINE'
|
||||||
DEGRADED = 'DEGRADED'
|
DEGRADED = 'DEGRADED'
|
||||||
ERROR = 'ERROR'
|
ERROR = 'ERROR'
|
||||||
SUPPORTED_OPERATING_STATUSES = (ONLINE, OFFLINE, DEGRADED, ERROR)
|
NO_MONITOR = 'NO_MONITOR'
|
||||||
|
SUPPORTED_OPERATING_STATUSES = (ONLINE, OFFLINE, DEGRADED, ERROR, NO_MONITOR)
|
||||||
|
|
||||||
AMPHORA_VM = 'VM'
|
AMPHORA_VM = 'VM'
|
||||||
SUPPORTED_AMPHORA_TYPES = (AMPHORA_VM,)
|
SUPPORTED_AMPHORA_TYPES = (AMPHORA_VM,)
|
||||||
@ -158,3 +159,7 @@ DOWN = 'DOWN'
|
|||||||
# UP = HAProxy backend has working or no servers
|
# UP = HAProxy backend has working or no servers
|
||||||
# DOWN = HAProxy backend has no working servers
|
# DOWN = HAProxy backend has no working servers
|
||||||
HAPROXY_BACKEND_STATUSES = (UP, DOWN)
|
HAPROXY_BACKEND_STATUSES = (UP, DOWN)
|
||||||
|
|
||||||
|
NO_CHECK = 'no check'
|
||||||
|
|
||||||
|
HAPROXY_MEMBER_STATUSES = (UP, DOWN, NO_CHECK)
|
||||||
|
@ -149,6 +149,8 @@ class UpdateHealthMixin(driver_base.HealthMixin):
|
|||||||
pool_status = constants.DEGRADED
|
pool_status = constants.DEGRADED
|
||||||
if lb_status == constants.ONLINE:
|
if lb_status == constants.ONLINE:
|
||||||
lb_status = constants.DEGRADED
|
lb_status = constants.DEGRADED
|
||||||
|
elif status == constants.NO_CHECK:
|
||||||
|
member_status = constants.NO_MONITOR
|
||||||
else:
|
else:
|
||||||
LOG.warn(_LW('Member %(mem)s reported status of '
|
LOG.warn(_LW('Member %(mem)s reported status of '
|
||||||
'%(status)s'), {'mem': member_id,
|
'%(status)s'), {'mem': member_id,
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
# Copyright 2015 Hewlett-Packard Development Company, L.P.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
"""Create NO_MONITOR operational_status
|
||||||
|
|
||||||
|
Revision ID: 3b199c848b96
|
||||||
|
Revises: 543f5d8e4e56
|
||||||
|
Create Date: 2015-09-03 17:11:03.724070
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '3b199c848b96'
|
||||||
|
down_revision = '543f5d8e4e56'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
bind = op.get_bind()
|
||||||
|
md = sa.MetaData()
|
||||||
|
sa.Table('operating_status', md, autoload=True, autoload_with=bind)
|
||||||
|
op.bulk_insert(md.tables['operating_status'], [{'name': 'NO_MONITOR'}])
|
@ -135,6 +135,50 @@ class TestUpdateHealthMixin(base.TestCase):
|
|||||||
|
|
||||||
self.hm.update_health(health)
|
self.hm.update_health(health)
|
||||||
|
|
||||||
|
@mock.patch('octavia.db.api.get_session')
|
||||||
|
def test_update_health_member_no_check(self, session):
|
||||||
|
|
||||||
|
health = {
|
||||||
|
"id": self.FAKE_UUID_1,
|
||||||
|
"listeners": {
|
||||||
|
"listener-id-1": {"status": constants.OPEN, "pools": {
|
||||||
|
"pool-id-1": {"status": constants.UP,
|
||||||
|
"members": {"member-id-1":
|
||||||
|
constants.NO_CHECK}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session.return_value = 'blah'
|
||||||
|
|
||||||
|
self.hm.update_health(health)
|
||||||
|
self.assertTrue(self.amphora_health_repo.replace.called)
|
||||||
|
|
||||||
|
# test listener, member
|
||||||
|
for listener_id, listener in six.iteritems(
|
||||||
|
health.get('listeners', {})):
|
||||||
|
|
||||||
|
self.listener_repo.update.assert_any_call(
|
||||||
|
'blah', listener_id, operating_status=constants.ONLINE)
|
||||||
|
|
||||||
|
for pool_id, pool in six.iteritems(listener.get('pools', {})):
|
||||||
|
|
||||||
|
self.hm.pool_repo.update.assert_any_call(
|
||||||
|
'blah', pool_id, operating_status=constants.ONLINE)
|
||||||
|
|
||||||
|
for member_id, member in six.iteritems(
|
||||||
|
pool.get('members', {})):
|
||||||
|
|
||||||
|
self.member_repo.update.assert_any_call(
|
||||||
|
'blah', id=member_id,
|
||||||
|
operating_status=constants.NO_MONITOR)
|
||||||
|
|
||||||
|
self.hm.listener_repo.count.return_value = 2
|
||||||
|
|
||||||
|
self.hm.update_health(health)
|
||||||
|
|
||||||
@mock.patch('octavia.db.api.get_session')
|
@mock.patch('octavia.db.api.get_session')
|
||||||
def test_update_health_list_full_member_down(self, session):
|
def test_update_health_list_full_member_down(self, session):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user