NSX|V: make use of granular API for getting DHCP binding

NSX 6.2.8 and 6.3.3 support the granular API:

New GET api:

GET https://<nsxmanagerIp>/api/4.0/edges/<edge-id>/dhcp/config/bindings/<binding-id>
RESPONSE:
           <staticBinding>
                <autoConfigureDNS>false</autoConfigureDNS>
                <leaseTime>86400</leaseTime>
                <subnetMask>255.255.255.0</subnetMask>
                <bindingId>binding-1</bindingId>
                <vmId>vm-34</vmId>
                <vnicId>1</vnicId>
                <hostname>test</hostname>
                <vmName>3-vm_ubuntu_1404_srv_64-shared-1668-02458540-04f1-4508-8037-2f2ce5542b91</vmName>
                <ipAddress>12.12.12.1</ipAddress>
           </staticBinding>

2) Quering a binding with a invalid ID:
   GET https://<nsxmanagerIp>/api/4.0/edges/<edge-id>/dhcp/config/bindings/<binding-id>
   RESPONSE:
           <error>
                <details>[Dhcp] Static binding is not found: binding-2</details>
                <errorCode>12510</errorCode>
                <moduleName>vShield Edge</moduleName>
         </error>

Change-Id: If1049035797c525344c46e1ae7f664a7b9daa4a1
This commit is contained in:
Gary Kotton 2017-02-24 12:43:03 -08:00
parent a9da47b2fd
commit c2d7155b70
4 changed files with 45 additions and 1 deletions

View File

@ -91,6 +91,15 @@ def is_nsxv_version_6_3(nsx_version):
version.LooseVersion('6.3'))
def is_nsxv_dhcp_binding_supported(nsx_version):
return ((version.LooseVersion(nsx_version) >=
version.LooseVersion('6.3.3')) or
(version.LooseVersion(nsx_version) >=
version.LooseVersion('6.2.8') and
version.LooseVersion(nsx_version) <
version.LooseVersion('6.3')))
def get_tags(**kwargs):
tags = ([dict(tag=value, scope=key)
for key, value in six.iteritems(kwargs)])

View File

@ -2118,7 +2118,7 @@ def get_dhcp_binding_mappings_for_hostname(nsxv_manager, edge_id):
return bindings_get
def get_dhcp_binding_for_binding_id(nsxv_manager, edge_id, binding_id):
def _get_dhcp_binding_for_binding_id(nsxv_manager, edge_id, binding_id):
dhcp_config = query_dhcp_service_config(nsxv_manager, edge_id)
if dhcp_config:
for binding in dhcp_config['staticBindings']['staticBindings']:
@ -2126,6 +2126,25 @@ def get_dhcp_binding_for_binding_id(nsxv_manager, edge_id, binding_id):
return binding
def _get_dhcp_binding(nsxv_manager, edge_id, binding_id):
try:
h, dhcp_binding = nsxv_manager.vcns.get_dhcp_binding(edge_id,
binding_id)
return dhcp_binding
except Exception:
return
def get_dhcp_binding_for_binding_id(nsxv_manager, edge_id, binding_id):
# API for specific binding is supported in NSX 6.2.8 and 6.3.3 onwards
ver = nsxv_manager.vcns.get_version()
if c_utils.is_nsxv_dhcp_binding_supported(ver):
return _get_dhcp_binding(nsxv_manager, edge_id, binding_id)
else:
return _get_dhcp_binding_for_binding_id(nsxv_manager, edge_id,
binding_id)
def query_dhcp_service_config(nsxv_manager, edge_id):
"""Retrieve the current DHCP configuration from the edge."""
_, dhcp_config = nsxv_manager.vcns.query_dhcp_configuration(edge_id)

View File

@ -561,6 +561,13 @@ class Vcns(object):
binding_id)
return self.do_request(HTTP_DELETE, uri, decode=False)
def get_dhcp_binding(self, edge_id, binding_id):
"""Get a dhcp static binding from the edge."""
uri = self._build_uri_path(edge_id,
DHCP_SERVICE, DHCP_BINDING_RESOURCE,
binding_id)
return self.do_request(HTTP_GET, uri, decode=False)
def create_security_group(self, request):
"""Creates a security group container in nsx.

View File

@ -304,6 +304,15 @@ class FakeVcns(object):
response = ''
return (header, response)
def get_dhcp_binding(self, edge_id, binding_id):
if binding_id not in self._dhcp_bindings[edge_id]:
raise Exception(_("binding %s does not exist") % binding_id)
response = self._dhcp_bindings[edge_id][binding_id]
header = {
'status': 200
}
return (header, response)
def create_bridge(self, edge_id, request):
if edge_id not in self._edges:
raise Exception(_("Edge %s does not exist") % edge_id)