python-octaviaclient/octaviaclient/osc/v2/health_monitor.py

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)