Module jumpscale.servers.rack.rack

Expand source code
from gevent import event

from jumpscale.core.base import Base


class ServerRack(Base):
    def __init__(self):
        super().__init__()
        self._servers = dict()
        self._started = set()
        self._running_event = event.Event()

    def _start(self, server_name: str):
        if server_name not in self._started:
            self._servers[server_name].start()
            self._started.add(server_name)

    def _stop(self, server_name: str):
        if server_name in self._started:
            self._servers[server_name].stop()
            self._started.remove(server_name)

    def add(self, server_name, server):
        """Add new server to the rack

        Args:
            name (str): server name
            server (object): server object
        """
        if server_name in self._servers:
            self._stop(server_name)

        self._servers[server_name] = server

    def remove(self, server_name: str):
        """Remove server (Stop it first if running)

        Args:
            server_name (str): server name
        """
        self._stop(server_name)

        if server_name in self._servers:
            self._servers.pop(server_name)

        if server_name in self._started:
            self._started.remove(server_name)

    def start(self, server_name: str = None, wait: bool = False):
        """Start server by its name or start all servers

        Args:
            server_name (str, optional): server name, if None will start all the servers. Defaults to None.
        """
        self._running_event.clear()
        if server_name:
            self._start(server_name)
        else:
            for server_name in self._servers:
                self._start(server_name)

        if wait:
            try:
                self._running_event.wait()
            except KeyboardInterrupt:
                self.stop()

    def stop(self, server_name: str = None):
        """Stop server by its name or stop all running servers

        Args:
            server_name (str, optional): server name, if None will stop all running servers. Defaults to None.
        """
        if server_name:
            self._stop(server_name)
        else:
            for server_name in self._servers:
                self._stop(server_name)
        self._running_event.set()

    def is_running(self, server_name):
        return server_name in self._started

Classes

class ServerRack

A simple attribute-based namespace.

SimpleNamespace(**kwargs)

base class implementation for any class with fields which supports getting/setting raw data for any instance fields.

any instance can have an optional name and a parent.

class Person(Base):
    name = fields.String()
    age = fields.Float()

p = Person(name="ahmed", age="19")
print(p.name, p.age)

Args

parent_ : Base, optional
parent instance. Defaults to None.
instance_name_ : str, optional
instance name. Defaults to None.
**values
any given field values to initiate the instance with
Expand source code
class ServerRack(Base):
    def __init__(self):
        super().__init__()
        self._servers = dict()
        self._started = set()
        self._running_event = event.Event()

    def _start(self, server_name: str):
        if server_name not in self._started:
            self._servers[server_name].start()
            self._started.add(server_name)

    def _stop(self, server_name: str):
        if server_name in self._started:
            self._servers[server_name].stop()
            self._started.remove(server_name)

    def add(self, server_name, server):
        """Add new server to the rack

        Args:
            name (str): server name
            server (object): server object
        """
        if server_name in self._servers:
            self._stop(server_name)

        self._servers[server_name] = server

    def remove(self, server_name: str):
        """Remove server (Stop it first if running)

        Args:
            server_name (str): server name
        """
        self._stop(server_name)

        if server_name in self._servers:
            self._servers.pop(server_name)

        if server_name in self._started:
            self._started.remove(server_name)

    def start(self, server_name: str = None, wait: bool = False):
        """Start server by its name or start all servers

        Args:
            server_name (str, optional): server name, if None will start all the servers. Defaults to None.
        """
        self._running_event.clear()
        if server_name:
            self._start(server_name)
        else:
            for server_name in self._servers:
                self._start(server_name)

        if wait:
            try:
                self._running_event.wait()
            except KeyboardInterrupt:
                self.stop()

    def stop(self, server_name: str = None):
        """Stop server by its name or stop all running servers

        Args:
            server_name (str, optional): server name, if None will stop all running servers. Defaults to None.
        """
        if server_name:
            self._stop(server_name)
        else:
            for server_name in self._servers:
                self._stop(server_name)
        self._running_event.set()

    def is_running(self, server_name):
        return server_name in self._started

Ancestors

  • Base
  • types.SimpleNamespace

Methods

def add(self, server_name, server)

Add new server to the rack

Args

name : str
server name
server : object
server object
Expand source code
def add(self, server_name, server):
    """Add new server to the rack

    Args:
        name (str): server name
        server (object): server object
    """
    if server_name in self._servers:
        self._stop(server_name)

    self._servers[server_name] = server
def is_running(self, server_name)
Expand source code
def is_running(self, server_name):
    return server_name in self._started
def remove(self, server_name: str)

Remove server (Stop it first if running)

Args

server_name : str
server name
Expand source code
def remove(self, server_name: str):
    """Remove server (Stop it first if running)

    Args:
        server_name (str): server name
    """
    self._stop(server_name)

    if server_name in self._servers:
        self._servers.pop(server_name)

    if server_name in self._started:
        self._started.remove(server_name)
def start(self, server_name: str = None, wait: bool = False)

Start server by its name or start all servers

Args

server_name : str, optional
server name, if None will start all the servers. Defaults to None.
Expand source code
def start(self, server_name: str = None, wait: bool = False):
    """Start server by its name or start all servers

    Args:
        server_name (str, optional): server name, if None will start all the servers. Defaults to None.
    """
    self._running_event.clear()
    if server_name:
        self._start(server_name)
    else:
        for server_name in self._servers:
            self._start(server_name)

    if wait:
        try:
            self._running_event.wait()
        except KeyboardInterrupt:
            self.stop()
def stop(self, server_name: str = None)

Stop server by its name or stop all running servers

Args

server_name : str, optional
server name, if None will stop all running servers. Defaults to None.
Expand source code
def stop(self, server_name: str = None):
    """Stop server by its name or stop all running servers

    Args:
        server_name (str, optional): server name, if None will stop all running servers. Defaults to None.
    """
    if server_name:
        self._stop(server_name)
    else:
        for server_name in self._servers:
            self._stop(server_name)
    self._running_event.set()

Inherited members