Erica Liu c9fabb82ee Support getting realtime LBS usage in policy
In current implementation, the LBS get_usage function
returns the number of current realized resources. This could
potentially break the l4 autoscaling logic. Thus we need to
get the realtime usage of LBS, which includes the resources in
progress

Change-Id: I5454a572cd751d2dd2a51135122d902031a0eaf3
2019-05-22 13:54:11 -07:00

497 lines
16 KiB
Python

# Copyright 2018 VMware, Inc.
# All Rights Reserved
#
# 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 vmware_nsxlib.v3.policy import constants
from vmware_nsxlib.v3.policy.core_defs import ResourceDef
TENANTS_PATH_PATTERN = "%s/"
LB_VIRTUAL_SERVERS_PATH_PATTERN = TENANTS_PATH_PATTERN + "lb-virtual-servers/"
LB_SERVICES_PATH_PATTERN = TENANTS_PATH_PATTERN + "lb-services/"
LB_POOL_PATH_PATTERN = TENANTS_PATH_PATTERN + "lb-pools/"
LB_APP_PROFILE_PATTERN = TENANTS_PATH_PATTERN + "lb-app-profiles/"
LB_MONITOR_PROFILE_PATTERN = TENANTS_PATH_PATTERN + "lb-monitor-profiles/"
LB_CLIENT_SSL_PROFILE_PATTERN = (TENANTS_PATH_PATTERN +
"lb-client-ssl-profiles/")
LB_PERSISTENCE_PROFILE_PATTERN = (TENANTS_PATH_PATTERN +
"lb-persistence-profiles/")
class LBRuleDef(object):
def __init__(self, actions, match_conditions=None, name=None,
match_strategy=None, phase=None):
self.actions = actions
self.name = name
self.match_conditions = match_conditions
self.match_strategy = match_strategy
self.phase = phase
def get_obj_dict(self):
lb_rule = {
'actions': self.actions
}
if self.match_conditions:
lb_rule['match_conditions'] = self.match_conditions
if self.name:
lb_rule['display_name'] = self.name
if self.match_strategy:
lb_rule['match_strategy'] = self.match_strategy
if self.phase:
lb_rule['phase'] = self.phase
return lb_rule
class LBPoolMemberDef(object):
def __init__(self, ip_address, port=None, name=None,
weight=None, admin_state=None, backup_member=None):
self.name = name
self.ip_address = ip_address
self.port = port
self.weight = weight
self.admin_state = admin_state
self.backup_member = backup_member
def get_obj_dict(self):
body = {'ip_address': self.ip_address}
if self.name:
body['display_name'] = self.name
if self.ip_address:
body['port'] = self.port
if self.weight:
body['weight'] = self.weight
if self.admin_state:
body['admin_state'] = self.admin_state
if self.backup_member:
body['backup_member'] = self.backup_member
return body
class LBClientSslProfileDef(ResourceDef):
@property
def path_pattern(self):
return LB_CLIENT_SSL_PROFILE_PATTERN
@property
def path_ids(self):
return ('tenant', 'client_ssl_profile_id')
@staticmethod
def resource_type():
return "LBClientSslProfile"
def get_obj_dict(self):
body = super(LBClientSslProfileDef, self).get_obj_dict()
self._set_attr_if_specified(body, 'protocols')
return body
class LBPersistenceProfileBase(ResourceDef):
@property
def path_pattern(self):
return LB_PERSISTENCE_PROFILE_PATTERN
@property
def path_ids(self):
return ('tenant', 'persistence_profile_id')
class LBCookiePersistenceProfileDef(LBPersistenceProfileBase):
@staticmethod
def resource_type():
return "LBCookiePersistenceProfile"
def get_obj_dict(self):
body = super(LBCookiePersistenceProfileDef, self).get_obj_dict()
self._set_attrs_if_specified(
body, ['cookie_garble', 'cookie_mode', 'cookie_name',
'cookie_path', 'cookie_time', 'persistence_shared'])
return body
class LBSourceIpPersistenceProfileDef(LBPersistenceProfileBase):
@staticmethod
def resource_type():
return "LBSourceIpPersistenceProfile"
def get_obj_dict(self):
body = super(LBSourceIpPersistenceProfileDef, self).get_obj_dict()
self._set_attrs_if_specified(
body, ['ha_persistence_mirroring_enabled', 'persistence_shared',
'purge', 'timeout'])
return body
class LBAppProfileBaseDef(ResourceDef):
@property
def path_pattern(self):
return LB_APP_PROFILE_PATTERN
@property
def path_ids(self):
return ('tenant', 'lb_app_profile_id')
def get_obj_dict(self):
body = super(LBAppProfileBaseDef, self).get_obj_dict()
self._set_attrs_if_specified(
body, ['idle_timeout', 'http_redirect_to_https',
'http_redirect_to', 'idle_timeout', 'ntlm',
'request_body_size', 'request_header_size',
'response_timeout', 'x_forwarded_for'])
return body
class LBHttpProfileDef(LBAppProfileBaseDef):
@staticmethod
def resource_type():
return "LBHttpProfile"
class LBFastTcpProfile(LBAppProfileBaseDef):
@staticmethod
def resource_type():
return "LBFastTcpProfile"
class LBFastUdpProfile(LBAppProfileBaseDef):
@staticmethod
def resource_type():
return "LBFastUdpProfile"
class LBPoolDef(ResourceDef):
@property
def path_pattern(self):
return LB_POOL_PATH_PATTERN
@property
def path_ids(self):
return ('tenant', 'lb_pool_id')
@staticmethod
def resource_type():
return 'LBPool'
def get_obj_dict(self):
body = super(LBPoolDef, self).get_obj_dict()
self._set_attrs_if_specified(
body, ['active_monitor_paths',
'algorithm', 'member_group', 'snat_translation'])
members = self.get_attr('members')
if members is None:
members = []
if self.has_attr('members'):
members = members if isinstance(members, list) else [members]
body['members'] = []
for member in members:
# the list contains old json members and newly added member
if isinstance(member, LBPoolMemberDef):
member = member.get_obj_dict()
body['members'].append(member)
return body
class LBVirtualServerDef(ResourceDef):
@property
def path_pattern(self):
return LB_VIRTUAL_SERVERS_PATH_PATTERN
@property
def path_ids(self):
return ('tenant', 'virtual_server_id')
@staticmethod
def resource_type():
return 'LBVirtualServer'
def get_obj_dict(self):
body = super(LBVirtualServerDef, self).get_obj_dict()
self._set_attrs_if_specified(
body, ['ip_address', 'ports', 'max_concurrent_connections'])
client_ssl_binding = self.get_attr('client_ssl_profile_binding')
if client_ssl_binding:
self._set_attr_if_specified(
body, 'client_ssl_profile_binding',
value=client_ssl_binding)
server_ssl_binding = self.get_attr('server_ssl_profile_binding')
if server_ssl_binding:
self._set_attr_if_specified(
body, 'server_ssl_profile_binding',
value=server_ssl_binding)
waf_profile_binding = self.get_attr('waf_profile_binding')
if waf_profile_binding:
if isinstance(waf_profile_binding, WAFProfileBindingDef):
waf_profile_binding = waf_profile_binding.get_obj_dict()
self._set_attr_if_specified(
body, 'waf_profile_binding',
value=waf_profile_binding)
rules = self.get_attr('rules')
if self.has_attr('rules'):
rules = rules if isinstance(rules, list) else [rules]
body['rules'] = []
for rule in rules:
# the list contains old json rules and newly added ruledef rule
if isinstance(rule, LBRuleDef):
rule = rule.get_obj_dict()
body['rules'].append(rule)
app_profile_id = self.get_attr('application_profile_id')
if app_profile_id:
app_profile_def = LBAppProfileBaseDef(
lb_app_profile_id=app_profile_id, tenant=self.get_tenant())
body['application_profile_path'] = (
app_profile_def.get_resource_full_path())
if self.has_attr('lb_persistence_profile_id'):
path = None
lb_persistence_profile_id = self.get_attr(
'lb_persistence_profile_id')
if lb_persistence_profile_id:
lb_persistence_profile_def = LBPersistenceProfileBase(
persistence_profile_id=lb_persistence_profile_id,
tenant=self.get_tenant())
path = lb_persistence_profile_def.get_resource_full_path()
body['lb_persistence_profile_path'] = path
if self.has_attr('lb_service_id'):
path = None
lb_service_id = self.get_attr('lb_service_id')
if lb_service_id:
lb_service_def = LBServiceDef(
lb_service_id=lb_service_id, tenant=self.get_tenant())
path = lb_service_def.get_resource_full_path()
body['lb_service_path'] = path
if self.has_attr('pool_id'):
path = None
lb_pool_id = self.get_attr('pool_id')
if lb_pool_id:
lb_pool_def = LBPoolDef(
lb_pool_id=lb_pool_id, tenant=self.get_tenant())
path = lb_pool_def.get_resource_full_path()
body['pool_path'] = path
return body
class ClientSSLProfileBindingDef(object):
def __init__(self, default_certificate_path, sni_certificate_paths=None,
ssl_profile_path=None, client_auth_ca_paths=None,
client_auth=None):
self.default_certificate_path = default_certificate_path
self.sni_certificate_paths = sni_certificate_paths
self.ssl_profile_path = ssl_profile_path
self.client_auth_ca_paths = client_auth_ca_paths
self.client_auth = client_auth
def get_obj_dict(self):
body = {
'default_certificate_path': self.default_certificate_path
}
if self.sni_certificate_paths:
body['sni_certificate_paths'] = self.sni_certificate_paths
if self.ssl_profile_path:
body['ssl_profile_path'] = self.ssl_profile_path
if self.client_auth_ca_paths:
body['client_auth_ca_paths'] = self.client_auth_ca_paths
if self.client_auth:
body['client_auth'] = self.client_auth
return body
class ServerSSLProfileBindingDef(object):
def __init__(self, client_certificate_path=None,
certificate_chain_depth=None,
server_auth=None, server_auth_ca_paths=None,
server_auth_crl_paths=None, ssl_profile_path=None):
self.client_certificate_path = client_certificate_path
self.certificate_chain_depth = certificate_chain_depth
self.server_auth = server_auth
self.server_auth_ca_paths = server_auth_ca_paths
self.server_auth_crl_paths = server_auth_crl_paths
self.ssl_profile_path = ssl_profile_path
def get_obj_dict(self):
body = {}
if self.client_certificate_path:
body['client_certificate_path'] = self.client_certificate_path
if self.ssl_profile_path:
body['certificate_chain_depth'] = self.certificate_chain_depth
if self.server_auth:
body['server_auth'] = self.server_auth
if self.ssl_profile_path:
body['server_auth_ca_paths'] = self.server_auth_ca_paths
if self.server_auth_crl_paths:
body['server_auth_crl_paths'] = self.server_auth_crl_paths
if self.ssl_profile_path:
body['ssl_profile_path'] = self.ssl_profile_path
return body
class WAFProfileBindingDef(object):
def __init__(self, waf_profile_path,
operational_mode=constants.WAF_OPERATIONAL_MODE_PROTECTION,
debug_log_level=constants.WAF_LOG_LEVEL_NO_LOG):
self.waf_profile_path = waf_profile_path
self.operational_mode = operational_mode
self.debug_log_level = debug_log_level
def get_obj_dict(self):
body = {
'waf_profile_path': self.waf_profile_path,
'operational_mode': self.operational_mode,
'debug_log_level': self.debug_log_level
}
return body
class LBServiceDef(ResourceDef):
@property
def path_pattern(self):
return LB_SERVICES_PATH_PATTERN
@property
def path_ids(self):
return ('tenant', 'lb_service_id')
@staticmethod
def resource_type():
return 'LBService'
def get_obj_dict(self):
body = super(LBServiceDef, self).get_obj_dict()
self._set_attrs_if_specified(body, ['size', 'connectivity_path'])
return body
class LBServiceStatisticsDef(ResourceDef):
@property
def path_pattern(self):
return LB_SERVICES_PATH_PATTERN + '%s/statistics/'
@property
def path_ids(self):
return ('tenant', 'lb_service_id', '')
class LBServiceStatusDef(ResourceDef):
@property
def path_pattern(self):
return LB_SERVICES_PATH_PATTERN + '%s/detailed-status/'
@property
def path_ids(self):
return ('tenant', 'lb_service_id', '')
class LBServiceUsageDef(ResourceDef):
def __init__(self, **kwargs):
self.realtime = kwargs.pop('realtime')
super(LBServiceUsageDef, self).__init__(**kwargs)
@property
def path_pattern(self):
if self.realtime:
return (LB_SERVICES_PATH_PATTERN +
'%s/service-usage?source=realtime')
return LB_SERVICES_PATH_PATTERN + '%s/service-usage/'
@property
def path_ids(self):
return ('tenant', 'lb_service_id', '')
class LBVirtualServerStatusDef(ResourceDef):
@property
def path_pattern(self):
return (LB_SERVICES_PATH_PATTERN +
'%s/lb-virtual-servers/%s/detailed-status/')
@property
def path_ids(self):
return ('tenant', 'lb_service_id', 'lb_virtual_server_id', '')
class LBMonitorProfileBaseDef(ResourceDef):
addl_attrs = ['interval', 'timeout', 'fall_count', 'rise_count']
@property
def path_pattern(self):
return LB_MONITOR_PROFILE_PATTERN
@property
def path_ids(self):
return ('tenant', 'lb_monitor_profile_id')
def get_obj_dict(self):
body = super(LBMonitorProfileBaseDef, self).get_obj_dict()
self._set_attrs_if_specified(body, self.addl_attrs)
return body
class LBHttpMonitorProfileDef(LBMonitorProfileBaseDef):
addl_attrs = LBMonitorProfileBaseDef.addl_attrs + [
'monitor_port', 'request_url', 'request_method', 'request_version',
'request_headers', 'request_body', 'response_status_codes']
@staticmethod
def resource_type():
return "LBHttpMonitorProfile"
class LBHttpsMonitorProfileDef(LBHttpMonitorProfileDef):
@staticmethod
def resource_type():
return "LBHttpsMonitorProfile"
class LBUdpMonitorProfileDef(LBMonitorProfileBaseDef):
addl_attrs = LBMonitorProfileBaseDef.addl_attrs + [
'monitor_port', 'receive', 'send']
@staticmethod
def resource_type():
return "LBUdpMonitorProfile"
class LBIcmpMonitorProfileDef(LBMonitorProfileBaseDef):
@staticmethod
def resource_type():
return "LBIcmpMonitorProfile"
class LBTcpMonitorProfileDef(LBMonitorProfileBaseDef):
addl_attrs = LBMonitorProfileBaseDef.addl_attrs + ['monitor_port']
@staticmethod
def resource_type():
return "LBTcpMonitorProfile"