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)
虽然可能还有更聪明的东西!
我想使用 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)
虽然可能还有更聪明的东西!