0
votes

I would like to use the API to disassociate a specific VLAN from a gateway. It can be attached with the following piece of code:

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)

But when I try to use method deleteObject (with same data) when the VLAN is attached of course, I get the following error:

>>> 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)

I don't understand what I missed here :( The data seem correct since if I retry createObject I get the meaningful error below:

>>> 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)
2

2 Answers

0
votes

you need only send the id of the object that you want to delete:

e.g:

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

The create method will return you the newly created object with its id so you can do this:

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

I think the following piece of code does the job of retrieving the right id (different from the VLAN id) but I'm not proud of it:

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)

There's probably something smarter though!