532 lines
24 KiB
Python
532 lines
24 KiB
Python
# Copyright 2018 Rackspace, US Inc.
|
|
#
|
|
# 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.
|
|
|
|
from octavia_lib.api.drivers import exceptions
|
|
|
|
# This class describes the abstraction of a provider driver interface.
|
|
# Load balancing provider drivers will implement this interface.
|
|
|
|
|
|
class ProviderDriver():
|
|
# name is for internal Octavia use and should not be used by drivers
|
|
name = None
|
|
|
|
# Load Balancer
|
|
def create_vip_port(self, loadbalancer_id, project_id, vip_dictionary,
|
|
additional_vip_dicts):
|
|
"""Creates a port for a load balancer VIP.
|
|
|
|
If the driver supports creating VIP ports, the driver will create a
|
|
VIP port with the primary VIP and all additional VIPs added to the
|
|
port, and return the vip_dictionary populated with the vip_port_id and
|
|
a list of vip_dictionaries populated with data from the additional
|
|
VIPs (which are guaranteed to be in the same Network).
|
|
This might look like:
|
|
{'port_id': port_id, 'subnet_id': subnet_id_1, 'ip_address': ip1},
|
|
[{'subnet_id': subnet_id_2, 'ip_address': ip2}, {...}, {...}]
|
|
If the driver does not support port creation, the driver will raise
|
|
a NotImplementedError.
|
|
|
|
:param loadbalancer_id: ID of loadbalancer.
|
|
:type loadbalancer_id: string
|
|
:param project_id: The project ID to create the VIP under.
|
|
:type project_id: string
|
|
:param: vip_dictionary: The VIP dictionary.
|
|
:type vip_dictionary: dict
|
|
:param: additional_vip_dicts: A list of additional VIP dictionaries,
|
|
with subnets guaranteed to be in the same
|
|
network as the primary vip_dictionary.
|
|
:type additional_vip_dicts: list(dict)
|
|
:returns: VIP dictionary with vip_port_id + a list of additional VIP
|
|
dictionaries (vip_dict, additional_vip_dicts).
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support creating VIP
|
|
ports.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating VIP '
|
|
'ports.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'VIP ports. Octavia will create it.')
|
|
|
|
def loadbalancer_create(self, loadbalancer):
|
|
"""Creates a new load balancer.
|
|
|
|
:param loadbalancer: The load balancer object.
|
|
:type loadbalancer: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support create.
|
|
:raises UnsupportedOptionError: The driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'load balancers.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'load balancers. What?')
|
|
|
|
def loadbalancer_delete(self, loadbalancer, cascade=False):
|
|
"""Deletes a load balancer.
|
|
|
|
:param loadbalancer: The load balancer to delete.
|
|
:type loadbalancer: object
|
|
:param cascade: If True, deletes all child objects (listeners,
|
|
pools, etc.) in addition to the load balancer.
|
|
:type cascade: bool
|
|
:return: Nothing if the delete request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'load balancers.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'load balancers.')
|
|
|
|
def loadbalancer_failover(self, loadbalancer_id):
|
|
"""Performs a fail over of a load balancer.
|
|
|
|
:param loadbalancer_id: ID of the load balancer to failover.
|
|
:type loadbalancer_id: string
|
|
:return: Nothing if the failover request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises: NotImplementedError if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support failing over '
|
|
'load balancers.',
|
|
operator_fault_string='This provider does not support failing '
|
|
'over load balancers.')
|
|
|
|
def loadbalancer_update(self, old_loadbalancer, new_loadbalncer):
|
|
"""Updates a load balancer.
|
|
|
|
:param old_loadbalancer: The baseline load balancer object.
|
|
:type old_loadbalancer: object
|
|
:param new_loadbalancer: The updated load balancer object.
|
|
:type new_loadbalancer: object
|
|
:return: Nothing if the update request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support request.
|
|
:raises UnsupportedOptionError: The driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'load balancers.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'load balancers.')
|
|
|
|
# Listener
|
|
def listener_create(self, listener):
|
|
"""Creates a new listener.
|
|
|
|
:param listener: The listener object.
|
|
:type listener: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'listeners.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'listeners.')
|
|
|
|
def listener_delete(self, listener):
|
|
"""Deletes a listener.
|
|
|
|
:param listener: The listener to delete.
|
|
:type listener: object
|
|
:return: Nothing if the delete request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'listeners.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'listeners.')
|
|
|
|
def listener_update(self, old_listener, new_listener):
|
|
"""Updates a listener.
|
|
|
|
:param old_listener: The baseline listener object.
|
|
:type old_listener: object
|
|
:param new_listener: The updated listener object.
|
|
:type new_listener: object
|
|
:return: Nothing if the update request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'listeners.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'listeners.')
|
|
|
|
# Pool
|
|
def pool_create(self, pool):
|
|
"""Creates a new pool.
|
|
|
|
:param pool: The pool object.
|
|
:type pool: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'pools.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'pools.')
|
|
|
|
def pool_delete(self, pool):
|
|
"""Deletes a pool and its members.
|
|
|
|
:param pool: The pool to delete.
|
|
:type pool: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'pools.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'pools.')
|
|
|
|
def pool_update(self, old_pool, new_pool):
|
|
"""Updates a pool.
|
|
|
|
:param pool: The baseline pool object.
|
|
:type pool: object
|
|
:param pool: The updated pool object.
|
|
:type pool: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'pools.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'pools.')
|
|
|
|
# Member
|
|
def member_create(self, member):
|
|
"""Creates a new member for a pool.
|
|
|
|
:param member: The member object.
|
|
:type member: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'members.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'members.')
|
|
|
|
def member_delete(self, member):
|
|
"""Deletes a pool member.
|
|
|
|
:param member: The member to delete.
|
|
:type member: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'members.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'members.')
|
|
|
|
def member_update(self, old_member, new_member):
|
|
"""Updates a pool member.
|
|
|
|
:param old_member: The baseline member object.
|
|
:type old_member: object
|
|
:param new_member: The updated member object.
|
|
:type new_member: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'members.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'members.')
|
|
|
|
def member_batch_update(self, pool_id, members):
|
|
"""Creates, updates, or deletes a set of pool members.
|
|
|
|
:param pool_id: The id of the pool to update.
|
|
:type pool_id: string
|
|
:param members: List of member objects.
|
|
:type members: list
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support batch '
|
|
'updating members.',
|
|
operator_fault_string='This provider does not support batch '
|
|
'updating members.')
|
|
|
|
# Health Monitor
|
|
def health_monitor_create(self, healthmonitor):
|
|
"""Creates a new health monitor.
|
|
|
|
:param healthmonitor: The health monitor object.
|
|
:type healthmonitor: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'health monitors.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'health monitors.')
|
|
|
|
def health_monitor_delete(self, healthmonitor):
|
|
"""Deletes a healthmonitor_id.
|
|
|
|
:param healthmonitor: The monitor to delete.
|
|
:type healthmonitor: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'health monitors.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'health monitors.')
|
|
|
|
def health_monitor_update(self, old_healthmonitor, new_healthmonitor):
|
|
"""Updates a health monitor.
|
|
|
|
:param old_healthmonitor: The baseline health monitor object.
|
|
:type old_healthmonitor: object
|
|
:param new_healthmonitor: The updated health monitor object.
|
|
:type new_healthmonitor: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'health monitors.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'health monitors.')
|
|
|
|
# L7 Policy
|
|
def l7policy_create(self, l7policy):
|
|
"""Creates a new L7 policy.
|
|
|
|
:param l7policy: The L7 policy object.
|
|
:type l7policy: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'l7policies.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'l7policies.')
|
|
|
|
def l7policy_delete(self, l7policy):
|
|
"""Deletes an L7 policy.
|
|
|
|
:param l7policy: The L7 policy to delete.
|
|
:type l7policy: object
|
|
:return: Nothing if the delete request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'l7policies.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'l7policies.')
|
|
|
|
def l7policy_update(self, old_l7policy, new_l7policy):
|
|
"""Updates an L7 policy.
|
|
|
|
:param old_l7policy: The baseline L7 policy object.
|
|
:type old_l7policy: object
|
|
:param new_l7policy: The updated L7 policy object.
|
|
:type new_l7policy: object
|
|
:return: Nothing if the update request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'l7policies.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'l7policies.')
|
|
|
|
# L7 Rule
|
|
def l7rule_create(self, l7rule):
|
|
"""Creates a new L7 rule.
|
|
|
|
:param l7rule: The L7 rule object.
|
|
:type l7rule: object
|
|
:return: Nothing if the create request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support creating '
|
|
'l7rules.',
|
|
operator_fault_string='This provider does not support creating '
|
|
'l7rules.')
|
|
|
|
def l7rule_delete(self, l7rule):
|
|
"""Deletes an L7 rule.
|
|
|
|
:param l7rule: The L7 rule to delete.
|
|
:type l7rule: object
|
|
:return: Nothing if the delete request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support deleting '
|
|
'l7rules.',
|
|
operator_fault_string='This provider does not support deleting '
|
|
'l7rules.')
|
|
|
|
def l7rule_update(self, old_l7rule, new_l7rule):
|
|
"""Updates an L7 rule.
|
|
|
|
:param old_l7rule: The baseline L7 rule object.
|
|
:type old_l7rule: object
|
|
:param new_l7rule: The updated L7 rule object.
|
|
:type new_l7rule: object
|
|
:return: Nothing if the update request was accepted.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: if driver does not support request.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support updating '
|
|
'l7rules.',
|
|
operator_fault_string='This provider does not support updating '
|
|
'l7rules.')
|
|
|
|
# Flavor
|
|
def get_supported_flavor_metadata(self):
|
|
"""Returns a dict of flavor metadata keys supported by this driver.
|
|
|
|
The returned dictionary will include key/value pairs, 'name' and
|
|
'description.'
|
|
|
|
:returns: The flavor metadata dictionary
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support flavors.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support getting the '
|
|
'supported flavor metadata.',
|
|
operator_fault_string='This provider does not support getting '
|
|
'the supported flavor metadata.')
|
|
|
|
def validate_flavor(self, flavor_metadata):
|
|
"""Validates if driver can support the flavor.
|
|
|
|
:param flavor_metadata: Dictionary with flavor metadata.
|
|
:type flavor_metadata: dict
|
|
:return: Nothing if the flavor is valid and supported.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support flavors.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
:raises NotFound: if the driver cannot find a resource.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support validating '
|
|
'flavors.',
|
|
operator_fault_string='This provider does not support validating '
|
|
'the supported flavor metadata.')
|
|
|
|
# Availability Zone
|
|
def get_supported_availability_zone_metadata(self):
|
|
"""Returns a dict of supported availability zone metadata keys.
|
|
|
|
The returned dictionary will include key/value pairs, 'name' and
|
|
'description.'
|
|
|
|
:returns: The availability zone metadata dictionary
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support AZs.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support getting the '
|
|
'supported availability zone metadata.',
|
|
operator_fault_string='This provider does not support getting '
|
|
'the supported availability zone metadata.')
|
|
|
|
def validate_availability_zone(self, availability_zone_metadata):
|
|
"""Validates if driver can support the availability zone.
|
|
|
|
:param availability_zone_metadata: Dictionary with az metadata.
|
|
:type availability_zone_metadata: dict
|
|
:return: Nothing if the availability zone is valid and supported.
|
|
:raises DriverError: An unexpected error occurred in the driver.
|
|
:raises NotImplementedError: The driver does not support availability
|
|
zones.
|
|
:raises UnsupportedOptionError: if driver does not
|
|
support one of the configuration options.
|
|
"""
|
|
raise exceptions.NotImplementedError(
|
|
user_fault_string='This provider does not support validating '
|
|
'availability zones.',
|
|
operator_fault_string='This provider does not support validating '
|
|
'the supported availability zone metadata.')
|