SoftLayer VLAN 解除关联/分离

SoftLayer VLAN disassociate / detach

我想使用 API 取消特定 VLAN 与网关的关联。 可以附上以下代码:

import SoftLayer
from SoftLayer.CLI import environment

env = SoftLayer.create_client_from_env()
obj = {'bypassFlag':False, 'id':None, 'networkGatewayId':65884, 'networkVlanId':944459}

res = env['Network_Gateway_Vlan'].createObject(obj)

但是当我尝试使用 deleteObject 方法(具有相同的数据)时当然附加了 VLAN,我收到以下错误:

>>> res = env['Network_Gateway_Vlan'].deleteObject(obj)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/API.py", line 390, in call_handler
    return self(name, *args, **kwargs)
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/API.py", line 358, in call
    return self.client.call(self.name, name, *args, **kwargs)
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/API.py", line 261, in call
    return self.transport(request)
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/transports.py", line 215, in __call__
    raise _ex(ex.faultCode, ex.faultString)
SoftLayer.exceptions.SoftLayerAPIError: SoftLayerAPIError(SoftLayer_Exception): Object does not exist to execute method on. (SoftLayer_Network_Gateway_Vlan::deleteObject)

我不明白我在这里错过了什么:( 数据似乎是正确的,因为如果我重试 createObject,我会得到以下有意义的错误:

>>> res = env['Network_Gateway_Vlan'].createObject(obj)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/API.py", line 390, in call_handler
    return self(name, *args, **kwargs)
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/API.py", line 358, in call
    return self.client.call(self.name, name, *args, **kwargs)
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/API.py", line 261, in call
    return self.transport(request)
  File "/Users/lochou/GitHub/ansible-dist/venv/lib/python2.7/site-packages/SoftLayer/transports.py", line 215, in __call__
    raise _ex(ex.faultCode, ex.faultString)
SoftLayer.exceptions.SoftLayerAPIError: SoftLayerAPIError(SoftLayer_Exception_Public): VLAN ID 944459 is an inside VLAN for gateway gw001-par (#65884)

您只需要发送您要删除的对象的id:

e.g:

env['Network_Gateway_Vlan'].deleteObject(id=theIdofTheObject)

create 方法将 return 新创建的对象及其 id,因此您可以这样做:

res = env['Network_Gateway_Vlan'].createObject(obj)
env['Network_Gateway_Vlan'].deleteObject(id=res["id"])

我认为以下代码可以检索正确的 ID(不同于 VLAN ID),但我并不为此感到自豪:

vlans = env['SoftLayer_Account'].getNetworkGateways(mask="mask[insideVlans[networkVlan]]", filter={"networkGateways":{"insideVlans":{"networkVlan":{"id":{"operation":vlan_id}}}}})
if vlans:
    for i in range(len(vlans[0]['insideVlans'])):
        insideVlan = vlans[0]['insideVlans'][i]
        if insideVlan['networkVlan']['id'] == vlan_id:
            try:
                res = env['Network_Gateway_Vlan'].deleteObject(id=insideVlan['id'])
            except SoftLayer.exceptions.SoftLayerAPIError as e:
                module.fail_json(msg=e.faultString)

虽然可能还有更聪明的东西!