Merge "Adding neutron api v2.0 security group/rules handlers"
authorMadhu Venugopal <mavenugo@gmail.com>
Tue, 27 May 2014 15:49:43 +0000 (15:49 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 27 May 2014 15:49:43 +0000 (15:49 +0000)
distribution/opendaylight/pom.xml
distribution/opendaylight/src/assemble/bin.xml
distribution/opendaylight/src/assemble/resources/run.base.sh [new file with mode: 0755]
distribution/opendaylight/src/assemble/resources/run.sh [new file with mode: 0755]
neutron/src/main/java/org/opendaylight/ovsdb/neutron/AdminConfigManager.java
neutron/src/test/java/org/opendaylight/ovsdb/neutron/AdminConfigManagerTest.java
resources/openstack/Neutron-v2.0-API-Examples.json.postman_collection [new file with mode: 0644]

index 74f819f06993fcb6a6437db3156d0a0ee74168b7..04dd37a7b0543420cef754dd71e49d1dae418556 100755 (executable)
@@ -16,6 +16,34 @@ see https://git.opendaylight.org/gerrit/#/c/390/
   <packaging>pom</packaging>
   <name>ovsdb Distribution</name>
   <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.openflowjava</groupId>
+      <artifactId>openflow-protocol-api</artifactId>
+      <version>0.5-SNAPSHOT</version>
+    </dependency>
+
+    <!-- openflowjava -->
+    <dependency>
+      <groupId>org.opendaylight.openflowjava</groupId>
+      <artifactId>openflow-protocol-impl</artifactId>
+      <version>0.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowjava</groupId>
+      <artifactId>openflow-protocol-spi</artifactId>
+      <version>0.5-SNAPSHOT</version>
+    </dependency>
+    <!-- openflowplugin -->
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin</groupId>
+      <artifactId>openflowplugin</artifactId>
+      <version>0.0.3-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin</groupId>
+      <artifactId>openflowplugin-controller-config</artifactId>
+      <version>0.0.3-SNAPSHOT</version>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.ovsdb</groupId>
       <artifactId>ovsdb</artifactId>
@@ -32,8 +60,8 @@ see https://git.opendaylight.org/gerrit/#/c/390/
       <version>0.5.1-SNAPSHOT</version>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.integration</groupId>
-      <artifactId>distributions-virtualization</artifactId>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>distribution.opendaylight</artifactId>
       <version>0.1.2-SNAPSHOT</version>
       <classifier>osgipackage</classifier>
       <type>zip</type>
@@ -82,8 +110,22 @@ see https://git.opendaylight.org/gerrit/#/c/390/
             <phase>generate-resources</phase>
             <configuration>
               <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
-              <includeArtifactIds>distributions-virtualization</includeArtifactIds>
-              <includeGroupIds>org.opendaylight.integration</includeGroupIds>
+              <includeArtifactIds>distribution.opendaylight</includeArtifactIds>
+              <includeGroupIds>org.opendaylight.controller</includeGroupIds>
+              <excludeTransitive>true</excludeTransitive>
+              <ignorePermissions>false</ignorePermissions>
+            </configuration>
+          </execution>
+          <execution>
+            <id>unpack-provided-configs</id>
+            <goals>
+              <goal>unpack-dependencies</goal>
+            </goals>
+            <phase>generate-resources</phase>
+            <configuration>
+              <outputDirectory>${project.build.directory}/provided-configs</outputDirectory>
+              <includeArtifactIds>openflowplugin-controller-config</includeArtifactIds>
+              <includes>**\/*.xml</includes>
               <excludeTransitive>true</excludeTransitive>
               <ignorePermissions>false</ignorePermissions>
             </configuration>
@@ -100,5 +142,3 @@ see https://git.opendaylight.org/gerrit/#/c/390/
     <url>https://wiki.opendaylight.org/view/OVSDB_Integration:Main</url>
   </scm>
 </project>
-
-
index 346df3c7455809e43fd2acde249b45ecaa891a48..fd9a8bc444d8890237099db3951d0b6e55b5df82 100644 (file)
       <outputDirectory>/</outputDirectory>
       <excludes>
           <exclude>opendaylight/plugins/*ovsdb*</exclude>
+          <exclude>opendaylight/run.sh</exclude>
+      </excludes>
+    </fileSet>
+    <fileSet>
+      <directory>${project.build.directory}/provided-configs/initial</directory>
+      <outputDirectory>/opendaylight/configuration/initial.available</outputDirectory>
+      <excludes>
+        <exclude>**/META-INF/**</exclude>
       </excludes>
     </fileSet>
   </fileSets>
+  <files>
+    <file>
+      <source>${project.build.directory}/generated-resources/opendaylight/run.sh</source>
+      <outputDirectory>/opendaylight/</outputDirectory>
+      <destName>run.internal.sh</destName>
+      <fileMode>0755</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/assemble/resources/run.sh</source>
+      <outputDirectory>/opendaylight/</outputDirectory>
+      <fileMode>0755</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/assemble/resources/run.base.sh</source>
+      <outputDirectory>/opendaylight/</outputDirectory>
+      <fileMode>0755</fileMode>
+    </file>
+  </files>
   <dependencySets>
     <dependencySet>
       <outputDirectory>opendaylight/plugins</outputDirectory>
-      <excludes>
-        <exclude>equinoxSDK381:org.eclipse.osgi</exclude>
-        <exclude>equinoxSDK381:org.eclipse.equinox.console</exclude>
-        <exclude>equinoxSDK381:org.eclipse.equinox.launcher</exclude>
-        <exclude>equinoxSDK381:org.eclipse.equinox.ds</exclude>
-        <exclude>equinoxSDK381:org.eclipse.equinox.util</exclude>
-        <exclude>equinoxSDK381:org.eclipse.osgi.services</exclude>
-        <exclude>virgomirror:org.eclipse.jdt.core.compiler.batch</exclude>
-        <exclude>org.apache.felix:org.apache.felix.fileinstall</exclude>
-        <exclude>geminiweb:org.eclipse.virgo.kernel.equinox.extensions</exclude>
-        <exclude>org.slf4j:slf4j-api</exclude>
-        <exclude>ch.qos.logback:logback-core</exclude>
-        <exclude>ch.qos.logback:logback-classic</exclude>
-        <exclude>com.sun.jersey:jersey-core</exclude>
-        <exclude>com.sun.jersey:jersey-json</exclude>
-        <exclude>com.sun.jersey:jersey-server</exclude>
-      </excludes>
       <outputFileNameMapping>
         ${artifact.groupId}.${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}
       </outputFileNameMapping>
diff --git a/distribution/opendaylight/src/assemble/resources/run.base.sh b/distribution/opendaylight/src/assemble/resources/run.base.sh
new file mode 100755 (executable)
index 0000000..f721ef8
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+# Use same path for run.internal.sh
+RUNSH_DIR=$(dirname $0)
+CONTROLLER_RUNSH=${RUNSH_DIR}/run.internal.sh
+
+OF_FILTER=
+
+# Be extra careful to pass on usage from run.internal.sh, but add our
+# usage as well in the standard way
+function usage {
+    $CONTROLLER_RUNSH -help | sed 's/\[-help\]/\[-help\] \[-of13\] \[-bundlefilter \<bundlefilter\> \]/' | sed "s;$CONTROLLER_RUNSH;$0;"
+    exit 1
+}
+
+OF13=0
+BUNDLEFILTER=
+while true ; do
+    (( i += 1 ))
+    case "${@:$i:1}" in
+        -of13) OF13=1 ;;
+        -bundlefilter) (( i += 1 )); BUNDLEFILTER="|${@:$i:1}";;
+        -help) usage ;;
+        "") break ;;
+    esac
+done
+
+# clean available optional configurations (links)
+find configuration/initial -type l -exec rm {} \;
+
+# OF Filter selection
+OF_FILTER="org.opendaylight.(openflowplugin|openflowjava)"
+if (( $OF13 != 0 )); then
+    OF_FILTER="org.opendaylight.controller.(thirdparty.org.openflow|protocol_plugins.openflow)"
+    while read ofConfig; do
+        ln -s ../initial.available/$(basename ${ofConfig}) configuration/initial/
+    done < <(find configuration/initial.available -name '*openflowplugin.xml')
+fi
+
+# Make sure we suck out our additional args so as to not confuse
+# run.internal.sh
+NEWARGS=`echo $@|sed 's/-of13//'|sed 's/-bundlefilter[ ]*[^ ]*//'`
+
+# Build the filter string
+FILTERBEGINING='^(?!'
+FILTERENDING=').*'
+FILTER=${FILTERBEGINING}${OF_FILTER}${BUNDLEFILTER}${FILTERENDING}
+
+# Run the command
+$CONTROLLER_RUNSH -Dfelix.fileinstall.filter="$FILTER" $NEWARGS
diff --git a/distribution/opendaylight/src/assemble/resources/run.sh b/distribution/opendaylight/src/assemble/resources/run.sh
new file mode 100755 (executable)
index 0000000..1b08fdf
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# Use same path for run.base.sh
+RUNSH_DIR=$(dirname $0)
+RUN_BASE_SH=${RUNSH_DIR}/run.base.sh
+
+function usage {
+    echo -e "You must select one of the 3 supported network virtualization technologies:\n\tovsdb | opendove | vtn"
+    echo "Usage: $0 -virt {ovsdb | opendove | vtn | affinity} [advanced options]"
+    echo "Advanced options: $($RUN_BASE_SH -help | sed "s;Usage: $RUN_BASE_SH ;;")"
+    exit 1
+}
+
+virtIndex=0
+while true ; do
+    (( i += 1 ))
+    case "${@:$i:1}" in
+        -virt) virtIndex=$i ;;
+        "") break ;;
+    esac
+done
+
+# Virtualization edition select
+if [ ${virtIndex} -eq 0 ]; then
+    usage
+fi
+
+virt=${@:$virtIndex+1:1}
+if [ "${virt}" == "" ]; then
+    usage
+else
+    if [ "${virt}" == "ovsdb" ]; then
+        ODL_VIRT_FILTER="opendove|vtn"
+    elif [ "${virt}" == "opendove" ]; then
+        ODL_VIRT_FILTER="ovsdb|vtn"
+    elif [ "${virt}" == "vtn" ]; then
+        ODL_VIRT_FILTER="affinity|opendove|ovsdb.ovsdb.neutron|controller.(arphandler|samples)"
+    elif [ "${virt}" == "affinity" ]; then
+        ODL_VIRT_FILTER="vtn|opendove|controller.samples"
+    else
+        usage
+    fi
+fi
+
+$RUN_BASE_SH -bundlefilter "org.opendaylight.(${ODL_VIRT_FILTER})" "${@:1:$virtIndex-1}" "${@:virtIndex+2}"
index 306c661c58360edd236203782ecdf5156899479c..cc108fe1e55a211efe4da49c696d90b77685bed5 100644 (file)
@@ -152,10 +152,10 @@ public class AdminConfigManager implements IAdminConfigManager{
      * provider_mappings=physnet1:eth1[,physnet2:eth2]
      */
       public String getPhysicalInterfaceName (Node node, String physicalNetwork) {
-        String phyIf = null;
+          String phyIf = null;
 
-        try {
-            OVSDBConfigService ovsdbConfig = (OVSDBConfigService) ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+          OVSDBConfigService ovsdbConfig = (OVSDBConfigService) ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+          try {
             Map<String, Table<?>> ovsTable = ovsdbConfig.getRows(node, Open_vSwitch.NAME.getName());
 
             if (ovsTable == null) {
@@ -189,7 +189,10 @@ public class AdminConfigManager implements IAdminConfigManager{
                         }
                     }
                 }
-                break;
+
+                if (phyIf != null) {
+                    break;
+                }
             }
         } catch (Exception e) {
             logger.error("Unable to find physical interface for Node: {}, Network {}",
index 8e8c412e4c3e82caacd1326745902b6b7d595d2e..5ac7a2d5a241bbaa44976c98c1caaec9c94372e8 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+ * Copyright (c) 2013 Hewlett-Packard Development Company, L.P. and others
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,11 +7,13 @@
  *
  * Contributors:
  *    Dave Tucker (HP) - Added unit tests for the AdminConfigManager class.
+ *    Sam Hague - Added unit tests for getPhysicalInterfaceName.
  *******************************************************************************/
 
 package org.opendaylight.ovsdb.neutron;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyObject;
 import static org.mockito.Matchers.anyString;
@@ -42,10 +44,35 @@ import org.powermock.modules.junit4.PowerMockRunner;
 public class AdminConfigManagerTest {
 
     AdminConfigManager adminConfigManager;
+    private OVSDBConfigService ovsdbConfig;
+    private Node node;
+    private Open_vSwitch ovsTable;
+    private ConcurrentMap<String, Table<?>> ovsMap;
+    private OvsDBMap map;
+
+    private static String OPENVSWITCH = "Open_vSwitch";
+    private static String PROVIDER_MAPPINGS = "provider_mappings";
+    private static String PHYSNET1 = "physnet1";
+    private static String ETH1 = "eth1";
+    private static String PHYSNET2 = "physnet2";
+    private static String ETH2 = "eth2";
+    private static String PHYSNET3 = "physnet3";
+    private static String ETH3 = "eth3";
+    private static String LOCAL_IP = "local_ip";
+    private static String IPADDR = "10.10.10.10";
 
     @Before
     public void setUp(){
         adminConfigManager = new AdminConfigManager();
+
+        node = mock(Node.class);
+        ovsdbConfig = mock(ConfigurationService.class);
+        PowerMockito.mockStatic(ServiceHelper.class);
+        when(ServiceHelper.getGlobalInstance(eq(OVSDBConfigService.class), anyObject())).thenReturn(ovsdbConfig);
+
+        ovsTable = new Open_vSwitch();
+        ovsMap = new ConcurrentHashMap<>();
+        map = new OvsDBMap();
     }
 
     @Test
@@ -108,4 +135,72 @@ public class AdminConfigManagerTest {
         // Success...
         assertEquals(testAddress, adminConfigManager.getTunnelEndPoint(mockNode));
     }
+
+    // Add key:value pairs to the map.
+    // Calling again with the same key will overwrite the current pair.
+    private void initMap (String key, String value) {
+        map.put(key, value);
+        ovsTable.setOther_config(map);
+        ovsMap.put(OPENVSWITCH, ovsTable);
+    }
+
+    @Test
+    public void testGetPhysicalInterfaceName () throws Exception {
+        when(ovsdbConfig.getRows(any(Node.class), anyString())).thenReturn(ovsMap);
+
+        // Check if match can be found with a single pair
+        initMap(PROVIDER_MAPPINGS, PHYSNET1 + ":" + ETH1);
+        assertEquals("Failed to find " + ETH1 + " in " + map.toString(),
+                ETH1, adminConfigManager.getPhysicalInterfaceName(node, PHYSNET1));
+
+        // Check if match can be found with different pairs
+        initMap(PROVIDER_MAPPINGS, PHYSNET1 + ":" + ETH1 + "," + PHYSNET2 + ":" + ETH2);
+        assertEquals("Failed to find " + ETH2 + " in " + map.toString(),
+                ETH2, adminConfigManager.getPhysicalInterfaceName(node, PHYSNET2));
+
+        // Check if match can be found with duplicate pairs
+        initMap(PROVIDER_MAPPINGS, PHYSNET1 + ":" + ETH1 + "," + PHYSNET2 + ":" + ETH2 + "," + PHYSNET2 + ":" + ETH2);
+        assertEquals("Failed to find " + ETH2 + " in " + map.toString(),
+                ETH2, adminConfigManager.getPhysicalInterfaceName(node, PHYSNET2));
+
+        // Check if match can be found with multiple pairs and extra other_config
+        initMap(LOCAL_IP, IPADDR);
+        assertEquals("Failed to find " + ETH2 + " in " + map.toString(),
+                ETH2, adminConfigManager.getPhysicalInterfaceName(node, PHYSNET2));
+    }
+
+    @Test
+    public void testGetPhysicalInterfaceNameNegative () throws Exception {
+        when(ovsdbConfig.getRows(any(Node.class), anyString())).thenReturn(null)
+                .thenReturn(ovsMap);
+
+        // Add a null row, an empty row and a good row to the table
+        Open_vSwitch nullRow = new Open_vSwitch();
+        Open_vSwitch emptyRow = new Open_vSwitch();
+        OvsDBMap emptyProviderMap = new OvsDBMap();
+        emptyRow.setOther_config(emptyProviderMap);
+        ovsMap.put("0", nullRow);
+        ovsMap.put("1", emptyRow);
+        initMap(PROVIDER_MAPPINGS, PHYSNET1 + ":" + ETH1);
+
+        // Check if no rows/no table is handled
+        assertEquals("Failed to return null when ovsdb table is null",
+                null, adminConfigManager.getTunnelEndPoint(node));
+
+        // Check if the null and empty rows are ignored
+        System.out.println("map = " + map.toString());
+        System.out.println("ovsMap = " + ovsMap.toString());
+        assertEquals("Failed to find " + ETH1 + " in " + map.toString(),
+                ETH1, adminConfigManager.getPhysicalInterfaceName(node, PHYSNET1));
+
+        // Should not be able to find match
+        initMap(PROVIDER_MAPPINGS, PHYSNET1 + ":" + ETH1 + "," + PHYSNET2 + ":" + ETH2);
+        assertNull("Found " + ETH3 + " in " + map.toString(),
+                adminConfigManager.getPhysicalInterfaceName(node, PHYSNET3));
+
+        // Should not be able to find match with mal-formed values
+        initMap(PROVIDER_MAPPINGS, PHYSNET1 + "-" + ETH1);
+        assertNull("Found " + ETH1 + " in " + map.toString(),
+                adminConfigManager.getPhysicalInterfaceName(node, PHYSNET1));
+    }
 }
diff --git a/resources/openstack/Neutron-v2.0-API-Examples.json.postman_collection b/resources/openstack/Neutron-v2.0-API-Examples.json.postman_collection
new file mode 100644 (file)
index 0000000..065d7f6
--- /dev/null
@@ -0,0 +1,301 @@
+{
+    "id": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+    "name": "Neutron-v2.0-API-Examples",
+    "description": "A collection of OpenStack Neutron v2.0 REST API calls for Postman. Import these into Postman and use to validate the OpenDaylight Neutron NB-API interfaces.\n\nResources:\n- Postman http://www.getpostman.com\n- Neutron v2.0 https://wiki.openstack.org/wiki/Neutron/APIv2-specification",
+    "order": [
+        "55aab7d7-6159-c4fb-5b3f-42cbb55c4e7b",
+        "1215e515-a4ff-7d7e-acbf-905c6706db86",
+        "f9de4b7d-8b08-fb14-d557-3cf81d7465f4",
+        "9fe0d840-dcd3-6d3e-d410-e88538858e3a",
+        "c9cc2212-1f16-ead6-5dc0-073aed1e2c61",
+        "1387de10-9981-2ecb-32b8-4cc4806894cf",
+        "56d38607-d1dc-adba-a3fd-7e4d63e6c75d",
+        "4f72cdab-70f1-dba9-3986-3305c7ef18c8",
+        "f01b7f99-0aeb-739f-eb4a-cd467320b85c",
+        "747f9a54-e64f-57f6-ce6d-8ad358817696",
+        "7ef5413c-7f22-ac12-5444-f9be6a7c029e",
+        "ed8face9-6585-8a9b-9e09-870e3a5e5546",
+        "09bcfbe4-b01a-3615-820f-7fc3a2261e05",
+        "a1efd833-3d79-1621-9aa5-61b0fecec94a",
+        "a183a8b3-bddb-dc04-ae73-3beb11af4d04",
+        "ef3c7339-ba4d-124d-7e1f-67d9ab638277"
+    ],
+    "folders": [],
+    "timestamp": 1394529177458,
+    "synced": false,
+    "requests": [
+        {
+            "id": "09bcfbe4-b01a-3615-820f-7fc3a2261e05",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/fw/firewalls_rules",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1401139182979,
+            "name": "Get Neutron FWaaS Rules",
+            "description": "Return a list of Neutron v2.0 API FWaaS rules.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "1215e515-a4ff-7d7e-acbf-905c6706db86",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/networks/",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1401139794797,
+            "name": "Get Neutron Networks",
+            "description": "Return a list of Neutron v2.0 Networks",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "1387de10-9981-2ecb-32b8-4cc4806894cf",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-groups/",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n   \"security_group\":{\n      \"name\":\"TCP Port Range\",\n      \"description\":\"Example TCP port range security group\",\n     \"tenant_id\":\"3B82FF05-72A2-413E-B051-222222222222\",\n     \"id\":\"C9F5924D-4D08-4819-BFC4-444444444444\"\n   }\n}",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401137715163,
+            "name": "Post Add Security Group Port Range",
+            "description": "Example Neutron v2.0  Add Security Group with a TCP Port Range",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "4f72cdab-70f1-dba9-3986-3305c7ef18c8",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-groups/",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1401139154340,
+            "name": "Get Neutron Security Groups",
+            "description": "Return a list of Neutron v2.0 API security groups.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "55aab7d7-6159-c4fb-5b3f-42cbb55c4e7b",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/networks/",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n   \"networks\":[\n      {\n         \"status\":\"ACTIVE\",\n         \"subnets\":[\n         ],\n         \"name\":\"sample_network_89\",\n         \"provider:physical_network\":null,\n   \"admin_state_up\":false,\n   \"tenant_id\":\"60cd4f6dbc5f499982a284e7b83b5be3\",\n   \"provider:network_type\":\"local\",\n   \"router:external\":false,\n   \"shared\":false,\n   \"id\":\"e9330b1f-a2ef-4160-a991-169e56ab17f5\",\n   \"provider:segmentation_id\":89\n}\n  ]\n}",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401139810802,
+            "name": "Post Add Neutron Network",
+            "description": "Post a list of Neutron v2.0 Networks",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "56d38607-d1dc-adba-a3fd-7e4d63e6c75d",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-group-rules/",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n   \"security_group_rule\":{\n      \"id\":\"A9F6424D-4D08-4819-BFC4-333333333333\",\n      \"direction\":\"ingress\",\n      \"port_range_min\":\"5000\",\n      \"ethertype\":\"IPv4\",\n      \"port_range_max\":\"6000\",\n      \"protocol\":\"tcp\",\n      \"remote_ip_prefix\":\"172.16.10.0/24\",\n      \"remote_group_id\":\"85cc3048-abc3-43cc-89b3-377341426ac5\",\n      \"security_group_id\":\"C9F5924D-4D08-4819-BFC4-444444444444\",\n      \"tenant_id\":\"3B82FF05-72A2-413E-B051-222222222222\"\n   }\n}\n",
+            "dataMode": "raw",
+            "name": "Post Add Security Rule Port Range",
+            "description": "Neutron v2.0 Add a Neutron Security Rule with a TCP Port Range.",
+            "descriptionFormat": "html",
+            "time": 1401138106104,
+            "version": 2,
+            "responses": [],
+            "tests": "",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "synced": false
+        },
+        {
+            "id": "747f9a54-e64f-57f6-ce6d-8ad358817696",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/fw/firewalls",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n  \"firewall\": {\n    \"admin_state_up\": true,\n    \"description\": \"Example Neutron v2.0 Firewall Creation\",\n    \"firewall_policy_id\": \"c69933c1-b472-44f9-8226-30dc4ffd454c\",\n    \"id\": \"3b0ef8f4-82c7-44d4-a4fb-6177f9a21977\",\n    \"name\": \"Example FWaaS Firewall\",\n    \"status\": \"PENDING_CREATE\",\n    \"tenant_id\": \"45977fa2dbd7482098dd68d0d8970117\"\n  }\n}",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401140100321,
+            "name": "Post Add Neutron FWaaS Firewall",
+            "description": "Example posting of a Neutron v2.0 Neutron FWaaS firewall.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "7ef5413c-7f22-ac12-5444-f9be6a7c029e",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/fw/firewalls",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1401139224214,
+            "name": "Get Neutron FWaaS Firewalls",
+            "description": "Return a list of Neutron FWaaS v2.0 API FWaaS firewalls.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "9fe0d840-dcd3-6d3e-d410-e88538858e3a",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-group-rules/",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n   \"security_group_rule\":{\n      \"id\":\"A9F6424D-4D08-4819-BFC4-444444444444\",\n      \"direction\":\"ingress\",\n      \"port_range_min\":\"80\",\n      \"ethertype\":\"IPv4\",\n      \"port_range_max\":\"80\",\n      \"protocol\":\"tcp\",\n      \"remote_ip_prefix\":\"172.0.0.0/24\",\n      \"remote_group_id\":\"85cc3048-abc3-43cc-89b3-377341426ac5\",\n      \"security_group_id\":\"C9F5924D-4D08-4819-BFC4-111111111111\",\n      \"tenant_id\":\"3B82FF05-72A2-413E-B051-222222222222\"\n   }\n}\n",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401137905549,
+            "name": "Post Add Security Rules Frontend Tier",
+            "description": "Example Neutron v2.0 security rule for a front web tier.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "a183a8b3-bddb-dc04-ae73-3beb11af4d04",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/fw/firewalls_policies",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1397457663853,
+            "name": "Get Neutron FWaaS Policies",
+            "description": "Return a list of Neutron v2.0 Neutron FWaaS Firewall policies.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "a1efd833-3d79-1621-9aa5-61b0fecec94a",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/fw/firewalls_policies",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n  \"firewall_policies\": [\n    {\n      \"audited\": false,\n      \"description\": \"\",\n      \"firewall_rules\": [\n        \"8722e0e0-9cc9-4490-9660-8c9a5732fbb0\"\n      ],\n      \"id\": \"c69933c1-b472-44f9-8226-30dc4ffd454c\",\n      \"name\": \"Example FWaaS Policy\",\n      \"shared\": false,\n      \"tenant_id\": \"45977fa2dbd7482098dd68d0d8970117\"\n    }\n  ]\n}",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401139374457,
+            "name": "Post Add Neutron FWaaS Policy",
+            "description": "Example posting of a Neutron v2.0 FWaaS policy.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "c9cc2212-1f16-ead6-5dc0-073aed1e2c61",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-group-rules/",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n   \"security_group_rule\":{\n      \"id\":\"A9F6424D-4D08-4819-BFC4-333333333333\",\n      \"direction\":\"ingress\",\n      \"port_range_min\":\"3306\",\n      \"ethertype\":\"IPv4\",\n      \"port_range_max\":\"3306\",\n      \"protocol\":\"tcp\",\n      \"remote_ip_prefix\":\"10.0.0.0/24\",\n      \"remote_group_id\":\"85cc3048-abc3-43cc-89b3-377341426ac5\",\n      \"security_group_id\":\"C9F5924D-4D08-4819-BFC4-111111111111\",\n      \"tenant_id\":\"3B82FF05-72A2-413E-B051-222222222222\"\n   }\n}\n",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401137493078,
+            "name": "Post Add Security Rule Backend Tier",
+            "description": "Neutron v2.0 Add a Neutron Security Rule for a backend database tier example",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "ed8face9-6585-8a9b-9e09-870e3a5e5546",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/fw/firewalls_rules",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n  \"firewall_rules\": [\n    {\n      \"action\": \"allow\",\n      \"description\": \"Example FWaaS Rule\",\n      \"destination_ip_address\": null,\n      \"destination_port\": \"22\",\n      \"enabled\": true,\n      \"firewall_policy_id\": \"c69933c1-b472-44f9-8226-30dc4ffd454c\",\n      \"id\": \"8722e0e0-9cc9-4490-9660-8c9a5732fbb0\",\n      \"ip_version\": 4,\n      \"name\": \"ALLOW_SSH\",\n      \"position\": 1,\n      \"protocol\": \"tcp\",\n      \"shared\": false,\n      \"source_ip_address\": null,\n      \"source_port\": null,\n      \"tenant_id\": \"45977fa2dbd7482098dd68d0d8970117\"\n    }\n  ]\n}",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401139588833,
+            "name": "Post Add Neutron FWaaS Rule",
+            "description": "Example posting of a Neutron v2.0 Neutron FWaaS firewall rule.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "ef3c7339-ba4d-124d-7e1f-67d9ab638277",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/ports/",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1401139136358,
+            "name": "Get Neutron Ports",
+            "description": "Return a list of Neutron v2.0 API ports.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "f01b7f99-0aeb-739f-eb4a-cd467320b85c",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-group-rules/",
+            "pathVariables": {},
+            "method": "GET",
+            "data": [],
+            "dataMode": "params",
+            "version": 2,
+            "tests": "",
+            "time": 1401139648839,
+            "name": "Get Neutron Security Rules",
+            "description": "Return a list of Neutron v2.0 security rules.",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        },
+        {
+            "id": "f9de4b7d-8b08-fb14-d557-3cf81d7465f4",
+            "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nAccept: application/json\nContent-Type: application/json\n",
+            "url": "http://127.0.0.1:8080/controller/nb/v2/neutron/security-groups/",
+            "pathVariables": {},
+            "method": "POST",
+            "data": "{\n   \"security_group\":{\n      \"name\":\"backend_databases\",\n      \"description\":\"Example security group for backend_databases\",\n     \"tenant_id\":\"3B82FF05-72A2-413E-B051-222222222222\",\n     \"id\":\"C9F5924D-4D08-4819-BFC4-111111111111\"\n   }\n}",
+            "dataMode": "raw",
+            "version": 2,
+            "tests": "",
+            "time": 1401136080941,
+            "name": "Post Add Security Group Web Tiers",
+            "description": "Neutron v2.0 Add a web tier security group",
+            "collectionId": "bd9b142f-e3ad-452d-f088-eed1b741b937",
+            "responses": [],
+            "synced": false
+        }
+    ]
+}
\ No newline at end of file