Module jumpscale.core.base.store.redis

Expand source code
import redis

from . import ConfigNotFound, EncryptedConfigStore
from .serializers import JsonSerializer


class RedisStore(EncryptedConfigStore):
    """
    RedisStore store is an EncryptedConfigStore

    It saves the data in redis and configuration for redis comes from `config_env.get_store_config("redis")`
    """

    def __init__(self, location):
        """
        create a new redis store, the location given will be used to generate keys

        this keys will be combined to get/set instance config

        Args:
            location (Location)
        """
        super().__init__(location, JsonSerializer())
        redis_config = self.config_env.get_store_config("redis")
        self.redis_client = redis.Redis(redis_config["hostname"], redis_config["port"])

    def get_key(self, instance_name):
        """
        get a key for an instance

        this will return a dot-separated key derived from current location

        Args:
            instance_name (str): name

        Returns:
            str: key
        """
        return ".".join([self.location.name, instance_name])

    def read(self, instance_name):
        """
        read instance config from redis

        Args:
            instance_name (name): name

        Returns:
            str: data
        """
        key = self.get_key(instance_name)
        if not self.redis_client.exists(key):
            raise ConfigNotFound(f"cannot find config for {instance_name} at {key}")
        return self.redis_client.get(key)

    def _full_scan(self, pattern):
        """
        get the full result of a scan command on current redis database by this pattern

        Args:
            pattern ([type]): [description]
        """
        keys = []
        cursor, values = self.redis_client.scan(0, pattern)

        while values:
            keys += values
            if not cursor:
                break
            cursor, values = self.redis_client.scan(cursor, pattern)

        return keys

    def get_location_keys(self):
        """
        get all keys under current location (scanned)

        Returns:
            list: a list of keys
        """
        return self._full_scan(f"{self.location.name}.*")

    def list_all(self):
        """
        get all names of instances (instance keys)

        Returns:
            [type]: [description]
        """
        names = []

        keys = self.get_location_keys()
        for key in keys:
            # remove location name part
            name = key.decode().replace(self.location.name, "").lstrip(".")
            # if it does not contain a ".", then it's not a child
            if "." not in name:
                names.append(name)
        return names

    def write(self, instance_name, data):
        """
        set data with the corresponding key for this instance

        Args:
            instance_name (str): name
            data (str): data

        Returns:
            bool: written or not
        """
        return self.redis_client.set(self.get_key(instance_name), data)

    def delete(self, instance_name):
        """
        delete given instance

        Args:
            instance_name (str): name

        Returns:
            bool
        """
        return self.redis_client.delete(self.get_key(instance_name))

Classes

class RedisStore (location)

RedisStore store is an EncryptedConfigStore

It saves the data in redis and configuration for redis comes from config_env.get_store_config("redis")

create a new redis store, the location given will be used to generate keys

this keys will be combined to get/set instance config

Args

location (Location)

Expand source code
class RedisStore(EncryptedConfigStore):
    """
    RedisStore store is an EncryptedConfigStore

    It saves the data in redis and configuration for redis comes from `config_env.get_store_config("redis")`
    """

    def __init__(self, location):
        """
        create a new redis store, the location given will be used to generate keys

        this keys will be combined to get/set instance config

        Args:
            location (Location)
        """
        super().__init__(location, JsonSerializer())
        redis_config = self.config_env.get_store_config("redis")
        self.redis_client = redis.Redis(redis_config["hostname"], redis_config["port"])

    def get_key(self, instance_name):
        """
        get a key for an instance

        this will return a dot-separated key derived from current location

        Args:
            instance_name (str): name

        Returns:
            str: key
        """
        return ".".join([self.location.name, instance_name])

    def read(self, instance_name):
        """
        read instance config from redis

        Args:
            instance_name (name): name

        Returns:
            str: data
        """
        key = self.get_key(instance_name)
        if not self.redis_client.exists(key):
            raise ConfigNotFound(f"cannot find config for {instance_name} at {key}")
        return self.redis_client.get(key)

    def _full_scan(self, pattern):
        """
        get the full result of a scan command on current redis database by this pattern

        Args:
            pattern ([type]): [description]
        """
        keys = []
        cursor, values = self.redis_client.scan(0, pattern)

        while values:
            keys += values
            if not cursor:
                break
            cursor, values = self.redis_client.scan(cursor, pattern)

        return keys

    def get_location_keys(self):
        """
        get all keys under current location (scanned)

        Returns:
            list: a list of keys
        """
        return self._full_scan(f"{self.location.name}.*")

    def list_all(self):
        """
        get all names of instances (instance keys)

        Returns:
            [type]: [description]
        """
        names = []

        keys = self.get_location_keys()
        for key in keys:
            # remove location name part
            name = key.decode().replace(self.location.name, "").lstrip(".")
            # if it does not contain a ".", then it's not a child
            if "." not in name:
                names.append(name)
        return names

    def write(self, instance_name, data):
        """
        set data with the corresponding key for this instance

        Args:
            instance_name (str): name
            data (str): data

        Returns:
            bool: written or not
        """
        return self.redis_client.set(self.get_key(instance_name), data)

    def delete(self, instance_name):
        """
        delete given instance

        Args:
            instance_name (str): name

        Returns:
            bool
        """
        return self.redis_client.delete(self.get_key(instance_name))

Ancestors

Methods

def delete(self, instance_name)

delete given instance

Args

instance_name : str
name

Returns

bool

Expand source code
def delete(self, instance_name):
    """
    delete given instance

    Args:
        instance_name (str): name

    Returns:
        bool
    """
    return self.redis_client.delete(self.get_key(instance_name))
def get_key(self, instance_name)

get a key for an instance

this will return a dot-separated key derived from current location

Args

instance_name : str
name

Returns

str
key
Expand source code
def get_key(self, instance_name):
    """
    get a key for an instance

    this will return a dot-separated key derived from current location

    Args:
        instance_name (str): name

    Returns:
        str: key
    """
    return ".".join([self.location.name, instance_name])
def get_location_keys(self)

get all keys under current location (scanned)

Returns

list
a list of keys
Expand source code
def get_location_keys(self):
    """
    get all keys under current location (scanned)

    Returns:
        list: a list of keys
    """
    return self._full_scan(f"{self.location.name}.*")
def list_all(self)

get all names of instances (instance keys)

Returns

[type]
[description]
Expand source code
def list_all(self):
    """
    get all names of instances (instance keys)

    Returns:
        [type]: [description]
    """
    names = []

    keys = self.get_location_keys()
    for key in keys:
        # remove location name part
        name = key.decode().replace(self.location.name, "").lstrip(".")
        # if it does not contain a ".", then it's not a child
        if "." not in name:
            names.append(name)
    return names
def read(self, instance_name)

read instance config from redis

Args

instance_name : name
name

Returns

str
data
Expand source code
def read(self, instance_name):
    """
    read instance config from redis

    Args:
        instance_name (name): name

    Returns:
        str: data
    """
    key = self.get_key(instance_name)
    if not self.redis_client.exists(key):
        raise ConfigNotFound(f"cannot find config for {instance_name} at {key}")
    return self.redis_client.get(key)
def write(self, instance_name, data)

set data with the corresponding key for this instance

Args

instance_name : str
name
data : str
data

Returns

bool
written or not
Expand source code
def write(self, instance_name, data):
    """
    set data with the corresponding key for this instance

    Args:
        instance_name (str): name
        data (str): data

    Returns:
        bool: written or not
    """
    return self.redis_client.set(self.get_key(instance_name), data)

Inherited members