Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.85 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. __author__ = "Mykola Yakovliev"
  4. __credits__ = ["Mykola Yakovliev"]
  5. __license__ = "GPLv3"
  6. __version__ = "1.0"
  7. __maintainer__ = "Mykola Yakovliev"
  8. __email__ = "vegasq@gmail.com"
  9. __status__ = "Production"
  10.  
  11. import argparse
  12. from pprint import pprint
  13. import requests
  14. import json
  15. from simplejson.scanner import JSONDecodeError
  16.  
  17. from prettytable import PrettyTable
  18. from keystoneclient.v2_0 import client
  19.  
  20.  
  21. class ContrailAPIWrap(object):
  22. """Generic wrapper that handles requests to Contrail VIP.
  23.  
  24. Requires working keystone v2
  25. """
  26. def __init__(self, contrail_ep, keystone_ep, user, password, tenant):
  27. self.contrail_ep = contrail_ep
  28. self.keystone_ep = keystone_ep
  29. self.user = user
  30. self.password = password
  31. self.tenant = tenant
  32.  
  33. def _get_token(self):
  34. kc = client.Client(
  35. username=self.user, password=self.password,
  36. auth_url=self.keystone_ep, tenant_name=self.tenant)
  37.  
  38. k = kc.service_catalog.get_token()
  39. return k['id']
  40.  
  41. def get(self, cmd=""):
  42. token = self._get_token()
  43. data = requests.get(
  44. "%s%s" % (self.contrail_ep, cmd),
  45. headers={'X-Auth-Token': token})
  46. try:
  47. return data.json()
  48. except JSONDecodeError:
  49. print(data.text)
  50.  
  51.  
  52. class PyContrailBackend(object):
  53. def __init__(self, contrail_ep, keystone_ep, user, password, tenant):
  54. self.conn = ContrailAPIWrap(
  55. contrail_ep, keystone_ep, user, password, tenant)
  56.  
  57. self.multiple_key = None
  58. self.single_key = None
  59.  
  60. def prnt(self, t):
  61. print(self.header)
  62. print(t)
  63.  
  64. def display(self):
  65. t = PrettyTable(['Name', 'IP', 'UUID'])
  66. for node in self.get_nodes():
  67. t.add_row(node)
  68. self.prnt(t)
  69.  
  70. def get_nodes(self):
  71. nodes = []
  72.  
  73. nodes_resp = self.conn.get(self.multiple_key)
  74. for n in nodes_resp[self.multiple_key]:
  75. # Remove full path since we handle it on higher level
  76. item_href = n['href'].replace(self.conn.contrail_ep, '')
  77. info = self.conn.get(item_href)[self.single_key]
  78.  
  79. ip = None
  80. if 'virtual_router_ip_address' in info:
  81. ip = info['virtual_router_ip_address']
  82. elif 'analytics_node_ip_address' in info:
  83. ip = info['analytics_node_ip_address']
  84. elif 'config_node_ip_address' in info:
  85. ip = info['config_node_ip_address']
  86. elif 'database_node_ip_address' in info:
  87. ip = info['database_node_ip_address']
  88. else:
  89. for k in info.keys():
  90. if "_ip_" in k:
  91. ip = info[k]
  92. if ip is None:
  93. ip = json.dumps(info['fq_name'])
  94.  
  95. nodes.append((info['display_name'], ip, info['uuid']))
  96. return nodes
  97.  
  98.  
  99. class AnalyticsNodes(PyContrailBackend):
  100. def __init__(self, *args, **kwargs):
  101. super(AnalyticsNodes, self).__init__(*args, **kwargs)
  102.  
  103. self.header = "Analytics nodes"
  104. self.multiple_key = 'analytics-nodes'
  105. self.single_key = 'analytics-node'
  106.  
  107.  
  108. class ConfigNodes(PyContrailBackend):
  109. def __init__(self, *args, **kwargs):
  110. super(ConfigNodes, self).__init__(*args, **kwargs)
  111.  
  112. self.header = "Config nodes"
  113. self.multiple_key = 'config-nodes'
  114. self.single_key = 'config-node'
  115.  
  116.  
  117. class DatabaseNodes(PyContrailBackend):
  118. def __init__(self, *args, **kwargs):
  119. super(DatabaseNodes, self).__init__(*args, **kwargs)
  120.  
  121. self.header = "Database nodes"
  122. self.multiple_key = 'database-nodes'
  123. self.single_key = 'database-node'
  124.  
  125.  
  126. class PhysicalRouters(PyContrailBackend):
  127. def __init__(self, *args, **kwargs):
  128. super(PhysicalRouters, self).__init__(*args, **kwargs)
  129.  
  130. self.header = "Physical Routers"
  131. self.multiple_key = 'physical-routers'
  132. self.single_key = 'physical-router'
  133.  
  134.  
  135. class VirtualRouters(PyContrailBackend):
  136. def __init__(self, *args, **kwargs):
  137. super(VirtualRouters, self).__init__(*args, **kwargs)
  138.  
  139. self.header = "Virtual routers"
  140. self.multiple_key = 'virtual-routers'
  141. self.single_key = 'virtual-router'
  142.  
  143.  
  144. class NodesFacade(object):
  145. def __init__(self):
  146. parser = argparse.ArgumentParser(description='Display Contrail nodes')
  147. parser.add_argument(
  148. '--username', type=str, metavar='USERNAME',
  149. help="Username", required=True)
  150. parser.add_argument(
  151. '--password', type=str, metavar='PASSWORD',
  152. help="Password", required=True)
  153. parser.add_argument(
  154. '--tenant', type=str, metavar='tenant',
  155. help="tenant", required=True)
  156. parser.add_argument(
  157. '--contrail-ep', type=str, metavar='CONTRAILEP',
  158. help="Contrail endpoint", required=True)
  159. parser.add_argument(
  160. '--keystone-ep', type=str, metavar='KEYSTONEEP',
  161. help="Keystone endpoint", required=True)
  162. parser.add_argument(
  163. '--get', type=str, metavar="HREF", help="Get object")
  164.  
  165. parsed_args = parser.parse_args()
  166.  
  167. if parsed_args.get:
  168. if parsed_args.get == '/':
  169. parsed_args.get = ''
  170. v = ContrailAPIWrap(
  171. parsed_args.contrail_ep, parsed_args.keystone_ep,
  172. parsed_args.username, parsed_args.password,
  173. parsed_args.tenant).get(parsed_args.get)
  174. pprint(v)
  175. else:
  176. monitor = [ConfigNodes, DatabaseNodes, AnalyticsNodes,
  177. VirtualRouters, PhysicalRouters]
  178. for object_type in monitor:
  179. object_type(
  180. parsed_args.contrail_ep, parsed_args.keystone_ep,
  181. parsed_args.username, parsed_args.password,
  182. parsed_args.tenant).display()
  183.  
  184.  
  185. if __name__ == '__main__':
  186. NodesFacade()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement