node.py 2.71 KB
Newer Older
1 2 3 4
RUNNING_STATE = 0
TEMPORARILY_DOWN_STATE = 2
DOWN_STATE = 3
BROKEN_STATE = 4
Yoshinori Okuji's avatar
Yoshinori Okuji committed
5 6 7 8 9

class Node(object):
    """This class represents a node."""

    def __init__(self, ip_address = None, port = None, uuid = None):
10
        self.state = RUNNING_STATE
Yoshinori Okuji's avatar
Yoshinori Okuji committed
11 12 13
        self.ip_address = ip_address
        self.port = port
        self.uuid = uuid
14
        self.manager = None
Yoshinori Okuji's avatar
Yoshinori Okuji committed
15 16 17 18

    def getState(self):
        return self.state

19
    def setState(self, new_state):
Yoshinori Okuji's avatar
Yoshinori Okuji committed
20 21
        self.state = new_state

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
    def setServer(self, ip_address, port):
        self.ip_address = ip_address
        self.port = port
        self.manager.registerServer(self)

    def getServer(self):
        return self.ip_address, self.port

    def setUUID(self, uuid):
        self.uuid = uuid
        self.manager.registerUUID(self)

    def getUUID(self):
        return self.uuid

Yoshinori Okuji's avatar
Yoshinori Okuji committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
class MasterNode(Node):
    """This class represents a master node."""
    pass

class StorageNode(Node):
    """This class represents a storage node."""
    pass

class ClientNode(Node):
    """This class represents a client node."""
    pass

class NodeManager(object):
    """This class manages node status."""

    def __init__(self):
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
        self.node_list = []
        self.server_dict = {}
        self.uuid_dict = {}

    def add(self, node):
        self.node_list.append(node)   
        if node.getServer()[0] is not None:
            self.registerServer(node)
        if node.getUUID() is not None:
            self.registerUUID(node)

    def remove(self, node):
        self.node_list.remove(node)
        self.unregisterServer(node)
        self.unregisterUUID(node)

    def registerServer(self, node):
        self.server_dict[node.getServer()] = node

    def unregisterServer(self, node):
        try:
            del self.server_dict[node.getServer()]
        except KeyError:
            pass

    def registerUUID(self, node):
        self.server_dict[node.getUUID()] = node

    def unregisterUUID(self, node):
        try:
            del self.server_dict[node.getUUID()]
        except KeyError:
            pass

    def getNodeList(self, filter = None):
        if filter is None:
            return list(self.node_list)
        return [n for n in self.node_list if filter(n)]

    def getMasterNodeList(self):
        return self.getNodeList(filter = lambda node: isinstance(node, MasterNode))

    def getStorageNodeList(self):
        return self.getNodeList(filter = lambda node: isinstance(node, StorageNode))

    def getClientNodeList(self):
        return self.getNodeList(filter = lambda node: isinstance(node, ClientNode))

    def getNodeByServer(self, ip_address, port):
        return self.server_dict.get((ip_address, port))
Yoshinori Okuji's avatar
Yoshinori Okuji committed
103

104 105
    def getNodeByUUID(self, uuid):
        return self.uuid_dict.get(uuid)