Repository: stratos Updated Branches: refs/heads/stratos-4.1.x fde5c2d1d -> 6806cf1e2
Fixing cep ha mode health stat publishing Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/eb5b2591 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/eb5b2591 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/eb5b2591 Branch: refs/heads/stratos-4.1.x Commit: eb5b2591f922fb0a78a930b1a1be6a0cf98c28b3 Parents: adc8576 Author: Pubudu Gunatilaka <[email protected]> Authored: Mon Nov 9 13:01:53 2015 +0530 Committer: Pubudu Gunatilaka <[email protected]> Committed: Mon Nov 9 13:01:53 2015 +0530 ---------------------------------------------------------------------- .../cartridge.agent/healthstats.py | 94 ++++-- .../integration/tests/CEPHAModeTestCase.java | 292 +++++++++++++++++++ .../test/resources/CEPHAModeTestCase/agent.conf | 46 +++ .../resources/CEPHAModeTestCase/logging.ini | 52 ++++ .../CEPHAModeTestCase/payload/launch-params | 1 + 5 files changed, 454 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/eb5b2591/components/org.apache.stratos.python.cartridge.agent/src/main/python/cartridge.agent/cartridge.agent/healthstats.py ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.python.cartridge.agent/src/main/python/cartridge.agent/cartridge.agent/healthstats.py b/components/org.apache.stratos.python.cartridge.agent/src/main/python/cartridge.agent/cartridge.agent/healthstats.py index 877bde0..92d2495 100644 --- a/components/org.apache.stratos.python.cartridge.agent/src/main/python/cartridge.agent/cartridge.agent/healthstats.py +++ b/components/org.apache.stratos.python.cartridge.agent/src/main/python/cartridge.agent/cartridge.agent/healthstats.py @@ -94,42 +94,24 @@ class HealthStatisticsPublisher: def __init__(self): self.publishers = [] - cep_admin_username = HealthStatisticsPublisher.read_config(constants.CEP_SERVER_ADMIN_USERNAME) - cep_admin_password = HealthStatisticsPublisher.read_config(constants.CEP_SERVER_ADMIN_PASSWORD) + self.deactive_publishers = [] + self.cep_admin_username = HealthStatisticsPublisher.read_config(constants.CEP_SERVER_ADMIN_USERNAME) + self.cep_admin_password = HealthStatisticsPublisher.read_config(constants.CEP_SERVER_ADMIN_PASSWORD) + self.stream_definition = HealthStatisticsPublisher.create_stream_definition() + HealthStatisticsPublisher.log.debug("Stream definition created: %r" % str(self.stream_definition)) + # 1.1.1.1:1883,2.2.2.2:1883 cep_urls = HealthStatisticsPublisher.read_config(constants.CEP_RECEIVER_URLS) cep_urls = cep_urls.split(',') for cep_url in cep_urls: - self.ports = [] - cep_ip = cep_url.split(':')[0] - cep_port = cep_url.split(':')[1] - self.ports.append(cep_port) - cartridgeagentutils.wait_until_ports_active( - cep_ip, - self.ports, - int(Config.read_property("port.check.timeout", critical=False))) - - cep_active = cartridgeagentutils.check_ports_active( - cep_ip, - self.ports) - - if not cep_active: - raise CEPPublisherException("CEP server not active. Health statistics publishing aborted.") - self.stream_definition = HealthStatisticsPublisher.create_stream_definition() - HealthStatisticsPublisher.log.debug("Stream definition created: %r" % str(self.stream_definition)) + cep_active = self.is_cep_active(cep_url) - publisher = ThriftPublisher( - cep_ip, - cep_port, - cep_admin_username, - cep_admin_password, - self.stream_definition) - - self.publishers.append(publisher) - - HealthStatisticsPublisher.log.debug("HealthStatisticsPublisher initialized. %r %r", - cep_ip, cep_port) + if cep_active: + self.add_publishers(cep_url) + else: + HealthStatisticsPublisher.log.warn("CEP server is not active... %r" % cep_url) + self.deactive_publishers.append(cep_url) @staticmethod def create_stream_definition(): @@ -201,11 +183,61 @@ class HealthStatisticsPublisher: self.publish_event(event) + def add_publishers(self, cep_url): + """ + Add publishers to the publisher list for publishing + """ + cep_ip = cep_url.split(':')[0] + cep_port = cep_url.split(':')[1] + + publisher = ThriftPublisher( + cep_ip, + cep_port, + self.cep_admin_username, + self.cep_admin_password, + self.stream_definition) + + self.publishers.append(publisher) + + + def is_cep_active(self, cep_url): + """ + Check if the cep node is active + return true if active + """ + self.ports = [] + cep_ip = cep_url.split(':')[0] + cep_port = cep_url.split(':')[1] + self.ports.append(cep_port) + + cep_active = cartridgeagentutils.check_ports_active( + cep_ip, + self.ports) + + return cep_active + + def publish_event(self, event): + """ + Publish events to cep nodes + """ for publisher in self.publishers: - publisher.publish(event) + try: + publisher.publish(event) + except Exception as ex: + raise ThriftReceiverOfflineException(ex) + + deactive_ceps = self.deactive_publishers + for cep_url in deactive_ceps: + cep_active = self.is_cep_active(cep_url) + if cep_active: + self.add_publishers(cep_url) + self.deactive_publishers.remove(cep_url) def disconnect_publisher(self): + """ + Disconnect publishers + """ for publisher in self.publishers: publisher.disconnect() http://git-wip-us.apache.org/repos/asf/stratos/blob/eb5b2591/products/python-cartridge-agent/modules/integration/test-integration/src/test/java/org/apache/stratos/python/cartridge/agent/integration/tests/CEPHAModeTestCase.java ---------------------------------------------------------------------- diff --git a/products/python-cartridge-agent/modules/integration/test-integration/src/test/java/org/apache/stratos/python/cartridge/agent/integration/tests/CEPHAModeTestCase.java b/products/python-cartridge-agent/modules/integration/test-integration/src/test/java/org/apache/stratos/python/cartridge/agent/integration/tests/CEPHAModeTestCase.java new file mode 100644 index 0000000..dfaad23 --- /dev/null +++ b/products/python-cartridge-agent/modules/integration/test-integration/src/test/java/org/apache/stratos/python/cartridge/agent/integration/tests/CEPHAModeTestCase.java @@ -0,0 +1,292 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.stratos.python.cartridge.agent.integration.tests; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.common.domain.LoadBalancingIPType; +import org.apache.stratos.messaging.domain.topology.*; +import org.apache.stratos.messaging.event.Event; +import org.apache.stratos.messaging.event.topology.CompleteTopologyEvent; +import org.apache.stratos.messaging.event.topology.MemberInitializedEvent; +import org.apache.stratos.messaging.listener.instance.status.InstanceActivatedEventListener; +import org.apache.stratos.python.cartridge.agent.integration.common.ThriftTestServer; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.wso2.carbon.databridge.commons.Credentials; +import org.wso2.carbon.databridge.commons.StreamDefinition; +import org.wso2.carbon.databridge.core.AgentCallback; +import org.wso2.carbon.databridge.core.exception.DataBridgeException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +public class CEPHAModeTestCase extends PythonAgentIntegrationTest { + + public CEPHAModeTestCase() throws IOException { + } + + private static final Log log = LogFactory.getLog(CEPHAModeTestCase.class); + private static final int STARTUP_TIMEOUT = 5 * 60000; + private static final String CLUSTER_ID = "php.php.domain"; + private static final String DEPLOYMENT_POLICY_NAME = "deployment-policy-1"; + private static final String AUTOSCALING_POLICY_NAME = "autoscaling-policy-1"; + private static final String APP_ID = "application-1"; + private static final String MEMBER_ID = "php.member-1"; + private static final String INSTANCE_ID = "instance-1"; + private static final String CLUSTER_INSTANCE_ID = "cluster-1-instance-1"; + private static final String NETWORK_PARTITION_ID = "network-partition-1"; + private static final String PARTITION_ID = "partition-1"; + private static final String TENANT_ID = "-1234"; + private static final String SERVICE_NAME = "php"; + private boolean startupTestCompleted = false; + private Topology topology = createTestTopology(); + private static final int ADC_TIMEOUT = 300000; + private ThriftTestServer secondThriftTestServer; + private boolean thriftTestCompletedinServerTwo = false; + private boolean thriftTestCompletedinServerOne = false; + private boolean failDetected = false; + + + @BeforeMethod(alwaysRun = true) + public void setupADCExtensionTest() throws Exception { + log.info("Setting up ADCExtensionTestCase"); + // Set jndi.properties.dir system property for initializing event publishers and receivers + System.setProperty("jndi.properties.dir", getCommonResourcesPath()); + + // start Python agent with configurations provided in resource path + super.setup(ADC_TIMEOUT); + + secondThriftTestServer = new ThriftTestServer(); + + File file = + new File(getResourcesPath() + PATH_SEP + "common" + PATH_SEP + "stratos-health-stream-def.json"); + FileInputStream fis = new FileInputStream(file); + byte[] data = new byte[(int) file.length()]; + fis.read(data); + fis.close(); + + String str = new String(data, "UTF-8"); + if (str.equals("")) { + log.warn("Stream definition of health stat stream is empty. Thrift server will not function properly"); + } + secondThriftTestServer.addStreamDefinition(str, Integer.parseInt(TENANT_ID)); + // start with non-ssl port; test server will automatically bind to ssl port + secondThriftTestServer.start(cepPort + 1); + log.info("Started Thrift server with stream definition: " + str); + + // Simulate server socket + startServerSocket(8080); + } + + + /** + * TearDown method for test method testPythonCartridgeAgent + */ + @AfterMethod(alwaysRun = true) + public void tearDownAgentStartupTest() { + tearDown(); + + try { + if (secondThriftTestServer != null) { + secondThriftTestServer.stop(); + } + } catch (Exception ignore) { + } + + } + + @Test(timeOut = STARTUP_TIMEOUT, description = "Test PCA initialization, activation, health stat publishing in " + + "CEP HA mode", groups = {"smoke"}) + public void testPythonCartridgeAgent() { + startCommunicatorThread(); + subscribeToThriftDatabridge(); + subscribeToSecondThriftDatabridge(); + Thread startupTestThread = new Thread(new Runnable() { + @Override + public void run() { + while (!eventReceiverInitiated) { + sleep(2000); + } + List<String> outputLines = new ArrayList<String>(); + while (!outputStream.isClosed()) { + List<String> newLines = getNewLines(outputLines, outputStream.toString()); + if (newLines.size() > 0) { + for (String line : newLines) { + if (line.contains("Subscribed to 'topology/#'")) { + sleep(2000); + // Send complete topology event + log.info("Publishing complete topology event..."); + CompleteTopologyEvent completeTopologyEvent = new CompleteTopologyEvent(topology); + publishEvent(completeTopologyEvent); + log.info("Complete topology event published"); + + // Publish member initialized event + log.info("Publishing member initialized event..."); + MemberInitializedEvent memberInitializedEvent = new MemberInitializedEvent( + SERVICE_NAME, CLUSTER_ID, CLUSTER_INSTANCE_ID, MEMBER_ID, NETWORK_PARTITION_ID, + PARTITION_ID, INSTANCE_ID + ); + publishEvent(memberInitializedEvent); + log.info("Member initialized event published"); + } + + if (line.contains("Published event to thrift stream")) { + startupTestCompleted = true; + } + + if (line.contains("Couldn't publish health statistics to CEP. Thrift Receiver offline.")) { + failDetected = true; + } + + } + } + sleep(1000); + } + } + }); + + startupTestThread.start(); + + instanceStatusEventReceiver.addEventListener(new InstanceActivatedEventListener() { + @Override + protected void onEvent(Event event) { + log.info("Publishing complete topology with a new member..."); + Member newMember = new Member(SERVICE_NAME, CLUSTER_ID, "new-member", CLUSTER_INSTANCE_ID, + NETWORK_PARTITION_ID, PARTITION_ID, LoadBalancingIPType.Private, System.currentTimeMillis()); + topology.getService(SERVICE_NAME).getCluster(CLUSTER_ID).addMember(newMember); + CompleteTopologyEvent completeTopologyEvent = new CompleteTopologyEvent(topology); + publishEvent(completeTopologyEvent); + log.info("Complete topology event published with new member"); + } + }); + + while (!instanceStarted || !instanceActivated || !startupTestCompleted || + !thriftTestCompletedinServerOne || !thriftTestCompletedinServerTwo) { + // wait until the instance activated event is received. + // this will assert whether instance got activated within timeout period; no need for explicit assertions + sleep(2000); + } + + thriftTestServer.stop(); + startupTestCompleted = false; + thriftTestCompletedinServerTwo = false; + + while (!startupTestCompleted || !failDetected || !thriftTestCompletedinServerTwo) { + // wait until PCA publishes health stats to second thrift server + sleep(2000); + } + + thriftTestCompletedinServerOne = false; + + try { + thriftTestServer.start(cepPort); + subscribeToThriftDatabridge(); + } catch (DataBridgeException e) { + e.printStackTrace(); + } + + while (!thriftTestCompletedinServerOne) { + // wait until PCA publishes health stats to started node + sleep(2000); + } + + } + + private void subscribeToThriftDatabridge() { + thriftTestServer.getDatabridge().subscribe(new AgentCallback() { + @Override + public void definedStream(StreamDefinition streamDefinition, int tenantId) { + // ignore + } + + @Override + public void removeStream(StreamDefinition streamDefinition, int tenantId) { + // ignore + } + + @Override + public void receive(List<org.wso2.carbon.databridge.commons.Event> eventList, Credentials credentials) { + log.info("Event list size of thrift server one: " + eventList.size()); + log.info("Recent events received for thrift server one: " + eventList); + // if the list contains an event that means PCA was able to successfully publish health stats + if (eventList.size() > 0) { + thriftTestCompletedinServerOne = true; + } + } + }); + } + + private void subscribeToSecondThriftDatabridge() { + secondThriftTestServer.getDatabridge().subscribe(new AgentCallback() { + @Override + public void definedStream(StreamDefinition streamDefinition, int tenantId) { + // ignore + } + + @Override + public void removeStream(StreamDefinition streamDefinition, int tenantId) { + // ignore + } + + @Override + public void receive(List<org.wso2.carbon.databridge.commons.Event> eventList, Credentials credentials) { + log.info("Event list size of thrift server two: " + eventList.size()); + log.info("Recent events received for thrift server two: " + eventList); + // if the list contains an event that means PCA was able to successfully publish health stats + if (eventList.size() > 0) { + thriftTestCompletedinServerTwo = true; + } + } + }); + } + + /** + * Create test topology + * + * @return Topology object with mock information + */ + private Topology createTestTopology() { + Topology topology = new Topology(); + Service service = new Service(SERVICE_NAME, ServiceType.SingleTenant); + topology.addService(service); + + Cluster cluster = new Cluster(service.getServiceName(), CLUSTER_ID, DEPLOYMENT_POLICY_NAME, + AUTOSCALING_POLICY_NAME, APP_ID); + service.addCluster(cluster); + + Member member = new Member(service.getServiceName(), cluster.getClusterId(), MEMBER_ID, + CLUSTER_INSTANCE_ID, NETWORK_PARTITION_ID, PARTITION_ID, LoadBalancingIPType.Private, + System.currentTimeMillis()); + + member.setDefaultPrivateIP("10.0.0.1"); + member.setDefaultPublicIP("20.0.0.1"); + Properties properties = new Properties(); + properties.setProperty("prop1", "value1"); + member.setProperties(properties); + member.setStatus(MemberStatus.Created); + cluster.addMember(member); + return topology; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/eb5b2591/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/agent.conf ---------------------------------------------------------------------- diff --git a/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/agent.conf b/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/agent.conf new file mode 100755 index 0000000..e982bc3 --- /dev/null +++ b/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/agent.conf @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +[agent] +mb.ip =localhost +mb.port =1885 +mb.username =system +mb.password =manager +listen.address =localhost +thrift.receiver.urls =localhost:7712,localhost:7713 +thrift.server.admin.username =admin +thrift.server.admin.password =admin +cep.stats.publisher.enabled =true +lb.private.ip = +lb.public.ip = +enable.artifact.update =true +auto.commit =true +auto.checkout =true +artifact.update.interval =15 +artifact.clone.retries =5 +artifact.clone.interval =10 +port.check.timeout =600000 +enable.data.publisher =false +monitoring.server.ip =localhost +monitoring.server.port =7612 +monitoring.server.secure.port =7712 +monitoring.server.admin.username =admin +monitoring.server.admin.password =admin +log.file.paths =/tmp/agent.screen-adc-test.log +metadata.service.url =https://localhost:9443 +super.tenant.repository.path =/repository/deployment/server/ +tenant.repository.path =/repository/tenants/ http://git-wip-us.apache.org/repos/asf/stratos/blob/eb5b2591/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/logging.ini ---------------------------------------------------------------------- diff --git a/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/logging.ini b/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/logging.ini new file mode 100755 index 0000000..15cad9b --- /dev/null +++ b/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/logging.ini @@ -0,0 +1,52 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +[formatters] +keys=default + +[formatter_default] +format=[%(asctime)s] %(levelname)s {%(filename)s:%(funcName)s} - %(message)s +class=logging.Formatter + +[handlers] +keys=console, error_file, log_file + +[handler_console] +class=logging.StreamHandler +formatter=default +args=tuple() + +[handler_log_file] +class=logging.FileHandler +level=DEBUG +formatter=default +args=("agent.log", "w") + +[handler_error_file] +class=logging.FileHandler +level=ERROR +formatter=default +args=("error.log", "w") + +[loggers] +keys=root + +[logger_root] +level=DEBUG +formatter=default +handlers=console,error_file,log_file \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/eb5b2591/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/payload/launch-params ---------------------------------------------------------------------- diff --git a/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/payload/launch-params b/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/payload/launch-params new file mode 100755 index 0000000..1b44343 --- /dev/null +++ b/products/python-cartridge-agent/modules/integration/test-integration/src/test/resources/CEPHAModeTestCase/payload/launch-params @@ -0,0 +1 @@ +APPLICATION_ID=application-1,APPLICATION_PATH=/tmp/AgentStartupTestCase,BASH=/bin/bash,BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath,BASH_ALIASES=(),BASH_ARGC=(),BASH_ARGV=(),BASH_CMDS=(),BASH_LINENO=([0]="0"),BASH_SOURCE=([0]="/usr/local/bin/populate-user-data.sh"),BASH_VERSINFO=([0]="4" [1]="3" [2]="30" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu"),BASH_VERSION='4.3.30(1)-release',CARTRIDGE_ALIAS=mytomcat,CARTRIDGE_KEY=PUjpXCLujDhYr5A6,CATALINA_HOME=/opt/tomcat,CEP_IP=54.179.197.243,CEP_PORT=7711,CLUSTER_ID=php.php.domain,CLUSTER_INSTANCE_ID=cluster-1-instance-1,DEPENDENCY_CLUSTER_IDS=myphp.php.domain,DEPLOYMENT=default,DIRSTACK=(),EUID=0,GROUPS=(),GROUP_NAME=null,HOME=/root,HOSTNAME=mytomcat-tomcat-domain3bd3cd47-b95d-475a-aa11-3e3ddc089d49,HOSTTYPE=x86_64,HOST_NAME=mytomcat.tomcat.stratos.org,IFS=' ,',INSTANCE_ID=null,INTERNAL=false,JAVA_HOME=/opt/jdk1.7.0_67,KUBERNETES_CLUSTER_ID=kubernetes-cluste r-1,KUBERNETES_PORT=tcp://10.100.0.2:443,KUBERNETES_PORT_443_TCP=tcp://10.100.0.2:443,KUBERNETES_PORT_443_TCP_ADDR=10.100.0.2,KUBERNETES_PORT_443_TCP_PORT=443,KUBERNETES_PORT_443_TCP_PROTO=tcp,KUBERNETES_RO_PORT=tcp://10.100.0.1:80,KUBERNETES_RO_PORT_80_TCP=tcp://10.100.0.1:80,KUBERNETES_RO_PORT_80_TCP_ADDR=10.100.0.1,KUBERNETES_RO_PORT_80_TCP_PORT=80,KUBERNETES_RO_PORT_80_TCP_PROTO=tcp,KUBERNETES_RO_SERVICE_HOST=10.100.0.1,KUBERNETES_RO_SERVICE_PORT=80,KUBERNETES_SERVICE_HOST=10.100.0.2,KUBERNETES_SERVICE_PORT=443,LB_CLUSTER_ID=null,LOG_LEVEL=DEBUG,MACHTYPE=x86_64-pc-linux-gnu,MB_IP=54.179.197.243,MB_PORT=1883,MEMBER_ID=php.member-1,MIN_COUNT=1,MULTITENANT=false,MYPHP_PHP_DOMAIN_1_PORT=tcp://10.100.171.218:4500,MYPHP_PHP_DOMAIN_1_PORT_4500_TCP=tcp://10.100.171.218:4500,MYPHP_PHP_DOMAIN_1_PORT_4500_TCP_ADDR=10.100.171.218,MYPHP_PHP_DOMAIN_1_PORT_4500_TCP_PORT=4500,MYPHP_PHP_DOMAIN_1_PORT_4500_TCP_PROTO=tcp,MYPHP_PHP_DOMAIN_1_SERVICE_HOST=10.100.171.218,MYPHP_PHP_DOMAIN_1_SERVICE_POR T=4500,MYTOMCAT_TOMCAT_DOMAIN_1_PORT=tcp://10.100.16.250:4500,MYTOMCAT_TOMCAT_DOMAIN_1_PORT_4500_TCP=tcp://10.100.16.250:4500,MYTOMCAT_TOMCAT_DOMAIN_1_PORT_4500_TCP_ADDR=10.100.16.250,MYTOMCAT_TOMCAT_DOMAIN_1_PORT_4500_TCP_PORT=4500,MYTOMCAT_TOMCAT_DOMAIN_1_PORT_4500_TCP_PROTO=tcp,MYTOMCAT_TOMCAT_DOMAIN_1_SERVICE_HOST=10.100.16.250,MYTOMCAT_TOMCAT_DOMAIN_1_SERVICE_PORT=4500,NETWORK_PARTITION_ID=network-partition-1,OPTERR=1,OPTIND=1,OSTYPE=linux-gnu,PARTITION_ID=partition-1,PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,PIPESTATUS=([0]="0"),PORTS=8080,POSIXLY_CORRECT=y,PPID=14,PRIMARY=false,PROVIDER=apache,PS4='+ ',PUPPET_DNS_AVAILABLE=null,PUPPET_ENV=false,PUPPET_HOSTNAME=puppet.apache.stratos.org,PUPPET_IP=127.0.0.1,PWD=/opt,SERVICE_NAME=php,SHELL=/bin/bash,SHELLOPTS=braceexpand:hashall:interactive-comments:posix,SHLVL=2,TENANT_ID=-1234,TENANT_RANGE='*',TERM=dumb,TOKEN=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOi04NzI0ODEyNDEsInN1YiI6ImFkbWluIiwiYXpwIjoid3I5SllVaDNtTXd6bVhHVl lqWmVIWnhCV2xFYSIsImFwcElkIjoic2luZ2xlX2dyb3VwX3YxIiwiYXVkIjpbIndyOUpZVWgzbU13em1YR1ZZalplSFp4QldsRWEiXSwiaXNzIjoiaHR0cHM6XC9cL2xvY2FsaG9zdDo5NDQzXC9vYXV0aDJlbmRwb2ludHNcL3Rva2VuIiwiaWF0IjotODcyNDgwMjQwfQ.OSa1gIXUT9amhk1YEU02Yc3JtUYqanzrXh5K1YyvRXcpSiY2Ccn2BfJO0hILF5UooRcGBihzfX3979NRcvGwcUDUvOUJ0eaGPmxFZYbu0nr3xD8lhAO3fa1QYsKAvMnMdwyu2uSgSp6R6EUdVleiwlabUoDsuEcKGkIAn_VQvG0,UID=0,_=posix,LVS_VIRTUAL_IP=192.168.0.40|255.255.255.0 \ No newline at end of file
