Created
December 21, 2016 22:34
-
-
Save allthingsclowd/9226265177bcb444d9caf811a0ad95ca to your computer and use it in GitHub Desktop.
Fujitsu K5 Routing API Call for Subnets and Routers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
"""Summary: Python 2.7X API example calls to add routes to subnets and routers | |
This is a very rough and ready example script ensure to tidy!! | |
Prerequisites: k5contractsettingsV7.py file in the same directory with K5 contract login details | |
adminUser = 'username' | |
adminPassword = 'password' | |
contract = 'contract_name' | |
contractid = 'contract_id' | |
defaultid = 'default_project_id' | |
region = 'uk-1' | |
Author: Graham Land | |
Date: 21/12/16 | |
Twitter: @allthingsclowd | |
Github: https://github.com/allthingscloud | |
Blog: https://allthingscloud.eu | |
""" | |
import requests | |
import getopt | |
import sys | |
from k5contractsettingsV7 import * | |
def get_scoped_token(adminUser, adminPassword, contract, projectid, region): | |
"""Summary - Get a regional project scoped token using a username and password | |
Returns: | |
Object: Regionally Scoped Project Token Object | |
Args: | |
adminUser (TYPE): username | |
adminPassword (TYPE): password | |
contract (TYPE): contract name | |
projectid (TYPE): project id | |
region (TYPE): region | |
""" | |
identityURL = 'https://identity.' + region + \ | |
'.cloud.global.fujitsu.com/v3/auth/tokens' | |
try: | |
response = requests.post(identityURL, | |
headers={'Content-Type': 'application/json', | |
'Accept': 'application/json'}, | |
json={"auth": | |
{"identity": | |
{"methods": ["password"], "password": | |
{"user": | |
{"domain": | |
{"name": contract}, | |
"name": adminUser, | |
"password": adminPassword | |
}}}, | |
"scope": | |
{"project": | |
{"id": projectid | |
}}}}) | |
return response | |
except: | |
return 'Regional Project Token Scoping Failure' | |
def add_static_route_to_subnet(k5token, subnetid, routes, region): | |
"""Summary | |
Args: | |
adminUser (TYPE): Description | |
adminPassword (TYPE): Description | |
subnet (TYPE): Description | |
routes (TYPE): Description | |
project (TYPE): Description | |
contract (TYPE): Description | |
region (TYPE): Description | |
Returns: | |
TYPE: Description | |
""" | |
subnetURL = 'https://networking.' + region + \ | |
'.cloud.global.fujitsu.com/v2.0/subnets/' + subnetid | |
try: | |
response = requests.put(subnetURL, | |
headers={'X-Auth-Token': k5token, | |
'Content-Type': 'application/json'}, | |
json={"subnet": {"host_routes": routes}}) | |
return response | |
except: | |
return ("\nUnexpected error:", sys.exc_info()) | |
def clear_routes_on_subnet(k5token, subnetid, region): | |
"""Summary | |
Args: | |
adminUser (TYPE): Description | |
adminPassword (TYPE): Description | |
subnet (TYPE): Description | |
project (TYPE): Description | |
contract (TYPE): Description | |
region (TYPE): Description | |
Returns: | |
TYPE: Description | |
""" | |
subnetURL = 'https://networking.' + region + \ | |
'.cloud.global.fujitsu.com/v2.0/subnets/' + subnetid | |
try: | |
response = requests.put(subnetURL, | |
headers={'X-Auth-Token': k5token, | |
'Content-Type': 'application/json'}, | |
json={"subnet": {"host_routes": []}}) | |
return response | |
except: | |
return ("\nUnexpected error:", sys.exc_info()) | |
def get_subnet_routes(k5token, subnetid, region): | |
"""Summary | |
Args: | |
adminUser (TYPE): Description | |
adminPassword (TYPE): Description | |
subnet (TYPE): Description | |
project (TYPE): Description | |
contract (TYPE): Description | |
region (TYPE): Description | |
Returns: | |
TYPE: Description | |
""" | |
subnetURL = 'https://networking.' + region + \ | |
'.cloud.global.fujitsu.com/v2.0/subnets/' + subnetid | |
try: | |
response = requests.get(subnetURL, | |
headers={'X-Auth-Token': k5token, 'Content-Type': 'application/json', 'Accept': 'application/json'}) | |
return response | |
except: | |
return ("\nUnexpected error:", sys.exc_info()) | |
def get_router_routes(k5token, routerid, region): | |
"""Summary | |
Args: | |
adminUser (TYPE): Description | |
adminPassword (TYPE): Description | |
router (TYPE): Description | |
project (TYPE): Description | |
contract (TYPE): Description | |
region (TYPE): Description | |
Returns: | |
TYPE: Description | |
""" | |
try: | |
routerURL = 'https://networking.' + region + \ | |
'.cloud.global.fujitsu.com/v2.0/routers/' + routerid | |
response = requests.get(routerURL, | |
headers={'X-Auth-Token': k5token, 'Content-Type': 'application/json', 'Accept': 'application/json'}) | |
return response | |
except: | |
return ("\nUnexpected error:", sys.exc_info()) | |
def add_static_route_to_router(k5token, routerid, routes, region): | |
"""Summary | |
Args: | |
adminUser (TYPE): Description | |
adminPassword (TYPE): Description | |
router (TYPE): Description | |
routes (TYPE): Description | |
project (TYPE): Description | |
contract (TYPE): Description | |
region (TYPE): Description | |
Returns: | |
TYPE: Description | |
""" | |
try: | |
routerURL = 'https://networking-ex.' + region + \ | |
'.cloud.global.fujitsu.com/v2.0/routers/' + routerid | |
response = requests.put(routerURL, | |
headers={'X-Auth-Token': k5token, | |
'Content-Type': 'application/json'}, | |
json={"router": {"routes": routes}}) | |
return response | |
except: | |
# error_sum = unicode(sys.exc_info()[0]) | |
# print error_sum | |
# print sys.exc_info().json() | |
# error_detail = unicode(sys.exc_info()[1]) | |
# print error_detail | |
return sys.exc_info() | |
def main(): | |
try: | |
# Please ensure to set all the values below to match the IDs of the subnets and routers local to you | |
demoProject = 'Project_A' | |
demoProjectid = '7015d1478a4c4bd7b970215d7b0260dd' | |
demoServerid = '8a33075f-0894-4b9b-8b16-047457952f74' | |
demoNetworkid = 'b514ab88-0a32-4b84-a73f-d5eabfd9de72' | |
demoSubnetid = '1588ed79-3efe-44a7-be5b-075eb653f3bd' | |
demoRouterid = 'df7a88eb-a8fd-4169-b292-77f14b6cd286' | |
demoRoutes = [{"destination":"192.168.50.0/24","nexthop":"192.168.0.43"},{"destination":"10.10.90.0/24","nexthop":"10.10.50.43"}] | |
# Get a project scoped token | |
k5token = get_scoped_token(adminUser, adminPassword, contract, demoProjectid, region).headers['X-Subject-Token'] | |
# Print the token - just for reassurance :) | |
print k5token | |
# List all the routes currently associated with the router | |
result = get_subnet_routes(k5token, demoSubnetid, region) | |
# Print the results | |
print result.json() | |
# Add the new routes to the desired subnet | |
result = add_static_route_to_subnet(k5token, demoSubnetid, demoRoutes, region) | |
# Print the results | |
print result.json() | |
# Clear all routes from the subnet - just sends an empty route [] | |
result = clear_routes_on_subnet(k5token, demoSubnetid, region) | |
# Print the results | |
print result.json() | |
# Get the routes currently associated with a router | |
result = get_router_routes(k5token, demoRouterid, region) | |
# Print the results | |
print result.json() | |
# Add a new set of routes to the router | |
result = add_static_route_to_router(k5token, demoRouterid, demoRoutes, region) | |
# Print the results | |
print result.json() | |
except: | |
print("\nUnexpected error:", sys.exc_info()) | |
''' | |
Example Output ---------------- | |
09855d3ce9a54c81847bb210a2225732 | |
{u'subnet': {u'name': u'SelectaSub', u'enable_dhcp': True, u'availability_zone': u'uk-1b', u'network_id': u'b514ab88-0a32-4b84-a73f-d5eabfd9de72', u'tenant_id': u'7015d1478a4c4bd7b970215d7b0260dd', u'dns_nameservers': [], u'allocation_pools': [{u'start': u'192.168.1.1', u'end': u'192.168.1.253'}], u'host_routes': [], u'ip_version': 4, u'gateway_ip': u'192.168.1.254', u'cidr': u'192.168.1.0/24', u'id': u'1588ed79-3efe-44a7-be5b-075eb653f3bd'}} | |
{u'subnet': {u'name': u'SelectaSub', u'enable_dhcp': True, u'availability_zone': u'uk-1b', u'network_id': u'b514ab88-0a32-4b84-a73f-d5eabfd9de72', u'tenant_id': u'7015d1478a4c4bd7b970215d7b0260dd', u'dns_nameservers': [], u'allocation_pools': [{u'start': u'192.168.1.1', u'end': u'192.168.1.253'}], u'host_routes': [{u'destination': u'192.168.50.0/24', u'nexthop': u'192.168.0.43'}, {u'destination': u'10.10.90.0/24', u'nexthop': u'10.10.50.43'}], u'ip_version': 4, u'gateway_ip': u'192.168.1.254', u'cidr': u'192.168.1.0/24', u'id': u'1588ed79-3efe-44a7-be5b-075eb653f3bd'}} | |
{u'subnet': {u'name': u'SelectaSub', u'enable_dhcp': True, u'availability_zone': u'uk-1b', u'network_id': u'b514ab88-0a32-4b84-a73f-d5eabfd9de72', u'tenant_id': u'7015d1478a4c4bd7b970215d7b0260dd', u'dns_nameservers': [], u'allocation_pools': [{u'start': u'192.168.1.1', u'end': u'192.168.1.253'}], u'host_routes': [], u'ip_version': 4, u'gateway_ip': u'192.168.1.254', u'cidr': u'192.168.1.0/24', u'id': u'1588ed79-3efe-44a7-be5b-075eb653f3bd'}} | |
{u'router': {u'status': u'ACTIVE', u'external_gateway_info': {u'network_id': u'd730db50-0e0c-4790-9972-1f6e2b8c4915', u'enable_snat': True}, u'name': u'SelectaRtr', u'admin_state_up': True, u'tenant_id': u'7015d1478a4c4bd7b970215d7b0260dd', u'availability_zone': u'uk-1b', u'routes': [{u'destination': u'10.10.50.0/24', u'nexthop': u'10.10.50.43'}, {u'destination': u'192.168.0.0/24', u'nexthop': u'192.168.0.43'}], u'id': u'df7a88eb-a8fd-4169-b292-77f14b6cd286'}} | |
{u'router': {u'status': u'ACTIVE', u'external_gateway_info': {u'network_id': u'd730db50-0e0c-4790-9972-1f6e2b8c4915', u'enable_snat': True}, u'name': u'SelectaRtr', u'admin_state_up': True, u'tenant_id': u'7015d1478a4c4bd7b970215d7b0260dd', u'availability_zone': u'uk-1b', u'routes': [{u'destination': u'10.10.90.0/24', u'nexthop': u'10.10.50.43'}, {u'destination': u'192.168.50.0/24', u'nexthop': u'192.168.0.43'}], u'id': u'df7a88eb-a8fd-4169-b292-77f14b6cd286'}} | |
[Finished in 24.2s] | |
''' | |
if __name__ == "__main__": | |
main() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment