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()
+
+