You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/10/11 11:09:34 UTC

[09/50] [abbrv] git commit: Topology context messaging model classes added

Topology context messaging model classes added


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/4850c53d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/4850c53d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/4850c53d

Branch: refs/heads/master
Commit: 4850c53dc4fe6fdb129f74336639a013e1a541be
Parents: 8537cdf
Author: Chamila de Alwis <ch...@wso2.com>
Authored: Wed Sep 24 22:11:39 2014 +0530
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Sat Oct 11 14:38:28 2014 +0530

----------------------------------------------------------------------
 .../modules/event/topology/__init__.py          |   0
 .../modules/event/topology/events.py            |  58 +++++
 .../modules/topology/__init__.py                |   0
 .../modules/topology/topologycontext.py         | 224 +++++++++++++++++++
 .../cartridge-agent/modules/util/__init__.py    |   1 -
 .../modules/util/cartridgeagentconstants.py     |   4 +
 .../modules/util/cartridgeagentutils.py         |  19 +-
 .../modules/util/extensionutils.py              |  45 +++-
 8 files changed, 347 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/__init__.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/__init__.py b/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/__init__.py
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/events.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/events.py b/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/events.py
new file mode 100644
index 0000000..5990ea7
--- /dev/null
+++ b/tools/python-cartridge-agent/cartridge-agent/modules/event/topology/events.py
@@ -0,0 +1,58 @@
+import json
+
+
+class MemberActivatedEvent:
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def create_from_json(json_str):
+        json_obj = json.loads(json_str)
+        instance = MemberActivatedEvent()
+
+
+class MemberTerminatedEvent:
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def create_from_json(json_str):
+        json_obj = json.loads(json_str)
+        instance = MemberTerminatedEvent()
+
+
+class MemberSuspendedEvent:
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def create_from_json(json_str):
+        json_obj = json.loads(json_str)
+        instance = MemberSuspendedEvent()
+
+
+class CompleteTopologyEvent:
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def create_from_json(json_str):
+        json_obj = json.loads(json_str)
+        instance = CompleteTopologyEvent()
+
+
+class MemberStartedEvent:
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def create_from_json(json_str):
+        json_obj = json.loads(json_str)
+        instance = MemberStartedEvent()
+
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/topology/__init__.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/topology/__init__.py b/tools/python-cartridge-agent/cartridge-agent/modules/topology/__init__.py
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/topology/topologycontext.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/topology/topologycontext.py b/tools/python-cartridge-agent/cartridge-agent/modules/topology/topologycontext.py
new file mode 100644
index 0000000..1994d4c
--- /dev/null
+++ b/tools/python-cartridge-agent/cartridge-agent/modules/topology/topologycontext.py
@@ -0,0 +1,224 @@
+from ..util import cartridgeagentutils, cartridgeagentconstants
+
+
+class TopologyContext:
+    topology = None
+    # TODO: read write locks, Lock() and RLock()
+
+    @staticmethod
+    def get_topology():
+        #TODO: thread-safety missing
+        if TopologyContext.topology is None:
+            TopologyContext.topology = Topology()
+        return TopologyContext.topology
+
+        # @staticmethod
+        # def update(topology):
+        #     TopologyContext.topology = topology
+        #     #TODO: persist in registry
+
+
+class Topology:
+    def __init__(self):
+        self.service_map = {}
+        self.initialized = False
+
+    def get_services(self):
+        return self.service_map.values()
+
+    def add_service(self, service):
+        self.service_map[service.service_name] = service
+
+    def add_services(self, services):
+        for service in services:
+            self.add_service(service)
+
+    def remove_service(self, service_name):
+        if service_name in self.service_map:
+            self.service_map.pop(service_name)
+
+    def service_exists(self, service_name):
+        return service_name in self.service_map
+
+    def clear(self):
+        self.service_map = {}
+
+    def __str__(self):
+        return "Topology [serviceMap= %r , initialized= %r ]" % (self.service_map, self.initialized)
+
+
+class Service:
+    def __init__(self, service_name, service_type):
+        self.service_name = service_name
+        self.service_type = service_type
+        self.cluster_id_cluster_map = {}
+        self.port_map = {}
+
+    def get_clusters(self):
+        return self.cluster_id_cluster_map.values()
+
+    def add_cluster(self, cluster):
+        self.cluster_id_cluster_map[cluster.cluster_id] = cluster
+
+    def remove_cluster(self, cluster_id):
+        if cluster_id in self.cluster_id_cluster_map:
+            self.cluster_id_cluster_map.pop(cluster_id)
+
+    def cluster_exists(self, cluster_id):
+        return cluster_id in self.cluster_id_cluster_map
+
+    def get_cluster(self, cluster_id):
+        if cluster_id in self.cluster_id_cluster_map:
+            return self.cluster_id_cluster_map[cluster_id]
+
+        return None
+
+    def get_ports(self):
+        return self.port_map.values()
+
+    def get_port(self, proxy):
+        if proxy in self.port_map:
+            return self.port_map[proxy]
+
+        return None
+
+    def add_port(self, port):
+        self.port_map[port.proxy] = port
+
+    def add_ports(self, ports):
+        for port in ports:
+            self.add_port(port)
+
+
+class Cluster:
+    def __init__(self, service_name, cluster_id, deployment_policy_name, autoscale_policy_name):
+        self.service_name = service_name
+        self.cluster_id = cluster_id
+        self.deployment_policy_name = deployment_policy_name
+        self.autoscale_policy_name = autoscale_policy_name
+        self.hostnames = []
+        self.member_map = {}
+
+        self.tenant_range = None
+        self.is_lb_cluster = False
+        self.status = None
+        self.load_balancer_algorithm_name = None
+        self.properties = {}
+
+    def add_hostname(self, hostname):
+        self.hostnames.append(hostname)
+
+    def set_tenant_range(self, tenant_range):
+        cartridgeagentutils.validate_tenant_range(tenant_range)
+        self.tenant_range = tenant_range
+
+    def get_members(self):
+        return self.member_map.values()
+
+    def add_member(self, member):
+        self.member_map[member.member_id] = member
+
+    def remove_member(self, member_id):
+        if self.member_exists(member_id):
+            self.member_map.pop(member_id)
+
+    def get_member(self, member_id):
+        if self.member_exists(member_id):
+            return self.member_map[member_id]
+
+        return None
+
+    def member_exists(self, member_id):
+        return member_id in self.member_map
+
+    def __str__(self):
+        return "Cluster [serviceName=%r, clusterId=%r, autoscalePolicyName=%r, deploymentPolicyName=%r, hostNames=%r, tenantRange=%r, isLbCluster=%r, properties=%r]" % \
+               (self.service_name, self.cluster_id, self.autoscale_policy_name, self.deployment_policy_name, self.hostnames, self.tenant_range, self.is_lb_cluster, self.properties)
+
+    def tenant_id_in_range(self, tenant_id):
+        if self.tenant_range is None:
+            return False
+
+        if self.tenant_range == "*":
+            return True
+        else:
+            arr = self.tenant_range.split(cartridgeagentconstants.TENANT_RANGE_DELIMITER)
+            tenant_start = int(arr[0])
+            if tenant_start <= tenant_id:
+                tenant_end = arr[1]
+                if tenant_end == "*":
+                    return True
+                else:
+                    if tenant_id <= int(tenant_end):
+                        return True
+
+        return False
+
+
+class Member:
+
+    def __init__(self, service_name, cluster_id, network_partition_id, parition_id, member_id):
+        self.service_name = service_name
+        self.cluster_id = cluster_id
+        self.network_partition_id = network_partition_id
+        self.partition_id = parition_id
+        self.member_id = member_id
+        self.port_map = {}
+
+        self.member_public_ip = None
+        self.status = None
+        self.member_ip = None
+        self.properties = {}
+        self.lb_cluster_id = None
+
+    def is_active(self):
+        return self.status == MemberStatus.Activated
+
+    def get_ports(self):
+        return self.port_map.values()
+
+    def get_port(self, proxy):
+        if proxy in self.port_map:
+            return self.port_map[proxy]
+
+        return None
+
+    def add_port(self, port):
+        self.port_map[port.proxy] = port
+
+    def add_ports(self, ports):
+        for port in ports:
+            self.add_port(port)
+
+
+class Port:
+
+    def __init__(self, protocol, value, proxy):
+        self.protocol = protocol
+        self.value = value
+        self.proxy = proxy
+
+    def __str__(self):
+        return "Port [protocol=%r, value=%r proxy=%r]" % (self.protocol, self.value, self.proxy)
+
+
+class ServiceType:
+    SingleTenant = 1
+    MultiTenant = 2
+
+
+class ClusterStatus:
+    Created = 1
+    In_Maintenance = 2
+    Removed = 3
+
+
+class MemberStatus:
+    Created = 1
+    Starting = 2
+    Activated = 3
+    In_Maintenance = 4
+    ReadyToShutDown = 5
+    Terminated = 6
+    Suspended = 0
+    ShuttingDown = 0
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/util/__init__.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/util/__init__.py b/tools/python-cartridge-agent/cartridge-agent/modules/util/__init__.py
index 7051a3c..e69de29 100644
--- a/tools/python-cartridge-agent/cartridge-agent/modules/util/__init__.py
+++ b/tools/python-cartridge-agent/cartridge-agent/modules/util/__init__.py
@@ -1 +0,0 @@
-__all__=['cartridgeagentconstants', 'cartridgeagentutils', 'extensionutils']
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentconstants.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentconstants.py b/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentconstants.py
index a2efe80..cf0199d 100644
--- a/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentconstants.py
+++ b/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentconstants.py
@@ -86,3 +86,7 @@ HEALTH_STAT_TOPIC = "health/#"
 TOPOLOGY_TOPIC = "topology/#"
 TENANT_TOPIC = "tenant/#"
 INSTANCE_STATUS_TOPIC = "instance/#"
+
+
+#Messaging Model
+TENANT_RANGE_DELIMITER = "-"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentutils.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentutils.py b/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentutils.py
index e599ef8..25d3b8a 100644
--- a/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentutils.py
+++ b/tools/python-cartridge-agent/cartridge-agent/modules/util/cartridgeagentutils.py
@@ -6,6 +6,7 @@ import time
 import socket
 
 from .. config.cartridgeagentconfiguration import CartridgeAgentConfiguration
+import cartridgeagentconstants
 
 unpad = lambda s : s[0:-ord(s[-1])]
 logging.basicConfig(level=logging.DEBUG)
@@ -91,4 +92,20 @@ def check_ports_active(ip_address, ports):
             log.debug("Print %r is not active" % port)
             return False
 
-    return True
\ No newline at end of file
+    return True
+
+
+def validate_tenant_range(tenant_range):
+    valid = False
+    if tenant_range == "*":
+        valid = True
+    else:
+        arr = tenant_range.split(cartridgeagentconstants.TENANT_RANGE_DELIMITER)
+        if len(arr) == 2:
+            if arr[0].isdigit() and arr[1].isdigit():
+                valid = True
+            elif arr[0].isdigit() and arr[1] == "*":
+                valid = True
+
+    if not valid:
+        raise RuntimeError("Tenant range %r is not valid" % tenant_range)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/4850c53d/tools/python-cartridge-agent/cartridge-agent/modules/util/extensionutils.py
----------------------------------------------------------------------
diff --git a/tools/python-cartridge-agent/cartridge-agent/modules/util/extensionutils.py b/tools/python-cartridge-agent/cartridge-agent/modules/util/extensionutils.py
index c2ecc52..3ce8964 100644
--- a/tools/python-cartridge-agent/cartridge-agent/modules/util/extensionutils.py
+++ b/tools/python-cartridge-agent/cartridge-agent/modules/util/extensionutils.py
@@ -1,15 +1,25 @@
 import logging
+import os
+
+import cartridgeagentconstants
+from .. config.cartridgeagentconfiguration import CartridgeAgentConfiguration
 
 logging.basicConfig(level=logging.DEBUG)
 log = logging.getLogger(__name__)
 
+cartridge_agent_configuration = CartridgeAgentConfiguration()
+
 
 def execute_copy_artifact_extension(source, destination):
     raise NotImplementedError
 
 
 def execute_instance_started_extention(env_params):
-    raise NotImplementedError
+    log.debug("Executing instance started extension")
+
+    script_name = cartridgeagentconstants.INSTANCE_STARTED_SCRIPT
+    command = prepare_command(script_name)
+
 
 
 def execute_instance_activated_extension():
@@ -37,4 +47,35 @@ def check_topology_consistency(service_name, cluster_id, member_id):
 
 
 def execute_volume_mount_extension(persistance_mappings_payload):
-    raise NotImplementedError
\ No newline at end of file
+    raise NotImplementedError
+
+
+def prepare_command(script_name):
+    extensions_dir = cartridge_agent_configuration.read_property(cartridgeagentconstants.EXTENSIONS_DIR)
+    if extensions_dir.strip() == "":
+        raise RuntimeError("System property not found: %r" % cartridgeagentconstants.EXTENSIONS_DIR)
+
+    file_path = extensions_dir + script_name if str(extensions_dir).endswith("/") else extensions_dir + "/" + script_name
+
+    if os.path.isfile(file_path):
+        return file_path
+
+    raise IOError("Script file not found : %r" % file_path)
+
+
+def add_payload_parameters(params):
+    params["STRATOS_APP_PATH"] = cartridge_agent_configuration.get_app_path()
+    params["STRATOS_PARAM_FILE_PATH"] = cartridge_agent_configuration.read_property(cartridgeagentconstants.PARAM_FILE_PATH)
+    params["STRATOS_SERVICE_NAME"] = cartridge_agent_configuration.get_service_name()
+    params["STRATOS_TENANT_ID"] = cartridge_agent_configuration.get_tenant_id()
+    params["STRATOS_CARTRIDGE_KEY"] = cartridge_agent_configuration.get_cartridge_key()
+    params["STRATOS_LB_CLUSTER_ID"] = cartridge_agent_configuration.get_lb_cluster_id()
+    params["STRATOS_CLUSTER_ID"] = cartridge_agent_configuration.get_cluster_id()
+    params["STRATOS_NETWORK_PARTITION_ID"] = cartridge_agent_configuration.get_network_partition_id()
+    params["STRATOS_PARTITION_ID"] = cartridge_agent_configuration.get_partition_id()
+    params["STRATOS_PERSISTENCE_MAPPINGS"] = cartridge_agent_configuration.get_persistance_mappings()
+    params["STRATOS_REPO_URL"] = cartridge_agent_configuration.get_repo_url()
+
+    lb_cluster_id_in_payload = cartridge_agent_configuration.get_lb_cluster_id()
+
+