WillemJiang closed pull request #243: [SCB-823] Setup the test in kubernetes
URL: https://github.com/apache/incubator-servicecomb-saga/pull/243
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/saga-demo/saga-k8s-resources/README.md 
b/saga-demo/saga-k8s-resources/README.md
new file mode 100644
index 00000000..a10588c7
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/README.md
@@ -0,0 +1,72 @@
+# Deploy & test saga with Kubernetes
+
+You can now play with saga under Kubernetes!
+
+The demos' Kubernetes resources are splitted into 3 categories:
+
+- **base**: The base resources that all demos needs under `base/` folder, 
including the `alpha-server` and `postgresql` database
+- **demos**: The resources that each demo will consume, stored in the folder 
named with `xxx-demo/`
+- **tests**: A [jmeter](https://jmeter.apache.org/) deployment is provided for 
each demo under the demo's `test/` folder, there is also a [Kubernetes 
configmap](http://kubernetes-v1-4.github.io/docs/user-guide/configmap/) where 
you can change and apply the jmeter test plans. So you can change the plan at 
any time and pull up the jmeter deployment to test the demos.
+
+
+
+## Get started
+
+All the Kubernetes objects will be deployed in the `servicecomb` namespace, so 
make sure it is there with the command:
+
+```bash
+$ kubectl create namespace servicecomb
+namespace "servicecomb" created
+```
+
+Let's take the `spring-demo` as the example, apply the base and demo resources:
+
+```bash
+$ kubectl apply -f ./base
+service "alpha-server" created
+deployment "alphaserver" created
+service "postgresql" created
+deployment "database" created
+
+$ kubectl apply -f ./spring-demo
+service "booking" created
+deployment "booking" created
+service "car" created
+deployment "car" created
+service "hotel" created
+deployment "hotel" created
+
+```
+
+Make sure all the services in the demo are up and running:
+
+```bash
+$ kubectl get pods -n servicecomb
+NAME                           READY     STATUS    RESTARTS   AGE
+alphaserver-6cb48898fc-tlqtb   1/1       Running   0          1d
+booking-666c8f4dbb-k5glt       1/1       Running   0          4h
+car-975d666f8-prs9p            1/1       Running   0          1d
+database-796fc68b98-mhz8n      1/1       Running   0          1d
+hotel-768b59dfcd-gc7sn         1/1       Running   0          1d
+```
+
+Then you can test the demo with jmeter, modify the configmap according to your 
test plan, then apply the test service to Kubernetes api server:
+
+```bash
+$ vim ./spring-demo/test/jmeter.configmap.yaml
+$ # edit the file as you wish, mind the identation of yamls
+$ kubectl apply -f ./spring-demo/test/
+configmap "springdemo-jmeter-script" created
+deployment "spring-demo-jmeter" created
+
+$ kubectl get pods -n servicecomb | grep jmeter
+spring-demo-jmeter-6cfb679f58-sckkx   1/1       Running   0          12s
+```
+
+The jmeter deployment will keep testing the demo and generate the test result. 
For now the the result file is stored in the Kubernetes nodes under the path 
`/saga-jmeter-result/{demo_name}.jtl`. You can generate the HTML dashboard with 
the command:
+
+```bash
+$ jmeter -g /saga-jmeter-result/{demo_name}.jtl -o output/
+```
+
+We will try to provide more services to automate the dashboard generation in 
the future.
diff --git a/saga-demo/saga-k8s-resources/base/alpha.yaml 
b/saga-demo/saga-k8s-resources/base/alpha.yaml
new file mode 100644
index 00000000..47c0d5df
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/base/alpha.yaml
@@ -0,0 +1,54 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: alpha-server
+  namespace: servicecomb
+  labels:
+    app: alphaserver
+spec:
+  ports:
+  - port: 8080
+    name: alpha
+  selector:
+    app: alphaserver
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: alphaserver
+  namespace: servicecomb
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: alphaserver
+        version: v1
+    spec:
+      containers:
+      - name: alphaserver
+        image: alpha-server:0.3.0-SNAPSHOT
+        imagePullPolicy: IfNotPresent
+        # ports:
+        # - containerPort: 8080
+        env:
+        - name: JAVA_OPTS
+          value: -Dspring.profiles.active=prd -Dalpha.server.port=8080 
-Dspring.datasource.url=jdbc:postgresql://postgresql.servicecomb:5432/saga?useSSL=false
+---
diff --git a/saga-demo/saga-k8s-resources/base/postgresql.yaml 
b/saga-demo/saga-k8s-resources/base/postgresql.yaml
new file mode 100644
index 00000000..bf0290f2
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/base/postgresql.yaml
@@ -0,0 +1,60 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+apiVersion: v1
+kind: Service
+metadata:
+  # original docker-compose link: "database:postgresql.servicecomb.io"
+  # Since kubernetes doesn't allow a namespace with dot like "servicecomb.io", 
make sure the Pod and Service are under the default namespace to be accessible
+  name: postgresql
+  namespace: servicecomb
+  labels:
+    app: database
+spec:
+  ports:
+  - port: 5432
+    name: postgresql # The name cannot be 'http'
+  selector:
+    app: database
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: database
+  namespace: servicecomb
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: database
+        version: v1
+    spec:
+      containers:
+      - name: postgresql
+        image: postgres
+        imagePullPolicy: IfNotPresent
+        ports:
+        - containerPort: 5432
+        env:
+        - name: POSTGRES_DB
+          value: saga
+        - name: POSTGRES_USER
+          value: saga
+        - name: POSTGRES_PASSWORD
+          value: password
+---
diff --git a/saga-demo/saga-k8s-resources/spring-demo/booking.yaml 
b/saga-demo/saga-k8s-resources/spring-demo/booking.yaml
new file mode 100644
index 00000000..93fc1519
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/spring-demo/booking.yaml
@@ -0,0 +1,73 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: booking
+  namespace: servicecomb
+  labels:
+    app: booking
+spec:
+  ports:
+  - port: 8083
+    targetPort: 8080
+    name: http
+  selector:
+    app: booking
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: booking
+  namespace: servicecomb
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: booking
+        version: v1
+    spec:
+      containers:
+      - name: booking
+        image: booking:0.3.0-SNAPSHOT
+        imagePullPolicy: IfNotPresent
+        env:
+        - name: JAVA_OPTS
+          value: -Dalpha.cluster.address=alpha-server.servicecomb:8080 
-Dcar.service.address=http://car.servicecomb:8082 
-Dhotel.service.address=http://hotel.servicecomb:8081
+        ports:
+        - containerPort: 8080
+---
+# Only for debugging
+# apiVersion: v1
+# kind: Service
+# metadata:
+#   name: booking-nodeip
+#   namespace: servicecomb
+#   labels:
+#     app: booking
+# spec:
+#   type: NodePort
+#   ports:
+#   - port: 8080
+#     # targetPort: 8080
+#     name: http
+#   externalIPs: ['$YOUR_NODE_IP']
+#   selector:
+#     app: booking
+# ---
diff --git a/saga-demo/saga-k8s-resources/spring-demo/car.yaml 
b/saga-demo/saga-k8s-resources/spring-demo/car.yaml
new file mode 100644
index 00000000..064ead20
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/spring-demo/car.yaml
@@ -0,0 +1,55 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: car
+  namespace: servicecomb
+  labels:
+    app: car
+spec:
+  ports:
+  - port: 8082
+    targetPort: 8080
+    name: car
+  selector:
+    app: car
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: car
+  namespace: servicecomb
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: car
+        version: v1
+    spec:
+      containers:
+      - name: car
+        image: car:0.3.0-SNAPSHOT
+        imagePullPolicy: IfNotPresent
+        env:
+        - name: JAVA_OPTS
+          value: -Dalpha.cluster.address=alpha-server.servicecomb:8080
+        ports:
+        - containerPort: 8080
+---
diff --git a/saga-demo/saga-k8s-resources/spring-demo/hotel.yaml 
b/saga-demo/saga-k8s-resources/spring-demo/hotel.yaml
new file mode 100644
index 00000000..ef1b0523
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/spring-demo/hotel.yaml
@@ -0,0 +1,55 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: hotel
+  namespace: servicecomb
+  labels:
+    app: hotel
+spec:
+  ports:
+  - port: 8081
+    targetPort: 8080
+    name: hotel
+  selector:
+    app: hotel
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: hotel
+  namespace: servicecomb
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: hotel
+        version: v1
+    spec:
+      containers:
+      - name: hotel
+        image: hotel:0.3.0-SNAPSHOT
+        imagePullPolicy: IfNotPresent
+        env:
+        - name: JAVA_OPTS
+          value: -Dalpha.cluster.address=alpha-server.servicecomb:8080
+        ports:
+        - containerPort: 8080
+---
diff --git 
a/saga-demo/saga-k8s-resources/spring-demo/test/jmeter.configmap.yaml 
b/saga-demo/saga-k8s-resources/spring-demo/test/jmeter.configmap.yaml
new file mode 100644
index 00000000..065d8cf6
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/spring-demo/test/jmeter.configmap.yaml
@@ -0,0 +1,282 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+    name: springdemo-jmeter-script
+    namespace: servicecomb
+data:
+    saga.jmx: |
+      <?xml version="1.0" encoding="UTF-8"?>
+      <jmeterTestPlan version="1.2" properties="4.0" jmeter="4.0 r1823414">
+        <hashTree>
+          <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test 
Plan" enabled="true">
+            <stringProp name="TestPlan.comments"></stringProp>
+            <boolProp name="TestPlan.functional_mode">false</boolProp>
+            <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
+            <elementProp name="TestPlan.user_defined_variables" 
elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" 
testname="User Defined Variables" enabled="true">
+              <collectionProp name="Arguments.arguments"/>
+            </elementProp>
+            <stringProp name="TestPlan.user_define_classpath"></stringProp>
+          </TestPlan>
+          <hashTree>
+            <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" 
testname="Thread Group" enabled="true">
+              <stringProp 
name="ThreadGroup.on_sample_error">continue</stringProp>
+              <elementProp name="ThreadGroup.main_controller" 
elementType="LoopController" guiclass="LoopControlPanel" 
testclass="LoopController" testname="Loop Controller" enabled="true">
+                <boolProp 
name="LoopController.continue_forever">false</boolProp>
+                <intProp name="LoopController.loops">-1</intProp>
+              </elementProp>
+              <stringProp name="ThreadGroup.num_threads">50</stringProp>
+              <stringProp name="ThreadGroup.ramp_time">100</stringProp>
+              <longProp name="ThreadGroup.start_time">1503917597000</longProp>
+              <longProp name="ThreadGroup.end_time">1503917597000</longProp>
+              <boolProp name="ThreadGroup.scheduler">true</boolProp>
+              <stringProp name="ThreadGroup.duration">300</stringProp>
+              <stringProp name="ThreadGroup.delay"></stringProp>
+            </ThreadGroup>
+            <hashTree>
+              <ConfigTestElement guiclass="HttpDefaultsGui" 
testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
+                <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
+                <elementProp name="HTTPsampler.Arguments" 
elementType="Arguments">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="" elementType="HTTPArgument">
+                      <boolProp 
name="HTTPArgument.always_encode">false</boolProp>
+                      <stringProp name="Argument.value"></stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">localhost</stringProp>
+                <stringProp name="HTTPSampler.port">8080</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path"></stringProp>
+                <stringProp name="HTTPSampler.concurrentPool">6</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+              </ConfigTestElement>
+              <hashTree/>
+              <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" 
testname="HTTP Header Manager" enabled="true">
+                <collectionProp name="HeaderManager.headers">
+                  <elementProp name="" elementType="Header">
+                    <stringProp name="Header.name">Content-Type</stringProp>
+                    <stringProp 
name="Header.value">application/json</stringProp>
+                  </elementProp>
+                </collectionProp>
+              </HeaderManager>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" 
testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" 
elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" 
testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments"/>
+                </elementProp>
+                <stringProp 
name="HTTPSampler.domain">booking.servicecomb</stringProp>
+                <stringProp name="HTTPSampler.port">8083</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp 
name="HTTPSampler.path">/booking/test/2/2</stringProp>
+                <stringProp name="HTTPSampler.method">POST</stringProp>
+                <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+                <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+                <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+                <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" 
testclass="HTTPSamplerProxy" testname="HTTP Request with error" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" 
elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" 
testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments"/>
+                </elementProp>
+                <stringProp 
name="HTTPSampler.domain">booking.servicecomb</stringProp>
+                <stringProp name="HTTPSampler.port">8083</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp 
name="HTTPSampler.path">/booking/test/3/2</stringProp>
+                <stringProp name="HTTPSampler.method">POST</stringProp>
+                <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+                <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+                <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+                <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <ConstantTimer guiclass="ConstantTimerGui" 
testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+                <stringProp name="ConstantTimer.delay">100</stringProp>
+              </ConstantTimer>
+              <hashTree/>
+              <ResponseAssertion guiclass="AssertionGui" 
testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
+                <collectionProp name="Asserion.test_strings">
+                  <stringProp name="49586">200</stringProp>
+                </collectionProp>
+                <stringProp 
name="Assertion.test_field">Assertion.response_code</stringProp>
+                <boolProp name="Assertion.assume_success">false</boolProp>
+                <intProp name="Assertion.test_type">2</intProp>
+                <stringProp name="Assertion.custom_message"></stringProp>
+              </ResponseAssertion>
+              <hashTree/>
+            </hashTree>
+            <ResultCollector guiclass="GraphVisualizer" 
testclass="ResultCollector" testname="Graph Results" enabled="true">
+              <boolProp name="ResultCollector.error_logging">false</boolProp>
+              <objProp>
+                <name>saveConfig</name>
+                <value class="SampleSaveConfiguration">
+                  <time>true</time>
+                  <latency>true</latency>
+                  <timestamp>true</timestamp>
+                  <success>true</success>
+                  <label>true</label>
+                  <code>true</code>
+                  <message>true</message>
+                  <threadName>true</threadName>
+                  <dataType>true</dataType>
+                  <encoding>false</encoding>
+                  <assertions>true</assertions>
+                  <subresults>true</subresults>
+                  <responseData>false</responseData>
+                  <samplerData>false</samplerData>
+                  <xml>false</xml>
+                  <fieldNames>true</fieldNames>
+                  <responseHeaders>false</responseHeaders>
+                  <requestHeaders>false</requestHeaders>
+                  <responseDataOnError>false</responseDataOnError>
+                  
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+                  <assertionsResultsToSave>0</assertionsResultsToSave>
+                  <bytes>true</bytes>
+                  <sentBytes>true</sentBytes>
+                  <threadCounts>true</threadCounts>
+                  <idleTime>true</idleTime>
+                  <connectTime>true</connectTime>
+                </value>
+              </objProp>
+              <stringProp name="filename"></stringProp>
+            </ResultCollector>
+            <hashTree/>
+            <ResultCollector guiclass="TableVisualizer" 
testclass="ResultCollector" testname="View Results in Table" enabled="true">
+              <boolProp name="ResultCollector.error_logging">false</boolProp>
+              <objProp>
+                <name>saveConfig</name>
+                <value class="SampleSaveConfiguration">
+                  <time>true</time>
+                  <latency>true</latency>
+                  <timestamp>true</timestamp>
+                  <success>true</success>
+                  <label>true</label>
+                  <code>true</code>
+                  <message>true</message>
+                  <threadName>true</threadName>
+                  <dataType>true</dataType>
+                  <encoding>false</encoding>
+                  <assertions>true</assertions>
+                  <subresults>true</subresults>
+                  <responseData>false</responseData>
+                  <samplerData>false</samplerData>
+                  <xml>false</xml>
+                  <fieldNames>true</fieldNames>
+                  <responseHeaders>false</responseHeaders>
+                  <requestHeaders>false</requestHeaders>
+                  <responseDataOnError>false</responseDataOnError>
+                  
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+                  <assertionsResultsToSave>0</assertionsResultsToSave>
+                  <bytes>true</bytes>
+                  <sentBytes>true</sentBytes>
+                  <threadCounts>true</threadCounts>
+                  <idleTime>true</idleTime>
+                  <connectTime>true</connectTime>
+                </value>
+              </objProp>
+              <stringProp name="filename"></stringProp>
+            </ResultCollector>
+            <hashTree/>
+            <ResultCollector guiclass="AssertionVisualizer" 
testclass="ResultCollector" testname="Assertion Results" enabled="true">
+              <boolProp name="ResultCollector.error_logging">false</boolProp>
+              <objProp>
+                <name>saveConfig</name>
+                <value class="SampleSaveConfiguration">
+                  <time>true</time>
+                  <latency>true</latency>
+                  <timestamp>true</timestamp>
+                  <success>true</success>
+                  <label>true</label>
+                  <code>true</code>
+                  <message>true</message>
+                  <threadName>true</threadName>
+                  <dataType>true</dataType>
+                  <encoding>false</encoding>
+                  <assertions>true</assertions>
+                  <subresults>true</subresults>
+                  <responseData>false</responseData>
+                  <samplerData>false</samplerData>
+                  <xml>false</xml>
+                  <fieldNames>true</fieldNames>
+                  <responseHeaders>false</responseHeaders>
+                  <requestHeaders>false</requestHeaders>
+                  <responseDataOnError>false</responseDataOnError>
+                  
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+                  <assertionsResultsToSave>0</assertionsResultsToSave>
+                  <bytes>true</bytes>
+                  <sentBytes>true</sentBytes>
+                  <threadCounts>true</threadCounts>
+                  <idleTime>true</idleTime>
+                  <connectTime>true</connectTime>
+                </value>
+              </objProp>
+              <stringProp name="filename"></stringProp>
+            </ResultCollector>
+            <hashTree/>
+            <ResultCollector guiclass="StatVisualizer" 
testclass="ResultCollector" testname="Aggregate Report" enabled="true">
+              <boolProp name="ResultCollector.error_logging">false</boolProp>
+              <objProp>
+                <name>saveConfig</name>
+                <value class="SampleSaveConfiguration">
+                  <time>true</time>
+                  <latency>true</latency>
+                  <timestamp>true</timestamp>
+                  <success>true</success>
+                  <label>true</label>
+                  <code>true</code>
+                  <message>true</message>
+                  <threadName>true</threadName>
+                  <dataType>true</dataType>
+                  <encoding>false</encoding>
+                  <assertions>true</assertions>
+                  <subresults>true</subresults>
+                  <responseData>false</responseData>
+                  <samplerData>false</samplerData>
+                  <xml>false</xml>
+                  <fieldNames>true</fieldNames>
+                  <responseHeaders>false</responseHeaders>
+                  <requestHeaders>false</requestHeaders>
+                  <responseDataOnError>false</responseDataOnError>
+                  
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+                  <assertionsResultsToSave>0</assertionsResultsToSave>
+                  <bytes>true</bytes>
+                  <sentBytes>true</sentBytes>
+                  <threadCounts>true</threadCounts>
+                  <idleTime>true</idleTime>
+                  <connectTime>true</connectTime>
+                </value>
+              </objProp>
+              <stringProp name="filename"></stringProp>
+            </ResultCollector>
+            <hashTree/>
+          </hashTree>
+        </hashTree>
+      </jmeterTestPlan>
diff --git a/saga-demo/saga-k8s-resources/spring-demo/test/jmeter.yaml 
b/saga-demo/saga-k8s-resources/spring-demo/test/jmeter.yaml
new file mode 100644
index 00000000..b6312539
--- /dev/null
+++ b/saga-demo/saga-k8s-resources/spring-demo/test/jmeter.yaml
@@ -0,0 +1,54 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: spring-demo-jmeter
+  namespace: servicecomb
+spec:
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: spring-demo-jmeter
+        version: v1
+    spec:
+      containers:
+      - name: jmeter
+        image: justb4/jmeter
+        imagePullPolicy: IfNotPresent
+        # TODO ReplicaSet, ReplicationController, Deployment, Daemonset only 
allow restartPolicy to be 'Always'
+        # Maybe we should provide a custom test scheduler to scale up pods and 
let them exit naturally.
+        # restartPolicy: Never
+        args: ["-n", "-t", "/tmp/saga.jmx", "-l", 
"/tmp/jmeter-result/spring-demo.jtl"]
+        volumeMounts:
+        - name: jmeter-script
+          mountPath: /tmp/
+        - name: result-dir
+          mountPath: /tmp/jmeter-result
+        lifecycle:
+          preStop:
+            exec:
+              command: ["echo", "jmeter finished"]
+      volumes:
+        - name: jmeter-script
+          configMap:
+            name: springdemo-jmeter-script
+        - name: result-dir
+          hostPath:
+            type: DirectoryOrCreate
+            path: /saga-jmeter-result/


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to