Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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()
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
 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()
Exemplo n.º 6
0
    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
            }
        }
Exemplo n.º 7
0
    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()
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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
            }
        }