287 lines
8.9 KiB
Python
287 lines
8.9 KiB
Python
# 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.
|
|
#
|
|
|
|
"""Health Monitor action implementation"""
|
|
|
|
|
|
from cliff import lister
|
|
from osc_lib.command import command
|
|
from osc_lib import utils
|
|
|
|
from octaviaclient.osc.v2 import constants as const
|
|
from octaviaclient.osc.v2 import utils as v2_utils
|
|
|
|
HTTP_METHODS = ['GET', 'POST', 'DELETE', 'PUT', 'HEAD', 'OPTIONS', 'PATCH',
|
|
'CONNECT', 'TRACE']
|
|
|
|
|
|
class CreateHealthMonitor(command.ShowOne):
|
|
"""Create a health monitor"""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(CreateHealthMonitor, self).get_parser(prog_name)
|
|
|
|
parser.add_argument(
|
|
'pool',
|
|
metavar='<pool_id>',
|
|
help="Pool for the health monitor (name or ID)"
|
|
)
|
|
parser.add_argument(
|
|
'--name',
|
|
metavar='<name>',
|
|
help="Set health monitor name"
|
|
)
|
|
parser.add_argument(
|
|
'--delay',
|
|
metavar='<delay>',
|
|
required=True,
|
|
help="Delay for the health monitor"
|
|
)
|
|
parser.add_argument(
|
|
'--expected-codes',
|
|
metavar='<codes>',
|
|
help="Expected response code to monitor for."
|
|
)
|
|
parser.add_argument(
|
|
'--http_method',
|
|
metavar='<method>',
|
|
choices=HTTP_METHODS,
|
|
help="HTTP method to use."
|
|
)
|
|
parser.add_argument(
|
|
'--timeout',
|
|
metavar='<timeout>',
|
|
required=True,
|
|
help="Timeout for the health monitor"
|
|
)
|
|
parser.add_argument(
|
|
'--max-retries',
|
|
metavar='<max_retries>',
|
|
type=int,
|
|
choices=range(1, 10),
|
|
required=True,
|
|
help="The number of successful checks before changing the "
|
|
"operating status of the member to ONLINE."
|
|
)
|
|
parser.add_argument(
|
|
'--url-path',
|
|
metavar='<url_path>',
|
|
help="URL path to endpoint"
|
|
)
|
|
parser.add_argument(
|
|
'--type',
|
|
metavar='<type>',
|
|
required=True,
|
|
choices=['PING', 'HTTP', 'TCP', 'HTTPS'],
|
|
help="Protocol to use for the health monitor"
|
|
)
|
|
parser.add_argument(
|
|
'--max-retries-down',
|
|
metavar='<max_retries_down>',
|
|
type=int,
|
|
choices=range(1, 10),
|
|
help="Maximum number of retires until the health monitor reports "
|
|
"down."
|
|
)
|
|
admin_group = parser.add_mutually_exclusive_group()
|
|
admin_group.add_argument(
|
|
'--enable',
|
|
action='store_true',
|
|
default=True,
|
|
help="Enable health monitor (default)"
|
|
)
|
|
admin_group.add_argument(
|
|
'--disable',
|
|
action='store_true',
|
|
default=None,
|
|
help="Disable health monitor"
|
|
)
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
rows = const.MONITOR_ROWS
|
|
attrs = v2_utils.get_health_monitor_attrs(self.app.client_manager,
|
|
parsed_args)
|
|
body = {"healthmonitor": attrs}
|
|
data = self.app.client_manager.load_balancer.health_monitor_create(
|
|
json=body)
|
|
|
|
formatters = {'pools': v2_utils.format_list}
|
|
|
|
return (rows,
|
|
(utils.get_dict_properties(data['healthmonitor'],
|
|
rows,
|
|
formatters=formatters)))
|
|
|
|
|
|
class DeleteHealthMonitor(command.Command):
|
|
"""Delete a health monitor"""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(DeleteHealthMonitor, self).get_parser(prog_name)
|
|
|
|
parser.add_argument(
|
|
'health_monitor',
|
|
metavar='<health_monitor>',
|
|
help="Health monitor to delete (name or ID)"
|
|
)
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
attrs = v2_utils.get_health_monitor_attrs(self.app.client_manager,
|
|
parsed_args)
|
|
|
|
health_monitor_id = attrs.pop('health_monitor_id')
|
|
|
|
self.app.client_manager.load_balancer.health_monitor_delete(
|
|
health_monitor_id=health_monitor_id)
|
|
|
|
|
|
class ListHealthMonitor(lister.Lister):
|
|
"""List health monitors"""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(ListHealthMonitor, self).get_parser(prog_name)
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
columns = const.MONITOR_COLUMNS
|
|
attrs = v2_utils.get_health_monitor_attrs(self.app.client_manager,
|
|
parsed_args)
|
|
data = self.app.client_manager.load_balancer.health_monitor_list(
|
|
**attrs)
|
|
|
|
formatters = {'pools': v2_utils.format_list}
|
|
return (columns,
|
|
(utils.get_dict_properties(s, columns, formatters=formatters)
|
|
for s in data['healthmonitors']))
|
|
|
|
|
|
class ShowHealthMonitor(command.ShowOne):
|
|
"""Show the details of a single health monitor"""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(ShowHealthMonitor, self).get_parser(prog_name)
|
|
|
|
parser.add_argument(
|
|
'health_monitor',
|
|
metavar='<health_monitor>',
|
|
help='Name or UUID of the health monitor'
|
|
)
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
rows = const.MONITOR_ROWS
|
|
attrs = v2_utils.get_health_monitor_attrs(self.app.client_manager,
|
|
parsed_args)
|
|
|
|
health_monitor_id = attrs.pop('health_monitor_id')
|
|
|
|
data = self.app.client_manager.load_balancer.health_monitor_show(
|
|
health_monitor_id=health_monitor_id,
|
|
)
|
|
formatters = {'pools': v2_utils.format_list}
|
|
|
|
return (rows,
|
|
(utils.get_dict_properties(data, rows, formatters=formatters)))
|
|
|
|
|
|
class SetHealthMonitor(command.Command):
|
|
"""Update a health monitor"""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(SetHealthMonitor, self).get_parser(prog_name)
|
|
|
|
parser.add_argument(
|
|
'health_monitor',
|
|
metavar='<health_monitor>',
|
|
help="Health monitor to update (name or ID)"
|
|
)
|
|
parser.add_argument(
|
|
'--name',
|
|
metavar='<name>',
|
|
help="Set health monitor name"
|
|
)
|
|
parser.add_argument(
|
|
'--delay',
|
|
metavar='<delay>',
|
|
help="Set delay for the health monitor"
|
|
)
|
|
parser.add_argument(
|
|
'--expected-codes',
|
|
metavar='<codes>',
|
|
help="Set expected response code to monitor for."
|
|
)
|
|
parser.add_argument(
|
|
'--http_method',
|
|
metavar='<method>',
|
|
choices=HTTP_METHODS,
|
|
help="Set HTTP method to use."
|
|
)
|
|
parser.add_argument(
|
|
'--timeout',
|
|
metavar='<timeout>',
|
|
help="Set the timeout for the health monitor"
|
|
)
|
|
parser.add_argument(
|
|
'--max-retries',
|
|
metavar='<max_retries>',
|
|
type=int,
|
|
choices=range(1, 10),
|
|
help="Set the number of successful checks before changing the "
|
|
"operating status of the member to ONLINE."
|
|
)
|
|
parser.add_argument(
|
|
'--max-retries-down',
|
|
metavar='<max_retries_down>',
|
|
type=int,
|
|
choices=range(1, 10),
|
|
help="Set the Maximum number of retires until the health monitor "
|
|
"reports down."
|
|
)
|
|
parser.add_argument(
|
|
'--url-path',
|
|
metavar='<url_path>',
|
|
help="Set the URL path to endpoint"
|
|
)
|
|
admin_group = parser.add_mutually_exclusive_group()
|
|
admin_group.add_argument(
|
|
'--enable',
|
|
action='store_true',
|
|
default=None,
|
|
help="Enable health monitor (default)"
|
|
)
|
|
admin_group.add_argument(
|
|
'--disable',
|
|
action='store_true',
|
|
default=None,
|
|
help="Disable health monitor"
|
|
)
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
attrs = v2_utils.get_health_monitor_attrs(self.app.client_manager,
|
|
parsed_args)
|
|
|
|
listener_id = attrs.pop('health_monitor_id')
|
|
|
|
body = {'healthmonitor': attrs}
|
|
|
|
self.app.client_manager.load_balancer.health_monitor_set(
|
|
listener_id, json=body)
|