Moved demo app back to main onos repo. Fixed broken build in DatabasePerfInstaller.

Change-Id: I382d0a62c646c1e93fcf1ca57ffbd847abb48e0c
diff --git a/database-perf/src/main/java/org/onosproject/databaseperf/DatabasePerfInstaller.java b/database-perf/src/main/java/org/onosproject/databaseperf/DatabasePerfInstaller.java
index 430211f..771e156 100644
--- a/database-perf/src/main/java/org/onosproject/databaseperf/DatabasePerfInstaller.java
+++ b/database-perf/src/main/java/org/onosproject/databaseperf/DatabasePerfInstaller.java
@@ -103,7 +103,10 @@
         appId = coreService.registerApplication("org.onosproject.nettyperf."
                                                         + nodeId);
 
-        cmap = storageService.createConsistentMap("onos-app-database-perf-test-map", SERIALIZER);
+        cmap = storageService.<String, String>consistentMapBuilder()
+                .withName("onos-app-database-perf-test-map")
+                .withSerializer(SERIALIZER)
+                .build();
         taskExecutor = Executors.newFixedThreadPool(NUM_TASK_THREADS, groupedThreads("onos/database-perf", "worker"));
         log.info("Started with Application ID {}", appId.id());
         start();
diff --git a/demo/pom.xml b/demo/pom.xml
deleted file mode 100644
index 5b5fdc5..0000000
--- a/demo/pom.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2014 Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-<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/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos-app-samples</artifactId>
-        <version>1.2.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>onos-app-demo</artifactId>
-    <packaging>bundle</packaging>
-
-    <description>ONOS demo app bundle</description>
-
-    <properties>
-        <web.context>/onos/demo</web.context>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onlab-rest</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-rest</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.sun.jersey</groupId>
-            <artifactId>jersey-servlet</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <_wab>src/main/webapp/</_wab>
-                        <Bundle-SymbolicName>
-                            ${project.groupId}.${project.artifactId}
-                        </Bundle-SymbolicName>
-                        <Import-Package>
-                            org.slf4j,
-                            org.osgi.framework,
-                            javax.ws.rs,javax.ws.rs.core,
-                            com.sun.jersey.api.core,
-                            com.sun.jersey.spi.container.servlet,
-                            com.sun.jersey.server.impl.container.servlet,
-                            com.fasterxml.jackson.databind,
-                            com.fasterxml.jackson.databind.node,
-                            org.apache.commons.lang.math.*,
-                            com.google.common.*,
-                            org.onlab.packet.*,
-                            org.onlab.rest.*,
-                            org.onosproject.*,
-                            org.onlab.util.*,
-                            org.jboss.netty.util.*
-                        </Import-Package>
-                        <Web-ContextPath>${web.context}</Web-ContextPath>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/demo/src/main/java/org/onosproject/demo/DemoAPI.java b/demo/src/main/java/org/onosproject/demo/DemoAPI.java
deleted file mode 100644
index eded291..0000000
--- a/demo/src/main/java/org/onosproject/demo/DemoAPI.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.demo;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.util.Optional;
-
-/**
- * Simple demo api interface.
- */
-public interface DemoAPI {
-
-    enum InstallType { MESH, RANDOM };
-
-    /**
-     * Tests flow subsystem based on the parameters supplied.
-     *
-     * @param params the test parameters
-     * @return JSON representation
-     */
-    JsonNode flowTest(Optional<JsonNode> params);
-
-    /**
-     * Installs intents based on the installation type.
-     * @param type the installation type.
-     * @param runParams run params
-     */
-    void setup(InstallType type, Optional<JsonNode> runParams);
-
-    /**
-     * Uninstalls all existing intents.
-     */
-    void tearDown();
-
-}
diff --git a/demo/src/main/java/org/onosproject/demo/DemoInstaller.java b/demo/src/main/java/org/onosproject/demo/DemoInstaller.java
deleted file mode 100644
index 1bad7a7..0000000
--- a/demo/src/main/java/org/onosproject/demo/DemoInstaller.java
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.demo;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.base.Predicate;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import org.apache.commons.lang.math.RandomUtils;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.MacAddress;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.Device;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.DefaultFlowRule;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRuleOperations;
-import org.onosproject.net.flow.FlowRuleOperationsContext;
-import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.intent.HostToHostIntent;
-import org.onosproject.net.intent.Intent;
-import org.onosproject.net.intent.IntentService;
-import org.slf4j.Logger;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Application to set up demos.
- */
-@Component(immediate = true)
-@Service
-public class DemoInstaller implements DemoAPI {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected IntentService intentService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostService hostService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected MastershipService mastershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterService clusterService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowRuleService flowService;
-
-    private ExecutorService worker;
-
-    private ExecutorService installWorker;
-
-    private ApplicationId appId;
-
-    private final Set<Intent> existingIntents = new HashSet<>();
-    private RandomInstaller randomInstaller;
-
-    private ObjectMapper mapper = new ObjectMapper();
-
-
-
-    @Activate
-    public void activate() {
-        String nodeId = clusterService.getLocalNode().ip().toString();
-        appId = coreService.registerApplication("org.onosproject.demo.installer."
-                                                        + nodeId);
-        worker = Executors.newFixedThreadPool(1,
-                                              new ThreadFactoryBuilder()
-                                                      .setNameFormat("demo-app-worker")
-                                                      .build());
-        log.info("Started with Application ID {}", appId.id());
-    }
-
-    @Deactivate
-    public void deactivate() {
-        shutdownAndAwaitTermination(worker);
-        if (installWorker != null && !installWorker.isShutdown()) {
-            shutdownAndAwaitTermination(installWorker);
-        }
-        log.info("Stopped");
-    }
-
-    @Override
-    public JsonNode flowTest(Optional<JsonNode> params) {
-        int flowsPerDevice = 1000;
-        int neighbours = 0;
-        boolean remove = true;
-        if (params.isPresent()) {
-            flowsPerDevice = params.get().get("flowsPerDevice").asInt();
-            neighbours = params.get().get("neighbours").asInt();
-            remove = params.get().get("remove").asBoolean();
-        }
-
-        Future<JsonNode> future = worker.submit(new FlowTest(flowsPerDevice, neighbours, remove));
-
-        try {
-            return future.get(10, TimeUnit.SECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            ObjectNode node = mapper.createObjectNode();
-            node.put("Error", e.getMessage());
-            return node;
-        }
-    }
-
-    @Override
-    public void setup(InstallType type, Optional<JsonNode> runParams) {
-        switch (type) {
-            case MESH:
-                log.debug("Installing mesh intents");
-                worker.execute(new MeshInstaller());
-                break;
-            case RANDOM:
-                //check that we do not have a random installer running
-                if (installWorker == null || installWorker.isShutdown()) {
-                    installWorker = Executors.newFixedThreadPool(1,
-                                                                 new ThreadFactoryBuilder()
-                                                                         .setNameFormat("random-worker")
-                                                                         .build());
-                    log.debug("Installing random sequence of intents");
-                    randomInstaller = new RandomInstaller(runParams);
-                    installWorker.execute(randomInstaller);
-                } else {
-                    log.warn("Random installer is already running");
-                }
-                break;
-            default:
-                throw new IllegalArgumentException("What is it you want exactly?");
-        }
-    }
-
-    @Override
-    public void tearDown() {
-        worker.submit(new UnInstaller());
-    }
-
-
-    /**
-     * Simply installs a mesh of intents from all the hosts existing in the network.
-     */
-    private class MeshInstaller implements Runnable {
-
-        @Override
-        public void run() {
-            TrafficSelector selector = DefaultTrafficSelector.emptySelector();
-            TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
-            List<Constraint> constraint = Lists.newArrayList();
-            List<Host> hosts = Lists.newArrayList(hostService.getHosts());
-            while (!hosts.isEmpty()) {
-                Host src = hosts.remove(0);
-                for (Host dst : hosts) {
-                    HostToHostIntent intent = HostToHostIntent.builder()
-                            .appId(appId)
-                            .one(src.id())
-                            .two(dst.id())
-                            .selector(selector)
-                            .treatment(treatment)
-                            .constraints(constraint)
-                            .build();
-                    existingIntents.add(intent);
-                    intentService.submit(intent);
-                }
-            }
-        }
-    }
-
-    /**
-     * Randomly installs and withdraws intents.
-     */
-    private class RandomInstaller implements Runnable {
-
-        private final boolean isLocal;
-        private final Set<Host> hosts;
-
-        private final Random random = new Random(System.currentTimeMillis());
-
-        private Set<HostPair> uninstalledOrWithdrawn;
-        private Set<HostPair> installed;
-
-        private CountDownLatch latch;
-
-        //used to wait on a batch to be processed.
-        private static final int ITERATIONMAX = 50000000;
-
-
-        public RandomInstaller(Optional<JsonNode> runParams) {
-            /*
-                Check if we have params and honour them. Otherwise
-                    set defaults to processing only local stuff and
-                    all local hosts.
-             */
-            if (runParams.isPresent()) {
-                JsonNode node = runParams.get();
-                isLocal = node.get("local").asBoolean();
-                hosts = node.get("hosts") == null ? Sets.newHashSet(hostService.getHosts()) :
-                        constructHostIds(node.get("hosts").elements());
-            } else {
-                isLocal = true;
-                hosts = Sets.newHashSet(hostService.getHosts());
-            }
-
-            //construct list of intents.
-            installed = Sets.newHashSet();
-            if (isLocal) {
-                uninstalledOrWithdrawn = buildPairs(pruneHostsByMasterShip());
-            } else {
-                uninstalledOrWithdrawn = buildPairs(hosts);
-            }
-
-        }
-
-        private Set<Host> constructHostIds(Iterator<JsonNode> elements) {
-            Set<Host> hostIds = Sets.newHashSet();
-            JsonNode n;
-            while (elements.hasNext()) {
-                n = elements.next();
-                hostIds.add(hostService.getHost(HostId.hostId(n.textValue())));
-            }
-            return hostIds;
-        }
-
-        @Override
-        public void run() {
-            if (!installWorker.isShutdown()) {
-                randomize();
-                latch = new CountDownLatch(1);
-                try {
-                    trackIntents();
-                } catch (InterruptedException e) {
-                    shutdown();
-                }
-            }
-
-        }
-
-
-        /**
-         *   Check whether the previously submitted batch is in progress
-         *   and if yes submit the next one. If things hang, wait for at
-         *   most 5 seconds and bail.
-         * @throws InterruptedException if the thread go interupted
-         */
-        private void trackIntents() throws InterruptedException {
-            //FIXME
-            // TODO generate keys for each set of intents to allow manager to throttle
-            // TODO may also look into the store to see how many operations are pending
-
-            //if everything is good proceed.
-            if (!installWorker.isShutdown()) {
-                installWorker.execute(this);
-            }
-
-        }
-
-        public void shutdown() {
-            log.warn("Shutting down random installer!");
-            cleanUp();
-        }
-
-
-        /**
-         *   Shuffle the uninstalled and installed list (separately) and select
-         *   a random number of them and install or uninstall them respectively.
-         */
-        private void randomize() {
-            List<HostPair> hostList = new LinkedList<>(uninstalledOrWithdrawn);
-            Collections.shuffle(hostList);
-            List<HostPair> toInstall = hostList.subList(0,
-                                                        random.nextInt(hostList.size() - 1));
-            List<HostPair> toRemove;
-            if (!installed.isEmpty()) {
-                hostList = new LinkedList<>(installed);
-                Collections.shuffle(hostList);
-                toRemove = hostList.subList(0,
-                                            random.nextInt(hostList.size() - 1));
-                uninstallIntents(toRemove);
-            }
-            installIntents(toInstall);
-
-        }
-
-        private void installIntents(List<HostPair> toInstall) {
-            for (HostPair pair : toInstall) {
-                installed.add(pair);
-                uninstalledOrWithdrawn.remove(pair);
-                intentService.submit(pair.h2hIntent());
-            }
-        }
-
-        private void uninstallIntents(Collection<HostPair> toRemove) {
-            for (HostPair pair : toRemove) {
-                installed.remove(pair);
-                uninstalledOrWithdrawn.add(pair);
-                intentService.withdraw(pair.h2hIntent());
-            }
-        }
-
-        /**
-         *  Take everything and remove it all.
-         */
-        private void cleanUp() {
-            List<HostPair> allPairs = Lists.newArrayList(installed);
-            allPairs.addAll(uninstalledOrWithdrawn);
-            for (HostPair pair : allPairs) {
-                intentService.withdraw(pair.h2hIntent());
-            }
-        }
-
-
-        private Set<HostPair> buildPairs(Set<Host> hosts) {
-            Set<HostPair> pairs = Sets.newHashSet();
-            Iterator<Host> it = Sets.newHashSet(hosts).iterator();
-            while (it.hasNext()) {
-                Host src = it.next();
-                it.remove();
-                for (Host dst : hosts) {
-                    pairs.add(new HostPair(src, dst));
-                }
-            }
-            return pairs;
-        }
-
-        private Set<Host> pruneHostsByMasterShip() {
-            return FluentIterable.from(hosts)
-                    .filter(hasLocalMaster())
-                    .toSet();
-
-        }
-
-        private Predicate<? super Host> hasLocalMaster() {
-            return new Predicate<Host>() {
-                @Override
-                public boolean apply(Host host) {
-                    return mastershipService.getLocalRole(
-                            host.location().deviceId()).equals(MastershipRole.MASTER);
-                }
-            };
-        }
-
-
-        /**
-         * Simple class representing a pair of hosts and precomputes the associated
-         * h2h intent.
-         */
-        private class HostPair {
-
-            private final Host src;
-            private final Host dst;
-
-            private final TrafficSelector selector = DefaultTrafficSelector.emptySelector();
-            private final TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
-            private final List<Constraint> constraint = Lists.newArrayList();
-            private final HostToHostIntent intent;
-
-            public HostPair(Host src, Host dst) {
-                this.src = src;
-                this.dst = dst;
-                this.intent = HostToHostIntent.builder()
-                        .appId(appId)
-                        .one(src.id())
-                        .two(dst.id())
-                        .selector(selector)
-                        .treatment(treatment)
-                        .constraints(constraint)
-                        .build();
-            }
-
-            public HostToHostIntent h2hIntent() {
-                return intent;
-            }
-
-            @Override
-            public boolean equals(Object o) {
-                if (this == o) {
-                    return true;
-                }
-                if (o == null || getClass() != o.getClass()) {
-                    return false;
-                }
-
-                HostPair hostPair = (HostPair) o;
-
-                return Objects.equals(src, hostPair.src) &&
-                        Objects.equals(dst, hostPair.dst);
-
-            }
-
-            @Override
-            public int hashCode() {
-                return Objects.hash(src, dst);
-            }
-
-
-        }
-
-    }
-
-    /**
-     * Remove anything that is running and clear it all out.
-     */
-    private class UnInstaller implements Runnable {
-        @Override
-        public void run() {
-            if (!existingIntents.isEmpty()) {
-                clearExistingIntents();
-            }
-
-            if (installWorker != null && !installWorker.isShutdown()) {
-                shutdownAndAwaitTermination(installWorker);
-                randomInstaller.shutdown();
-            }
-        }
-
-        private void clearExistingIntents() {
-            for (Intent i : existingIntents) {
-                intentService.withdraw(i);
-            }
-            existingIntents.clear();
-        }
-    }
-
-    /**
-     * Shutdown a pool cleanly if possible.
-     *
-     * @param pool an executorService
-     */
-    private void shutdownAndAwaitTermination(ExecutorService pool) {
-        pool.shutdown(); // Disable new tasks from being submitted
-        try {
-            // Wait a while for existing tasks to terminate
-            if (!pool.awaitTermination(10, TimeUnit.SECONDS)) {
-                pool.shutdownNow(); // Cancel currently executing tasks
-                // Wait a while for tasks to respond to being cancelled
-                if (!pool.awaitTermination(10, TimeUnit.SECONDS)) {
-                    log.error("Pool did not terminate");
-                }
-            }
-        } catch (Exception ie) {
-            // (Re-)Cancel if current thread also interrupted
-            pool.shutdownNow();
-            // Preserve interrupt status
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    private class FlowTest implements Callable<JsonNode> {
-        private final int flowPerDevice;
-        private final int neighbours;
-        private final boolean remove;
-        private FlowRuleOperations.Builder adds;
-        private FlowRuleOperations.Builder removes;
-
-        public FlowTest(int flowsPerDevice, int neighbours, boolean remove) {
-            this.flowPerDevice = flowsPerDevice;
-            this.neighbours = neighbours;
-            this.remove = remove;
-            prepareInstallation();
-        }
-
-        private void prepareInstallation() {
-            Set<ControllerNode> instances = Sets.newHashSet(clusterService.getNodes());
-            instances.remove(clusterService.getLocalNode());
-            Set<NodeId> acceptableNodes = Sets.newHashSet();
-            if (neighbours >= instances.size()) {
-                instances.forEach(instance -> acceptableNodes.add(instance.id()));
-            } else {
-                Iterator<ControllerNode> nodes = instances.iterator();
-                for (int i = neighbours; i > 0; i--) {
-                    acceptableNodes.add(nodes.next().id());
-                }
-            }
-            acceptableNodes.add(clusterService.getLocalNode().id());
-
-            Set<Device> devices = Sets.newHashSet();
-            for (Device dev : deviceService.getDevices()) {
-                if (acceptableNodes.contains(
-                        mastershipService.getMasterFor(dev.id()))) {
-                    devices.add(dev);
-                }
-            }
-
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                    .setOutput(PortNumber.portNumber(RandomUtils.nextInt())).build();
-            TrafficSelector.Builder sbuilder;
-            FlowRuleOperations.Builder rules = FlowRuleOperations.builder();
-            FlowRuleOperations.Builder remove = FlowRuleOperations.builder();
-
-            for (Device d : devices) {
-                for (int i = 0; i < this.flowPerDevice; i++) {
-                    sbuilder = DefaultTrafficSelector.builder();
-
-                    sbuilder.matchEthSrc(MacAddress.valueOf(RandomUtils.nextInt() * i))
-                            .matchEthDst(MacAddress.valueOf((Integer.MAX_VALUE - i) * RandomUtils.nextInt()));
-
-
-                    int randomPriority = RandomUtils.nextInt();
-                    DefaultFlowRule f = new DefaultFlowRule(d.id(), sbuilder.build(), treatment,
-                                                            randomPriority, appId, 10, false);
-                    rules.add(f);
-                    remove.remove(f);
-
-                }
-            }
-
-            this.adds = rules;
-            this.removes = remove;
-        }
-
-        @Override
-        public JsonNode call() throws Exception {
-            ObjectNode node = mapper.createObjectNode();
-            CountDownLatch latch = new CountDownLatch(1);
-            flowService.apply(adds.build(new FlowRuleOperationsContext() {
-
-                private final Stopwatch timer = Stopwatch.createStarted();
-
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-
-                    long elapsed = timer.elapsed(TimeUnit.MILLISECONDS);
-                    node.put("elapsed", elapsed);
-
-
-                    latch.countDown();
-                }
-            }));
-
-            latch.await(10, TimeUnit.SECONDS);
-            if (this.remove) {
-                flowService.apply(removes.build());
-            }
-            return node;
-        }
-    }
-}
-
-
diff --git a/demo/src/main/java/org/onosproject/demo/DemoResource.java b/demo/src/main/java/org/onosproject/demo/DemoResource.java
deleted file mode 100644
index 29c55d1..0000000
--- a/demo/src/main/java/org/onosproject/demo/DemoResource.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.demo;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.onlab.rest.BaseResource;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Optional;
-
-/**
- * Rest API for demos.
- */
-@Path("intents")
-public class DemoResource extends BaseResource {
-
-
-
-    @POST
-    @Path("flowTest")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response flowTest(InputStream input) throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        JsonNode cfg = mapper.readTree(input);
-        DemoAPI demo = get(DemoAPI.class);
-        return Response.ok(demo.flowTest(Optional.ofNullable(cfg)).toString()).build();
-    }
-
-    @POST
-    @Path("setup")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response setup(InputStream input) throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        JsonNode cfg = mapper.readTree(input);
-        if (!cfg.has("type")) {
-            return Response.status(Response.Status.BAD_REQUEST)
-                    .entity("Expected type field containing either mesh or random.").build();
-        }
-
-
-        DemoAPI.InstallType type = DemoAPI.InstallType.valueOf(
-                cfg.get("type").asText().toUpperCase());
-        DemoAPI demo = get(DemoAPI.class);
-        demo.setup(type, Optional.ofNullable(cfg.get("runParams")));
-
-        return Response.ok(mapper.createObjectNode().toString()).build();
-    }
-
-    @GET
-    @Path("teardown")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response tearDown() throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        DemoAPI demo = get(DemoAPI.class);
-        demo.tearDown();
-        return Response.ok(mapper.createObjectNode().toString()).build();
-    }
-
-}
diff --git a/demo/src/main/java/org/onosproject/demo/package-info.java b/demo/src/main/java/org/onosproject/demo/package-info.java
deleted file mode 100644
index f583a0e..0000000
--- a/demo/src/main/java/org/onosproject/demo/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- *  Demo applications live here.
- */
-package org.onosproject.demo;
diff --git a/demo/src/main/webapp/WEB-INF/web.xml b/demo/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 29716df..0000000
--- a/demo/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2014 Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
-         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-         id="ONOS" version="2.5">
-    <display-name>ONOS DEMO APP API v1.0</display-name>
-
-    <servlet>
-        <servlet-name>JAX-RS Service</servlet-name>
-        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
-        <init-param>
-            <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
-            <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.config.property.classnames</param-name>
-            <param-value>
-                org.onosproject.demo.DemoResource
-            </param-value>
-        </init-param>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <servlet-mapping>
-        <servlet-name>JAX-RS Service</servlet-name>
-        <url-pattern>/*</url-pattern>
-    </servlet-mapping>
-
-</web-app>
diff --git a/pom.xml b/pom.xml
index cf0c2c4..34cdc8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,7 +43,6 @@
         <module>oneping</module>
         <module>ifwd</module>
         <module>calendar</module>
-        <module>demo</module>
         <module>database-perf</module>
         <module>tvue</module>
     </modules>