Repository: bigtop Updated Branches: refs/heads/master 64c262fca -> 66de460b8
BIGTOP-2315. Added smoke test for apex. Signed-off-by: Youngwoo Kim <yw...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/bigtop/repo Commit: http://git-wip-us.apache.org/repos/asf/bigtop/commit/66de460b Tree: http://git-wip-us.apache.org/repos/asf/bigtop/tree/66de460b Diff: http://git-wip-us.apache.org/repos/asf/bigtop/diff/66de460b Branch: refs/heads/master Commit: 66de460b80777d812cfc5f87af81d9df77ed1d40 Parents: 64c262f Author: chinmaykolhatkar <chin...@datatorrent.com> Authored: Thu Mar 3 23:08:38 2016 +0530 Committer: Youngwoo Kim <yw...@apache.org> Committed: Thu Apr 7 22:58:33 2016 +0900 ---------------------------------------------------------------------- .../smoke-tests/apex/TestApexSmoke.groovy | 117 ++++++++++++ bigtop-tests/smoke-tests/apex/build.gradle | 34 ++++ bigtop-tests/test-artifacts/apex/pom.xml | 191 +++++++++++++++++++ .../apex/src/assemble/appPackage.xml | 59 ++++++ .../java/com/example/myapexapp/Application.java | 41 ++++ .../myapexapp/ConsoleOutputOperator.java | 79 ++++++++ .../myapexapp/RandomNumberGenerator.java | 61 ++++++ .../src/main/resources/META-INF/properties.xml | 28 +++ 8 files changed, 610 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/smoke-tests/apex/TestApexSmoke.groovy ---------------------------------------------------------------------- diff --git a/bigtop-tests/smoke-tests/apex/TestApexSmoke.groovy b/bigtop-tests/smoke-tests/apex/TestApexSmoke.groovy new file mode 100644 index 0000000..dd712c2 --- /dev/null +++ b/bigtop-tests/smoke-tests/apex/TestApexSmoke.groovy @@ -0,0 +1,117 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bigtop.itest.apex + +import org.junit.BeforeClass +import org.junit.AfterClass +import org.junit.FixMethodOrder +import org.junit.runners.MethodSorters +import org.junit.Test +import static org.junit.Assert.assertTrue + +import org.apache.bigtop.itest.shell.Shell +import org.apache.bigtop.itest.TestUtils +import org.apache.commons.logging.LogFactory +import org.apache.commons.logging.Log + +import org.junit.runner.RunWith + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +class TestApexSmoke { + static private Log LOG = LogFactory.getLog(Object.class); + + static def testDir = "build/resources/test/" + static Shell sh = new Shell("/bin/bash -s"); + static appId = null; + + @AfterClass + public static void tearDown() { + sh.exec('hadoop fs -rm -r -skipTrash datatorrent'); + sh.exec('rm -rf ' + testDir); + } + + @BeforeClass + static void setUp() { + sh.exec('pushd ' + testDir, + 'mvn clean package -DskipTests', + 'popd'); + LOG.info('Setup Done. Package ready to launch.'); + } + + @Test + void test1_Start() { + String apaPath = testDir + "target/myapexapp-1.0-SNAPSHOT.apa"; + LOG.info('Starting apex application...'); + sh.exec('echo "launch ' + apaPath + '" | apex'); + + String out = sh.getOut()[1].trim(); + LOG.info("ApplicationID: " + out); + assertTrue(out.contains('{"appId": "application_')); + out = out.replace('{"appId": "', ''); + appId = out.replace('"}', ''); + LOG.info('Sleeping for 20 sec for application to start...'); + sh.exec('sleep 20'); + sh.exec("yarn application -status " + appId); + out = sh.getOut(); + for (String item : out) { + if (item.contains('Application-Id :')) { + assertTrue(item.contains(appId)); + } + if (item.contains('Application-Name :')) { + assertTrue(item.contains('MyFirstApplication')); + } + if (item.contains('Application-Type :')) { + assertTrue(item.contains('DataTorrent')); + } + else if (item.contains('State :')) { + assertTrue(item.contains('RUNNING')); + } + else if (item.contains('Final-State :')) { + assertTrue(item.contains('UNDEFINED')); + } + } + } + + @Test + void test2_Stop() { + LOG.info('Stopping apex application..'); + sh.exec('echo "shutdown-app ' + appId + '" | apex'); + LOG.info('Sleeping for 20 sec for application to stop...'); + sh.exec('sleep 20'); + sh.exec("yarn application -status " + appId); + String out = sh.getOut(); + for (String item : out) { + if (item.contains('Application-Id :')) { + assertTrue(item.contains(appId)); + } + if (item.contains('Application-Name :')) { + assertTrue(item.contains('MyFirstApplication')); + } + if (item.contains('Application-Type :')) { + assertTrue(item.contains('DataTorrent')); + } + else if (item.contains('State :')) { + assertTrue(item.contains('FINISHED')); + } + else if (item.contains('Final-State :')) { + assertTrue(item.contains('SUCCEEDED')); + } + } + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/smoke-tests/apex/build.gradle ---------------------------------------------------------------------- diff --git a/bigtop-tests/smoke-tests/apex/build.gradle b/bigtop-tests/smoke-tests/apex/build.gradle new file mode 100644 index 0000000..cd5f6c2 --- /dev/null +++ b/bigtop-tests/smoke-tests/apex/build.gradle @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * 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. + */ +def tests_to_include() { + return ["TestApexSmoke.groovy"]; +} + +sourceSets { + test { + groovy { + resources { + srcDirs = [ + "${BIGTOP_HOME}/bigtop-tests/test-artifacts/apex", + ] + } + srcDirs = [projectDir] + exclude { FileTreeElement elem -> (doExclude(elem.getName())) } + } + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/test-artifacts/apex/pom.xml ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/apex/pom.xml b/bigtop-tests/test-artifacts/apex/pom.xml new file mode 100644 index 0000000..e909d74 --- /dev/null +++ b/bigtop-tests/test-artifacts/apex/pom.xml @@ -0,0 +1,191 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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> + + <groupId>com.example</groupId> + <version>1.0-SNAPSHOT</version> + <artifactId>myapexapp</artifactId> + <packaging>jar</packaging> + + <!-- change these to the appropriate values --> + <name>My Apex Application</name> + <description>My Apex Application Description</description> + + <properties> + <!-- change this if you desire to use a different version of Apex Core --> + <apex.version>3.3.0-incubating</apex.version> + <apex.apppackage.classpath>lib/*.jar</apex.apppackage.classpath> + </properties> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>2.9</version> + <configuration> + <downloadSources>true</downloadSources> + </configuration> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.3</version> + <configuration> + <encoding>UTF-8</encoding> + <source>1.7</source> + <target>1.7</target> + <debug>true</debug> + <optimize>false</optimize> + <showDeprecation>true</showDeprecation> + <showWarnings>true</showWarnings> + </configuration> + </plugin> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.8</version> + <executions> + <execution> + <id>copy-dependencies</id> + <phase>prepare-package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + <configuration> + <outputDirectory>target/deps</outputDirectory> + <includeScope>runtime</includeScope> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>app-package-assembly</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + <configuration> + <finalName>${project.artifactId}-${project.version}-apexapp</finalName> + <appendAssemblyId>false</appendAssemblyId> + <descriptors> + <descriptor>src/assemble/appPackage.xml</descriptor> + </descriptors> + <archiverConfig> + <defaultDirectoryMode>0755</defaultDirectoryMode> + </archiverConfig> + <archive> + <manifestEntries> + <Class-Path>${apex.apppackage.classpath}</Class-Path> + <DT-Engine-Version>${apex.version}</DT-Engine-Version> + <DT-App-Package-Group-Id>${project.groupId}</DT-App-Package-Group-Id> + <DT-App-Package-Name>${project.artifactId}</DT-App-Package-Name> + <DT-App-Package-Version>${project.version}</DT-App-Package-Version> + <DT-App-Package-Display-Name>${project.name}</DT-App-Package-Display-Name> + <DT-App-Package-Description>${project.description}</DT-App-Package-Description> + </manifestEntries> + </archive> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <version>1.7</version> + <executions> + <execution> + <phase>package</phase> + <configuration> + <target> + <move file="${project.build.directory}/${project.artifactId}-${project.version}-apexapp.jar" + tofile="${project.build.directory}/${project.artifactId}-${project.version}.apa" /> + </target> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + <execution> + <!-- create resource directory for xml javadoc--> + <id>createJavadocDirectory</id> + <phase>generate-resources</phase> + <configuration> + <tasks> + <delete dir="${project.build.directory}/generated-resources/xml-javadoc"/> + <mkdir dir="${project.build.directory}/generated-resources/xml-javadoc"/> + </tasks> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.9.1</version> + <executions> + <execution> + <id>attach-artifacts</id> + <phase>package</phase> + <goals> + <goal>attach-artifact</goal> + </goals> + <configuration> + <artifacts> + <artifact> + <file>target/${project.artifactId}-${project.version}.apa</file> + <type>apa</type> + </artifact> + </artifacts> + <skipAttach>false</skipAttach> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.apache.apex</groupId> + <artifactId>apex-common</artifactId> + <version>${apex.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.10</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.apex</groupId> + <artifactId>apex-engine</artifactId> + <version>${apex.version}</version> + <scope>test</scope> + </dependency> + </dependencies> + +</project> http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/test-artifacts/apex/src/assemble/appPackage.xml ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/apex/src/assemble/appPackage.xml b/bigtop-tests/test-artifacts/apex/src/assemble/appPackage.xml new file mode 100644 index 0000000..0547979 --- /dev/null +++ b/bigtop-tests/test-artifacts/apex/src/assemble/appPackage.xml @@ -0,0 +1,59 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> + <id>appPackage</id> + <formats> + <format>jar</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <fileSets> + <fileSet> + <directory>${basedir}/target/</directory> + <outputDirectory>/app</outputDirectory> + <includes> + <include>${project.artifactId}-${project.version}.jar</include> + </includes> + </fileSet> + <fileSet> + <directory>${basedir}/target/deps</directory> + <outputDirectory>/lib</outputDirectory> + </fileSet> + <fileSet> + <directory>${basedir}/src/site/conf</directory> + <outputDirectory>/conf</outputDirectory> + <includes> + <include>*.xml</include> + </includes> + </fileSet> + <fileSet> + <directory>${basedir}/src/main/resources/META-INF</directory> + <outputDirectory>/META-INF</outputDirectory> + </fileSet> + <fileSet> + <directory>${basedir}/src/main/resources/app</directory> + <outputDirectory>/app</outputDirectory> + </fileSet> + <fileSet> + <directory>${basedir}/src/main/resources/resources</directory> + <outputDirectory>/resources</outputDirectory> + </fileSet> + </fileSets> + +</assembly> + http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/Application.java ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/Application.java b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/Application.java new file mode 100644 index 0000000..a9663fb --- /dev/null +++ b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/Application.java @@ -0,0 +1,41 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package com.example.myapexapp; + +import org.apache.hadoop.conf.Configuration; + +import com.datatorrent.api.annotation.ApplicationAnnotation; +import com.datatorrent.api.StreamingApplication; +import com.datatorrent.api.DAG; +import com.datatorrent.api.DAG.Locality; + +@ApplicationAnnotation(name="MyFirstApplication") +public class Application implements StreamingApplication +{ + + @Override + public void populateDAG(DAG dag, Configuration conf) + { + RandomNumberGenerator randomGenerator = dag.addOperator("randomGenerator", RandomNumberGenerator.class); + randomGenerator.setNumTuples(500); + + ConsoleOutputOperator cons = dag.addOperator("console", new ConsoleOutputOperator()); + + dag.addStream("randomData", randomGenerator.out, cons.input).setLocality(Locality.CONTAINER_LOCAL); + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/ConsoleOutputOperator.java ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/ConsoleOutputOperator.java b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/ConsoleOutputOperator.java new file mode 100644 index 0000000..9c2f9b2 --- /dev/null +++ b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/ConsoleOutputOperator.java @@ -0,0 +1,79 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package com.example.myapexapp; + +import com.datatorrent.api.DefaultInputPort; +import com.datatorrent.api.annotation.Stateless; +import com.datatorrent.common.util.BaseOperator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Stateless +public class ConsoleOutputOperator extends BaseOperator +{ + private static final Logger logger = LoggerFactory.getLogger(ConsoleOutputOperator.class); + public final transient DefaultInputPort<Object> input = new DefaultInputPort() { + public void process(Object t) { + String s; + if(ConsoleOutputOperator.this.stringFormat == null) { + s = t.toString(); + } else { + s = String.format(ConsoleOutputOperator.this.stringFormat, new Object[]{t}); + } + + if(!ConsoleOutputOperator.this.silent) { + System.out.println(s); + } + + if(ConsoleOutputOperator.this.debug) { + ConsoleOutputOperator.logger.info(s); + } + + } + }; + public boolean silent = false; + private boolean debug; + private String stringFormat; + + public ConsoleOutputOperator() { + } + + public boolean isSilent() { + return this.silent; + } + + public void setSilent(boolean silent) { + this.silent = silent; + } + + public boolean isDebug() { + return this.debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public String getStringFormat() { + return this.stringFormat; + } + + public void setStringFormat(String stringFormat) { + this.stringFormat = stringFormat; + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/RandomNumberGenerator.java ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/RandomNumberGenerator.java b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/RandomNumberGenerator.java new file mode 100644 index 0000000..63d7c04 --- /dev/null +++ b/bigtop-tests/test-artifacts/apex/src/main/java/com/example/myapexapp/RandomNumberGenerator.java @@ -0,0 +1,61 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package com.example.myapexapp; + +import com.datatorrent.api.DefaultOutputPort; +import com.datatorrent.api.InputOperator; +import com.datatorrent.common.util.BaseOperator; + +/** + * This is a simple operator that emits random number. + */ +public class RandomNumberGenerator extends BaseOperator implements InputOperator +{ + private int numTuples = 100; + private transient int count = 0; + + public final transient DefaultOutputPort<Double> out = new DefaultOutputPort<Double>(); + + @Override + public void beginWindow(long windowId) + { + count = 0; + } + + @Override + public void emitTuples() + { + if (count++ < numTuples) { + out.emit(Math.random()); + } + } + + public int getNumTuples() + { + return numTuples; + } + + /** + * Sets the number of tuples to be emitted every window. + * @param numTuples number of tuples + */ + public void setNumTuples(int numTuples) + { + this.numTuples = numTuples; + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/66de460b/bigtop-tests/test-artifacts/apex/src/main/resources/META-INF/properties.xml ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/apex/src/main/resources/META-INF/properties.xml b/bigtop-tests/test-artifacts/apex/src/main/resources/META-INF/properties.xml new file mode 100644 index 0000000..023aa05 --- /dev/null +++ b/bigtop-tests/test-artifacts/apex/src/main/resources/META-INF/properties.xml @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<configuration> + <property> + <name>dt.application.MyFirstApplication.operator.randomGenerator.prop.numTuples</name> + <value>1000</value> + </property> + <property> + <name>dt.application.MyFirstApplication.operator.console.prop.stringFormat</name> + <value>hello world: %s</value> + </property> +</configuration> +