def write_config(params, config_path=None): """write mongo*'s config file Args: params - options wich file contains config_path - path to the config_file, will create if None Return config_path where config_path - path to mongo*'s options file """ if config_path is None: config_path = tempfile.mktemp(prefix="mongo-") cfg = params.copy() if 'setParameter' in cfg: set_parameters = cfg.pop('setParameter') try: for key, value in set_parameters.items(): cfg['setParameter = ' + key] = value except AttributeError: reraise( RequestError, 'Not a valid value for setParameter: %r ' 'Expected "setParameter": {<param name> : value, ...}' % set_parameters) # fix boolean value for key, value in cfg.items(): if isinstance(value, bool): cfg[key] = json.dumps(value) with open(config_path, 'w') as fd: data = '\n'.join('%s=%s' % (key, item) for key, item in cfg.items()) fd.write(data) return config_path
def write_config(params, config_path=None): """write mongo*'s config file Args: params - options wich file contains config_path - path to the config_file, will create if None Return config_path where config_path - path to mongo*'s options file """ if config_path is None: config_path = tempfile.mktemp(prefix="mongo-") cfg = params.copy() if 'setParameter' in cfg: set_parameters = cfg.pop('setParameter') try: for key, value in set_parameters.items(): cfg['setParameter = ' + key] = value except AttributeError: reraise(RequestError, 'Not a valid value for setParameter: %r ' 'Expected "setParameter": {<param name> : value, ...}' % set_parameters) # fix boolean value for key, value in cfg.items(): if isinstance(value, bool): cfg[key] = json.dumps(value) with open(config_path, 'w') as fd: data = '\n'.join('%s=%s' % (key, item) for key, item in cfg.items()) fd.write(data) return config_path
def __init__(self, rs_params): """create replica set according members config Args: rs_params - replica set configuration """ self.server_map = {} self.auth_key = rs_params.get('auth_key', None) self.login = rs_params.get('login', '') self.password = rs_params.get('password', '') self.repl_id = rs_params.get('id', None) or str(uuid4()) self._version = rs_params.get('version') self.sslParams = rs_params.get('sslParams', {}) self.kwargs = {} if not not self.sslParams: self.kwargs['ssl'] = True config = { "_id": self.repl_id, "members": [ self.member_create(member, index) for index, member in enumerate(rs_params.get('members', {})) ] } logger.debug("replica config: {config}".format(**locals())) if not self.repl_init(config): self.cleanup() raise ReplicaSetError("Could not create replica set.") if self.login: logger.debug("add admin user {login}/{password}".format( login=self.login, password=self.password)) try: c = self.connection() c.admin.add_user(self.login, self.password, roles=[ '__system', 'clusterAdmin', 'dbAdminAnyDatabase', 'readWriteAnyDatabase', 'userAdminAnyDatabase' ]) # Make sure user propagates to secondaries before proceeding. c.admin.authenticate(self.login, self.password) c.admin.command('getLastError', w=len(self.servers())) except pymongo.errors.OperationFailure: reraise( ReplicaSetError, "Could not add user %s to the replica set." % self.login) finally: c.close() if not self.waiting_config_state(): raise ReplicaSetError( "Could not actualize replica set configuration.")
def get_json(req_body): try: str_body = req_body.read() if str_body: str_body = str_body.decode('utf-8') return json.loads(str_body) return {} except ValueError: exc_type, exc_value, exc_tb = sys.exc_info() message = "Could not parse the JSON sent to the server." reraise(RequestError, message, exc_tb)
def __init__(self, rs_params): """create replica set according members config Args: rs_params - replica set configuration """ self.server_map = {} self.auth_key = rs_params.get('auth_key', None) self.login = rs_params.get('login', '') self.password = rs_params.get('password', '') self.repl_id = rs_params.get('id', None) or str(uuid4()) self._version = rs_params.get('version') self.sslParams = rs_params.get('sslParams', {}) self.kwargs = {} if not not self.sslParams: self.kwargs['ssl'] = True config = {"_id": self.repl_id, "members": [ self.member_create(member, index) for index, member in enumerate(rs_params.get('members', {})) ]} logger.debug("replica config: {config}".format(**locals())) if not self.repl_init(config): self.cleanup() raise ReplicaSetError("Could not create replica set.") if self.login: logger.debug("add admin user {login}/{password}".format(login=self.login, password=self.password)) try: c = self.connection() c.admin.add_user(self.login, self.password, roles=['__system', 'clusterAdmin', 'dbAdminAnyDatabase', 'readWriteAnyDatabase', 'userAdminAnyDatabase']) # Make sure user propagates to secondaries before proceeding. c.admin.authenticate(self.login, self.password) c.admin.command('getLastError', w=len(self.servers())) except pymongo.errors.OperationFailure: reraise(ReplicaSetError, "Could not add user %s to the replica set." % self.login) finally: c.close() if not self.waiting_config_state(): raise ReplicaSetError( "Could not actualize replica set configuration.")
def start(self, timeout=300): """start server return True of False""" if self.is_alive: return True try: if self.cfg.get('dbpath', None) and self._is_locked: # repair if needed process.repair_mongo(self.name, self.cfg['dbpath']) self.proc, self.hostname = process.mprocess( self.name, self.config_path, self.cfg.get('port', None), timeout, self.silence_stdout) self.pid = self.proc.pid logger.debug("pid={pid}, hostname={hostname}".format(pid=self.pid, hostname=self.hostname)) self.host = self.hostname.split(':')[0] self.port = int(self.hostname.split(':')[1]) # Wait for Server to respond to isMaster. for i in range(timeout): try: self.run_command('isMaster') break except pymongo.errors.ConnectionFailure: logger.exception('isMaster command failed:') time.sleep(0.1) else: raise TimeoutError( "Server did not respond to 'isMaster' after %d attempts." % timeout) except (OSError, TimeoutError): logpath = self.cfg.get('logpath') if logpath: # Copy the server logs into the mongo-orchestration logs. logger.error( "Could not start Server. Please find server log below.\n" "=====================================================") with open(logpath) as lp: logger.error(lp.read()) else: logger.exception( 'Could not start Server, and no logpath was provided!') reraise(TimeoutError, 'Could not start Server. ' 'Please check server log located in ' + self.cfg.get('logpath', '<no logpath given>') + ' or the mongo-orchestration log in ' + LOG_FILE + ' for more details.') if self.restart_required: if self.login: # Add users to the appropriate database. self._add_users() self.stop() # Restart with keyfile and auth. if self.is_mongos: self.config_path, self.cfg = self.__init_mongos(self.cfg) else: # Add auth options to this Server's config file. self.config_path, self.cfg = self.__init_mongod( self.cfg, add_auth=True) self.restart_required = False self.start() return True
def start(self, timeout=300): """start server return True of False""" if self.is_alive: return True try: if self.cfg.get('dbpath', None) and self._is_locked: # repair if needed process.repair_mongo(self.name, self.cfg['dbpath']) self.proc, self.hostname = process.mprocess( self.name, self.config_path, self.cfg.get('port', None), timeout, self.silence_stdout) self.pid = self.proc.pid logger.debug("pid={pid}, hostname={hostname}".format(pid=self.pid, hostname=self.hostname)) self.host = self.hostname.split(':')[0] self.port = int(self.hostname.split(':')[1]) # Wait for Server to respond to isMaster. for i in range(timeout): try: self.run_command('isMaster') break except pymongo.errors.ConnectionFailure: time.sleep(0.1) else: raise TimeoutError( "Server did not respond to 'isMaster' after %d attempts." % timeout) except (OSError, TimeoutError): logpath = self.cfg.get('logpath') if logpath: # Copy the server logs into the mongo-orchestration logs. logger.error( "Could not start Server. Please find server log below.\n" "=====================================================") with open(logpath) as lp: logger.error(lp.read()) else: logger.exception( 'Could not start Server, and no logpath was provided!') reraise(TimeoutError, 'Could not start Server. ' 'Please check server log located in ' + self.cfg.get('logpath', '<no logpath given>') + ' or the mongo-orchestration log in ' + LOG_FILE + ' for more details.') if self.restart_required: if self.login: # Add users to the appropriate database. self._add_users() self.stop() # Restart with keyfile and auth. if self.is_mongos: self.config_path, self.cfg = self.__init_mongos(self.cfg) else: # Add auth options to this Server's config file. self.config_path, self.cfg = self.__init_mongod( self.cfg, add_auth=True) self.restart_required = False self.start() return True