
1. Replace the url used for manager status check. 2. Change the order of validation checks since the list action can be timed out. 3. Run the status validation without retries, to make sure the node is identified as DOWN quicker. Change-Id: I60501b544b5892dcc6eb1c4c897ee4add6262e0b
202 lines
9.0 KiB
Python
202 lines
9.0 KiB
Python
# Copyright 2016 OpenStack Foundation
|
|
# 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 distutils import version
|
|
|
|
from oslo_log import log
|
|
|
|
from vmware_nsxlib._i18n import _
|
|
from vmware_nsxlib.v3 import client
|
|
from vmware_nsxlib.v3 import core_resources
|
|
from vmware_nsxlib.v3 import exceptions
|
|
from vmware_nsxlib.v3 import lib
|
|
from vmware_nsxlib.v3 import load_balancer
|
|
from vmware_nsxlib.v3 import native_dhcp
|
|
from vmware_nsxlib.v3 import nsx_constants
|
|
from vmware_nsxlib.v3 import resources
|
|
from vmware_nsxlib.v3 import router
|
|
from vmware_nsxlib.v3 import security
|
|
from vmware_nsxlib.v3 import trust_management
|
|
from vmware_nsxlib.v3 import utils
|
|
from vmware_nsxlib.v3 import vpn_ipsec
|
|
|
|
LOG = log.getLogger(__name__)
|
|
|
|
|
|
class NsxLib(lib.NsxLibBase):
|
|
|
|
def init_api(self):
|
|
self.port_mirror = core_resources.NsxLibPortMirror(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.bridge_endpoint = core_resources.NsxLibBridgeEndpoint(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.logical_switch = core_resources.NsxLibLogicalSwitch(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.logical_router = core_resources.NsxLibLogicalRouter(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.switching_profile = core_resources.NsxLibSwitchingProfile(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.qos_switching_profile = core_resources.NsxLibQosSwitchingProfile(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.edge_cluster = core_resources.NsxLibEdgeCluster(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.bridge_cluster = core_resources.NsxLibBridgeCluster(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.transport_zone = core_resources.NsxLibTransportZone(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.transport_node = core_resources.NsxLibTransportNode(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.relay_service = core_resources.NsxLibDhcpRelayService(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.relay_profile = core_resources.NsxLibDhcpRelayProfile(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.native_dhcp_profile = core_resources.NsxLibDhcpProfile(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.native_md_proxy = core_resources.NsxLibMetadataProxy(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.firewall_section = security.NsxLibFirewallSection(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.ns_group = security.NsxLibNsGroup(
|
|
self.client, self.nsxlib_config, self.firewall_section,
|
|
nsxlib=self)
|
|
self.native_dhcp = native_dhcp.NsxLibNativeDhcp(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.ip_block_subnet = core_resources.NsxLibIpBlockSubnet(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.ip_block = core_resources.NsxLibIpBlock(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.ip_set = security.NsxLibIPSet(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.logical_port = resources.LogicalPort(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.logical_router_port = resources.LogicalRouterPort(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.dhcp_server = resources.LogicalDhcpServer(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.ip_pool = resources.IpPool(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.load_balancer = load_balancer.LoadBalancer(
|
|
self.client, self.nsxlib_config)
|
|
self.trust_management = trust_management.NsxLibTrustManagement(
|
|
self.client, self.nsxlib_config)
|
|
self.router = router.RouterLib(
|
|
self.logical_router, self.logical_router_port, self)
|
|
self.virtual_machine = core_resources.NsxLibFabricVirtualMachine(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.vif = core_resources.NsxLibFabricVirtualInterface(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.vpn_ipsec = vpn_ipsec.VpnIpSec(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.http_services = resources.NodeHttpServiceProperties(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
self.cluster_nodes = resources.NsxlibClusterNodesConfig(
|
|
self.client, self.nsxlib_config, nsxlib=self)
|
|
|
|
# Update tag limits
|
|
self.tag_limits = self.get_tag_limits()
|
|
utils.update_tag_limits(self.tag_limits)
|
|
|
|
@property
|
|
def keepalive_section(self):
|
|
return 'transport-zones'
|
|
|
|
@property
|
|
def validate_connection_method(self):
|
|
"""Return a method that will validate the NSX manager status"""
|
|
def check_manager_status(client, manager_url):
|
|
# Try to get the cluster status silently and with no retries
|
|
status = client.get('operational/application/status',
|
|
silent=True, with_retries=False)
|
|
if (not status or
|
|
status.get('application_status') != 'WORKING' or
|
|
status.get('corfu_status') != 'CONNECTED' or
|
|
status.get('corfu_status') != 'CONNECTED'):
|
|
msg = _("Manager is not in working state: %s") % status
|
|
LOG.warning(msg)
|
|
raise exceptions.ResourceNotFound(
|
|
manager=manager_url, operation=msg)
|
|
|
|
return check_manager_status
|
|
|
|
def get_version(self):
|
|
if self.nsx_version:
|
|
return self.nsx_version
|
|
|
|
node = self.client.get("node")
|
|
self.nsx_version = node.get('node_version')
|
|
return self.nsx_version
|
|
|
|
def export_restricted(self):
|
|
node = self.client.get("node")
|
|
return node.get('export_type') is 'RESTRICTED'
|
|
|
|
def feature_supported(self, feature):
|
|
if (version.LooseVersion(self.get_version()) >=
|
|
version.LooseVersion(nsx_constants.NSX_VERSION_2_4_0)):
|
|
# Features available since 2.4
|
|
if (feature == nsx_constants.FEATURE_ENS_WITH_SEC):
|
|
return True
|
|
if (feature == nsx_constants.FEATURE_ICMP_STRICT):
|
|
return True
|
|
if (feature == nsx_constants.FEATURE_ENABLE_STANDBY_RELOCATION):
|
|
return True
|
|
|
|
if (version.LooseVersion(self.get_version()) >=
|
|
version.LooseVersion(nsx_constants.NSX_VERSION_2_3_0)):
|
|
# Features available since 2.3
|
|
if (feature == nsx_constants.FEATURE_ROUTER_ALLOCATION_PROFILE):
|
|
return True
|
|
if (feature == nsx_constants.FEATURE_LB_HM_RESPONSE_CODES):
|
|
return True
|
|
|
|
if (version.LooseVersion(self.get_version()) >=
|
|
version.LooseVersion(nsx_constants.NSX_VERSION_2_2_0)):
|
|
# Features available since 2.2
|
|
if (feature == nsx_constants.FEATURE_VLAN_ROUTER_INTERFACE or
|
|
feature == nsx_constants.FEATURE_IPSEC_VPN or
|
|
feature == nsx_constants.FEATURE_ON_BEHALF_OF or
|
|
feature == nsx_constants.FEATURE_RATE_LIMIT or
|
|
feature == nsx_constants.FEATURE_TRUNK_VLAN or
|
|
feature == nsx_constants.FEATURE_ROUTER_TRANSPORT_ZONE or
|
|
feature == nsx_constants.FEATURE_NO_DNAT_NO_SNAT):
|
|
return True
|
|
|
|
if (version.LooseVersion(self.get_version()) >=
|
|
version.LooseVersion(nsx_constants.NSX_VERSION_2_1_0)):
|
|
# Features available since 2.1
|
|
if (feature == nsx_constants.FEATURE_LOAD_BALANCER):
|
|
return True
|
|
|
|
if (version.LooseVersion(self.get_version()) >=
|
|
version.LooseVersion(nsx_constants.NSX_VERSION_2_0_0)):
|
|
# Features available since 2.0
|
|
if (feature == nsx_constants.FEATURE_EXCLUDE_PORT_BY_TAG or
|
|
feature == nsx_constants.FEATURE_ROUTER_FIREWALL or
|
|
feature == nsx_constants.FEATURE_DHCP_RELAY):
|
|
return True
|
|
|
|
if (version.LooseVersion(self.get_version()) >=
|
|
version.LooseVersion(nsx_constants.NSX_VERSION_1_1_0)):
|
|
# Features available since 1.1
|
|
if (feature == nsx_constants.FEATURE_MAC_LEARNING or
|
|
feature == nsx_constants.FEATURE_DYNAMIC_CRITERIA):
|
|
return True
|
|
|
|
return False
|
|
|
|
@property
|
|
def client_url_prefix(self):
|
|
return client.NSX3Client.NSX_V1_API_PREFIX
|