#!/usr/bin/env python # # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # # Show all ports of all VM instances for # all users and topologies. # Like the console port and the VNC port # # rschmied@cisco.com # # modified by sebastian.rieger@informatik.hs-fulda.de to display telnet console ports of running nodes in a topology # import os, libvirt, re, sys from keystoneclient import client as keystone from novaclient import client as nova from xml.dom.minidom import parseString """ In [14]: m.group(0) Out[14]: '---' In [15]: m.group(1) Out[15]: '/guest/endpoint' In [16]: m.group(2) Out[16]: 'Sample_Project' In [16]: m.group(3) Out[16]: 'asa-test-topo' In [17]: m.group(4) Out[17]: 'iosv-2' In [18]: m.group(5) Out[18]: 'Multipoint Connection-1' will not match jumphost ports! not interested in these, anyway """ class KeystoneV3NovaAuthPlugin(object): def __init__(self, keystone_client): self.keystone_client = keystone_client def authenticate(self, client, fake_auth_url): client.auth_url = fake_auth_url client.service_catalog = self.keystone_client.service_catalog client.auth_token = self.keystone_client.auth_token client.tenant_id = self.keystone_client.tenant_id client.management_url = self.keystone_client.service_catalog.url_for( attr='region', filter_value=client.region_name, endpoint_type=client.endpoint_type, service_type=client.service_type, service_name=client.service_name).rstrip('/') def getports(user,simulation): # Sample output / field mapping # -- # USER PROJECT TOPOLOGY NODE # -- # USER TOPOLOGY NODE prog=re.compile(r'-<(.*)-[_0-9a-z]{6}>-<(.*)>', re.IGNORECASE) # table=list() try: libvirt_uri = os.environ['LIBVIRT_DEFAULT_URI'] except: libvirt_uri = "qemu:///system" print "LIBVIRT_DEFAULT_URI env not set!" print "Using default '" + libvirt_uri + "'" conn=libvirt.openReadOnly(libvirt_uri) kc = keystone.Client(auth_url=os.environ['OS_AUTH_URL'], username=os.environ['OS_USERNAME'], password=os.environ['OS_PASSWORD'], project_name=os.environ['OS_TENANT_NAME']) kc.session.auth = kc kc.authenticate() nc=nova.Client('2', os.environ['OS_USERNAME'], os.environ['OS_PASSWORD'], os.environ['OS_TENANT_NAME'], auth_system='keystonev3', auth_plugin=KeystoneV3NovaAuthPlugin(kc), auth_url='http://fake/v2.0') for server in nc.servers.list(search_opts={'all_tenants': True}): m=prog.match(server.name) if m: try: domain=conn.lookupByUUIDString(server.id) except: print "Domain not found / not running" return 1 else: doc=parseString(domain.XMLDesc(flags=0)) # get the VNC port #port=doc.getElementsByTagName('graphics')[0].getAttribute('port') # get the serial console TCP port for i in doc.getElementsByTagName('source'): if i.parentNode.nodeName == u'console': console=i.getAttribute('service') # get the instance name name=doc.getElementsByTagName('name')[0].childNodes[0].nodeValue # print info if simulation == "*": if m.group(1) == user: print m.group(3) + "=" + console else: if m.group(1) == user and server.name.find(simulation) != -1: print m.group(3) + "=" + console def main(): if len(sys.argv) != 3: sys.stdout.write(str(sys.argv[0])) print ": username and simulation (e.g., project name or session-id) needed as argument! bailing out" return 1 else: user = str(sys.argv[1]).strip() simulation = str(sys.argv[2]).strip() getports(user,simulation) return 0 if __name__ == '__main__': sys.exit(main())