IBM Cloud的 API 引用Virtual Router Appliance
SoftLayer Application Programming Interface (SLAPI) 是一个开发接口,用于向开发者和系统管理员提供与 IBM Cloud® 后端系统的直接交互,并由 IBM Cloud® Virtual Router Appliance使用。
SLAPI 为IBM Cloud控制台中的许多功能提供了支持,这通常意味着如果可以在控制台中进行交互,也可以在 API 中运行。 由于您可以在 API 中与IBM Cloud控制台的所有部分进行编程交互,因此您可以使用 API 自动执行任务。
SLAPI 是远程过程调用 (RPC) 系统。 每个调用都涉及向 API 端点发送数据以及接收所返回的结构化数据。 使用 SLAPI 进行发送和接收数据的格式取决于您所选择的 API 实施。 SLAPI 当前使用 SOAP、XML-RPC 或 REST 进行数据传输。
有关 SLAPI(现在称为“Virtual Router Appliance API”)的更多信息,请参阅 SoftLayer 开发网络 (SLDN) 中的以下资源:
- SoftLayer_Network_Gateway API
- SoftLayer_Network_Gateway_Member API
- SoftLayer_Network_Gateway_Vlan API
- SoftLayer_Network_Gateway_Status API
- SoftLayer API Python 客户机
- 更多不同语言的SoftLayer API示例
示例 - 订购网关设备
import SoftLayer
from pprint import pprint
def main():
client = SoftLayer.create_client_from_env(username=<your_username>,
api_key=<your_api_key>,
endpoint_url="https://api.softlayer.com/xmlrpc/v3")
productOrder = {
'orderContainers': [
{
"complexType": ('SoftLayer_Container_Product_Order_Hardware' +
'_Server_Gateway_Appliance'),
"prices": [
{"id", 205533}, # price for OS
{"id", 177619}, # price for Server
{"id", 17188}, # price for RAM
{"id", 63077}, # price for DISK
{"id", 52527}, # price for Network speed
{"id", 418},
{"id": 198769},
{"id": 75007},
{"id": 21},
{"id": 906},
{"id": 792},
{"id": 56},
{"id": 57},
{"id": 59},
{"id": 420}
]
"hardware": [{
"hostname": your_gwname,
"domain": your_domain.com
}],
"location": "DAL09",
"quantity": 1,
"packageId": 174
}
]
}
if bool(verify_order_only):
order = client['Product_Order'].verifyOrder(productOrder)
else:
order = client['Product_Order'].placeOrder(productOrder)
pprint(order)
if __name__ == '__main__':
main()
示例 - 将 VLAN 关联到网关设备、将 VLAN 路由到网关设备、使 VLAN 绕过网关设备以及解除 VLAN 与网关设备的关联
import SoftLayer
from pprint import pprint
class Gateway:
def __init__(self, client, gateway_id):
self.__gateway_id = gateway_id
self.__client = client
self.__inside_vlans = None
def getNetworkVlanId(self, vlanNum):
"""
obtains the VLAN Object (Vlan Object id) given the vlanNumber
via SoftLayer API call
"""
nwfilter = {'networkVlans': {'vlanNumber': {'operation': vlanNum}}}
mask = 'mask[id]'
vlan = self.__client['SoftLayer_Account'].getNetworkVlans(filter=nwfilter,
mask=mask)
if vlan:
return vlan[0]['id']
else:
pprint("Vlan Object not present")
return 0
def getInsideVlans(self):
"""
obtains the inside VLANs via SoftLayer API call
"""
self.__inside_vlans = self.__client['Network_Gateway'].getInsideVlans(
id=self.__gateway_id,
mask='mask[id, networkVlanId, networkVlan.vlanNumber]')
return self.__inside_vlans
def __findVlanAssocId(self, vlanNum):
for vlan in self.__inside_vlans:
if int(vlan['networkVlan']['vlanNumber']) == int(vlanNum):
return vlan['id']
return None
def associateVlan(self, vlanNum):
vlanId = self.getNetworkVlanId(vlanNum)
if vlanId:
vlanObj = {"bypassFlag": "false",
"networkGatewayId": self.__gateway_id,
"networkVlanId": vlanId}
obj = self.__client['Network_Gateway_Vlan'].createObject(vlanObj)
return True
else:
pprint("Invalid Vlan")
return False
def disassociateVlan(self, vlanNum):
vlanId = self.getNetworkVlanId(vlanNum)
self.__client['Network_Gateway_Vlan'].deleteObject(id=vlanId)
return True
def bypassAllVlans(self):
self.__client['Network_Gateway'].bypassAllVlans(id=self.__gateway_id)
def routeAllVlans(self):
self.__client['Network_Gateway'].unbypassAllVlans(id=self.__gateway_id)
def bypassSingleVlan(self, vlan):
vlanAssocId = self.__findVlanAssocId(vlan)
if vlanAssocId:
vlanAssocObj = [{'id': vlanAssocId}]
self.__client['Network_Gateway'].bypassVlans(vlanAssocObj,
id=self.__gateway_id)
else:
pprint("Cannot bypass VLAN %s is not associated" % vlan)
def routeSingleVlan(self, vlan):
vlanAssocId = self.__findVlanAssocId(vlan)
if vlanAssocId:
vlanAssocObj = [{'id': vlanAssocId}]
self.__client['Network_Gateway'].unbypassVlans(vlanAssocObj,
id=self.__gateway_id)
else:
pprint("Can't route thru VLAN %s is not associated" % vlan)
示例 - 取消网关设备
import SoftLayer
from pprint import pprint
def getGatewayMembers(client, appliance_id):
"""
Retrieves the gateway's member(s)
args:
client:
SL client credentials
appliance_id:
ID of the gateway appliance to be reclaimed
returns:
gateway members
"""
mask = 'mask[hardwareId]'
return client['Network_Gateway'].getMembers(id=appliance_id, mask=mask)
def cancelGateway(client, appliance_id):
"""
Cancels a standalone or HA pair gateway
args:
client:
SL client credentials
appliance_id:
ID of the gateway appliance to be reclaimed
returns:
True if all members of the appliance are successfully reclaimed
False otherwise
"""
members = getGatewayMembers(client, appliance_id)
for hardware in members:
billingID = client['Hardware'].getBillingItem(id=hardware['hardwareId'])
result = client['Billing_Item'].cancelItem(False,
False,
"No longer needed",
"", id=billingID['id'])
def main():
client = SoftLayer.create_client_from_env(username=<your_username>,
api_key=<your_api_key>,
endpoint_url="https://api.softlayer.com/xmlrpc/v3")
cancelGateway(client, your_gateway_id)
if __name__ == '__main__':
main()