예제 #1
0
    def admin_client(self, host):
        """Return host MongoClient authenticated as admin.

        Args:
            host (str): MongoDB host

        Returns:
            pymongo.mongo_client.MongoClient: host MongoClient as admin

        Raises:
            ConfigError: if authentication fails or cannot connect to host.
        """
        if host not in self._admin_client:
            config = self.cfg.load()
            try:
                client = MongoClient(config["auth"][host],
                                     connect=False,
                                     serverSelectionTimeoutMS=5000)
                client.server_info()
                self._admin_client[host] = client
            except pymongo.errors.OperationFailure as e:
                raise ConfigError("Auth error: {}".format(e))
            except pymongo.errors.ServerSelectionTimeoutError as e:
                return ConfigError("Cannot connect: {}".format(e))
        return self._admin_client[host]
예제 #2
0
def check(config: dict):
    """Verify config is properly formatted.

    Args:
        config (dict): config spec

    Raises:
        ConfigError: if config is improperly formatted.
    """
    if not set(config.keys()) >= {"mgdb_uri", "mailer", "auth"}:
        raise ConfigError("config missing one of "
                          "{mgdb_uri,mailer,auth} keys")
    if not (isinstance(config["mgdb_uri"], str) and isinstance(
            config["mailer"], dict) and isinstance(config["auth"], dict)):
        raise ConfigError("config field of wrong type")
    if not set(config["mailer"].keys()) >= {"class", "kwargs"}:
        raise ConfigError("mailer config missing fields")
    if config["mgdb_uri"]:
        if not re.match("mongodb://[^:]+:[^@]+@[^/]+/.+", config["mgdb_uri"]):
            raise ConfigError("mgdb_uri must be of form "
                              "mongodb://{username}:{password}@{host}/{db}")
예제 #3
0
def check(config):
    """Verify config is properly formatted.

    Args:
        config (dict): config spec

    Raises:
        ConfigError: if config is improperly formatted.
    """
    fetch = config["fetch"]
    auth = config["auth"]
    if not set(config.keys()) >= {"fetch", "auth"}:
        raise ConfigError("config missing fetch and auth keys")
    if not set(fetch.keys()) >= {"remotes", "host_aliases", "db_aliases"}:
        raise ConfigError("fetch config missing fields")
    if not (isinstance(fetch["remotes"], list)
            and isinstance(fetch["host_aliases"], dict)
            and isinstance(fetch["db_aliases"], dict)):
        raise ConfigError("fetch config field of wrong type")
    if not (isinstance(auth, list) and all(
            set(a.keys()) == {'host', 'db', 'role', 'username', 'password'}
            for a in auth)):
        raise ConfigError("auth config of wrong type")
예제 #4
0
 def check(config):
     if not ("req_list_field" in config
             and isinstance(config["req_list_field"], list)):
         raise ConfigError("bad config")