def runProcess(self, funcName, args = ()): if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id(self.session['process'][0]) if process is not None and process.is_alive(): raise { status : False, msg : 'Currently running process, cannot start new one' } outPath = tempfile.mkdtemp(dir = os.path.abspath('{0}/../output/'.format(os.path.dirname(__file__)))) stdout = os.path.join(outPath, 'stdout.log') stderr = os.path.join(outPath, 'stderr.log') return_code = os.path.join(outPath, 'return_code') molnsConfigProcessWrapper = MolnsConfigProcessWrapper() molnsConfigProcessWrapper.outPath = outPath molnsConfigProcessWrapper.stdout = stdout molnsConfigProcessWrapper.stderr = stderr molnsConfigProcessWrapper.return_code = return_code stdoutFile = open(stdout, 'w') stderrFile = open(stderr, 'w') thisFile = os.path.abspath(__file__) process = subprocess.Popen(shlex.split('python {0}'.format(thisFile)), stdout = stdoutFile, stderr = stderrFile, stdin = subprocess.PIPE) process.stdin.write(pickle.dumps((funcName, return_code, args))) process.stdin.close() molnsConfigProcessWrapper.pid = process.pid molnsConfigProcessWrapper.put() self.session['process'] = (molnsConfigProcessWrapper.key().id(), funcName)
def addWorkers(self): self.response.content_type = 'application/json' providerType = self.request.get('providerType') number = self.request.get('number') if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id( self.session['process'][0]) if process is not None and process.is_alive(): return {'status': False, 'msg': 'Currently running process'} if providerType not in molns.VALID_PROVIDER_TYPES: return { 'status': False, 'msg': 'Invalid provider type specified (shouldn\'t be possible)' } workerName = providerToNames[providerType]['workerName'] self.runProcess('addWorkers', (workerName, number, self.getMolnsConfigPath())) return self.pollSystemState()
def startMolns(self): self.response.content_type = 'application/json' state = self.request.get('state') providerType = self.request.get('providerType') pw = self.request.get('pw') if pw is None or pw == '': pw = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8)) logging.info('*'*80) logging.info('*'*80) logging.info("MolnsConfig.startMolns(pw={0})".format(pw)) logging.info('*'*80) logging.info('*'*80) if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id(self.session['process'][0]) if process is not None and process.is_alive(): return { 'status' : False, 'msg' : 'Currently running process' } if providerType not in molns.VALID_PROVIDER_TYPES: return { 'status' : False, 'msg' : 'Invalid provider type specified (shouldn\'t be possible)' } state = json.loads(state) self.updateMolnsState(state) providerName = providerToNames[providerType]['providerName'] controllerName = providerToNames[providerType]['controllerName'] workerName = providerToNames[providerType]['workerName'] self.runProcess('startMolns', (providerName, controllerName, workerName, providerType, pw, self.getMolnsConfigPath())) return self.pollSystemState()
def updateMolnsState(self, state): if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id(self.session['process'][0]) if process is not None and process.is_alive(): raise { status : False, msg: 'Currently running process, cannot update state while this is ongoing' } config = molns.MOLNSConfig(db_file = self.getMolnsConfigPath()) for providerType in state: providerName = providerToNames[providerType]['providerName'] controllerName = providerToNames[providerType]['controllerName'] workerName = providerToNames[providerType]['workerName'] provider_conf_items = molns.MOLNSProvider.provider_get_config(name = providerName, provider_type = providerType, config = config) json_obj = { 'name' : providerName, 'type' : providerType, 'config' : {} } provider = state[providerType]['provider'] # Update those values that have changed for i in range(len(provider)): if provider[i]['value'] != provider_conf_items[i]['value']: json_obj['config'][provider_conf_items[i]['key']] = provider[i]['value'] molns.MOLNSProvider.provider_import('', config, json_obj) controller_conf_items = molns.MOLNSController.controller_get_config(name = controllerName, provider_type = providerType, config = config) controller = state[providerType]['controller'] json_obj = { 'name' : controllerName, 'provider_name' : providerName, 'config' : {} } for i in range(len(controller)): if controller[i]['value'] != controller_conf_items[i]['value']: json_obj['config'][controller_conf_items[i]['key']] = controller[i]['value'] molns.MOLNSController.controller_import('', config, json_obj) worker_conf_items = molns.MOLNSWorkerGroup.worker_group_get_config(name = workerName, provider_type = providerType, config = config) worker = state[providerType]['worker'] json_obj = { 'name' : workerName, 'controller_name' : controllerName, 'provider_name' : providerName, 'config' : {} } for i in range(len(worker)): if worker[i]['value'] != worker_conf_items[i]['value']: json_obj['config'][worker_conf_items[i]['key']] = worker[i]['value'] molns.MOLNSWorkerGroup.worker_group_import('', config, json_obj)
def terminateMolns(self): self.response.content_type = 'application/json' providerType = self.request.get('providerType') if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id(self.session['process'][0]) if process is not None and process.is_alive(): return { 'status' : False, 'msg' : 'Currently running process' } if providerType not in molns.VALID_PROVIDER_TYPES: return { 'status' : False, 'msg' : 'Invalid provider type specified (shouldn\'t be possible)' } controllerName = providerToNames[providerType]['controllerName'] self.runProcess('terminateMolns', (controllerName, self.getMolnsConfigPath())) return self.pollSystemState()
def pollSystemState(self): output = [] config = molns.MOLNSConfig(db_file = self.getMolnsConfigPath()) controllerName = providerToNames['EC2']['controllerName'] if 'process' in self.session: processId, functionName = self.session['process'] process = MolnsConfigProcessWrapper.get_by_id(processId) if not process: functionName = None is_alive = False else: is_alive = process.is_alive() stdout, stderr = process.communicate() # Get new messages if len(stdout) > 0: output.append({ 'status' : 1, 'msg' : stdout }) if len(stderr) > 0: output.append({ 'status' : 0, 'msg' : stderr }) else: functionName = None is_alive = False try: status = molns.MOLNSController.status_controller([controllerName], config) if 'column_names' in status: status['column_names'] = [s.capitalize() for s in status['column_names']] else: status = {'type':'table', 'column_names':['Name','Status','Type','Provider','Instance id', 'IP address'], 'data':[]} except: status = {'type':'table', 'column_names':['Name','Status','Type','Provider','Instance id', 'IP address'], 'data':[]} return { 'molns': self.getMolnsState(), 'instanceStatus' : status, 'messages': output, 'process' : { 'name' : functionName, 'status' : is_alive } }
def startMolns(self): self.response.content_type = 'application/json' state = self.request.get('state') providerType = self.request.get('providerType') pw = self.request.get('pw') if pw is None or pw == '': pw = ''.join( random.choice(string.ascii_uppercase + string.digits) for _ in range(8)) logging.info('*' * 80) logging.info('*' * 80) logging.info("MolnsConfig.startMolns(pw={0})".format(pw)) logging.info('*' * 80) logging.info('*' * 80) if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id( self.session['process'][0]) if process is not None and process.is_alive(): return {'status': False, 'msg': 'Currently running process'} if providerType not in molns.VALID_PROVIDER_TYPES: return { 'status': False, 'msg': 'Invalid provider type specified (shouldn\'t be possible)' } state = json.loads(state) self.updateMolnsState(state) providerName = providerToNames[providerType]['providerName'] controllerName = providerToNames[providerType]['controllerName'] workerName = providerToNames[providerType]['workerName'] self.runProcess('startMolns', (providerName, controllerName, workerName, providerType, pw, self.getMolnsConfigPath())) return self.pollSystemState()
def updateMolnsState(self, state): if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id( self.session['process'][0]) if process is not None and process.is_alive(): raise { status: False, msg: 'Currently running process, cannot update state while this is ongoing' } config = molns.MOLNSConfig(db_file=self.getMolnsConfigPath()) for providerType in state: providerName = providerToNames[providerType]['providerName'] controllerName = providerToNames[providerType]['controllerName'] workerName = providerToNames[providerType]['workerName'] provider_conf_items = molns.MOLNSProvider.provider_get_config( name=providerName, provider_type=providerType, config=config) json_obj = { 'name': providerName, 'type': providerType, 'config': {} } provider = state[providerType]['provider'] # Update those values that have changed for i in range(len(provider)): if provider[i]['value'] != provider_conf_items[i]['value']: json_obj['config'][provider_conf_items[i] ['key']] = provider[i]['value'] molns.MOLNSProvider.provider_import('', config, json_obj) controller_conf_items = molns.MOLNSController.controller_get_config( name=controllerName, provider_type=providerType, config=config) controller = state[providerType]['controller'] json_obj = { 'name': controllerName, 'provider_name': providerName, 'config': {} } for i in range(len(controller)): if controller[i]['value'] != controller_conf_items[i]['value']: json_obj['config'][controller_conf_items[i] ['key']] = controller[i]['value'] molns.MOLNSController.controller_import('', config, json_obj) worker_conf_items = molns.MOLNSWorkerGroup.worker_group_get_config( name=workerName, provider_type=providerType, config=config) worker = state[providerType]['worker'] json_obj = { 'name': workerName, 'controller_name': controllerName, 'provider_name': providerName, 'config': {} } for i in range(len(worker)): if worker[i]['value'] != worker_conf_items[i]['value']: json_obj['config'][worker_conf_items[i] ['key']] = worker[i]['value'] molns.MOLNSWorkerGroup.worker_group_import('', config, json_obj)
def runProcess(self, funcName, args=()): if 'process' in self.session: process = MolnsConfigProcessWrapper.get_by_id( self.session['process'][0]) if process is not None and process.is_alive(): raise { status: False, msg: 'Currently running process, cannot start new one' } outPath = tempfile.mkdtemp(dir=os.path.abspath('{0}/../output/'.format( os.path.dirname(__file__)))) stdout = os.path.join(outPath, 'stdout.log') stderr = os.path.join(outPath, 'stderr.log') return_code = os.path.join(outPath, 'return_code') molnsConfigProcessWrapper = MolnsConfigProcessWrapper() molnsConfigProcessWrapper.outPath = outPath molnsConfigProcessWrapper.stdout = stdout molnsConfigProcessWrapper.stderr = stderr molnsConfigProcessWrapper.return_code = return_code stdoutFile = open(stdout, 'w') stderrFile = open(stderr, 'w') thisFile = os.path.abspath(__file__) process = subprocess.Popen(shlex.split('python {0}'.format(thisFile)), stdout=stdoutFile, stderr=stderrFile, stdin=subprocess.PIPE) process.stdin.write(pickle.dumps((funcName, return_code, args))) process.stdin.close() molnsConfigProcessWrapper.pid = process.pid molnsConfigProcessWrapper.put() self.session['process'] = (molnsConfigProcessWrapper.key().id(), funcName)
def pollSystemState(self): output = [] config = molns.MOLNSConfig(db_file=self.getMolnsConfigPath()) controllerName = providerToNames['EC2']['controllerName'] if 'process' in self.session: processId, functionName = self.session['process'] process = MolnsConfigProcessWrapper.get_by_id(processId) if not process: functionName = None is_alive = False else: is_alive = process.is_alive() stdout, stderr = process.communicate() # Get new messages if len(stdout) > 0: output.append({'status': 1, 'msg': stdout}) if len(stderr) > 0: output.append({'status': 0, 'msg': stderr}) else: functionName = None is_alive = False try: status = molns.MOLNSController.status_controller([controllerName], config) if 'column_names' in status: status['column_names'] = [ s.capitalize() for s in status['column_names'] ] else: status = { 'type': 'table', 'column_names': [ 'Name', 'Status', 'Type', 'Provider', 'Instance id', 'IP address' ], 'data': [] } except: status = { 'type': 'table', 'column_names': [ 'Name', 'Status', 'Type', 'Provider', 'Instance id', 'IP address' ], 'data': [] } return { 'molns': self.getMolnsState(), 'instanceStatus': status, 'messages': output, 'process': { 'name': functionName, 'status': is_alive } }