add scripts to measure performance of PDP-D 21/57721/11
authorJim Hahn <jrh3@att.com>
Thu, 26 Jul 2018 14:46:26 +0000 (10:46 -0400)
committerJim Hahn <jrh3@att.com>
Fri, 3 Aug 2018 18:01:32 +0000 (14:01 -0400)
Also changed tabs to spaces in scripts.
Fix typo in script name: "performace" -> "performance".
Add comments to uebtime.sh.
Removed comments about "wait".
Added "mt" to report script name.
Updated comments in both scripts.
Renamed jmeter script.
Modified uebtime.sh to scan zipped network files, too, and then combined
uebtime.sh into generate.sh.
Removed commented-out code from generate.sh.
Ignore errors from "ls network*.zip" in generate.sh.
Restructured the network.log parser and included additional request types
in the list of times it extracts from the log.
Removed unused import.
Rebased.
Removed unneeded network.log match pattern.
Added comments about matching abatements.
Renamed script to use hyphens instead of underscores, and dropped the
".sh" extension.

Change-Id: I5f8e74cec3e83d5427be03f5e684c871a038f923
Issue-ID: POLICY-888
Signed-off-by: Jim Hahn <jrh3@att.com>
testsuites/performance/pom.xml [new file with mode: 0644]
testsuites/performance/src/assembly/assembly.xml [new file with mode: 0644]
testsuites/performance/src/main/resources/amsterdam/generate-mt-performance-report [new file with mode: 0644]
testsuites/performance/src/main/resources/amsterdam/policyMTPerformanceTestPlan.jmx [new file with mode: 0644]
testsuites/pom.xml

diff --git a/testsuites/performance/pom.xml b/testsuites/performance/pom.xml
new file mode 100644 (file)
index 0000000..0d8f9ba
--- /dev/null
@@ -0,0 +1,51 @@
+<!--
+  ============LICENSE_START=======================================================
+  performance
+  ================================================================================
+  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed 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.
+  ============LICENSE_END=========================================================
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.policy.drools-applications</groupId>
+        <artifactId>testsuites</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>performance</artifactId>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>create-distribution</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/assembly/assembly.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/testsuites/performance/src/assembly/assembly.xml b/testsuites/performance/src/assembly/assembly.xml
new file mode 100644 (file)
index 0000000..e32259d
--- /dev/null
@@ -0,0 +1,42 @@
+<!--
+  ============LICENSE_START=======================================================
+  performance
+  ================================================================================
+  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed 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.
+  ============LICENSE_END=========================================================
+  -->
+<assembly
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>performance</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <baseDirectory>/drools-applications/performance</baseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>${project.basedir}/src/main/resources/amsterdam/</directory>
+            <outputDirectory>tests/amsterdam</outputDirectory>
+            <includes>
+                <include>*.jmx</include>
+                <include>*.sh</include>
+            </includes>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0644</fileMode>
+            <filtered>true</filtered>
+        </fileSet>
+    </fileSets>
+</assembly>
diff --git a/testsuites/performance/src/main/resources/amsterdam/generate-mt-performance-report b/testsuites/performance/src/main/resources/amsterdam/generate-mt-performance-report
new file mode 100644 (file)
index 0000000..16f1bc8
--- /dev/null
@@ -0,0 +1,611 @@
+#!/bin/bash
+
+#
+# Copyright (C) 2018 AT&T. All rights reserved.
+#
+# Licensed 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.
+
+# The aim of this script is to collect performance metric for policies
+# running in PDP-D.
+#
+# Pre-requisites:
+#
+# Get the JMeter Multi-threaded Performance test plan (see below link).
+#
+# https://gerrit.onap.org/r/gitweb?p=policy/drools-applications.git;a=blob;f=testsuites/performance/src/main/resources/amsterdam/policyMTPerformanceTestPlan.jmx;hb=refs/heads/master
+#
+# How to run:
+# 1: Copy this script to drools container
+# 2: Remove (or save) existing network*zip files found in logging directory
+# 3: Truncate (and save?) existing audit.log file found in logging directory
+# 4: Run the performance jmeter script to completion
+# 5: Pass following parameters to run this script
+#    - log-dir : the complete directory location of network.log and audit.log
+#
+# Sample command for running the script:
+#   ./generate_mt_performance_report.sh -l /var/log/onap/policy/pdpd
+# Note: -h or --help can be used to display details about input parameters.
+#
+# How it works
+# The script will parse the network log files at the specified location
+# and match outgoing requests with incoming responses and then calculate
+# the time taken for each request to complete.  The total time is recorded
+# for each request id.
+# Once that completes, it then scans the audit log files, matches request IDs
+# with those found in the network files, and reports the average elapsed
+# time for each ONSET type, after subtracting the network time.
+
+usage()
+{
+_msg_="$@"
+scriptname=$(basename $0)
+
+cat<<-USAGE
+
+Command Arguments:
+
+-l
+ Mandatory argument. Directory location of network logs.
+
+-h
+ Optional argument.  Display this usage.
+
+USAGE
+
+}
+
+while getopts "hl:" OPT "$@"
+do
+    case $OPT in
+    h)
+        usage
+        exit 0
+        ;;
+    l)
+        LOGDIR="$OPTARG"
+        ;;
+    *)
+        usage
+        exit 1
+        ;;
+    esac
+done
+
+if [ -z "$LOGDIR" ]; then
+    usage
+    exit 1
+fi
+
+
+python - <<PYTHON
+
+import subprocess
+import re
+import time
+import calendar
+import logging
+
+logging.basicConfig(format="%(message)s")
+logger = logging.getLogger("diff")
+logger.setLevel(logging.INFO)
+
+class Data:
+    """
+    A little bit of data associated with a single request.  This is only
+    used for some request types.
+    """
+    
+    def __init__(self, reqid, nexpected):
+        self.reqid = reqid
+        
+        # number of matches expected before this object is discarded
+        self.nexpected = nexpected
+        
+        # time when the request began
+        self.begin = None
+
+    def complete(self):
+        """
+        Indicates that the request has completed.  Returns true if no more
+        requests are expected
+        """
+        self.begin = None
+        self.nexpected -= 1
+        return self.nexpected <= 0
+        
+class NetworkLogParser:
+    """
+    Used to parse network.log.  Various request types are identified
+    within the network.log using pattern matching.
+
+    AAI
+        <begin-time-stamp> OUT.AAI
+            "vnf-id": "vnf-<request-id>"; OR
+            "vserver-name": "vserver-<request-id>"
+        <end-time-stamp> IN.AAI
+            (takes the first one after OUT.AAI)
+            
+    ABATEMENT
+        <begin-time-stamp> OUT.UEB.POLICY-CL-MGT
+            "requestId": "<request-id>"
+            "policyName": "...APPC.LCM.RESPONSE"
+        <end-time-stamp> IN.UEB.DCAE_CL_OUTPUT
+            "closedLoopEventStatus": "ABATED"
+            "RequestID": "<matching-request-id>"
+     
+    APPC-CL
+        <begin-time-stamp> OUT.UEB.APPC-CL
+            "RequestID": "<request-id>"
+        <end-time-stamp> IN.UEB.APPC-CL
+            "RequestID": "<matching-request-id>"
+     
+    APPC-LCM
+        <begin-time-stamp> OUT.UEB.APPC-LCM-READ
+            "request-id": "<request-id>"
+        <end-time-stamp> IN.UEB.APPC-LCM-WRITE
+            "request-id": "<matching-request-id>"
+            
+    GUARD
+        <begin-time-stamp> OUT.UEB.POLICY-CL-MGT
+            "requestId": "<request-id>"
+            "policyName": "...GUARD_NOT_YET_QUERIED"
+        <end-time-stamp> OUT.UEB.POLICY-CL-MGT
+            "requestId": "<request-id>"
+            "policyName": "...GUARD.RESPONSE"
+     
+    SO
+        OUT.UEB.POLICY-CL-MGT
+            "requestId": "<request-id>"
+            "message": "actor=SO,..."
+        <begin-time-stamp> <thread-id> OUT.SO
+            (takes the first one after OUT.UEB.POLICY-CL-MGT)
+        <end-time-stamp> <matching-thread-id> IN.SO
+     
+    VFC
+        <begin-time-stamp> <thread-id> OUT.VFC url contains vserver-name-ssi-<request-id>
+        <end-time-stamp> <matching-thread-id> IN.VFC (vserver response)
+        <begin-time-stamp> <matching-thread-id> OUT.VFC (jobs request)
+        <end-time-stamp> <matching-thread-id> IN.VFC (jobs response)
+    """
+
+    def __init__(self):
+
+        # maps a request id to the time when the notification was received
+        self.req2begin = {}
+
+        # maps a request id to the total time from notification to response.
+        # some requests (e.g., vCPE) may include more than one notification/response
+        # pair in this total
+        self.req2total = {}
+
+        # latest AAI request ids, added as requests are seen and popped
+        # as requests are completed
+        self.aai_reqid = []
+        
+        # latest actor data, added when actor=SO is seen and moved to
+        # so_thread_data when OUT.SO is seen
+        self.so_actor_data = []
+        
+        # maps a thread id of the form, "pool-63-thread-41", to its SO Data
+        self.so_thread_data = {}
+        
+        # maps a thread id of the form, "Thread-11382", to its VFC Data
+        self.vfc_thread_data = {}
+
+        # time associated with last IN/OUT line
+        self.tm = None
+        
+        # current parser state, if parsing the body of a message, None
+        # otherwise
+        self.state = None
+        
+        # request id associated with last IN/OUT line
+        self.reqid = None
+        
+        # regular expression to match leading time stamp
+        timestamp_re = '[[]([^|]+).*'
+        
+        # regular expression to match thread id appearing before IN/OUT
+        thread_re = '\\|([^|]+)\\]\\['
+        
+        # list of [method, pattern]
+        # when the pattern is matched, the given method is invoked.
+        # during compilation, the number of capture groups + 1 is added to
+        # the end of each list
+        self.actions = [
+            [NetworkLogParser.out_notify, timestamp_re + '(?:OUT.UEB.*POLICY-CL)'],
+            [NetworkLogParser.out_appc, timestamp_re + '(?:OUT.UEB.*APPC)'],
+            [NetworkLogParser.in_appc, timestamp_re + '(?:IN.UEB.*APPC)'],
+            [NetworkLogParser.in_dcae, timestamp_re + '(?:IN.UEB.*DCAE_CL_OUTPUT)'],
+            [NetworkLogParser.out_aai, timestamp_re + '(?:OUT.AAI)'],
+            [NetworkLogParser.in_aai, timestamp_re + '(?:IN.AAI)'],
+            [NetworkLogParser.out_vfc, timestamp_re + thread_re + '(?:OUT.VFC)(?:.*vserver-name-ssi-([^/]+))?'],
+            [NetworkLogParser.in_vfc, timestamp_re + thread_re + '(?:IN.VFC)'],
+            [NetworkLogParser.in_abated, '.*"closedLoopEventStatus"[: ]+"ABATED"'],
+            [NetworkLogParser.request_id, '.*"(?:requestId|request-id|RequestID|requestID)"[: ]+"([^"]+)"'],
+            [NetworkLogParser.appc_lcm_response, '.*"policyName"(?:.*)[.]APPC.LCM.RESPONSE'],
+            [NetworkLogParser.out_guard, '.*"policyName"(?:.*)[.]GUARD_NOT_YET_QUERIED'],
+            [NetworkLogParser.in_guard, '.*"policyName"(?:.*)[.]GUARD.RESPONSE'],
+            [NetworkLogParser.vnf_vserver, '.*"vnf-id"[: ]+"vnf-([^"]+)"'],
+            [NetworkLogParser.vnf_vserver, '.*"vserver-name"[: ]+"vserver-([^"]+)"'],
+            [NetworkLogParser.actor_so, '.*"actor=SO,'],
+            [NetworkLogParser.out_so, timestamp_re + thread_re + '(?:OUT.SO)'],
+            [NetworkLogParser.in_so, timestamp_re + thread_re + '(?:IN.SO)'],
+            [NetworkLogParser.out_in_ueb, timestamp_re + '(?:(?:OUT|IN).UEB)'],
+            ]
+        
+        # pattern to match a date and extract the millisecond portion
+        self.datepat = re.compile("^(20[^|]*)[.](\\d+)([^|]+)$")
+        
+        # compile the actions into a single pattern
+        netpat = ""
+        for action in self.actions:
+            actpat = action[1]
+                        
+            # append capture group count + 1 to the end of the action
+            action.append(re.compile(actpat).groups + 1)
+            
+            # append the pattern to the combined pattern
+            if netpat != "":
+                netpat += "|"
+            netpat += "(" + actpat + ")"
+            
+        # Pattern for network.log files
+        self.netpat = re.compile(netpat)
+    
+    def total(self, reqid):
+        """
+        Returns the total network time for a request, or None, if no network
+        time has been determined for the request
+        """
+        if reqid in self.req2total:
+            return self.req2total[reqid]
+            
+        else:
+            return None
+
+    def detm_network_times(self):
+        """
+        Scans network log files, computing time differences between requests
+        and their corresponding responses.
+        Updates req2total, accordingly.
+        """
+    
+        proc = subprocess.Popen(["bash", "-c",
+                    "(ls -rth $LOGDIR/network*zip | xargs -n1 zcat) 2>/dev/null; " +
+                        "cat $LOGDIR/network.log"],
+                    stdout=subprocess.PIPE)
+    
+        netpat = self.netpat
+        actions = self.actions
+        
+        for line in proc.stdout:
+            result = netpat.match(line)
+            if not result:
+                continue
+            
+            # find the matching action and then apply its method
+            i = 1
+            for action in actions:
+                if result.group(i):
+                    method = action[0]
+                    method(self, line, result, i)
+                    break
+                
+                i += action[-1]
+
+    def out_notify(self, line, result, i):
+        """ matched OUT line, which starts with a timestamp """
+        self.tm = self.date_to_ms(result.group(i+1))
+        self.state = "out"
+        logger.debug("out %s", self.tm)
+
+    def out_appc(self, line, result, i):
+        """ matched APPC OUT line, which starts with a timestamp """
+        self.tm = self.date_to_ms(result.group(i+1))
+        self.state = "out-appc"
+        logger.debug("appc out %s", self.tm)
+
+    def in_appc(self, line, result, i):
+        """ matched APPC IN line, which starts with a timestamp """
+        self.tm = self.date_to_ms(result.group(i+1))
+        self.state = "in-appc"
+        logger.debug("appc in %s", self.tm)
+
+    def in_dcae(self, line, result, i):
+        """ matched DCAE_CL_OUTPUT IN line, which starts with a timestamp """
+        self.tm = self.date_to_ms(result.group(i+1))
+        self.state = "in-dcae"
+        logger.debug("dcae in %s", self.tm)
+
+    def out_aai(self, line, result, i):
+        """ matched AAI OUT line, which starts with a timestamp """
+        self.tm = self.date_to_ms(result.group(i+1))
+        self.state = "out-aai"
+        logger.debug("aai out %s", self.tm)
+
+    def in_aai(self, line, result, i):
+        """ matched AAI IN line, which starts with a timestamp """
+        tm = self.date_to_ms(result.group(i+1))
+        self.state = None
+        if len(self.aai_reqid) > 0:
+            reqid = self.aai_reqid.pop()
+            self.update_diff("aai", reqid, tm)
+            logger.debug("aai in %s", tm)
+        else:
+            logger.debug("unmatched aai in")
+    
+    def out_vfc(self, line, result, i):
+        """ matched VFC OUT line, which starts with a timestamp """
+        tm = self.date_to_ms(result.group(i+1))
+        tid = result.group(i+2)
+        reqid = result.group(i+3)
+        
+        if reqid:
+            self.add_out("vfc", [Data(reqid,2)], self.vfc_thread_data, tid, tm)            
+        else:
+            self.update_out("vfc", tid, self.vfc_thread_data, tm)
+                
+        self.state = None
+    
+    def in_vfc(self, line, result, i):
+        """ matched VFC IN line, which starts with a timestamp """
+        tm = self.date_to_ms(result.group(i+1))
+        tid = result.group(i+2)
+        self.finish_in("vfc", self.vfc_thread_data, tid, tm)
+        self.state = None
+    
+    def in_abated(self, line, result, i):
+        """
+        matched ABATED line
+        """
+        if self.state == "in-dcae":
+            self.state = "in-abatement"
+            logger.debug("abatement in %s", self.tm)
+    
+    def request_id(self, line, result, i):
+        """ matched a request id field """
+        if self.state == "out":
+            # matched request id in OUT message
+            self.reqid = result.group(i+1)
+            logger.debug("out reqid: %s", self.reqid)
+            
+        elif self.state == "out-appc":
+            reqid = result.group(i+1)
+            self.req2begin[reqid] = self.tm
+            logger.debug("out appc reqid: %s", reqid)
+            
+        elif self.state == "in-appc":
+            self.update_diff("appc", result.group(i+1), self.tm)
+            self.state = None
+            
+        elif self.state == "in-abatement":
+            # matched request id in IN message
+            self.update_diff("abatement", result.group(i+1), self.tm)
+            self.state = None
+    
+    def appc_lcm_response(self, line, result, i):
+        """
+        matched APPC.LCM.RESPONSE in notification message.
+        this precedes an ABATEMENT
+        """
+        if self.reqid:
+            self.req2begin[self.reqid] = self.tm
+            logger.debug("await abatement")
+        else:
+            logger.debug("unknown abatement")
+    
+    def out_guard(self, line, result, i):
+        """
+        matched GUARD_NOT_YET_QUERIED in notification message.
+        """
+        if self.reqid:
+            self.req2begin[self.reqid] = self.tm
+            logger.debug("await guard")
+        else:
+            logger.debug("unknown guard")
+    
+    def in_guard(self, line, result, i):
+        """
+        matched GUARD.RESPONSE in notification message.
+        """
+        self.update_diff("guard", self.reqid, self.tm)
+    
+    def vnf_vserver(self, line, result, i):
+        """ matched vnf-id or vserver-name """
+        if self.state == "out-aai":
+            # matched within AAI OUT message
+            reqid = result.group(i+1)
+            self.req2begin[reqid] = self.tm
+            self.aai_reqid.append(reqid)
+            logger.debug("await aai vnf-id")
+    
+    def actor_so(self, line, result, i):
+        """ matched actor=SO """
+        self.add_req("so", self.so_actor_data, 1)
+        self.state = None
+    
+    def out_so(self, line, result, i):
+        """ matched OUT|SO """
+        tm = self.date_to_ms(result.group(i+1))
+        tid = result.group(i+2)
+        self.add_out("so", self.so_actor_data, self.so_thread_data, tid, tm)
+        self.state = None
+    
+    def in_so(self, line, result, i):
+        """ matched IN|SO """
+        tm = self.date_to_ms(result.group(i+1))
+        tid = result.group(i+2)
+        self.finish_in("so", self.so_thread_data, tid, tm)
+        self.state = None
+    
+    def out_in_ueb(self, line, result, i):
+        """ matched irrelevant IN/OUT message """
+        logger.debug("clear")
+        self.state = None
+        self.reqid = None
+        self.tm = None
+
+    def date_to_ms(self, dtstr):
+        """
+        converts a date string to milliseconds
+        """        
+        result = self.datepat.match(dtstr)
+        tm = result.group(1) + result.group(3)
+        tm = time.strptime(tm, "%Y-%m-%dT%H:%M:%S+00:00")
+        tm = calendar.timegm(tm)
+        tm = tm * 1000 + int(result.group(2))
+        return tm
+
+    def update_diff(self, reqtype, reqid, tend):
+        """
+        Updates req2total and req2begin, based on the total time used by the
+        given request
+        """        
+        logger.debug("reqid #2: %s", reqid)
+    
+        if reqid in self.req2begin:
+            logger.debug("matched %s", reqid)
+            diff = tend - self.req2begin[reqid]
+    
+            if reqid in self.req2total:
+                self.req2total[reqid] += diff
+            else:
+                self.req2total[reqid] = diff
+    
+            logger.debug("%s %s total %s", reqtype, diff, self.req2total[reqid])
+            del self.req2begin[reqid]
+    
+        else:
+            logger.debug("unmatched %s", reqid)
+
+    def add_req(self, actor, actor_data, nexpected):
+        """
+        Adds request data for a particular actor
+        """        
+        if self.state == "out" and self.reqid:
+            # matched action=<actor> in POLICY OUT message
+            actor_data.append(Data(self.reqid, nexpected))
+            logger.debug("%s actor", actor)
+        else:
+            logger.debug("unmatched %s actor", actor)
+
+    def add_out(self, actor, actor_data, thread_data, tid, tm):
+        """
+        Adds data associated with the OUT message for an actor
+        """        
+        if tid:
+            if len(actor_data) > 0:
+                d = actor_data.pop()
+                d.begin = tm
+                thread_data[tid] = d
+                logger.debug("%s out %s %s begin %s", actor, d.reqid, tid, tm)
+            else:
+                logger.debug("unmatched %s out %s", actor, tid)
+        else:
+            logger.debug("unmatched %s out", actor)
+
+    def update_out(self, actor, tid, thread_data, tm):
+        """
+        Updates data associated with the OUT message for an actor
+        """        
+        if tid:
+            if tid in thread_data:
+                d = thread_data[tid]
+                d.begin = tm
+                logger.debug("%s out %s begin %s (repeat) %s", actor, d.reqid, tid, tm)
+            else:
+                logger.debug("unmatched %s out (repeat) %s", actor, tid)
+        else:
+            logger.debug("unmatched %s out (repeat)", actor)
+
+    def finish_in(self, actor, thread_data, tid, tm):
+        """
+        Finishes data associated with the IN message for an actor
+        """    
+        if tid:
+            if tid in thread_data:
+                d = thread_data[tid]
+                if d.begin:
+                    self.req2begin[d.reqid] = d.begin
+                    self.update_diff(actor, d.reqid, tm)
+                else:
+                    logger.debug("unmatched %s in begin %s", actor, tid)
+                    
+                if d.complete():
+                    del thread_data[tid]
+                    logger.debug("removed %s in %s", actor, tid)
+            else:
+                logger.debug("unmatched %s in %s", actor, tid)
+        else:
+            logger.debug("unmatched %s in", actor)
+
+
+def gen_audit_times(net_log, event_type, grep_cmd):
+    """
+    Scans audit log files and reports average elapsed time
+    """    
+    global logger
+
+    # used to compute averages for requests having matching network times
+    mat_total = 0
+    mat_count = 0
+    
+    # used to compute averages for requests that are unmatched
+    un_total = 0
+    un_count = 0
+
+    proc = subprocess.Popen(["bash", "-c",
+                "((ls -rth $LOGDIR/audit*zip | xargs -n1 zgrep " + event_type +
+                    ") 2>/dev/null; " +
+                    "grep " + event_type + " $LOGDIR/audit.log) " +
+                    "| grep COMPLETE " +
+                    grep_cmd +
+                    "| awk -F'|' '{ print \$1, \$7}' " +
+                    "| tail -10000"],
+                stdout=subprocess.PIPE)
+
+    for line in proc.stdout:
+        (reqid,elapsed) = line.split(" ")
+
+        total = net_log.total(reqid)
+        if total:
+            logger.debug("audit reqid %s: %s %s", reqid, elapsed, total)
+            mat_total += int(elapsed) - total
+            mat_count += 1
+
+        else:
+            logger.debug("audit unmatched reqid %s: %s", reqid, elapsed)
+            un_total += int(elapsed)
+            un_count += 1
+
+    print "Elapsed time for", event_type, ":"
+    if mat_count > 0:
+        print "  matched", mat_count, "samples, average", mat_total/mat_count, "ms"
+    if un_count > 0:
+        print "  unmatched", un_count, "samples, average", un_total/un_count, "ms"
+
+    print
+
+
+# scan all network log files, recording network times for each request id
+nlp = NetworkLogParser()
+nlp.detm_network_times()
+
+# scan audit log files and report elapsed time for each ONSET type
+gen_audit_times(nlp, "vCPE", '| grep generic-vnf.vnf-id')
+gen_audit_times(nlp, "vFirewall", '| grep generic-vnf.vnf-id')
+gen_audit_times(nlp, "vDNS", '| grep vserver.vserver-name')
+gen_audit_times(nlp, "VOLTE", '')
+
+PYTHON
diff --git a/testsuites/performance/src/main/resources/amsterdam/policyMTPerformanceTestPlan.jmx b/testsuites/performance/src/main/resources/amsterdam/policyMTPerformanceTestPlan.jmx
new file mode 100644 (file)
index 0000000..660e468
--- /dev/null
@@ -0,0 +1,1393 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  performance
+  ================================================================================
+  Copyright (C) 2018 AT&T. All rights reserved.
+  ================================================================================
+  Licensed 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.
+  ============LICENSE_END=========================================================
+  -->
+<jmeterTestPlan version="1.2" properties="3.1" jmeter="3.1 r1770033">
+  <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>
+      <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="set test params" enabled="true">
+        <collectionProp name="Arguments.arguments">
+          <elementProp name="threads" elementType="Argument">
+            <stringProp name="Argument.name">threads</stringProp>
+            <stringProp name="Argument.value">10</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="loops" elementType="Argument">
+            <stringProp name="Argument.name">loops</stringProp>
+            <stringProp name="Argument.value">1000</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="rampUpSec" elementType="Argument">
+            <stringProp name="Argument.name">rampUpSec</stringProp>
+            <stringProp name="Argument.value">10</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="failures" elementType="Argument">
+            <stringProp name="Argument.name">failures</stringProp>
+            <stringProp name="Argument.value">false</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="vcpe" elementType="Argument">
+            <stringProp name="Argument.name">vcpe</stringProp>
+            <stringProp name="Argument.value">true</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="vdns" elementType="Argument">
+            <stringProp name="Argument.name">vdns</stringProp>
+            <stringProp name="Argument.value">true</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="vfw" elementType="Argument">
+            <stringProp name="Argument.name">vfw</stringProp>
+            <stringProp name="Argument.value">true</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="volte" elementType="Argument">
+            <stringProp name="Argument.name">volte</stringProp>
+            <stringProp name="Argument.value">true</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="pdpdServer" elementType="Argument">
+            <stringProp name="Argument.name">pdpdServer</stringProp>
+            <stringProp name="Argument.value">dev-drools-0</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="uebServer" elementType="Argument">
+            <stringProp name="Argument.name">uebServer</stringProp>
+            <stringProp name="Argument.value">message-router</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="notifyTopic" elementType="Argument">
+            <stringProp name="Argument.name">notifyTopic</stringProp>
+            <stringProp name="Argument.value">POLICY-CL-MGT</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="eventTopic" elementType="Argument">
+            <stringProp name="Argument.name">eventTopic</stringProp>
+            <stringProp name="Argument.value">unauthenticated.DCAE_CL_OUTPUT</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="appcRespTopic" elementType="Argument">
+            <stringProp name="Argument.name">appcRespTopic</stringProp>
+            <stringProp name="Argument.value">APPC-LCM-WRITE</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="appcRespTopic2" elementType="Argument">
+            <stringProp name="Argument.name">appcRespTopic2</stringProp>
+            <stringProp name="Argument.value">APPC-CL</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="vCPEName" elementType="Argument">
+            <stringProp name="Argument.name">vCPEName</stringProp>
+            <stringProp name="Argument.value">ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="vDNSName" elementType="Argument">
+            <stringProp name="Argument.name">vDNSName</stringProp>
+            <stringProp name="Argument.value">ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="vFWName" elementType="Argument">
+            <stringProp name="Argument.name">vFWName</stringProp>
+            <stringProp name="Argument.value">ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+          <elementProp name="VOLTEName" elementType="Argument">
+            <stringProp name="Argument.name">VOLTEName</stringProp>
+            <stringProp name="Argument.value">ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b</stringProp>
+            <stringProp name="Argument.metadata">=</stringProp>
+          </elementProp>
+        </collectionProp>
+      </Arguments>
+      <hashTree/>
+      <AuthManager guiclass="AuthPanel" testclass="AuthManager" testname="HTTP Authorization Manager - PDPD" enabled="true">
+        <collectionProp name="AuthManager.auth_list">
+          <elementProp name="" elementType="Authorization">
+            <stringProp name="Authorization.url">http://${pdpdServer}:9696/</stringProp>
+            <stringProp name="Authorization.username">@1b3rt</stringProp>
+            <stringProp name="Authorization.password">31nst31n</stringProp>
+            <stringProp name="Authorization.domain"></stringProp>
+            <stringProp name="Authorization.realm"></stringProp>
+          </elementProp>
+        </collectionProp>
+      </AuthManager>
+      <hashTree/>
+      <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults - PDPD" 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">${pdpdServer}</stringProp>
+        <stringProp name="HTTPSampler.port">9696</stringProp>
+        <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+        <stringProp name="HTTPSampler.response_timeout"></stringProp>
+        <stringProp name="HTTPSampler.protocol">http</stringProp>
+        <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+        <stringProp name="HTTPSampler.path"></stringProp>
+        <stringProp name="HTTPSampler.concurrentPool">6</stringProp>
+      </ConfigTestElement>
+      <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>
+          <stringProp name="LoopController.loops">1</stringProp>
+        </elementProp>
+        <stringProp name="ThreadGroup.num_threads">${threads}</stringProp>
+        <stringProp name="ThreadGroup.ramp_time">${rampUpSec}</stringProp>
+        <longProp name="ThreadGroup.start_time">1525540233000</longProp>
+        <longProp name="ThreadGroup.end_time">1525540233000</longProp>
+        <boolProp name="ThreadGroup.scheduler">false</boolProp>
+        <stringProp name="ThreadGroup.duration"></stringProp>
+        <stringProp name="ThreadGroup.delay"></stringProp>
+      </ThreadGroup>
+      <hashTree>
+        <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="declare request params" enabled="true">
+          <collectionProp name="Arguments.arguments">
+            <elementProp name="requestId" elementType="Argument">
+              <stringProp name="Argument.name">requestId</stringProp>
+              <stringProp name="Argument.value"></stringProp>
+              <stringProp name="Argument.metadata">=</stringProp>
+            </elementProp>
+            <elementProp name="vnfId" elementType="Argument">
+              <stringProp name="Argument.name">vnfId</stringProp>
+              <stringProp name="Argument.value"></stringProp>
+              <stringProp name="Argument.metadata">=</stringProp>
+            </elementProp>
+            <elementProp name="consumerGroup" elementType="Argument">
+              <stringProp name="Argument.name">consumerGroup</stringProp>
+              <stringProp name="Argument.value"></stringProp>
+              <stringProp name="Argument.metadata">=</stringProp>
+            </elementProp>
+          </collectionProp>
+        </Arguments>
+        <hashTree/>
+        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Establish consumer group with DMaaP" 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">${uebServer}</stringProp>
+          <stringProp name="HTTPSampler.port">3904</stringProp>
+          <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+          <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+          <stringProp name="HTTPSampler.protocol"></stringProp>
+          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+          <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1?timeout=5000&amp;limit=1</stringProp>
+          <stringProp name="HTTPSampler.method">GET</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>
+          <boolProp name="HTTPSampler.monitor">false</boolProp>
+          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+        </HTTPSamplerProxy>
+        <hashTree>
+          <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate thread params" enabled="true">
+            <stringProp name="scriptLanguage">groovy</stringProp>
+            <stringProp name="parameters"></stringProp>
+            <stringProp name="filename"></stringProp>
+            <stringProp name="cacheKey"></stringProp>
+            <stringProp name="script">import java.util.UUID;
+vars.put(&quot;consumerGroup&quot;, &quot;policy-${__machineName}-${__threadNum}&quot;);
+</stringProp>
+          </JSR223PreProcessor>
+          <hashTree/>
+          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert poll succeeded" enabled="true">
+            <collectionProp name="Asserion.test_strings">
+              <stringProp name="2829691">\[.*</stringProp>
+            </collectionProp>
+            <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+            <boolProp name="Assertion.assume_success">false</boolProp>
+            <intProp name="Assertion.test_type">1</intProp>
+          </ResponseAssertion>
+          <hashTree/>
+        </hashTree>
+        <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">true</boolProp>
+          <stringProp name="LoopController.loops">${loops}</stringProp>
+        </LoopController>
+        <hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="vCPE Use Case" enabled="true">
+            <stringProp name="IfController.condition">${vcpe}</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+            <boolProp name="IfController.useExpression">true</boolProp>
+          </IfController>
+          <hashTree>
+            <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="vCPE SUCCESS Use Case" enabled="true"/>
+            <hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ONSET" 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">{&#xd;
+  &quot;closedLoopControlName&quot;: &quot;${vCPEName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;: 1463679805324,&#xd;
+  &quot;closedLoopEventClient&quot;: &quot;DCAE_INSTANCE_ID.dcae-tca&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;: &quot;ONSET&quot;,&#xd;
+  &quot;requestID&quot;: &quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;: &quot;VNF&quot;,&#xd;
+  &quot;target&quot;: &quot;generic-vnf.vnf-id&quot;,&#xd;
+  &quot;AAI&quot;: {&#xd;
+       &quot;vserver.is-closed-loop-disabled&quot;: &quot;false&quot;,&#xd;
+       &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;&#xd;
+  },&#xd;
+  &quot;from&quot;: &quot;DCAE&quot;,&#xd;
+  &quot;version&quot;: &quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate request params" enabled="true">
+                  <stringProp name="scriptLanguage">groovy</stringProp>
+                  <stringProp name="parameters"></stringProp>
+                  <stringProp name="filename"></stringProp>
+                  <stringProp name="cacheKey"></stringProp>
+                  <stringProp name="script">import java.util.UUID;
+String reqid = UUID.randomUUID().toString();
+vars.put(&quot;requestId&quot;, reqid);
+vars.put(&quot;vnfId&quot;, &quot;vnf-&quot;+reqid);
+</stringProp>
+                </JSR223PreProcessor>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await APPC begin" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;EndsWith&quot;, &quot;string&quot;:&quot;${policyName}&quot;, &quot;value&quot;:&quot;GUARD_PERMITTED&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert start notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="APPC Response" 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">{&#xd;
+  &quot;body&quot;: {&#xd;
+    &quot;output&quot;: {&#xd;
+      &quot;common-header&quot;: {&#xd;
+        &quot;timestamp&quot;: &quot;2017-08-25T21:06:23.037Z&quot;,&#xd;
+        &quot;api-ver&quot;: &quot;5.00&quot;,&#xd;
+        &quot;originator-id&quot;: &quot;${requestId}&quot;,&#xd;
+        &quot;request-id&quot;: &quot;${requestId}&quot;,&#xd;
+        &quot;sub-request-id&quot;: &quot;1&quot;,&#xd;
+        &quot;flags&quot;: {}&#xd;
+      },&#xd;
+      &quot;status&quot;: {&#xd;
+        &quot;code&quot;: 400,&#xd;
+        &quot;message&quot;: &quot;Restart Successful&quot;&#xd;
+      }&#xd;
+    }&#xd;
+  },&#xd;
+  &quot;version&quot;: &quot;2.0&quot;,&#xd;
+  &quot;rpc-name&quot;: &quot;restart&quot;,&#xd;
+  &quot;correlation-id&quot;: &quot;664be3d2-6c12-4f4b-a3e7-c349acced200-1&quot;,&#xd;
+  &quot;type&quot;: &quot;response&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${appcRespTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await APPC finish" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;EndsWith&quot;, &quot;string&quot;:&quot;${policyName}&quot;, &quot;value&quot;:&quot;APPC.LCM.RESPONSE&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert finish notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ABATEMENT" 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">{&#xd;
+  &quot;closedLoopControlName&quot;: &quot;${vCPEName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;: 1463679805324,&#xd;
+  &quot;closedLoopAlarmEnd&quot;: 1463699805324,&#xd;
+  &quot;closedLoopEventClient&quot;: &quot;DCAE_INSTANCE_ID.dcae-tca&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;: &quot;ABATED&quot;,&#xd;
+  &quot;requestID&quot;: &quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;: &quot;VNF&quot;,&#xd;
+  &quot;target&quot;: &quot;generic-vnf.vnf-id&quot;,&#xd;
+  &quot;AAI&quot;: {&#xd;
+    &quot;vserver.is-closed-loop-disabled&quot;: &quot;false&quot;,&#xd;
+    &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;&#xd;
+  },&#xd;
+  &quot;from&quot;: &quot;DCAE&quot;,&#xd;
+  &quot;version&quot;: &quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await FINAL" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;notification&quot;, &quot;value&quot;:&quot;FINAL: SUCCESS&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert final notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+            </hashTree>
+            <IfController guiclass="IfControllerPanel" testclass="IfController" testname="vCPE FAILURE Use Case" enabled="true">
+              <stringProp name="IfController.condition">${failures}</stringProp>
+              <boolProp name="IfController.evaluateAll">false</boolProp>
+              <boolProp name="IfController.useExpression">true</boolProp>
+            </IfController>
+            <hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ONSET" 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">{&#xd;
+  &quot;closedLoopControlName&quot;: &quot;${vCPEName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;: 1463679805324,&#xd;
+  &quot;closedLoopEventClient&quot;: &quot;DCAE_INSTANCE_ID.dcae-tca&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;: &quot;ONSET&quot;,&#xd;
+  &quot;requestID&quot;: &quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;: &quot;VNF&quot;,&#xd;
+  &quot;target&quot;: &quot;generic-vnf.vnf-id&quot;,&#xd;
+  &quot;AAI&quot;: {&#xd;
+       &quot;vserver.is-closed-loop-disabled&quot;: &quot;false&quot;,&#xd;
+       &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;&#xd;
+  },&#xd;
+  &quot;from&quot;: &quot;DCAE&quot;,&#xd;
+  &quot;version&quot;: &quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate request params" enabled="true">
+                  <stringProp name="scriptLanguage">groovy</stringProp>
+                  <stringProp name="parameters"></stringProp>
+                  <stringProp name="filename"></stringProp>
+                  <stringProp name="cacheKey"></stringProp>
+                  <stringProp name="script">import java.util.UUID;
+String reqid = UUID.randomUUID().toString();
+vars.put(&quot;requestId&quot;, reqid);
+vars.put(&quot;vnfId&quot;, &quot;vnf-&quot;+reqid);
+</stringProp>
+                </JSR223PreProcessor>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await APPC begin" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;EndsWith&quot;, &quot;string&quot;:&quot;${policyName}&quot;, &quot;value&quot;:&quot;GUARD_PERMITTED&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert start notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="APPC Response" 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">{&#xd;
+  &quot;body&quot;: {&#xd;
+    &quot;output&quot;: {&#xd;
+      &quot;common-header&quot;: {&#xd;
+        &quot;timestamp&quot;: &quot;2017-08-25T21:06:23.037Z&quot;,&#xd;
+        &quot;api-ver&quot;: &quot;5.00&quot;,&#xd;
+        &quot;originator-id&quot;: &quot;${requestId}&quot;,&#xd;
+        &quot;request-id&quot;: &quot;${requestId}&quot;,&#xd;
+        &quot;sub-request-id&quot;: &quot;1&quot;,&#xd;
+        &quot;flags&quot;: {}&#xd;
+      },&#xd;
+      &quot;status&quot;: {&#xd;
+        &quot;code&quot;: 500,&#xd;
+        &quot;message&quot;: &quot;Restart Failed&quot;&#xd;
+      }&#xd;
+    }&#xd;
+  },&#xd;
+  &quot;version&quot;: &quot;2.0&quot;,&#xd;
+  &quot;rpc-name&quot;: &quot;restart&quot;,&#xd;
+  &quot;correlation-id&quot;: &quot;664be3d2-6c12-4f4b-a3e7-c349acced200-1&quot;,&#xd;
+  &quot;type&quot;: &quot;response&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${appcRespTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await FINAL" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;notification&quot;, &quot;value&quot;:&quot;FINAL: FAILURE&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert final notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+            </hashTree>
+          </hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="vDNS Use Case" enabled="true">
+            <stringProp name="IfController.condition">${vdns}</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+            <boolProp name="IfController.useExpression">true</boolProp>
+          </IfController>
+          <hashTree>
+            <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="vDNS SUCCESS Use Case" enabled="true"/>
+            <hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ONSET" 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">{&#xd;
+  &quot;closedLoopControlName&quot;: &quot;${vDNSName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;: 1484677482204798,&#xd;
+  &quot;closedLoopEventClient&quot;: &quot;DCAE_INSTANCE_ID.dcae-tca&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;: &quot;ONSET&quot;,&#xd;
+  &quot;requestID&quot;: &quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;: &quot;VNF&quot;,&#xd;
+  &quot;target&quot;: &quot;vserver.vserver-name&quot;,&#xd;
+  &quot;AAI&quot;: {&#xd;
+    &quot;vserver.is-closed-loop-disabled&quot;: &quot;false&quot;,&#xd;
+    &quot;vserver.vserver-name&quot;: &quot;${vserverName}&quot;&#xd;
+  },   &#xd;
+  &quot;from&quot;: &quot;DCAE&quot;,&#xd;
+  &quot;version&quot;: &quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate request params" enabled="true">
+                  <stringProp name="scriptLanguage">groovy</stringProp>
+                  <stringProp name="parameters"></stringProp>
+                  <stringProp name="filename"></stringProp>
+                  <stringProp name="cacheKey"></stringProp>
+                  <stringProp name="script">import java.util.UUID;
+String reqid = UUID.randomUUID().toString();
+vars.put(&quot;requestId&quot;, reqid);
+vars.put(&quot;vserverName&quot;, &quot;vserver-&quot;+reqid);
+</stringProp>
+                </JSR223PreProcessor>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await FINAL" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;notification&quot;, &quot;value&quot;:&quot;FINAL: SUCCESS&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert final notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+            </hashTree>
+          </hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="vFW Use Case" enabled="true">
+            <stringProp name="IfController.condition">${vfw}</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+            <boolProp name="IfController.useExpression">true</boolProp>
+          </IfController>
+          <hashTree>
+            <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="vFW SUCCESS Use Case" enabled="true"/>
+            <hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ONSET" 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">{&#xd;
+  &quot;closedLoopControlName&quot;: &quot;${vFWName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;: 1463679805324,&#xd;
+  &quot;closedLoopEventClient&quot;: &quot;microservice.stringmatcher&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;: &quot;ONSET&quot;,&#xd;
+  &quot;requestID&quot;: &quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;: &quot;VNF&quot;,&#xd;
+  &quot;target&quot;: &quot;generic-vnf.vnf-id&quot;,&#xd;
+  &quot;AAI&quot;: {&#xd;
+    &quot;generic-vnf.is-closed-loop-disabled&quot;: &quot;false&quot;,&#xd;
+    &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;&#xd;
+  },&#xd;
+  &quot;from&quot;: &quot;DCAE&quot;,&#xd;
+  &quot;version&quot;: &quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate request params" enabled="true">
+                  <stringProp name="scriptLanguage">groovy</stringProp>
+                  <stringProp name="parameters"></stringProp>
+                  <stringProp name="filename"></stringProp>
+                  <stringProp name="cacheKey"></stringProp>
+                  <stringProp name="script">import java.util.UUID;
+String reqid = UUID.randomUUID().toString();
+vars.put(&quot;requestId&quot;, reqid);
+vars.put(&quot;vnfId&quot;, &quot;vnf-&quot;+reqid);
+</stringProp>
+                </JSR223PreProcessor>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await APPC begin" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;EndsWith&quot;, &quot;string&quot;:&quot;${policyName}&quot;, &quot;value&quot;:&quot;GUARD_PERMITTED&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert start notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="APPC Response" 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">{&#xd;
+  &quot;CommonHeader&quot;: {&#xd;
+    &quot;TimeStamp&quot;: 1506051879001,&#xd;
+    &quot;APIver&quot;: &quot;1.01&quot;,&#xd;
+    &quot;RequestID&quot;: &quot;${requestId}&quot;,&#xd;
+    &quot;SubRequestID&quot;: &quot;1&quot;,&#xd;
+    &quot;RequestTrack&quot;: [],&#xd;
+    &quot;Flags&quot;: []&#xd;
+  },&#xd;
+  &quot;Status&quot;: {&#xd;
+    &quot;Code&quot;: 400,&#xd;
+    &quot;Value&quot;: &quot;SUCCESS&quot;&#xd;
+  },&#xd;
+  &quot;Payload&quot;: {&#xd;
+    &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;,&#xd;
+    &quot;pg-streams&quot;: {&#xd;
+      &quot;pg-stream&quot;: [&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp1&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp2&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp3&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp4&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp5&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        }&#xd;
+      ]&#xd;
+    }&#xd;
+  }&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${appcRespTopic2}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await FINAL" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;notification&quot;, &quot;value&quot;:&quot;FINAL: SUCCESS&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert final notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+            </hashTree>
+            <IfController guiclass="IfControllerPanel" testclass="IfController" testname="vFW FAILURE Use Case" enabled="true">
+              <stringProp name="IfController.condition">${failures}</stringProp>
+              <boolProp name="IfController.evaluateAll">false</boolProp>
+              <boolProp name="IfController.useExpression">true</boolProp>
+            </IfController>
+            <hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ONSET" 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">{&#xd;
+  &quot;closedLoopControlName&quot;: &quot;${vFWName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;: 1463679805324,&#xd;
+  &quot;closedLoopEventClient&quot;: &quot;microservice.stringmatcher&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;: &quot;ONSET&quot;,&#xd;
+  &quot;requestID&quot;: &quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;: &quot;VNF&quot;,&#xd;
+  &quot;target&quot;: &quot;generic-vnf.vnf-id&quot;,&#xd;
+  &quot;AAI&quot;: {&#xd;
+    &quot;generic-vnf.is-closed-loop-disabled&quot;: &quot;false&quot;,&#xd;
+    &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;&#xd;
+  },&#xd;
+  &quot;from&quot;: &quot;DCAE&quot;,&#xd;
+  &quot;version&quot;: &quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate request params" enabled="true">
+                  <stringProp name="scriptLanguage">groovy</stringProp>
+                  <stringProp name="parameters"></stringProp>
+                  <stringProp name="filename"></stringProp>
+                  <stringProp name="cacheKey"></stringProp>
+                  <stringProp name="script">import java.util.UUID;
+String reqid = UUID.randomUUID().toString();
+vars.put(&quot;requestId&quot;, reqid);
+vars.put(&quot;vnfId&quot;, &quot;vnf-&quot;+reqid);
+</stringProp>
+                </JSR223PreProcessor>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await APPC begin" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;EndsWith&quot;, &quot;string&quot;:&quot;${policyName}&quot;, &quot;value&quot;:&quot;GUARD_PERMITTED&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert start notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="APPC Response" 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">{&#xd;
+  &quot;CommonHeader&quot;: {&#xd;
+    &quot;TimeStamp&quot;: 1506051879001,&#xd;
+    &quot;APIver&quot;: &quot;1.01&quot;,&#xd;
+    &quot;RequestID&quot;: &quot;${requestId}&quot;,&#xd;
+    &quot;SubRequestID&quot;: &quot;1&quot;,&#xd;
+    &quot;RequestTrack&quot;: [],&#xd;
+    &quot;Flags&quot;: []&#xd;
+  },&#xd;
+  &quot;Status&quot;: {&#xd;
+    &quot;Code&quot;: 500,&#xd;
+    &quot;Value&quot;: &quot;FAILED&quot;&#xd;
+  },&#xd;
+  &quot;Payload&quot;: {&#xd;
+    &quot;generic-vnf.vnf-id&quot;: &quot;${vnfId}&quot;,&#xd;
+    &quot;pg-streams&quot;: {&#xd;
+      &quot;pg-stream&quot;: [&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp1&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp2&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp3&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp4&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        },&#xd;
+        {&#xd;
+          &quot;id&quot;: &quot;fw_udp5&quot;,&#xd;
+          &quot;is-enabled&quot;: &quot;true&quot;&#xd;
+        }&#xd;
+      ]&#xd;
+    }&#xd;
+  }&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${appcRespTopic2}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree/>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await FINAL" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;notification&quot;, &quot;value&quot;:&quot;FINAL: FAILURE&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert final notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+            </hashTree>
+          </hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="VoLTE Use Case" enabled="true">
+            <stringProp name="IfController.condition">${volte}</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+            <boolProp name="IfController.useExpression">true</boolProp>
+          </IfController>
+          <hashTree>
+            <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="VoLTE SUCCESS Use Case" enabled="true"/>
+            <hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="ONSET" 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">{  &#xd;
+  &quot;closedLoopControlName&quot;:&quot;${VOLTEName}&quot;,&#xd;
+  &quot;closedLoopAlarmStart&quot;:1484677482204798,&#xd;
+  &quot;closedLoopEventClient&quot;:&quot;DCAE.HolmesInstance&quot;,&#xd;
+  &quot;closedLoopEventStatus&quot;:&quot;ONSET&quot;,&#xd;
+  &quot;requestID&quot;:&quot;${requestId}&quot;,&#xd;
+  &quot;target_type&quot;:&quot;VM&quot;,&#xd;
+  &quot;target&quot;:&quot;vserver.vserver-name&quot;,&#xd;
+  &quot;AAI&quot;:{  &#xd;
+    &quot;vserver.is-closed-loop-disabled&quot;:&quot;false&quot;,&#xd;
+    &quot;vserver.vserver-name&quot;:&quot;${vserverName}&quot;,&#xd;
+    &quot;service-instance.service-instance-id&quot;:&quot;vserver-name-${serviceInstanceId}&quot;,&#xd;
+    &quot;generic-vnf.vnf-id&quot;:&quot;vnf-id-${serviceInstanceId}&quot;,&#xd;
+    &quot;generic-vnf.vnf-name&quot;:&quot;vnf-name-${serviceInstanceId}&quot;&#xd;
+  },&#xd;
+  &quot;from&quot;:&quot;DCAE&quot;,&#xd;
+  &quot;version&quot;:&quot;1.0.2&quot;&#xd;
+}&#xd;
+</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain"></stringProp>
+                <stringProp name="HTTPSampler.port"></stringProp>
+                <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+                <stringProp name="HTTPSampler.response_timeout"></stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">policy/pdp/engine/topics/sources/ueb/${eventTopic}/events</stringProp>
+                <stringProp name="HTTPSampler.method">PUT</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="generate request params" enabled="true">
+                  <stringProp name="scriptLanguage">groovy</stringProp>
+                  <stringProp name="parameters"></stringProp>
+                  <stringProp name="filename"></stringProp>
+                  <stringProp name="cacheKey"></stringProp>
+                  <stringProp name="script">import java.util.UUID;
+String reqid = UUID.randomUUID().toString();
+vars.put(&quot;requestId&quot;, reqid);
+vars.put(&quot;vserverName&quot;, &quot;vserver-&quot;+reqid);
+vars.put(&quot;serviceInstanceId&quot;, &quot;ssi-&quot;+reqid);
+</stringProp>
+                </JSR223PreProcessor>
+                <hashTree/>
+              </hashTree>
+              <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Await FINAL" enabled="true">
+                <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+                  <collectionProp name="Arguments.arguments">
+                    <elementProp name="filter" elementType="HTTPArgument">
+                      <boolProp name="HTTPArgument.always_encode">true</boolProp>
+                      <stringProp name="Argument.value">{&quot;class&quot;:&quot;And&quot;, &quot;filters&quot;: [ { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;requestId&quot;, &quot;value&quot;:&quot;${requestId}&quot; }, { &quot;class&quot;:&quot;Equals&quot;, &quot;field&quot;:&quot;notification&quot;, &quot;value&quot;:&quot;FINAL: SUCCESS&quot; }]}</stringProp>
+                      <stringProp name="Argument.metadata">=</stringProp>
+                      <boolProp name="HTTPArgument.use_equals">true</boolProp>
+                      <stringProp name="Argument.name">filter</stringProp>
+                    </elementProp>
+                  </collectionProp>
+                </elementProp>
+                <stringProp name="HTTPSampler.domain">${uebServer}</stringProp>
+                <stringProp name="HTTPSampler.port">3904</stringProp>
+                <stringProp name="HTTPSampler.connect_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.response_timeout">20000</stringProp>
+                <stringProp name="HTTPSampler.protocol"></stringProp>
+                <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+                <stringProp name="HTTPSampler.path">/events/${notifyTopic}/${consumerGroup}/1</stringProp>
+                <stringProp name="HTTPSampler.method">GET</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>
+                <boolProp name="HTTPSampler.monitor">false</boolProp>
+                <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+              </HTTPSamplerProxy>
+              <hashTree>
+                <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="assert final notification" enabled="true">
+                  <collectionProp name="Asserion.test_strings">
+                    <stringProp name="595233003">notification</stringProp>
+                  </collectionProp>
+                  <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+                  <boolProp name="Assertion.assume_success">false</boolProp>
+                  <intProp name="Assertion.test_type">16</intProp>
+                </ResponseAssertion>
+                <hashTree/>
+              </hashTree>
+            </hashTree>
+          </hashTree>
+        </hashTree>
+      </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="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" 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>
index 842aa00..ceccba2 100644 (file)
@@ -3,6 +3,7 @@
   testsuites
   ================================================================================
   Copyright (C) 2018 Ericsson. All rights reserved.
+  Modifications Copyright (C) 2018 AT&T. All rights reserved.
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -29,5 +30,6 @@
     <packaging>pom</packaging>
     <modules>
         <module>stability</module>
+        <module>performance</module>
     </modules>
 </project>
\ No newline at end of file