Last active
January 30, 2018 21:52
-
-
Save Vegasq/c5dc7837606c78fdaef9a1672a880c2e to your computer and use it in GitHub Desktop.
Print list of Contrail nodes in cloud. Usage: python contrail-node-list.py --username admin --password admin --tenant admin --contrail-ep http://172.1.1.1:8182/ --keystone-ep http://172.1.1.2:5000/v2.0/
This file contains 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 | |
# 1.0 basic version | |
# 1.1 --delete added | |
__author__ = "Mykola Yakovliev" | |
__credits__ = ["Mykola Yakovliev"] | |
__license__ = "GPLv3" | |
__version__ = "1.1" | |
__maintainer__ = "Mykola Yakovliev" | |
__email__ = "[email protected]" | |
__status__ = "Production" | |
import argparse | |
from pprint import pprint | |
import requests | |
import json | |
from simplejson.scanner import JSONDecodeError | |
from prettytable import PrettyTable | |
from keystoneclient.v2_0 import client | |
class ContrailAPIWrap(object): | |
"""Generic wrapper that handles requests to Contrail VIP. | |
Requires working keystone v2 | |
""" | |
def __init__(self, contrail_ep, keystone_ep, user, password, tenant): | |
self.contrail_ep = contrail_ep | |
self.keystone_ep = keystone_ep | |
self.user = user | |
self.password = password | |
self.tenant = tenant | |
def _get_token(self): | |
kc = client.Client( | |
username=self.user, password=self.password, | |
auth_url=self.keystone_ep, tenant_name=self.tenant) | |
k = kc.service_catalog.get_token() | |
return k['id'] | |
def get(self, cmd=""): | |
token = self._get_token() | |
data = requests.get( | |
"%s%s" % (self.contrail_ep, cmd), | |
headers={'X-Auth-Token': token}) | |
try: | |
return data.json() | |
except JSONDecodeError: | |
print(data.text) | |
def delete(self, cmd=""): | |
token = self._get_token() | |
data = requests.delete( | |
"%s%s" % (self.contrail_ep, cmd), | |
headers={'X-Auth-Token': token}) | |
try: | |
return data.json() | |
except JSONDecodeError: | |
print(data.text) | |
class PyContrailBackend(object): | |
def __init__(self, contrail_ep, keystone_ep, user, password, tenant): | |
self.conn = ContrailAPIWrap( | |
contrail_ep, keystone_ep, user, password, tenant) | |
self.multiple_key = None | |
self.single_key = None | |
def prnt(self, t): | |
print(self.header) | |
print(t) | |
def display(self): | |
t = PrettyTable(['Name', 'IP', 'UUID']) | |
for node in self.get_nodes(): | |
t.add_row(node) | |
self.prnt(t) | |
def get_nodes(self): | |
nodes = [] | |
nodes_resp = self.conn.get(self.multiple_key) | |
for n in nodes_resp[self.multiple_key]: | |
# Remove full path since we handle it on higher level | |
item_href = n['href'].replace(self.conn.contrail_ep, '') | |
info = self.conn.get(item_href)[self.single_key] | |
ip = None | |
if 'virtual_router_ip_address' in info: | |
ip = info['virtual_router_ip_address'] | |
elif 'analytics_node_ip_address' in info: | |
ip = info['analytics_node_ip_address'] | |
elif 'config_node_ip_address' in info: | |
ip = info['config_node_ip_address'] | |
elif 'database_node_ip_address' in info: | |
ip = info['database_node_ip_address'] | |
else: | |
for k in info.keys(): | |
if "_ip_" in k: | |
ip = info[k] | |
if ip is None: | |
ip = json.dumps(info['fq_name']) | |
nodes.append((info['display_name'], ip, info['uuid'])) | |
return nodes | |
class AnalyticsNodes(PyContrailBackend): | |
def __init__(self, *args, **kwargs): | |
super(AnalyticsNodes, self).__init__(*args, **kwargs) | |
self.header = "Analytics nodes" | |
self.multiple_key = 'analytics-nodes' | |
self.single_key = 'analytics-node' | |
class ConfigNodes(PyContrailBackend): | |
def __init__(self, *args, **kwargs): | |
super(ConfigNodes, self).__init__(*args, **kwargs) | |
self.header = "Config nodes" | |
self.multiple_key = 'config-nodes' | |
self.single_key = 'config-node' | |
class DatabaseNodes(PyContrailBackend): | |
def __init__(self, *args, **kwargs): | |
super(DatabaseNodes, self).__init__(*args, **kwargs) | |
self.header = "Database nodes" | |
self.multiple_key = 'database-nodes' | |
self.single_key = 'database-node' | |
class PhysicalRouters(PyContrailBackend): | |
def __init__(self, *args, **kwargs): | |
super(PhysicalRouters, self).__init__(*args, **kwargs) | |
self.header = "Physical Routers" | |
self.multiple_key = 'physical-routers' | |
self.single_key = 'physical-router' | |
class VirtualRouters(PyContrailBackend): | |
def __init__(self, *args, **kwargs): | |
super(VirtualRouters, self).__init__(*args, **kwargs) | |
self.header = "Virtual routers" | |
self.multiple_key = 'virtual-routers' | |
self.single_key = 'virtual-router' | |
class NodesFacade(object): | |
def __init__(self): | |
parser = argparse.ArgumentParser(description='Display Contrail nodes') | |
parser.add_argument( | |
'--username', type=str, metavar='USERNAME', | |
help="Username", required=True) | |
parser.add_argument( | |
'--password', type=str, metavar='PASSWORD', | |
help="Password", required=True) | |
parser.add_argument( | |
'--tenant', type=str, metavar='tenant', | |
help="tenant", required=True) | |
parser.add_argument( | |
'--contrail-ep', type=str, metavar='CONTRAILEP', | |
help="Contrail endpoint", required=True) | |
parser.add_argument( | |
'--keystone-ep', type=str, metavar='KEYSTONEEP', | |
help="Keystone endpoint", required=True) | |
parser.add_argument( | |
'--get', type=str, metavar="HREF", help="Get object") | |
parser.add_argument( | |
'--delete', type=str, metavar="HREF", help="Delete object") | |
parsed_args = parser.parse_args() | |
if parsed_args.get: | |
if parsed_args.get == '/': | |
parsed_args.get = '' | |
v = ContrailAPIWrap( | |
parsed_args.contrail_ep, parsed_args.keystone_ep, | |
parsed_args.username, parsed_args.password, | |
parsed_args.tenant).get(parsed_args.get) | |
pprint(v) | |
elif parsed_args.delete: | |
if parsed_args.get == '/': | |
parsed_args.get = '' | |
v = ContrailAPIWrap( | |
parsed_args.contrail_ep, parsed_args.keystone_ep, | |
parsed_args.username, parsed_args.password, | |
parsed_args.tenant).delete(parsed_args.delete) | |
pprint(v) | |
else: | |
monitor = [ConfigNodes, DatabaseNodes, AnalyticsNodes, | |
VirtualRouters, PhysicalRouters] | |
for object_type in monitor: | |
object_type( | |
parsed_args.contrail_ep, parsed_args.keystone_ep, | |
parsed_args.username, parsed_args.password, | |
parsed_args.tenant).display() | |
if __name__ == '__main__': | |
NodesFacade() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment