PK!.GGpcte_dynaprov/__init__.pyimport logging import queue # Initialize Logging logging.basicConfig( format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.DEBUG ) mainlog = logging.getLogger('pcte-dynamoprovision.main') apilog = logging.getLogger('pcte-dynamoprovision.api') rmqlog = logging.getLogger('pcte-dynamoprovision.rmq') parselog = logging.getLogger('pcte-dynamoprovision.parser') outputlog = logging.getLogger('pcte-dynamoprovision.output') clilog = logging.getLogger('pcte-dynamoprovision.cli') q = queue.Queue() __version__ = u'0.1\N{GREEK SMALL LETTER ALPHA}'PK!?t**pcte_dynaprov/parsers.py# STDLIB Imports import csv import json import queue import ipaddress import configparser from uuid import uuid4 # 3rd Party Imports import yaml # Local Imports from pcte_dynaprov import parselog class ParseBase: def __init__(self): self.output_filename = None self.direct_to_vmare = False self.direct_to_lxc = False self.direct_to_lxd = False self.direct_to_k8s = False self.direct_to_docker = False self.simspace_yaml__meta_type = 'PCTE/Environment' self.simspace_yaml_meta_version = '1.0' self.simspace_yaml_meta_name = 'PCTE Grey' self.ipaddresses = queue.Queue() def load_usable_ipaddresses(self, config): if config is not None: for i in config['config']['networking']: for ii in list(ipaddress.ip_network(i['subnet']).hosts()): if ii == ipaddress.ip_address(i['gateway']): pass else: self.ipaddresses.put(ii) def _get_usable_ip_address(self): r = str(self.ipaddresses.get()) return r def simspace_out(self, config): if config is not None: nets = [] for i in config['config']['networking']: self.netName = i['name'] self.netSubnet = i['subnet'] self.netDefaultGateway = i['gateway'] self.netUuid = str(uuid4()) nets.append( { 'defaultGateway': self.netDefaultGateway, 'key': self.netUuid, 'name': self.netName, 'subnet': self.netSubnet, } ) vms = [] for i in config['config']['services']: iface = [] for ii in range(0, len(i['vNIC'])): if i['vNIC'][ii]['ipv4Address'] == 'auto': self.netIpaddr = self._get_usable_ip_address() else: self.netIpaddr = i['vNIC'][ii]['ipv4Address'] iface.append( { 'ip': self.netIpaddr, 'subnet': self.netUuid } ) svc = [] vmSpec = { 'cpuCount': i['vCPU']['count'], 'description': i['name'], 'interfaces': iface, 'memoryMb': i['vRAM'], 'name': i['name'], 'template': i['vmTemplate'], 'services': [{'name': i['name']}] } vms.append(vmSpec) spec = { 'fileType': self.simspace_yaml__meta_type, 'fileVersion': self.simspace_yaml_meta_version, 'name': self.simspace_yaml_meta_name, 'topology': { 'vms': vms, 'subnets': nets, 'users': [] } } y = yaml.dump(spec, default_flow_style=False) self.output_filename.write(y) else: parselog.error(f'[ERROR] - No configuration loaded') pass class CSVParser(ParseBase): def __init__(self, data=None, outfile_name=None): super().__init__() self.data = data self.outfile_name = outfile_name if self.data is not None: self.load_usable_ipaddresses(self._parse()) self.simspace_out(self._parse()) def _parse(self): parselog.info('Starting CSV parser') try: c = csv.DictReader(self.data) return c except Exception as e: parselog.error(f'Exception occurred while parsing the CSV data ... {e}') class INIParser(ParseBase): def __init__(self, data=None, outfile_name=None): super().__init__() self.data = data self.outfile_name = outfile_name if self.data is not None: self.load_usable_ipaddresses(self._parse()) self.simspace_out(self._parse()) def _parse(self): parselog.info('Starting INI parser') try: config = configparser.ConfigParser() c = config.read(self.data) return c except Exception as e: parselog.error(f'Exception occurred while parsing the INI data ... {e}') class JSONParser(ParseBase): def __init__(self, data=None, outfile_name=None): super().__init__() self.data = data self.outfile_name = outfile_name if self.data is not None: self.load_usable_ipaddresses(self._parse()) self.simspace_out(self._parse()) def _parse(self): parselog.info('Starting JSON parser') try: c = json.loads(self.data) return c except Exception as e: parselog.error(f'Exception occurred while parsing the INI data ... {e}') class YAMLParser(ParseBase): def __init__(self, data=None, outfile_name=None): super().__init__() self.data = data self.output_filename = outfile_name if self.data is not None: self.load_usable_ipaddresses(self._parse()) self.simspace_out(self._parse()) def _parse(self): parselog.info('Starting YAML parser') try: c = yaml.load(self.data) return c except Exception as e: parselog.error(f'Exception occurred while parsing the YAML data ... {e}') PK!"pcte_dynaprov/services/__init__.pyPK!I%pcte_dynaprov/services/monitor_api.pyimport json import threading from aiohttp import web class Monitoring: def __init__(self): pass async def ping(self, request): response = { 'message': 'pong' } return web.Response(text=json.dumps(response)) def _run_api(self): self.app = web.Application() self.app.router.add_get('/ping', self.ping) web.run_app(self.app) def run_api(self): t = threading.Thread(target=self._run_api()) t.daemon = True t.start()PK!b111&pcte_dynaprov/services/rmq_listener.py# STDLIB Imports import os import threading # 3rd Party Imports import pika from pika.exceptions import ( ConnectionClosed, ChannelClosed, ChannelError, ) # Local Imports from pcte_dynaprov import ( rmqlog, q ) rmqhost = os.environ.get('RMQ_HOST', default='localhost') rmqport = os.environ.get('RMQ_PORT', default=5672) rmquser = os.environ.get('RMQ_USER', default='guest') rmqpassword = os.environ.get('RMQ_PASSWORD', default='guest') rmqex = os.environ.get('RMQ_EXCHANGE', default='SLAMREXCH') rmqchan = os.environ.get('RMQ_CHANNEL', default='PCTE') rmqq = os.environ.get('RMQ_QUEUE', default='PROVISIONING') def rmq_daemon(): rmqlog.debug(f""" Starting Thread with the following information: RabbitMQ Connection Details:\tamqp://{rmquser}:{rmqpassword}@{rmqhost}:{rmqport}/ RabbitMQ Exchange:\t\t{rmqex} RabbitMQ Queue:\t\t{rmqq} """) def work(ch, method, properties, body): q.put(body) creds = pika.credentials.PlainCredentials( username=rmquser, password=rmqpassword ) try: conn = pika.BlockingConnection( pika.ConnectionParameters( host=rmqhost, port=rmqport, credentials=creds, retry_delay=10, socket_timeout=30, blocked_connection_timeout=30)) try: chan = conn.channel() chan.queue_declare(queue=rmqq) chan.basic_consume( work, queue=rmqq, no_ack=True, ) rmqlog.info('Starting the RabbitMQ Consumer') chan.start_consuming() except ChannelClosed as e: rmqlog.error(f'RabbitMQ Channel Error... {e}') except ChannelError as e: rmqlog.error(f'RabbitMQ Channel Error... {e}') except ConnectionClosed as e: rmqlog.error(f'RabbitMQ Connection Error... {e}') def start_daemon(): threads = [] t = threading.Thread(target=rmq_daemon) t.daemon = True t.start() threads.append(t)PK!Kpcte_dynaprov/validators.pyclass ValidatorBase: def __init__(self): pass class ValidateCSV(ValidatorBase): def __init__(self): super().__init__() class ValidateJSON(ValidatorBase): def __init__(self): super().__init__() class ValidateINI(ValidatorBase): def __init__(self): super().__init__() class ValidateYAML(ValidatorBase): def __init__(self): super().__init__() PK!H3_53:pcte_dynamic_provisioning-0.1.0.dist-info/entry_points.txtN+I/N.,()*H.IMKL-(/,ϳM̳JPK!H2ʍTT/pcte_dynamic_provisioning-0.1.0.dist-info/WHEEL 1 0 =Rn>ZD:_dhRUQTk=-k]m`Q'iPK!Hk!2pcte_dynamic_provisioning-0.1.0.dist-info/METADATAMO#1 9R~hQvT|슣75Ӕ&O{)z~켱+$X1 9} Z55ag3a})랸r,ã5\ؤ s1xğPUP[>} մ!Fe[X-Mr Nsm#&lQgr[H>Z\>_֬Jom]^]1;rj.+6=t|1[k21ֽI'flg4Ym _p@q$ؐېھg‡pL;BZqLO2X m"~+airS+ٲzgGQ@OC97Um/b::[ve~sQWn,"Qq kkuG:U͝|&en|]ה$d2N.a?dmFt6nCFc)n5cƅ ;cRW("7QKf%~Ǹi|۩+'٬f-e-tPdtoa@Fl9>N4`"}̦a׬aۡ_ QCҤ9moޤyګЃohQ᠎$ &y֐䚘#a܉}XNbZkJQqGϣrQg1&`{JVJx iF9UzPK!.GGpcte_dynaprov/__init__.pyPK!?t**~pcte_dynaprov/parsers.pyPK!"pcte_dynaprov/services/__init__.pyPK!I%pcte_dynaprov/services/monitor_api.pyPK!b111&Zpcte_dynaprov/services/rmq_listener.pyPK!K#pcte_dynaprov/validators.pyPK!H3_53:%pcte_dynamic_provisioning-0.1.0.dist-info/entry_points.txtPK!H2ʍTT/-&pcte_dynamic_provisioning-0.1.0.dist-info/WHEELPK!Hk!2&pcte_dynamic_provisioning-0.1.0.dist-info/METADATAPK!HUp}0(pcte_dynamic_provisioning-0.1.0.dist-info/RECORDPK P*