Guest User

Untitled

a guest
Dec 7th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.44 KB | None | 0 0
  1. from keystoneauth1 import identity
  2. from keystoneauth1 import session
  3. from neutronclient.v2_0 import client
  4. from argparse import ArgumentParser
  5. import os
  6. import sys
  7. import pdb
  8. from ovs_vsctl import VSCtl
  9. import subprocess
  10. import ovs_vsctl.parser as ovs_vsctl_parser
  11. """
  12. emit the commands you need to run to link a router namespace to a network.
  13. To run this script create a port for the entwork you want to access.
  14.  
  15. Usage : python access-lbnet-from-qrouter.py port router
  16.  
  17. Leave out the router argument for the root namespace.
  18. """
  19.  
  20. vsctl = VSCtl('tcp', '127.0.0.1', 6640)
  21.  
  22. def find_internal_vlan_tag_for_network( network_id):
  23. interal_vlan_tag = -1
  24. ports = vsctl.run(command='list port',parser=ovs_vsctl_parser.list_cmd_parser)
  25. for port in ports:
  26. other_config = port.other_config
  27. if 'net_uuid' in other_config and str(other_config['net_uuid']) == network_id:
  28. internal_vlan_tag = other_config['tag']
  29. break
  30. return internal_vlan_tag
  31.  
  32.  
  33. if __name__ == "__main__":
  34. parser = ArgumentParser()
  35. parser.add_argument("port", help = "network port", default = None)
  36. parser.add_argument("router", help = "Router name that you want to link to", default = None)
  37.  
  38. args = parser.parse_args()
  39. router_name = args.router username= os.environ.get("OS_USERNAME")
  40. password= os.environ.get("OS_PASSWORD")
  41. project_name= os.environ.get("OS_PROJECT_NAME")
  42. project_domain_id='default'
  43. if os.environ.get("OS_PROJECT_DOMAIN_NAME") is not None:
  44. project_domain_id = os.environ.get("OS_PROJECT_DOMAIN_NAME")
  45. user_domain_id='default'
  46. if os.environ.get("OS_USER_DOMAIN_NAME") is not None:
  47. user_domain_id= os.environ.get("OS_USER_DOMAIN_NAME")
  48. auth_url= os.environ.get("OS_AUTH_URL")
  49. if auth_url is None:
  50. print "Missing auth url ... set OS_AUTH_URL environment variable"
  51. sys.exit()
  52. auth = identity.Password(auth_url=auth_url,
  53. username=username,
  54. password=password,
  55. project_name=project_name,
  56. project_domain_id=project_domain_id,
  57. user_domain_id=user_domain_id)
  58. sess = session.Session(auth=auth)
  59. neutron = client.Client(session=sess)
  60. ports = neutron.list_ports()['ports']
  61. lb_ovs_port_name = None
  62. port_mac_address = None
  63. port_ip_address = None
  64. network_id = None
  65. for port in ports:
  66. if port_name == port['id'] or port_name == port['name']:
  67. if lb_ovs_port_name is None:
  68. lb_ovs_port_name = "lb-" + port['id'][0:11]
  69. port_mac_address = port['mac_address']
  70. port_ip_address = port['fixed_ips'][0]['ip_address']
  71. network_id = port['network_id']
  72. else:
  73. print ("ERROR: More than one port with name " + port_name)
  74. break
  75.  
  76.  
  77. if port_ip_address is None or network_id is None or port_mac_address is None:
  78. print("Cant find port assignments")
  79. sys.exit()
  80.  
  81.  
  82. ovs_command = "ovs-vsctl add-port br-int {} -- set interface {} type=internal -- set port {} tag={} -- set port {} other-config:hwaddr={}"\
  83. .format(lb_ovs_port_name,lb_ovs_port_name,lb_ovs_port_name,vlan_tag,lb_ovs_port_name,port_mac_address)
  84.  
  85. print ovs_command
  86. ifconfig_command = "ifconfig {} {}".format(lb_ovs_port_name,port_ip_address)
  87. if router_name is None:
  88. print ifconfig_command
  89. else:
  90. routers = neutron.list_routers()['routers']
  91. router_id = None
  92. for router in routers:
  93. if str(router['name']) == router_name:
  94. router_id = router['id']
  95. elif str(router['id']) == router_name:
  96. router_id = router_name
  97.  
  98. if router_id is None:
  99. print ("Cannot find router " + router_name)
  100. sys.exit()
  101. router_namespace = "qrouter-" + router_id
  102. print "ip link set {} netns {}".format(lb_ovs_port_name,router_namespace)
  103. print "ip netns exec " + router_namespace + " " + ifconfig_command
  104.  
  105.  
  106. vlan_tag = find_internal_vlan_tag_for_network(network_id)
  107.  
  108. port_name = args.port
  109. if port_name is None:
  110. print "Specify lbnet"
  111. sys.exit()
  112. username= os.environ.get("OS_USERNAME")
  113. password= os.environ.get("OS_PASSWORD")
  114. project_name= os.environ.get("OS_PROJECT_NAME")
  115. project_domain_id='default'
  116. if os.environ.get("OS_PROJECT_DOMAIN_NAME") is not None:
  117. project_domain_id = os.environ.get("OS_PROJECT_DOMAIN_NAME")
  118. user_domain_id='default'
Add Comment
Please, Sign In to add comment