1

For softlayer api SoftLayer_Network_Subnet, the description says:

Every SoftLayer ip address is associated with a subnet which is defined in the SoftLayer_Network_Subnet service. SoftLayer subnets define a group of ip addresses and are assigned to a SoftLayer_Network_Vlan.

http://sldn.softlayer.com/reference/services/SoftLayer_Network_Subnet

I'm trying to find the api which can assign subnet to a vlan or just build relations between subnet and vlan, but with no luck.

Q1: Is there any api that can assign subnet to vlan?

Also I have another question about network/subnet/vlan. When creating a virtual server without subnet option, IP still will be allocated to this virtual server. What method is used to determine the subnet and allocate this IP to virtual server?

Really appreciate if someone can provide information.

mattyb
  • 11,693
  • 15
  • 20
Hengguo
  • 73
  • 5

1 Answers1

1

when you order a VLAN also you order its subnet, now when you order a subnet you can attach it to a vlan, you can do that for "Portable Public", "Portable Private" and "Portable Public IPv6" subnets. As you can see you can assing a subnet to a vlan at the order moment there no any method to assing them after you performed the order.

here a simple example about the subnet order

"""
Orders a new portable public subnet

Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder/
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder/

License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""
import SoftLayer
# For nice debug output:
from pprint import pprint as pp

API_USERNAME = 'set me'
API_KEY = 'set me'

# Order Template with all new item configurations

orderTemplate = {
    'location': 224092,    # Singapore 1
    'packageId': 0,
    'endPointVlanId': 527900,
    'prices': [
        {
            'id': 13980
        }
    ],
    'quantity': 1,
    'itemCategoryQuestionAnswers': [
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 14,
            'answer': 1    # TOTAL_IPS_IN_30_DAYS
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 15,
            'answer': 3    # TOTAL_IPS_IN_12_MONTHS
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 16,
            'answer': 'Test description of your need for additional IPs'     # REASON_FOR_IPS
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 9,
            'answer': 'ContactNameTest'    # CONTACT_NAME
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 10,
            'answer': 'ContactJobTitleTest'    # CONTACT_JOB_TITLE
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 11,
            'answer': 'contact.email@myemail.com'    # CONTACT_EMAIL
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 12,
            'answer': '72878781'    # CONTACT_PHONE_NUMBER
        },
        {
            'categoryId': 313,
            'categoryCode': 'sov_sec_ip_addresses_pub',
            'questionId': 13,
            'answer': True    # CONTACT_VALIDATED
        }
    ],
    'complexType': 'SoftLayer_Container_Product_Order_Network_Subnet'
}

# Creates a new connection to the API service.
client = SoftLayer.Client(
    username=API_USERNAME,
    api_key=API_KEY
)

try:
    result = client['SoftLayer_Product_Order'].verifyOrder(orderTemplate)
    pp(result)
except SoftLayer.SoftLayerAPIError as e:
    pp('Failed ... Unable to order the new item faultCode=%s, faultString=%s'
        % (e.faultCode, e.faultString))

and this is a more complete code to order subnets of any kind:

"""
Order a new subnet.

The script order a new subnet using the same options like the portal.

Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getAllObjects
http://sldn.softlayer.com/reference/services/SoftLayer_Network_Subnet/getSubnetForIpAddress
http://sldn.softlayer.com/reference/services/SoftLayer_Account/getNetworkVlans
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Network_Subnet
http://sldn.softlayer.com/blog/bpotter/Going-Further-SoftLayer-API-Python-Client-Part-3
http://sldn.softlayer.com/article/Object-Filters
http://sldn.softlayer.com/article/Python
http://sldn.softlayer.com/article/Object-Masks


License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""

import SoftLayer
import json

# The subnet you wish to order. The available options are the
# same like in the in the Softlayer Portal.
# e.g. "1 Static Public IP Address",
# "/64 Block Static Public IPv6 Addresses", etc.
option = "Global IPv6"

# The endpoint IP address for the subnet.
# You need to configure this field if
# your order belongs to the categories
# "Static Public" or "Static Public IPv6"
# e.g. "119.81.142.114", "2401:c900:1201:9c::2".
endPointIP = "119.81.142.114"

# The VLan number for the subnet.
# You need to configure this field if
# your order belongs to the categories
# "Portable Public", "Portable Private" and
# "Portable Public IPv6".
vlanNumber = 758

client = SoftLayer.Client()
packageService = client['SoftLayer_Product_Package']
subnetService = client['SoftLayer_Network_Subnet']
orderService = client['SoftLayer_Product_Order']
accountService = client['SoftLayer_Account']

# Declaring an object filter to get the packages
# related to subnets.
objectFilter = {
    "type": {
        "keyName": {
            "operation": "in",
            "options": [{
                "name": "data",
                "value": [
                    "ADDITIONAL_SERVICES",
                    "ADDITIONAL_SERVICES_PORTABLE_IP_ADDRESSES",
                    "ADDITIONAL_SERVICES_STATIC_IP_ADDRESSES"
                ]
            }]
        }
    }
}

# Declaring an object mask to get more information about the packages
objectMask = "mask[items[id, description, prices[id, recurringFee, attributes, categories]]]"

# Getting the items and the prices available to order subnets
try:
    packages = packageService.getAllObjects(filter=objectFilter,
                                            mask=objectMask)

except SoftLayer.SoftLayerAPIError as e:
    print("Unable to list the packages. faultCode=%s, faultString=%s" %
          (e.faultCode, e.faultString))
    exit(1)

# Getting item price for the configured option to order.
optionItem = {}
optionPackage = 0
for package in packages:
    for item in package['items']:
        if item['description'] == option:
            prices = []
            if len(item['prices']) > 1:
                for price in item['prices']:
                    if len(price['attributes']) == 0:
                        if 'recurringFee' in price:
                            prices.append(price)
                            item['prices'] = price
                            break
            optionItem = item
            optionPackage = package['id']
            break
    if 'id' in optionItem:
        break

if not 'id' in optionItem:
    print("The configured option: " + option + " is not valid.")
    exit(1)

# Verifying if the configured option requires a VLan or end point IP.
requireVlan = False
requireIp = False
for category in optionItem['prices'][0]["categories"]:
    cat = category['categoryCode']
    if cat == "static_sec_ip_addresses" or cat == "static_ipv6_addresses":
        requireIp = True
    if (cat == "sov_sec_ip_addresses_pub" or
       cat == "sov_sec_ip_addresses_priv" or cat == "sov_ipv6_addresses"):
        requireVlan = True
    break

# Getting the IP address object.
ip = {}
if requireIp:
    try:
        objectMask = "mask[ipAddresses]"
        subnet = subnetService.getSubnetForIpAddress(endPointIP,
                                                     mask=objectMask)
        if not 'id' in subnet:
            print("There is no a IP address " + endPointIP +
                  " in the subnets of the account.")
            exit(1)
        else:
            for ipSubnet in subnet['ipAddresses']:
                if ipSubnet['ipAddress'] == endPointIP:
                    ip = ipSubnet
                    break
    except SoftLayer.SoftLayerAPIError as e:
        print("Unable to find the subnet. faultCode=%s, faultString=%s"
              % (e.faultCode, e.faultString))
        exit(1)

# Getting the VLan.
vlan = {}
if requireVlan:
    try:
        objectFilter = {
            "networkVlans": {
                "vlanNumber": {
                    "operation": vlanNumber
                }
            }
        }
        vlans = accountService.getNetworkVlans(filter=objectFilter)
        if len(vlans) == 0:
            print("There is no a VLan number " + str(vlanNumber) +
                  " in the account.")
            exit(1)
        else:
            vlan = vlans[0]
    except SoftLayer.SoftLayerAPIError as e:
        print("Unable to retrieve the VLans. faultCode=%s, faultString=%s" %
              (e.faultCode, e.faultString))
        exit(1)

# Creating the order template for the subnet
orderTemplate = {
    'packageId': optionPackage,
    'prices': optionItem['prices'],
    'quantity': 1,
    'complexType': 'SoftLayer_Container_Product_Order_Network_Subnet'
}

if requireVlan:
    orderTemplate['endPointVlanId'] = vlan['id']
elif requireIp:
    orderTemplate['endPointIpAddressId'] = ip['id']

try:
    # verifyOrder() will check your order for errors. Replace this with a call
    # to placeOrder() when you're ready to order. Both calls return a receipt
    # object that you can use for your records.
    result = orderService.verifyOrder(orderTemplate)
    print(json.dumps(result, sort_keys=True, indent=2, separators=(',', ': ')))
except SoftLayer.SoftLayerAPIError as e:
    print("Unable to place the order. faultCode=%s, faultString=%s" %
          (e.faultCode, e.faultString))

In regards your another question always a IP is assigned to your machine even if you did not configure any.

you can see this article about how to pick the VLAN that you want in your order: http://sldn.softlayer.com/blog/phil/CCI-VLAN-Specification

To assing the VLAN to your machine you only can do that proccess at order time, if you want to changa the vlan after the order you need to submit an ticket to softlayer and ask them.

Once you have the VLAN you can list its subnets and pick the subnet that you want for that see:

http://sldn.softlayer.com/reference/services/SoftLayer_Network_Vlan/getSubnets

Here an example about how to order a VSI + subnets

https://$user:$apiKey@api.softlayer.com/rest/v3/SoftLayer_Product_Order/placeOrder

Method: Post

{  
   "parameters":[  
      {  
         "orderContainers":[  
            {  
               "hardware":[  
                  {  
                     "hostname":"testhost",
                     "domain":"softlayer.com",
                     "primaryBackendNetworkComponent":  
                        {  
                           "networkVlanId":971077,
                           "networkVlan":{  
                              "primarySubnet":{  
                                 "id":225652
                              }
                           }
                        }
                     ,
                     "primaryNetworkComponent":  
                        {  
                           "networkVlanId":971075,
                           "networkVlan":{  
                              "primarySubnet":{  
                                 "id":233232
                              }
                           }
                        }

                  }
               ],
               "location":"DALLAS05",
               "quantity":1,
               "packageId":46,
               "prices":[  
                  {  
                     "id":1640
                  },
                  {  
                     "id":1644
                  },
                  {  
                     "id":1857
                  },
                  {  
                     "id":1639
                  },
                  {  
                     "id":50367
                  },
                  {  
                     "id":273
                  },
                  {  
                     "id":2302
                  },
                  {  
                     "id":55
                  },
                  {  
                     "id":58
                  },
                  {  
                     "id":420
                  },
                  {  
                     "id":418
                  },
                  {  
                     "id":21
                  },
                  {  
                     "id":57
                  },
                  {  
                     "id":905
                  }
               ]
            }
         ]
      }
   ]
}
  • Thanks a lot! From you answer I get the clear structure about order vsi/subnet/vlan. For the part "In regards your another question always a IP is assigned to your machine even if you did not configure any. ", still want to know more about how the IP is picked. I think there should be some policy to check available IP that can be assigned to vsi if subnet/vlan is not specified in order api. Could you please explain more about this? Thanks! – Hengguo Jan 19 '17 at 02:40
  • softlayer looks for an available VLAN in your account and it is assing it, that's it. if there is no available VLAN your order will fail in provisioning proccess and an softlayer's employee will contact you – Nelson Raul Cabero Mendoza Jan 19 '17 at 12:34
  • Thanks! My doubt is solved here. – Hengguo Jan 19 '17 at 15:46