Bug 5117 - DOS chars in shell script 49/33649/1
authorTomas Cechvala <tcechval@cisco.com>
Wed, 27 Jan 2016 17:06:51 +0000 (18:06 +0100)
committerTomas Cechvala <tcechval@cisco.com>
Wed, 27 Jan 2016 17:06:51 +0000 (18:06 +0100)
Removing nested DOS line endings

Change-Id: I4297ccc946f6c20b8fb9a1171f99632e8ef73159
Signed-off-by: Tomas Cechvala <tcechval@cisco.com>
demos/gbpsfc-env/demo-asymmetric-chain/sf-flows.sh
demos/gbpsfc-env/demo-asymmetric-coexistence/rest.py
demos/gbpsfc-env/demo-asymmetric-coexistence/sf-config.sh
demos/gbpsfc-env/demo-asymmetric-coexistence/sf-flows.sh
demos/gbpsfc-env/demo-symmetric-chain/sf-flows.sh
demos/gbpsfc-env/demo-symmetric-coexistence/rest.py
demos/gbpsfc-env/demo-symmetric-coexistence/sf-config.sh
demos/gbpsfc-env/demo-symmetric-coexistence/sf-flows.sh

index 4d577b40b7c78387035349234e8c335d3bf1f115..f4ee6497d240d311173070518c85933a15761b21 100644 (file)
@@ -1,20 +1,20 @@
-#!/usr/bin/env bash\r
-\r
-set -e\r
-hostnum=${HOSTNAME#"gbpsfc"}\r
-sw="sw$hostnum"\r
-nsp=$1\r
-\r
-if [ "$hostnum" -eq "3" ]; then\r
-    TUNNEL=0xC0A83247\r
-elif [ "$hostnum" -eq "5" ]; then\r
-    TUNNEL=0xC0A83249\r
-else\r
-    echo "Invalid SF for this demo";\r
-    exit\r
-fi\r
-# delete NORMAL, if present\r
-nsphex=`printf "%x\n" $nsp`\r
-sudo ovs-ofctl --strict del-flows $sw priority=0\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13\r
+#!/usr/bin/env bash
+
+set -e
+hostnum=${HOSTNAME#"gbpsfc"}
+sw="sw$hostnum"
+nsp=$1
+
+if [ "$hostnum" -eq "3" ]; then
+    TUNNEL=0xC0A83247
+elif [ "$hostnum" -eq "5" ]; then
+    TUNNEL=0xC0A83249
+else
+    echo "Invalid SF for this demo";
+    exit
+fi
+# delete NORMAL, if present
+nsphex=`printf "%x\n" $nsp`
+sudo ovs-ofctl --strict del-flows $sw priority=0
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13
index 13b30b05dd48e2af66754ca15109eebc289e8c3d..530a9345a81d56571d08d71f10c8349bdf37e28e 100644 (file)
-#!/usr/bin/python\r
-import argparse\r
-import requests,json\r
-from requests.auth import HTTPBasicAuth\r
-from subprocess import call\r
-import time\r
-import sys\r
-import os\r
-\r
-\r
-DEFAULT_PORT='8181'\r
-\r
-\r
-USERNAME='admin'\r
-PASSWORD='admin'\r
-\r
-\r
-CONF_TENANT='/restconf/config/policy:tenants'\r
-\r
-def get(host, port, uri):\r
-    url='http://'+host+":"+port+uri\r
-    r = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
-    return r\r
-\r
-def put(host, port, uri, data, debug=False):\r
-    '''Perform a PUT rest operation, using the URL and data provided'''\r
-\r
-    url='http://'+host+":"+port+uri\r
-\r
-    headers = {'Content-type': 'application/yang.data+json',\r
-               'Accept': 'application/yang.data+json'}\r
-    if debug == True:\r
-        print "PUT %s" % url\r
-        print json.dumps(data, indent=4, sort_keys=True)\r
-    r = requests.put(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
-    if debug == True:\r
-        print r.text\r
-    r.raise_for_status()\r
-\r
-def post(host, port, uri, data, debug=False):\r
-    '''Perform a POST rest operation, using the URL and data provided'''\r
-\r
-    url='http://'+host+":"+port+uri\r
-    headers = {'Content-type': 'application/yang.data+json',\r
-               'Accept': 'application/yang.data+json'}\r
-    if debug == True:\r
-        print "POST %s" % url\r
-        print json.dumps(data, indent=4, sort_keys=True)\r
-    r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
-    if debug == True:\r
-        print r.text\r
-    r.raise_for_status()\r
-\r
-def wait_for_sff_in_datastore(url):\r
-    for i in xrange(30):\r
-        resp=get(controller, DEFAULT_PORT, url)\r
-        if ('192.168.50.70' in resp.text) and ('192.168.50.71' in resp.text):\r
-            break\r
-        time.sleep(3)\r
-    if ('192.168.50.70' not in resp.text):\r
-        print "ERROR: SFF1 has not been initialized!"\r
-        sys.exit(1)\r
-    if ('192.168.50.71' not in resp.text):\r
-        print "ERROR: SFF2 has not been initialized!"\r
-        sys.exit(1)\r
-\r
-\r
-\r
-def get_service_functions_uri():\r
-    return "/restconf/config/service-function:service-functions"\r
-\r
-def get_service_functions_data():\r
-    return {\r
-    "service-functions": {\r
-        "service-function": [\r
-            {\r
-                "name": "firewall-72",\r
-                "ip-mgmt-address": "192.168.50.72",\r
-                "type": "service-function-type:firewall",\r
-                "nsh-aware": "true",\r
-                "sf-data-plane-locator": [\r
-                    {\r
-                        "name": "2",\r
-                        "port": 6633,\r
-                        "ip": "192.168.50.72",\r
-                        "transport": "service-locator:vxlan-gpe",\r
-                        "service-function-forwarder": "SFF1"\r
-                    }\r
-                ]\r
-            },\r
-            {\r
-                "name": "dpi-74",\r
-                "ip-mgmt-address": "192.168.50.74",\r
-                "type": "service-function-type:dpi",\r
-                "nsh-aware": "true",\r
-                "sf-data-plane-locator": [\r
-                    {\r
-                        "name": "3",\r
-                        "port": 6633,\r
-                        "ip": "192.168.50.74",\r
-                        "transport": "service-locator:vxlan-gpe",\r
-                        "service-function-forwarder": "SFF2"\r
-                    }\r
-                ]\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_service_function_forwarders_uri():\r
-    return "/restconf/config/service-function-forwarder:service-function-forwarders"\r
-\r
-def get_service_function_forwarders_data():\r
-    return {\r
-    "service-function-forwarders": {\r
-        "service-function-forwarder": [\r
-            {\r
-                "name": "SFF1",\r
-                "service-node": "OVSDB2",\r
-                "service-function-forwarder-ovs:ovs-bridge": {\r
-                    "bridge-name": "sw1"\r
-                },\r
-                "service-function-dictionary": [\r
-                    {\r
-                        "name": "firewall-72",\r
-                        "sff-sf-data-plane-locator": {\r
-                            "sf-dpl-name": "2",\r
-                            "sff-dpl-name": "sfc-tun2"\r
-                        }\r
-                    }\r
-                ],\r
-                "sff-data-plane-locator": [\r
-                    {\r
-                        "name": "sfc-tun2",\r
-                        "data-plane-locator": {\r
-                            "transport": "service-locator:vxlan-gpe",\r
-                            "port": 6633,\r
-                            "ip": "192.168.50.70"\r
-                        },\r
-                        "service-function-forwarder-ovs:ovs-options": {\r
-                            "remote-ip": "flow",\r
-                            "dst-port": "6633",\r
-                            "key": "flow",\r
-                            "nsp": "flow",\r
-                            "nsi": "flow",\r
-                            "nshc1": "flow",\r
-                            "nshc2": "flow",\r
-                            "nshc3": "flow",\r
-                            "nshc4": "flow"\r
-                        }\r
-                    }\r
-                ]\r
-            },\r
-            {\r
-                "name": "SFF2",\r
-                "service-node": "OVSDB2",\r
-                "service-function-forwarder-ovs:ovs-bridge": {\r
-                    "bridge-name": "sw2"\r
-                },\r
-                "service-function-dictionary": [\r
-                    {\r
-                        "name": "dpi-74",\r
-                        "sff-sf-data-plane-locator": {\r
-                            "sf-dpl-name": "3",\r
-                            "sff-dpl-name": "sfc-tun4"\r
-                        }\r
-                    }\r
-                ],\r
-                "sff-data-plane-locator": [\r
-                    {\r
-                        "name": "sfc-tun4",\r
-                        "data-plane-locator": {\r
-                            "transport": "service-locator:vxlan-gpe",\r
-                            "port": 6633,\r
-                            "ip": "192.168.50.71"\r
-                        },\r
-                        "service-function-forwarder-ovs:ovs-options": {\r
-                            "remote-ip": "flow",\r
-                            "dst-port": "6633",\r
-                            "key": "flow",\r
-                            "nsp": "flow",\r
-                            "nsi": "flow",\r
-                            "nshc1": "flow",\r
-                            "nshc2": "flow",\r
-                            "nshc3": "flow",\r
-                            "nshc4": "flow"\r
-                        }\r
-                    }\r
-                ]\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_service_function_chains_uri():\r
-    return "/restconf/config/service-function-chain:service-function-chains/"\r
-\r
-def get_service_function_chains_data():\r
-    return {\r
-    "service-function-chains": {\r
-        "service-function-chain": [\r
-            {\r
-                "name": "SFCGBP",\r
-                "symmetric": "false",\r
-                "sfc-service-function": [\r
-                    {\r
-                        "name": "firewall-abstract1",\r
-                        "type": "service-function-type:firewall"\r
-                    },\r
-                    {\r
-                        "name": "dpi-abstract1",\r
-                        "type": "service-function-type:dpi"\r
-                    }\r
-                ]\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_service_function_paths_uri():\r
-    return "/restconf/config/service-function-path:service-function-paths/"\r
-\r
-def get_service_function_paths_data():\r
-    return {\r
-    "service-function-paths": {\r
-        "service-function-path": [\r
-            {\r
-                "name": "SFCGBP-Path",\r
-                "service-chain-name": "SFCGBP",\r
-                "starting-index": 255,\r
-                "symmetric": "false"\r
-\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_tenant_data():\r
-    return {\r
-        "tenant": [\r
-          {\r
-            "id": "tenant-red",\r
-            "name": "DockerTenant",\r
-            "forwarding-context": {\r
-              "l2-flood-domain": [\r
-                {\r
-                  "id": "flood-domain-1",\r
-                  "parent": "bridge-domain1"\r
-                },\r
-                {\r
-                  "id": "flood-domain-2",\r
-                  "parent": "bridge-domain1"\r
-                }\r
-              ],\r
-              "l3-context": [\r
-                {\r
-                  "id": "l3-context-vrf-red"\r
-                }\r
-              ],\r
-              "l2-bridge-domain": [\r
-                {\r
-                  "id": "bridge-domain1",\r
-                  "parent": "l3-context-vrf-red"\r
-                }\r
-              ],\r
-              "subnet": [\r
-                {\r
-                  "id": "subnet-10.0.36.0/24",\r
-                  "virtual-router-ip": "10.0.36.1",\r
-                  "parent": "flood-domain-2",\r
-                  "ip-prefix": "10.0.36.1/24"\r
-                },\r
-                {\r
-                  "id": "subnet-10.0.35.0/24",\r
-                  "virtual-router-ip": "10.0.35.1",\r
-                  "parent": "flood-domain-1",\r
-                  "ip-prefix": "10.0.35.1/24"\r
-                }\r
-              ]\r
-            },\r
-            "policy": {\r
-              "endpoint-group": [\r
-                {\r
-                  "id": "webservers",\r
-                  "name": "webservers",\r
-                  "provider-named-selector": [\r
-                    {\r
-                      "name": "webservers-clients-icmp-http-contract",\r
-                      "contract": [\r
-                        "icmp-http-contract"\r
-                      ]\r
-                    }\r
-                  ]\r
-                },\r
-                {\r
-                  "id": "clients",\r
-                  "name": "clients",\r
-                  "consumer-named-selector": [\r
-                    {\r
-                      "name": "webservers-clients-icmp-http-contract",\r
-                      "contract": [\r
-                        "icmp-http-contract"\r
-                      ]\r
-                    }\r
-                  ]\r
-                }\r
-              ],\r
-              "subject-feature-instances": {\r
-                "classifier-instance": [\r
-                  {\r
-                    "name": "icmp",\r
-                    "classifier-definition-id": "Classifier-IP-Protocol",\r
-                    "parameter-value": [\r
-                      {\r
-                        "name": "proto",\r
-                        "int-value": 1\r
-                      }\r
-                    ]\r
-                  },\r
-                  {\r
-                    "name": "http-dest",\r
-                    "classifier-definition-id": "Classifier-L4",\r
-                    "parameter-value": [\r
-                      {\r
-                        "int-value": "6",\r
-                        "name": "proto"\r
-                      },\r
-                      {\r
-                        "int-value": "80",\r
-                        "name": "destport"\r
-                      }\r
-                    ]\r
-                  },\r
-                  {\r
-                    "name": "http-src",\r
-                    "classifier-definition-id": "Classifier-L4",\r
-                    "parameter-value": [\r
-                      {\r
-                        "int-value": "6",\r
-                        "name": "proto"\r
-                      },\r
-                      {\r
-                        "int-value": "80",\r
-                        "name": "sourceport"\r
-                      }\r
-                    ]\r
-                  }\r
-                ],\r
-                "action-instance": [\r
-                  {\r
-                    "name": "chain1",\r
-                    "action-definition-id": "Action-Chain",\r
-                    "parameter-value": [\r
-                      {\r
-                        "name": "sfc-chain-name",\r
-                        "string-value": "SFCGBP"\r
-                      }\r
-                    ]\r
-                  },\r
-                  {\r
-                    "name": "allow1",\r
-                    "action-definition-id": "Action-Allow"\r
-                  }\r
-                ]\r
-              },\r
-              "contract": [\r
-                {\r
-                  "id": "icmp-http-contract",\r
-                  "subject": [\r
-                    {\r
-                      "name": "icmp-subject",\r
-                      "rule": [\r
-                        {\r
-                          "name": "allow-icmp-rule",\r
-                          "order": 0,\r
-                          "classifier-ref": [\r
-                            {\r
-                              "name": "icmp",\r
-                              "instance-name": "icmp"\r
-                            }\r
-                          ],\r
-                          "action-ref": [\r
-                            {\r
-                              "name": "allow1",\r
-                              "order": 0\r
-                            }\r
-                          ]\r
-                        }\r
-                      ]\r
-                    },\r
-                    {\r
-                      "name": "http-subject",\r
-                      "rule": [\r
-                        {\r
-                          "name": "http-chain-rule",\r
-                          "classifier-ref": [\r
-                            {\r
-                              "name": "http-dest",\r
-                              "instance-name": "http-dest",\r
-                              "direction": "in"\r
-                            }\r
-                          ],\r
-                          "action-ref": [\r
-                            {\r
-                              "name": "chain1",\r
-                              "order": 0\r
-                            }\r
-                          ]\r
-                        },\r
-                        {\r
-                          "name": "http-out-rule",\r
-                          "classifier-ref": [\r
-                            {\r
-                              "name": "http-src",\r
-                              "instance-name": "http-src",\r
-                              "direction": "out"\r
-                            }\r
-                          ],\r
-                          "action-ref": [\r
-                            {\r
-                              "name": "allow1",\r
-                              "order": 0\r
-                            }\r
-                          ]\r
-                        }\r
-                      ]\r
-                    }\r
-                  ],\r
-                  "clause": [\r
-                    {\r
-                      "name": "icmp-http-clause",\r
-                      "subject-refs": [\r
-                        "icmp-subject",\r
-                        "http-subject"\r
-                      ]\r
-                    }\r
-                  ]\r
-                }\r
-              ]\r
-            }\r
-          }\r
-        ]\r
-    }\r
-\r
-# Main definition - constants\r
-\r
-# =======================\r
-#     MENUS FUNCTIONS\r
-# =======================\r
-\r
-# Main menu\r
-\r
-# =======================\r
-#      MAIN PROGRAM\r
-# =======================\r
-\r
-# Main Program\r
-\r
-def get_tenant_uri():\r
-    return "/restconf/config/policy:tenants/policy:tenant/tenant-red"\r
-\r
-def get_tunnel_data_1():\r
-    return {\r
-    "node": [\r
-      {\r
-        "id": "openflow:1",\r
-        "ofoverlay:tunnel": [\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",\r
-            "node-connector-id": "openflow:1:1",\r
-            "ip": "192.168.50.70",\r
-            "port": 6633\r
-          },\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan",\r
-            "node-connector-id": "openflow:1:2",\r
-            "ip": "192.168.50.70",\r
-            "port": 4789\r
-          }\r
-        ]\r
-      }\r
-    ]\r
-  }\r
-\r
-def get_tunnel_uri_1():\r
-    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:1"\r
-\r
-def get_tunnel_data_6():\r
-    return {\r
-    "node": [\r
-      {\r
-        "id": "openflow:6",\r
-        "ofoverlay:tunnel": [\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",\r
-            "node-connector-id": "openflow:6:1",\r
-            "ip": "192.168.50.75",\r
-            "port": 6633\r
-          },\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan",\r
-            "node-connector-id": "openflow:6:2",\r
-            "ip": "192.168.50.75",\r
-            "port": 4789\r
-          }\r
-        ]\r
-      }\r
-    ]\r
-  }\r
-\r
-def get_tunnel_uri_6():\r
-    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:6"\r
-\r
-def get_endpoint_data():\r
-    return [\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:02",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.2",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_2",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-    "endpoint-group": "clients",\r
-"network-containment" : "subnet-10.0.35.0/24",\r
-"l2-context": "bridge-domain1",\r
-"mac-address": "00:00:00:00:35:02",\r
-"l3-address": [\r
-    {\r
-        "ip-address": "10.0.35.2",\r
-        "l3-context": "l3-context-vrf-red"\r
-    }\r
-],\r
-"port-name": "vethl-h35_2",\r
-"tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "clients",\r
-\r
-    "network-containment" : "subnet-10.0.35.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:35:03",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.35.3",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h35_3",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:03",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.3",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_3",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:04",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.4",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_4",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "clients",\r
-\r
-    "network-containment" : "subnet-10.0.35.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:35:04",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.35.4",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h35_4",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "clients",\r
-\r
-    "network-containment" : "subnet-10.0.35.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:35:05",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.35.5",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h35_5",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:05",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.5",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_5",\r
-    "tenant": "tenant-red"\r
-}\r
-}]\r
-\r
-\r
-def get_endpoint_uri():\r
-    return "/restconf/operations/endpoint:register-endpoint"\r
-\r
-def get_tunnel_oper_uri():\r
-    return "/restconf/operational/opendaylight-inventory:nodes/"\r
-\r
-def get_topology_oper_uri():\r
-    return "/restconf/operational/network-topology:network-topology/topology/ovsdb:1/"\r
-\r
-if __name__ == "__main__":\r
-    # Launch main menu\r
-\r
-\r
-    # Some sensible defaults\r
-    controller=os.environ.get('ODL')\r
-    if controller == None:\r
-        sys.exit("No controller set.")\r
-\r
-    print "Contacting controller at %s" % controller\r
-    print "waiting for manager on SFFs..."\r
-    wait_for_sff_in_datastore(get_topology_oper_uri())\r
-    print "sending service functions"\r
-    put(controller, DEFAULT_PORT, get_service_functions_uri(), get_service_functions_data(), True)\r
-    print "sending service function forwarders"\r
-    put(controller, DEFAULT_PORT, get_service_function_forwarders_uri(), get_service_function_forwarders_data(), True)\r
-    print "waiting for switches on SFFs..."\r
-    wait_for_sff_in_datastore(get_tunnel_oper_uri())\r
-    print "sending service function chains"\r
-    put(controller, DEFAULT_PORT, get_service_function_chains_uri(), get_service_function_chains_data(), True)\r
-    print "sending service function paths"\r
-    put(controller, DEFAULT_PORT, get_service_function_paths_uri(), get_service_function_paths_data(), True)\r
-    print "sending tunnel"\r
-    put(controller, DEFAULT_PORT, get_tunnel_uri_1(), get_tunnel_data_1(), True)\r
-    print "sending tenant"\r
-    put(controller, DEFAULT_PORT, get_tunnel_uri_6(), get_tunnel_data_6(), True)\r
-    print "sending tenant"\r
-    put(controller, DEFAULT_PORT, get_tenant_uri(), get_tenant_data(),True)\r
-    print "registering endpoints"\r
-    for endpoint in get_endpoint_data():\r
-        post(controller, DEFAULT_PORT, get_endpoint_uri(),endpoint,True)\r
+#!/usr/bin/python
+import argparse
+import requests,json
+from requests.auth import HTTPBasicAuth
+from subprocess import call
+import time
+import sys
+import os
+
+
+DEFAULT_PORT='8181'
+
+
+USERNAME='admin'
+PASSWORD='admin'
+
+
+CONF_TENANT='/restconf/config/policy:tenants'
+
+def get(host, port, uri):
+    url='http://'+host+":"+port+uri
+    r = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD))
+    return r
+
+def put(host, port, uri, data, debug=False):
+    '''Perform a PUT rest operation, using the URL and data provided'''
+
+    url='http://'+host+":"+port+uri
+
+    headers = {'Content-type': 'application/yang.data+json',
+               'Accept': 'application/yang.data+json'}
+    if debug == True:
+        print "PUT %s" % url
+        print json.dumps(data, indent=4, sort_keys=True)
+    r = requests.put(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
+    if debug == True:
+        print r.text
+    r.raise_for_status()
+
+def post(host, port, uri, data, debug=False):
+    '''Perform a POST rest operation, using the URL and data provided'''
+
+    url='http://'+host+":"+port+uri
+    headers = {'Content-type': 'application/yang.data+json',
+               'Accept': 'application/yang.data+json'}
+    if debug == True:
+        print "POST %s" % url
+        print json.dumps(data, indent=4, sort_keys=True)
+    r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
+    if debug == True:
+        print r.text
+    r.raise_for_status()
+
+def wait_for_sff_in_datastore(url):
+    for i in xrange(30):
+        resp=get(controller, DEFAULT_PORT, url)
+        if ('192.168.50.70' in resp.text) and ('192.168.50.71' in resp.text):
+            break
+        time.sleep(3)
+    if ('192.168.50.70' not in resp.text):
+        print "ERROR: SFF1 has not been initialized!"
+        sys.exit(1)
+    if ('192.168.50.71' not in resp.text):
+        print "ERROR: SFF2 has not been initialized!"
+        sys.exit(1)
+
+
+
+def get_service_functions_uri():
+    return "/restconf/config/service-function:service-functions"
+
+def get_service_functions_data():
+    return {
+    "service-functions": {
+        "service-function": [
+            {
+                "name": "firewall-72",
+                "ip-mgmt-address": "192.168.50.72",
+                "type": "service-function-type:firewall",
+                "nsh-aware": "true",
+                "sf-data-plane-locator": [
+                    {
+                        "name": "2",
+                        "port": 6633,
+                        "ip": "192.168.50.72",
+                        "transport": "service-locator:vxlan-gpe",
+                        "service-function-forwarder": "SFF1"
+                    }
+                ]
+            },
+            {
+                "name": "dpi-74",
+                "ip-mgmt-address": "192.168.50.74",
+                "type": "service-function-type:dpi",
+                "nsh-aware": "true",
+                "sf-data-plane-locator": [
+                    {
+                        "name": "3",
+                        "port": 6633,
+                        "ip": "192.168.50.74",
+                        "transport": "service-locator:vxlan-gpe",
+                        "service-function-forwarder": "SFF2"
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+def get_service_function_forwarders_uri():
+    return "/restconf/config/service-function-forwarder:service-function-forwarders"
+
+def get_service_function_forwarders_data():
+    return {
+    "service-function-forwarders": {
+        "service-function-forwarder": [
+            {
+                "name": "SFF1",
+                "service-node": "OVSDB2",
+                "service-function-forwarder-ovs:ovs-bridge": {
+                    "bridge-name": "sw1"
+                },
+                "service-function-dictionary": [
+                    {
+                        "name": "firewall-72",
+                        "sff-sf-data-plane-locator": {
+                            "sf-dpl-name": "2",
+                            "sff-dpl-name": "sfc-tun2"
+                        }
+                    }
+                ],
+                "sff-data-plane-locator": [
+                    {
+                        "name": "sfc-tun2",
+                        "data-plane-locator": {
+                            "transport": "service-locator:vxlan-gpe",
+                            "port": 6633,
+                            "ip": "192.168.50.70"
+                        },
+                        "service-function-forwarder-ovs:ovs-options": {
+                            "remote-ip": "flow",
+                            "dst-port": "6633",
+                            "key": "flow",
+                            "nsp": "flow",
+                            "nsi": "flow",
+                            "nshc1": "flow",
+                            "nshc2": "flow",
+                            "nshc3": "flow",
+                            "nshc4": "flow"
+                        }
+                    }
+                ]
+            },
+            {
+                "name": "SFF2",
+                "service-node": "OVSDB2",
+                "service-function-forwarder-ovs:ovs-bridge": {
+                    "bridge-name": "sw2"
+                },
+                "service-function-dictionary": [
+                    {
+                        "name": "dpi-74",
+                        "sff-sf-data-plane-locator": {
+                            "sf-dpl-name": "3",
+                            "sff-dpl-name": "sfc-tun4"
+                        }
+                    }
+                ],
+                "sff-data-plane-locator": [
+                    {
+                        "name": "sfc-tun4",
+                        "data-plane-locator": {
+                            "transport": "service-locator:vxlan-gpe",
+                            "port": 6633,
+                            "ip": "192.168.50.71"
+                        },
+                        "service-function-forwarder-ovs:ovs-options": {
+                            "remote-ip": "flow",
+                            "dst-port": "6633",
+                            "key": "flow",
+                            "nsp": "flow",
+                            "nsi": "flow",
+                            "nshc1": "flow",
+                            "nshc2": "flow",
+                            "nshc3": "flow",
+                            "nshc4": "flow"
+                        }
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+def get_service_function_chains_uri():
+    return "/restconf/config/service-function-chain:service-function-chains/"
+
+def get_service_function_chains_data():
+    return {
+    "service-function-chains": {
+        "service-function-chain": [
+            {
+                "name": "SFCGBP",
+                "symmetric": "false",
+                "sfc-service-function": [
+                    {
+                        "name": "firewall-abstract1",
+                        "type": "service-function-type:firewall"
+                    },
+                    {
+                        "name": "dpi-abstract1",
+                        "type": "service-function-type:dpi"
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+def get_service_function_paths_uri():
+    return "/restconf/config/service-function-path:service-function-paths/"
+
+def get_service_function_paths_data():
+    return {
+    "service-function-paths": {
+        "service-function-path": [
+            {
+                "name": "SFCGBP-Path",
+                "service-chain-name": "SFCGBP",
+                "starting-index": 255,
+                "symmetric": "false"
+
+            }
+        ]
+    }
+}
+
+def get_tenant_data():
+    return {
+        "tenant": [
+          {
+            "id": "tenant-red",
+            "name": "DockerTenant",
+            "forwarding-context": {
+              "l2-flood-domain": [
+                {
+                  "id": "flood-domain-1",
+                  "parent": "bridge-domain1"
+                },
+                {
+                  "id": "flood-domain-2",
+                  "parent": "bridge-domain1"
+                }
+              ],
+              "l3-context": [
+                {
+                  "id": "l3-context-vrf-red"
+                }
+              ],
+              "l2-bridge-domain": [
+                {
+                  "id": "bridge-domain1",
+                  "parent": "l3-context-vrf-red"
+                }
+              ],
+              "subnet": [
+                {
+                  "id": "subnet-10.0.36.0/24",
+                  "virtual-router-ip": "10.0.36.1",
+                  "parent": "flood-domain-2",
+                  "ip-prefix": "10.0.36.1/24"
+                },
+                {
+                  "id": "subnet-10.0.35.0/24",
+                  "virtual-router-ip": "10.0.35.1",
+                  "parent": "flood-domain-1",
+                  "ip-prefix": "10.0.35.1/24"
+                }
+              ]
+            },
+            "policy": {
+              "endpoint-group": [
+                {
+                  "id": "webservers",
+                  "name": "webservers",
+                  "provider-named-selector": [
+                    {
+                      "name": "webservers-clients-icmp-http-contract",
+                      "contract": [
+                        "icmp-http-contract"
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "id": "clients",
+                  "name": "clients",
+                  "consumer-named-selector": [
+                    {
+                      "name": "webservers-clients-icmp-http-contract",
+                      "contract": [
+                        "icmp-http-contract"
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "subject-feature-instances": {
+                "classifier-instance": [
+                  {
+                    "name": "icmp",
+                    "classifier-definition-id": "Classifier-IP-Protocol",
+                    "parameter-value": [
+                      {
+                        "name": "proto",
+                        "int-value": 1
+                      }
+                    ]
+                  },
+                  {
+                    "name": "http-dest",
+                    "classifier-definition-id": "Classifier-L4",
+                    "parameter-value": [
+                      {
+                        "int-value": "6",
+                        "name": "proto"
+                      },
+                      {
+                        "int-value": "80",
+                        "name": "destport"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "http-src",
+                    "classifier-definition-id": "Classifier-L4",
+                    "parameter-value": [
+                      {
+                        "int-value": "6",
+                        "name": "proto"
+                      },
+                      {
+                        "int-value": "80",
+                        "name": "sourceport"
+                      }
+                    ]
+                  }
+                ],
+                "action-instance": [
+                  {
+                    "name": "chain1",
+                    "action-definition-id": "Action-Chain",
+                    "parameter-value": [
+                      {
+                        "name": "sfc-chain-name",
+                        "string-value": "SFCGBP"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "allow1",
+                    "action-definition-id": "Action-Allow"
+                  }
+                ]
+              },
+              "contract": [
+                {
+                  "id": "icmp-http-contract",
+                  "subject": [
+                    {
+                      "name": "icmp-subject",
+                      "rule": [
+                        {
+                          "name": "allow-icmp-rule",
+                          "order": 0,
+                          "classifier-ref": [
+                            {
+                              "name": "icmp",
+                              "instance-name": "icmp"
+                            }
+                          ],
+                          "action-ref": [
+                            {
+                              "name": "allow1",
+                              "order": 0
+                            }
+                          ]
+                        }
+                      ]
+                    },
+                    {
+                      "name": "http-subject",
+                      "rule": [
+                        {
+                          "name": "http-chain-rule",
+                          "classifier-ref": [
+                            {
+                              "name": "http-dest",
+                              "instance-name": "http-dest",
+                              "direction": "in"
+                            }
+                          ],
+                          "action-ref": [
+                            {
+                              "name": "chain1",
+                              "order": 0
+                            }
+                          ]
+                        },
+                        {
+                          "name": "http-out-rule",
+                          "classifier-ref": [
+                            {
+                              "name": "http-src",
+                              "instance-name": "http-src",
+                              "direction": "out"
+                            }
+                          ],
+                          "action-ref": [
+                            {
+                              "name": "allow1",
+                              "order": 0
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ],
+                  "clause": [
+                    {
+                      "name": "icmp-http-clause",
+                      "subject-refs": [
+                        "icmp-subject",
+                        "http-subject"
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+    }
+
+# Main definition - constants
+
+# =======================
+#     MENUS FUNCTIONS
+# =======================
+
+# Main menu
+
+# =======================
+#      MAIN PROGRAM
+# =======================
+
+# Main Program
+
+def get_tenant_uri():
+    return "/restconf/config/policy:tenants/policy:tenant/tenant-red"
+
+def get_tunnel_data_1():
+    return {
+    "node": [
+      {
+        "id": "openflow:1",
+        "ofoverlay:tunnel": [
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",
+            "node-connector-id": "openflow:1:1",
+            "ip": "192.168.50.70",
+            "port": 6633
+          },
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan",
+            "node-connector-id": "openflow:1:2",
+            "ip": "192.168.50.70",
+            "port": 4789
+          }
+        ]
+      }
+    ]
+  }
+
+def get_tunnel_uri_1():
+    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:1"
+
+def get_tunnel_data_6():
+    return {
+    "node": [
+      {
+        "id": "openflow:6",
+        "ofoverlay:tunnel": [
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",
+            "node-connector-id": "openflow:6:1",
+            "ip": "192.168.50.75",
+            "port": 6633
+          },
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan",
+            "node-connector-id": "openflow:6:2",
+            "ip": "192.168.50.75",
+            "port": 4789
+          }
+        ]
+      }
+    ]
+  }
+
+def get_tunnel_uri_6():
+    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:6"
+
+def get_endpoint_data():
+    return [
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:02",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.2",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_2",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+    "endpoint-group": "clients",
+"network-containment" : "subnet-10.0.35.0/24",
+"l2-context": "bridge-domain1",
+"mac-address": "00:00:00:00:35:02",
+"l3-address": [
+    {
+        "ip-address": "10.0.35.2",
+        "l3-context": "l3-context-vrf-red"
+    }
+],
+"port-name": "vethl-h35_2",
+"tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "clients",
+
+    "network-containment" : "subnet-10.0.35.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:35:03",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.35.3",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h35_3",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:03",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.3",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_3",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:04",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.4",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_4",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "clients",
+
+    "network-containment" : "subnet-10.0.35.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:35:04",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.35.4",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h35_4",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "clients",
+
+    "network-containment" : "subnet-10.0.35.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:35:05",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.35.5",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h35_5",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:05",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.5",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_5",
+    "tenant": "tenant-red"
+}
+}]
+
+
+def get_endpoint_uri():
+    return "/restconf/operations/endpoint:register-endpoint"
+
+def get_tunnel_oper_uri():
+    return "/restconf/operational/opendaylight-inventory:nodes/"
+
+def get_topology_oper_uri():
+    return "/restconf/operational/network-topology:network-topology/topology/ovsdb:1/"
+
+if __name__ == "__main__":
+    # Launch main menu
+
+
+    # Some sensible defaults
+    controller=os.environ.get('ODL')
+    if controller == None:
+        sys.exit("No controller set.")
+
+    print "Contacting controller at %s" % controller
+    print "waiting for manager on SFFs..."
+    wait_for_sff_in_datastore(get_topology_oper_uri())
+    print "sending service functions"
+    put(controller, DEFAULT_PORT, get_service_functions_uri(), get_service_functions_data(), True)
+    print "sending service function forwarders"
+    put(controller, DEFAULT_PORT, get_service_function_forwarders_uri(), get_service_function_forwarders_data(), True)
+    print "waiting for switches on SFFs..."
+    wait_for_sff_in_datastore(get_tunnel_oper_uri())
+    print "sending service function chains"
+    put(controller, DEFAULT_PORT, get_service_function_chains_uri(), get_service_function_chains_data(), True)
+    print "sending service function paths"
+    put(controller, DEFAULT_PORT, get_service_function_paths_uri(), get_service_function_paths_data(), True)
+    print "sending tunnel"
+    put(controller, DEFAULT_PORT, get_tunnel_uri_1(), get_tunnel_data_1(), True)
+    print "sending tenant"
+    put(controller, DEFAULT_PORT, get_tunnel_uri_6(), get_tunnel_data_6(), True)
+    print "sending tenant"
+    put(controller, DEFAULT_PORT, get_tenant_uri(), get_tenant_data(),True)
+    print "registering endpoints"
+    for endpoint in get_endpoint_data():
+        post(controller, DEFAULT_PORT, get_endpoint_uri(),endpoint,True)
index 34389859028d66734bdf4e86cfbe4a56fefea5dc..b06a7564345e550bde4aa7e8b4e1eccca0874384 100644 (file)
@@ -1,17 +1,17 @@
-#!/usr/bin/env bash\r
-\r
-set -e\r
-hostnum=${HOSTNAME#"gbpsfc"}\r
-sw="sw$hostnum"\r
-\r
-if [ "$hostnum" -eq "3" ]; then\r
-    TUNNEL=0xC0A83247\r
-elif [ "$hostnum" -eq "5" ]; then\r
-    TUNNEL=0xC0A83249\r
-else\r
-    echo "Invalid SF for this demo";\r
-    exit\r
-fi\r
-\r
-sudo ovs-vsctl add-br $sw\r
-sudo ovs-vsctl add-port $sw $sw-vxlangpe-0 -- set interface $sw-vxlangpe-0 type=vxlan options:remote_ip=flow options:dst_port=6633 options:nshc1=flow options:nshc2=flow options:nshc3=flow options:nshc4=flow options:nsp=flow options:nsi=flow options:key=flow\r
+#!/usr/bin/env bash
+
+set -e
+hostnum=${HOSTNAME#"gbpsfc"}
+sw="sw$hostnum"
+
+if [ "$hostnum" -eq "3" ]; then
+    TUNNEL=0xC0A83247
+elif [ "$hostnum" -eq "5" ]; then
+    TUNNEL=0xC0A83249
+else
+    echo "Invalid SF for this demo";
+    exit
+fi
+
+sudo ovs-vsctl add-br $sw
+sudo ovs-vsctl add-port $sw $sw-vxlangpe-0 -- set interface $sw-vxlangpe-0 type=vxlan options:remote_ip=flow options:dst_port=6633 options:nshc1=flow options:nshc2=flow options:nshc3=flow options:nshc4=flow options:nsp=flow options:nsi=flow options:key=flow
index 31b693ddbb33b3c3368fa13a0b800c729b4324c0..1d84f7e377894e36f5b073acdf180f311618e526 100644 (file)
@@ -1,20 +1,20 @@
-#!/usr/bin/env bash\r
-\r
-set -e\r
-hostnum=${HOSTNAME#"gbpsfc"}\r
-sw="sw$hostnum"\r
-nsp=$1\r
-\r
-if [ "$hostnum" -eq "3" ]; then\r
-    TUNNEL=0xC0A83246\r
-elif [ "$hostnum" -eq "5" ]; then\r
-    TUNNEL=0xC0A83247\r
-else\r
-    echo "Invalid SF for this demo";\r
-    exit\r
-fi\r
-# delete NORMAL, if present\r
-nsphex=`printf "%x\n" $nsp`\r
-sudo ovs-ofctl --strict del-flows $sw priority=0\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13\r
+#!/usr/bin/env bash
+
+set -e
+hostnum=${HOSTNAME#"gbpsfc"}
+sw="sw$hostnum"
+nsp=$1
+
+if [ "$hostnum" -eq "3" ]; then
+    TUNNEL=0xC0A83246
+elif [ "$hostnum" -eq "5" ]; then
+    TUNNEL=0xC0A83247
+else
+    echo "Invalid SF for this demo";
+    exit
+fi
+# delete NORMAL, if present
+nsphex=`printf "%x\n" $nsp`
+sudo ovs-ofctl --strict del-flows $sw priority=0
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13
index 4d577b40b7c78387035349234e8c335d3bf1f115..f4ee6497d240d311173070518c85933a15761b21 100644 (file)
@@ -1,20 +1,20 @@
-#!/usr/bin/env bash\r
-\r
-set -e\r
-hostnum=${HOSTNAME#"gbpsfc"}\r
-sw="sw$hostnum"\r
-nsp=$1\r
-\r
-if [ "$hostnum" -eq "3" ]; then\r
-    TUNNEL=0xC0A83247\r
-elif [ "$hostnum" -eq "5" ]; then\r
-    TUNNEL=0xC0A83249\r
-else\r
-    echo "Invalid SF for this demo";\r
-    exit\r
-fi\r
-# delete NORMAL, if present\r
-nsphex=`printf "%x\n" $nsp`\r
-sudo ovs-ofctl --strict del-flows $sw priority=0\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13\r
+#!/usr/bin/env bash
+
+set -e
+hostnum=${HOSTNAME#"gbpsfc"}
+sw="sw$hostnum"
+nsp=$1
+
+if [ "$hostnum" -eq "3" ]; then
+    TUNNEL=0xC0A83247
+elif [ "$hostnum" -eq "5" ]; then
+    TUNNEL=0xC0A83249
+else
+    echo "Invalid SF for this demo";
+    exit
+fi
+# delete NORMAL, if present
+nsphex=`printf "%x\n" $nsp`
+sudo ovs-ofctl --strict del-flows $sw priority=0
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13
index bc06db7ad4d67548005c905a7e7d137c1c6bd1b4..6b99f6dfff3ce19ceeffbe6a5d0ad09022f6a790 100644 (file)
-#!/usr/bin/python\r
-import argparse\r
-import requests,json\r
-from requests.auth import HTTPBasicAuth\r
-from subprocess import call\r
-import time\r
-import sys\r
-import os\r
-\r
-\r
-DEFAULT_PORT='8181'\r
-\r
-\r
-USERNAME='admin'\r
-PASSWORD='admin'\r
-\r
-\r
-CONF_TENANT='/restconf/config/policy:tenants'\r
-\r
-def get(host, port, uri):\r
-    url='http://'+host+":"+port+uri\r
-    r = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
-    return r\r
-\r
-def put(host, port, uri, data, debug=False):\r
-    '''Perform a PUT rest operation, using the URL and data provided'''\r
-\r
-    url='http://'+host+":"+port+uri\r
-\r
-    headers = {'Content-type': 'application/yang.data+json',\r
-               'Accept': 'application/yang.data+json'}\r
-    if debug == True:\r
-        print "PUT %s" % url\r
-        print json.dumps(data, indent=4, sort_keys=True)\r
-    r = requests.put(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
-    if debug == True:\r
-        print r.text\r
-    r.raise_for_status()\r
-\r
-def post(host, port, uri, data, debug=False):\r
-    '''Perform a POST rest operation, using the URL and data provided'''\r
-\r
-    url='http://'+host+":"+port+uri\r
-    headers = {'Content-type': 'application/yang.data+json',\r
-               'Accept': 'application/yang.data+json'}\r
-    if debug == True:\r
-        print "POST %s" % url\r
-        print json.dumps(data, indent=4, sort_keys=True)\r
-    r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
-    if debug == True:\r
-        print r.text\r
-    r.raise_for_status()\r
-\r
-def wait_for_sff_in_datastore(url):\r
-    for i in xrange(30):\r
-        resp=get(controller, DEFAULT_PORT, url)\r
-        if ('192.168.50.70' in resp.text) and ('192.168.50.71' in resp.text):\r
-            break\r
-        time.sleep(3)\r
-    if ('192.168.50.70' not in resp.text):\r
-        print "ERROR: SFF1 has not been initialized!"\r
-        sys.exit(1)\r
-    if ('192.168.50.71' not in resp.text):\r
-        print "ERROR: SFF2 has not been initialized!"\r
-        sys.exit(1)\r
-\r
-\r
-\r
-def get_service_functions_uri():\r
-    return "/restconf/config/service-function:service-functions"\r
-\r
-def get_service_functions_data():\r
-    return {\r
-    "service-functions": {\r
-        "service-function": [\r
-            {\r
-                "name": "firewall-72",\r
-                "ip-mgmt-address": "192.168.50.72",\r
-                "type": "service-function-type:firewall",\r
-                "nsh-aware": "true",\r
-                "sf-data-plane-locator": [\r
-                    {\r
-                        "name": "2",\r
-                        "port": 6633,\r
-                        "ip": "192.168.50.72",\r
-                        "transport": "service-locator:vxlan-gpe",\r
-                        "service-function-forwarder": "SFF1"\r
-                    }\r
-                ]\r
-            },\r
-            {\r
-                "name": "dpi-74",\r
-                "ip-mgmt-address": "192.168.50.74",\r
-                "type": "service-function-type:dpi",\r
-                "nsh-aware": "true",\r
-                "sf-data-plane-locator": [\r
-                    {\r
-                        "name": "3",\r
-                        "port": 6633,\r
-                        "ip": "192.168.50.74",\r
-                        "transport": "service-locator:vxlan-gpe",\r
-                        "service-function-forwarder": "SFF2"\r
-                    }\r
-                ]\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_service_function_forwarders_uri():\r
-    return "/restconf/config/service-function-forwarder:service-function-forwarders"\r
-\r
-def get_service_function_forwarders_data():\r
-    return {\r
-    "service-function-forwarders": {\r
-        "service-function-forwarder": [\r
-            {\r
-                "name": "SFF1",\r
-                "service-node": "OVSDB2",\r
-                "service-function-forwarder-ovs:ovs-bridge": {\r
-                    "bridge-name": "sw1"\r
-                },\r
-                "service-function-dictionary": [\r
-                    {\r
-                        "name": "firewall-72",\r
-                        "sff-sf-data-plane-locator": {\r
-                            "sf-dpl-name": "2",\r
-                            "sff-dpl-name": "sfc-tun2"\r
-                        }\r
-                    }\r
-                ],\r
-                "sff-data-plane-locator": [\r
-                    {\r
-                        "name": "sfc-tun2",\r
-                        "data-plane-locator": {\r
-                            "transport": "service-locator:vxlan-gpe",\r
-                            "port": 6633,\r
-                            "ip": "192.168.50.70"\r
-                        },\r
-                        "service-function-forwarder-ovs:ovs-options": {\r
-                            "remote-ip": "flow",\r
-                            "dst-port": "6633",\r
-                            "key": "flow",\r
-                            "nsp": "flow",\r
-                            "nsi": "flow",\r
-                            "nshc1": "flow",\r
-                            "nshc2": "flow",\r
-                            "nshc3": "flow",\r
-                            "nshc4": "flow"\r
-                        }\r
-                    }\r
-                ]\r
-            },\r
-            {\r
-                "name": "SFF2",\r
-                "service-node": "OVSDB2",\r
-                "service-function-forwarder-ovs:ovs-bridge": {\r
-                    "bridge-name": "sw2"\r
-                },\r
-                "service-function-dictionary": [\r
-                    {\r
-                        "name": "dpi-74",\r
-                        "sff-sf-data-plane-locator": {\r
-                            "sf-dpl-name": "3",\r
-                            "sff-dpl-name": "sfc-tun4"\r
-                        }\r
-                    }\r
-                ],\r
-                "sff-data-plane-locator": [\r
-                    {\r
-                        "name": "sfc-tun4",\r
-                        "data-plane-locator": {\r
-                            "transport": "service-locator:vxlan-gpe",\r
-                            "port": 6633,\r
-                            "ip": "192.168.50.71"\r
-                        },\r
-                        "service-function-forwarder-ovs:ovs-options": {\r
-                            "remote-ip": "flow",\r
-                            "dst-port": "6633",\r
-                            "key": "flow",\r
-                            "nsp": "flow",\r
-                            "nsi": "flow",\r
-                            "nshc1": "flow",\r
-                            "nshc2": "flow",\r
-                            "nshc3": "flow",\r
-                            "nshc4": "flow"\r
-                        }\r
-                    }\r
-                ]\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_service_function_chains_uri():\r
-    return "/restconf/config/service-function-chain:service-function-chains/"\r
-\r
-def get_service_function_chains_data():\r
-    return {\r
-    "service-function-chains": {\r
-        "service-function-chain": [\r
-            {\r
-                "name": "SFCGBP",\r
-                "symmetric": "true",\r
-                "sfc-service-function": [\r
-                    {\r
-                        "name": "firewall-abstract1",\r
-                        "type": "service-function-type:firewall"\r
-                    },\r
-                    {\r
-                        "name": "dpi-abstract1",\r
-                        "type": "service-function-type:dpi"\r
-                    }\r
-                ]\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_service_function_paths_uri():\r
-    return "/restconf/config/service-function-path:service-function-paths/"\r
-\r
-def get_service_function_paths_data():\r
-    return {\r
-    "service-function-paths": {\r
-        "service-function-path": [\r
-            {\r
-                "name": "SFCGBP-Path",\r
-                "service-chain-name": "SFCGBP",\r
-                "starting-index": 255,\r
-                "symmetric": "true"\r
-\r
-            }\r
-        ]\r
-    }\r
-}\r
-\r
-def get_tenant_data():\r
-    return {\r
-        "tenant": [\r
-          {\r
-            "id": "tenant-red",\r
-            "name": "DockerTenant",\r
-            "forwarding-context": {\r
-              "l2-flood-domain": [\r
-                {\r
-                  "id": "flood-domain-1",\r
-                  "parent": "bridge-domain1"\r
-                },\r
-                {\r
-                  "id": "flood-domain-2",\r
-                  "parent": "bridge-domain1"\r
-                }\r
-              ],\r
-              "l3-context": [\r
-                {\r
-                  "id": "l3-context-vrf-red"\r
-                }\r
-              ],\r
-              "l2-bridge-domain": [\r
-                {\r
-                  "id": "bridge-domain1",\r
-                  "parent": "l3-context-vrf-red"\r
-                }\r
-              ],\r
-              "subnet": [\r
-                {\r
-                  "id": "subnet-10.0.36.0/24",\r
-                  "virtual-router-ip": "10.0.36.1",\r
-                  "parent": "flood-domain-2",\r
-                  "ip-prefix": "10.0.36.1/24"\r
-                },\r
-                {\r
-                  "id": "subnet-10.0.35.0/24",\r
-                  "virtual-router-ip": "10.0.35.1",\r
-                  "parent": "flood-domain-1",\r
-                  "ip-prefix": "10.0.35.1/24"\r
-                }\r
-              ]\r
-            },\r
-            "policy": {\r
-              "endpoint-group": [\r
-                {\r
-                  "id": "webservers",\r
-                  "name": "webservers",\r
-                  "provider-named-selector": [\r
-                    {\r
-                      "name": "webservers-clients-icmp-http-contract",\r
-                      "contract": [\r
-                        "icmp-http-contract"\r
-                      ]\r
-                    }\r
-                  ]\r
-                },\r
-                {\r
-                  "id": "clients",\r
-                  "name": "clients",\r
-                  "consumer-named-selector": [\r
-                    {\r
-                      "name": "webservers-clients-icmp-http-contract",\r
-                      "contract": [\r
-                        "icmp-http-contract"\r
-                      ]\r
-                    }\r
-                  ]\r
-                }\r
-              ],\r
-              "subject-feature-instances": {\r
-                "classifier-instance": [\r
-                  {\r
-                    "name": "icmp",\r
-                    "classifier-definition-id": "Classifier-IP-Protocol",\r
-                    "parameter-value": [\r
-                      {\r
-                        "name": "proto",\r
-                        "int-value": 1\r
-                      }\r
-                    ]\r
-                  },\r
-                  {\r
-                    "name": "http-dest",\r
-                    "classifier-definition-id": "Classifier-L4",\r
-                    "parameter-value": [\r
-                      {\r
-                        "int-value": "6",\r
-                        "name": "proto"\r
-                      },\r
-                      {\r
-                        "int-value": "80",\r
-                        "name": "destport"\r
-                      }\r
-                    ]\r
-                  },\r
-                  {\r
-                    "name": "http-src",\r
-                    "classifier-definition-id": "Classifier-L4",\r
-                    "parameter-value": [\r
-                      {\r
-                        "int-value": "6",\r
-                        "name": "proto"\r
-                      },\r
-                      {\r
-                        "int-value": "80",\r
-                        "name": "sourceport"\r
-                      }\r
-                    ]\r
-                  }\r
-                ],\r
-                "action-instance": [\r
-                  {\r
-                    "name": "chain1",\r
-                    "action-definition-id": "Action-Chain",\r
-                    "parameter-value": [\r
-                      {\r
-                        "name": "sfc-chain-name",\r
-                        "string-value": "SFCGBP"\r
-                      }\r
-                    ]\r
-                  },\r
-                  {\r
-                    "name": "allow1",\r
-                    "action-definition-id": "Action-Allow"\r
-                  }\r
-                ]\r
-              },\r
-              "contract": [\r
-                {\r
-                  "id": "icmp-http-contract",\r
-                  "subject": [\r
-                    {\r
-                      "name": "icmp-subject",\r
-                      "rule": [\r
-                        {\r
-                          "name": "allow-icmp-rule",\r
-                          "order": 0,\r
-                          "classifier-ref": [\r
-                            {\r
-                              "name": "icmp",\r
-                              "instance-name": "icmp"\r
-                            }\r
-                          ],\r
-                          "action-ref": [\r
-                            {\r
-                              "name": "allow1",\r
-                              "order": 0\r
-                            }\r
-                          ]\r
-                        }\r
-                      ]\r
-                    },\r
-                    {\r
-                      "name": "http-subject",\r
-                      "rule": [\r
-                        {\r
-                          "name": "http-chain-rule",\r
-                          "classifier-ref": [\r
-                            {\r
-                              "name": "http-dest",\r
-                              "instance-name": "http-dest",\r
-                              "direction": "in"\r
-                            }\r
-                          ],\r
-                          "action-ref": [\r
-                            {\r
-                              "name": "chain1",\r
-                              "order": 0\r
-                            }\r
-                          ]\r
-                        },\r
-                        {\r
-                          "name": "http-out-rule",\r
-                          "classifier-ref": [\r
-                            {\r
-                              "name": "http-src",\r
-                              "instance-name": "http-src",\r
-                              "direction": "out"\r
-                            }\r
-                          ],\r
-                          "action-ref": [\r
-                            {\r
-                              "name": "allow1",\r
-                              "order": 0\r
-                            }\r
-                          ]\r
-                        }\r
-                      ]\r
-                    }\r
-                  ],\r
-                  "clause": [\r
-                    {\r
-                      "name": "icmp-http-clause",\r
-                      "subject-refs": [\r
-                        "icmp-subject",\r
-                        "http-subject"\r
-                      ]\r
-                    }\r
-                  ]\r
-                }\r
-              ]\r
-            }\r
-          }\r
-        ]\r
-    }\r
-\r
-# Main definition - constants\r
-\r
-# =======================\r
-#     MENUS FUNCTIONS\r
-# =======================\r
-\r
-# Main menu\r
-\r
-# =======================\r
-#      MAIN PROGRAM\r
-# =======================\r
-\r
-# Main Program\r
-\r
-def get_tenant_uri():\r
-    return "/restconf/config/policy:tenants/policy:tenant/tenant-red"\r
-\r
-def get_tunnel_data_1():\r
-    return {\r
-    "node": [\r
-      {\r
-        "id": "openflow:1",\r
-        "ofoverlay:tunnel": [\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",\r
-            "node-connector-id": "openflow:1:1",\r
-            "ip": "192.168.50.70",\r
-            "port": 6633\r
-          },\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan",\r
-            "node-connector-id": "openflow:1:2",\r
-            "ip": "192.168.50.70",\r
-            "port": 4789\r
-          }\r
-        ]\r
-      }\r
-    ]\r
-  }\r
-\r
-def get_tunnel_uri_1():\r
-    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:1"\r
-\r
-def get_tunnel_data_6():\r
-    return {\r
-    "node": [\r
-      {\r
-        "id": "openflow:6",\r
-        "ofoverlay:tunnel": [\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",\r
-            "node-connector-id": "openflow:6:1",\r
-            "ip": "192.168.50.75",\r
-            "port": 6633\r
-          },\r
-          {\r
-            "tunnel-type": "overlay:tunnel-type-vxlan",\r
-            "node-connector-id": "openflow:6:2",\r
-            "ip": "192.168.50.75",\r
-            "port": 4789\r
-          }\r
-        ]\r
-      }\r
-    ]\r
-  }\r
-\r
-def get_tunnel_uri_6():\r
-    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:6"\r
-\r
-def get_endpoint_data():\r
-    return [\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:02",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.2",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_2",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-    "endpoint-group": "clients",\r
-"network-containment" : "subnet-10.0.35.0/24",\r
-"l2-context": "bridge-domain1",\r
-"mac-address": "00:00:00:00:35:02",\r
-"l3-address": [\r
-    {\r
-        "ip-address": "10.0.35.2",\r
-        "l3-context": "l3-context-vrf-red"\r
-    }\r
-],\r
-"port-name": "vethl-h35_2",\r
-"tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "clients",\r
-\r
-    "network-containment" : "subnet-10.0.35.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:35:03",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.35.3",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h35_3",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:03",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.3",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_3",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:04",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.4",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_4",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "clients",\r
-\r
-    "network-containment" : "subnet-10.0.35.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:35:04",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.35.4",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h35_4",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "clients",\r
-\r
-    "network-containment" : "subnet-10.0.35.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:35:05",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.35.5",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h35_5",\r
-    "tenant": "tenant-red"\r
-}\r
-},\r
-{\r
-"input": {\r
-\r
-    "endpoint-group": "webservers",\r
-\r
-    "network-containment" : "subnet-10.0.36.0/24",\r
-\r
-    "l2-context": "bridge-domain1",\r
-    "mac-address": "00:00:00:00:36:05",\r
-\r
-    "l3-address": [\r
-        {\r
-            "ip-address": "10.0.36.5",\r
-            "l3-context": "l3-context-vrf-red"\r
-        }\r
-    ],\r
-    "port-name": "vethl-h36_5",\r
-    "tenant": "tenant-red"\r
-}\r
-}]\r
-\r
-\r
-def get_endpoint_uri():\r
-    return "/restconf/operations/endpoint:register-endpoint"\r
-\r
-def get_tunnel_oper_uri():\r
-    return "/restconf/operational/opendaylight-inventory:nodes/"\r
-\r
-def get_topology_oper_uri():\r
-    return "/restconf/operational/network-topology:network-topology/topology/ovsdb:1/"\r
-\r
-if __name__ == "__main__":\r
-    # Launch main menu\r
-\r
-\r
-    # Some sensible defaults\r
-    controller=os.environ.get('ODL')\r
-    if controller == None:\r
-        sys.exit("No controller set.")\r
-\r
-    print "Contacting controller at %s" % controller\r
-    print "waiting for manager on SFFs..."\r
-    wait_for_sff_in_datastore(get_topology_oper_uri())\r
-    print "sending service functions"\r
-    put(controller, DEFAULT_PORT, get_service_functions_uri(), get_service_functions_data(), True)\r
-    print "sending service function forwarders"\r
-    put(controller, DEFAULT_PORT, get_service_function_forwarders_uri(), get_service_function_forwarders_data(), True)\r
-    print "waiting for switches on SFFs..."\r
-    wait_for_sff_in_datastore(get_tunnel_oper_uri())\r
-    print "sending service function chains"\r
-    put(controller, DEFAULT_PORT, get_service_function_chains_uri(), get_service_function_chains_data(), True)\r
-    print "sending service function paths"\r
-    put(controller, DEFAULT_PORT, get_service_function_paths_uri(), get_service_function_paths_data(), True)\r
-    print "sending tunnel"\r
-    put(controller, DEFAULT_PORT, get_tunnel_uri_1(), get_tunnel_data_1(), True)\r
-    print "sending tenant"\r
-    put(controller, DEFAULT_PORT, get_tunnel_uri_6(), get_tunnel_data_6(), True)\r
-    print "sending tenant"\r
-    put(controller, DEFAULT_PORT, get_tenant_uri(), get_tenant_data(),True)\r
-    print "registering endpoints"\r
-    for endpoint in get_endpoint_data():\r
-        post(controller, DEFAULT_PORT, get_endpoint_uri(),endpoint,True)\r
+#!/usr/bin/python
+import argparse
+import requests,json
+from requests.auth import HTTPBasicAuth
+from subprocess import call
+import time
+import sys
+import os
+
+
+DEFAULT_PORT='8181'
+
+
+USERNAME='admin'
+PASSWORD='admin'
+
+
+CONF_TENANT='/restconf/config/policy:tenants'
+
+def get(host, port, uri):
+    url='http://'+host+":"+port+uri
+    r = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD))
+    return r
+
+def put(host, port, uri, data, debug=False):
+    '''Perform a PUT rest operation, using the URL and data provided'''
+
+    url='http://'+host+":"+port+uri
+
+    headers = {'Content-type': 'application/yang.data+json',
+               'Accept': 'application/yang.data+json'}
+    if debug == True:
+        print "PUT %s" % url
+        print json.dumps(data, indent=4, sort_keys=True)
+    r = requests.put(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
+    if debug == True:
+        print r.text
+    r.raise_for_status()
+
+def post(host, port, uri, data, debug=False):
+    '''Perform a POST rest operation, using the URL and data provided'''
+
+    url='http://'+host+":"+port+uri
+    headers = {'Content-type': 'application/yang.data+json',
+               'Accept': 'application/yang.data+json'}
+    if debug == True:
+        print "POST %s" % url
+        print json.dumps(data, indent=4, sort_keys=True)
+    r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))
+    if debug == True:
+        print r.text
+    r.raise_for_status()
+
+def wait_for_sff_in_datastore(url):
+    for i in xrange(30):
+        resp=get(controller, DEFAULT_PORT, url)
+        if ('192.168.50.70' in resp.text) and ('192.168.50.71' in resp.text):
+            break
+        time.sleep(3)
+    if ('192.168.50.70' not in resp.text):
+        print "ERROR: SFF1 has not been initialized!"
+        sys.exit(1)
+    if ('192.168.50.71' not in resp.text):
+        print "ERROR: SFF2 has not been initialized!"
+        sys.exit(1)
+
+
+
+def get_service_functions_uri():
+    return "/restconf/config/service-function:service-functions"
+
+def get_service_functions_data():
+    return {
+    "service-functions": {
+        "service-function": [
+            {
+                "name": "firewall-72",
+                "ip-mgmt-address": "192.168.50.72",
+                "type": "service-function-type:firewall",
+                "nsh-aware": "true",
+                "sf-data-plane-locator": [
+                    {
+                        "name": "2",
+                        "port": 6633,
+                        "ip": "192.168.50.72",
+                        "transport": "service-locator:vxlan-gpe",
+                        "service-function-forwarder": "SFF1"
+                    }
+                ]
+            },
+            {
+                "name": "dpi-74",
+                "ip-mgmt-address": "192.168.50.74",
+                "type": "service-function-type:dpi",
+                "nsh-aware": "true",
+                "sf-data-plane-locator": [
+                    {
+                        "name": "3",
+                        "port": 6633,
+                        "ip": "192.168.50.74",
+                        "transport": "service-locator:vxlan-gpe",
+                        "service-function-forwarder": "SFF2"
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+def get_service_function_forwarders_uri():
+    return "/restconf/config/service-function-forwarder:service-function-forwarders"
+
+def get_service_function_forwarders_data():
+    return {
+    "service-function-forwarders": {
+        "service-function-forwarder": [
+            {
+                "name": "SFF1",
+                "service-node": "OVSDB2",
+                "service-function-forwarder-ovs:ovs-bridge": {
+                    "bridge-name": "sw1"
+                },
+                "service-function-dictionary": [
+                    {
+                        "name": "firewall-72",
+                        "sff-sf-data-plane-locator": {
+                            "sf-dpl-name": "2",
+                            "sff-dpl-name": "sfc-tun2"
+                        }
+                    }
+                ],
+                "sff-data-plane-locator": [
+                    {
+                        "name": "sfc-tun2",
+                        "data-plane-locator": {
+                            "transport": "service-locator:vxlan-gpe",
+                            "port": 6633,
+                            "ip": "192.168.50.70"
+                        },
+                        "service-function-forwarder-ovs:ovs-options": {
+                            "remote-ip": "flow",
+                            "dst-port": "6633",
+                            "key": "flow",
+                            "nsp": "flow",
+                            "nsi": "flow",
+                            "nshc1": "flow",
+                            "nshc2": "flow",
+                            "nshc3": "flow",
+                            "nshc4": "flow"
+                        }
+                    }
+                ]
+            },
+            {
+                "name": "SFF2",
+                "service-node": "OVSDB2",
+                "service-function-forwarder-ovs:ovs-bridge": {
+                    "bridge-name": "sw2"
+                },
+                "service-function-dictionary": [
+                    {
+                        "name": "dpi-74",
+                        "sff-sf-data-plane-locator": {
+                            "sf-dpl-name": "3",
+                            "sff-dpl-name": "sfc-tun4"
+                        }
+                    }
+                ],
+                "sff-data-plane-locator": [
+                    {
+                        "name": "sfc-tun4",
+                        "data-plane-locator": {
+                            "transport": "service-locator:vxlan-gpe",
+                            "port": 6633,
+                            "ip": "192.168.50.71"
+                        },
+                        "service-function-forwarder-ovs:ovs-options": {
+                            "remote-ip": "flow",
+                            "dst-port": "6633",
+                            "key": "flow",
+                            "nsp": "flow",
+                            "nsi": "flow",
+                            "nshc1": "flow",
+                            "nshc2": "flow",
+                            "nshc3": "flow",
+                            "nshc4": "flow"
+                        }
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+def get_service_function_chains_uri():
+    return "/restconf/config/service-function-chain:service-function-chains/"
+
+def get_service_function_chains_data():
+    return {
+    "service-function-chains": {
+        "service-function-chain": [
+            {
+                "name": "SFCGBP",
+                "symmetric": "true",
+                "sfc-service-function": [
+                    {
+                        "name": "firewall-abstract1",
+                        "type": "service-function-type:firewall"
+                    },
+                    {
+                        "name": "dpi-abstract1",
+                        "type": "service-function-type:dpi"
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+def get_service_function_paths_uri():
+    return "/restconf/config/service-function-path:service-function-paths/"
+
+def get_service_function_paths_data():
+    return {
+    "service-function-paths": {
+        "service-function-path": [
+            {
+                "name": "SFCGBP-Path",
+                "service-chain-name": "SFCGBP",
+                "starting-index": 255,
+                "symmetric": "true"
+
+            }
+        ]
+    }
+}
+
+def get_tenant_data():
+    return {
+        "tenant": [
+          {
+            "id": "tenant-red",
+            "name": "DockerTenant",
+            "forwarding-context": {
+              "l2-flood-domain": [
+                {
+                  "id": "flood-domain-1",
+                  "parent": "bridge-domain1"
+                },
+                {
+                  "id": "flood-domain-2",
+                  "parent": "bridge-domain1"
+                }
+              ],
+              "l3-context": [
+                {
+                  "id": "l3-context-vrf-red"
+                }
+              ],
+              "l2-bridge-domain": [
+                {
+                  "id": "bridge-domain1",
+                  "parent": "l3-context-vrf-red"
+                }
+              ],
+              "subnet": [
+                {
+                  "id": "subnet-10.0.36.0/24",
+                  "virtual-router-ip": "10.0.36.1",
+                  "parent": "flood-domain-2",
+                  "ip-prefix": "10.0.36.1/24"
+                },
+                {
+                  "id": "subnet-10.0.35.0/24",
+                  "virtual-router-ip": "10.0.35.1",
+                  "parent": "flood-domain-1",
+                  "ip-prefix": "10.0.35.1/24"
+                }
+              ]
+            },
+            "policy": {
+              "endpoint-group": [
+                {
+                  "id": "webservers",
+                  "name": "webservers",
+                  "provider-named-selector": [
+                    {
+                      "name": "webservers-clients-icmp-http-contract",
+                      "contract": [
+                        "icmp-http-contract"
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "id": "clients",
+                  "name": "clients",
+                  "consumer-named-selector": [
+                    {
+                      "name": "webservers-clients-icmp-http-contract",
+                      "contract": [
+                        "icmp-http-contract"
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "subject-feature-instances": {
+                "classifier-instance": [
+                  {
+                    "name": "icmp",
+                    "classifier-definition-id": "Classifier-IP-Protocol",
+                    "parameter-value": [
+                      {
+                        "name": "proto",
+                        "int-value": 1
+                      }
+                    ]
+                  },
+                  {
+                    "name": "http-dest",
+                    "classifier-definition-id": "Classifier-L4",
+                    "parameter-value": [
+                      {
+                        "int-value": "6",
+                        "name": "proto"
+                      },
+                      {
+                        "int-value": "80",
+                        "name": "destport"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "http-src",
+                    "classifier-definition-id": "Classifier-L4",
+                    "parameter-value": [
+                      {
+                        "int-value": "6",
+                        "name": "proto"
+                      },
+                      {
+                        "int-value": "80",
+                        "name": "sourceport"
+                      }
+                    ]
+                  }
+                ],
+                "action-instance": [
+                  {
+                    "name": "chain1",
+                    "action-definition-id": "Action-Chain",
+                    "parameter-value": [
+                      {
+                        "name": "sfc-chain-name",
+                        "string-value": "SFCGBP"
+                      }
+                    ]
+                  },
+                  {
+                    "name": "allow1",
+                    "action-definition-id": "Action-Allow"
+                  }
+                ]
+              },
+              "contract": [
+                {
+                  "id": "icmp-http-contract",
+                  "subject": [
+                    {
+                      "name": "icmp-subject",
+                      "rule": [
+                        {
+                          "name": "allow-icmp-rule",
+                          "order": 0,
+                          "classifier-ref": [
+                            {
+                              "name": "icmp",
+                              "instance-name": "icmp"
+                            }
+                          ],
+                          "action-ref": [
+                            {
+                              "name": "allow1",
+                              "order": 0
+                            }
+                          ]
+                        }
+                      ]
+                    },
+                    {
+                      "name": "http-subject",
+                      "rule": [
+                        {
+                          "name": "http-chain-rule",
+                          "classifier-ref": [
+                            {
+                              "name": "http-dest",
+                              "instance-name": "http-dest",
+                              "direction": "in"
+                            }
+                          ],
+                          "action-ref": [
+                            {
+                              "name": "chain1",
+                              "order": 0
+                            }
+                          ]
+                        },
+                        {
+                          "name": "http-out-rule",
+                          "classifier-ref": [
+                            {
+                              "name": "http-src",
+                              "instance-name": "http-src",
+                              "direction": "out"
+                            }
+                          ],
+                          "action-ref": [
+                            {
+                              "name": "allow1",
+                              "order": 0
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ],
+                  "clause": [
+                    {
+                      "name": "icmp-http-clause",
+                      "subject-refs": [
+                        "icmp-subject",
+                        "http-subject"
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+    }
+
+# Main definition - constants
+
+# =======================
+#     MENUS FUNCTIONS
+# =======================
+
+# Main menu
+
+# =======================
+#      MAIN PROGRAM
+# =======================
+
+# Main Program
+
+def get_tenant_uri():
+    return "/restconf/config/policy:tenants/policy:tenant/tenant-red"
+
+def get_tunnel_data_1():
+    return {
+    "node": [
+      {
+        "id": "openflow:1",
+        "ofoverlay:tunnel": [
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",
+            "node-connector-id": "openflow:1:1",
+            "ip": "192.168.50.70",
+            "port": 6633
+          },
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan",
+            "node-connector-id": "openflow:1:2",
+            "ip": "192.168.50.70",
+            "port": 4789
+          }
+        ]
+      }
+    ]
+  }
+
+def get_tunnel_uri_1():
+    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:1"
+
+def get_tunnel_data_6():
+    return {
+    "node": [
+      {
+        "id": "openflow:6",
+        "ofoverlay:tunnel": [
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan-gpe",
+            "node-connector-id": "openflow:6:1",
+            "ip": "192.168.50.75",
+            "port": 6633
+          },
+          {
+            "tunnel-type": "overlay:tunnel-type-vxlan",
+            "node-connector-id": "openflow:6:2",
+            "ip": "192.168.50.75",
+            "port": 4789
+          }
+        ]
+      }
+    ]
+  }
+
+def get_tunnel_uri_6():
+    return "/restconf/config/opendaylight-inventory:nodes/node/openflow:6"
+
+def get_endpoint_data():
+    return [
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:02",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.2",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_2",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+    "endpoint-group": "clients",
+"network-containment" : "subnet-10.0.35.0/24",
+"l2-context": "bridge-domain1",
+"mac-address": "00:00:00:00:35:02",
+"l3-address": [
+    {
+        "ip-address": "10.0.35.2",
+        "l3-context": "l3-context-vrf-red"
+    }
+],
+"port-name": "vethl-h35_2",
+"tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "clients",
+
+    "network-containment" : "subnet-10.0.35.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:35:03",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.35.3",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h35_3",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:03",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.3",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_3",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:04",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.4",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_4",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "clients",
+
+    "network-containment" : "subnet-10.0.35.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:35:04",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.35.4",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h35_4",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "clients",
+
+    "network-containment" : "subnet-10.0.35.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:35:05",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.35.5",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h35_5",
+    "tenant": "tenant-red"
+}
+},
+{
+"input": {
+
+    "endpoint-group": "webservers",
+
+    "network-containment" : "subnet-10.0.36.0/24",
+
+    "l2-context": "bridge-domain1",
+    "mac-address": "00:00:00:00:36:05",
+
+    "l3-address": [
+        {
+            "ip-address": "10.0.36.5",
+            "l3-context": "l3-context-vrf-red"
+        }
+    ],
+    "port-name": "vethl-h36_5",
+    "tenant": "tenant-red"
+}
+}]
+
+
+def get_endpoint_uri():
+    return "/restconf/operations/endpoint:register-endpoint"
+
+def get_tunnel_oper_uri():
+    return "/restconf/operational/opendaylight-inventory:nodes/"
+
+def get_topology_oper_uri():
+    return "/restconf/operational/network-topology:network-topology/topology/ovsdb:1/"
+
+if __name__ == "__main__":
+    # Launch main menu
+
+
+    # Some sensible defaults
+    controller=os.environ.get('ODL')
+    if controller == None:
+        sys.exit("No controller set.")
+
+    print "Contacting controller at %s" % controller
+    print "waiting for manager on SFFs..."
+    wait_for_sff_in_datastore(get_topology_oper_uri())
+    print "sending service functions"
+    put(controller, DEFAULT_PORT, get_service_functions_uri(), get_service_functions_data(), True)
+    print "sending service function forwarders"
+    put(controller, DEFAULT_PORT, get_service_function_forwarders_uri(), get_service_function_forwarders_data(), True)
+    print "waiting for switches on SFFs..."
+    wait_for_sff_in_datastore(get_tunnel_oper_uri())
+    print "sending service function chains"
+    put(controller, DEFAULT_PORT, get_service_function_chains_uri(), get_service_function_chains_data(), True)
+    print "sending service function paths"
+    put(controller, DEFAULT_PORT, get_service_function_paths_uri(), get_service_function_paths_data(), True)
+    print "sending tunnel"
+    put(controller, DEFAULT_PORT, get_tunnel_uri_1(), get_tunnel_data_1(), True)
+    print "sending tenant"
+    put(controller, DEFAULT_PORT, get_tunnel_uri_6(), get_tunnel_data_6(), True)
+    print "sending tenant"
+    put(controller, DEFAULT_PORT, get_tenant_uri(), get_tenant_data(),True)
+    print "registering endpoints"
+    for endpoint in get_endpoint_data():
+        post(controller, DEFAULT_PORT, get_endpoint_uri(),endpoint,True)
index 34389859028d66734bdf4e86cfbe4a56fefea5dc..b06a7564345e550bde4aa7e8b4e1eccca0874384 100644 (file)
@@ -1,17 +1,17 @@
-#!/usr/bin/env bash\r
-\r
-set -e\r
-hostnum=${HOSTNAME#"gbpsfc"}\r
-sw="sw$hostnum"\r
-\r
-if [ "$hostnum" -eq "3" ]; then\r
-    TUNNEL=0xC0A83247\r
-elif [ "$hostnum" -eq "5" ]; then\r
-    TUNNEL=0xC0A83249\r
-else\r
-    echo "Invalid SF for this demo";\r
-    exit\r
-fi\r
-\r
-sudo ovs-vsctl add-br $sw\r
-sudo ovs-vsctl add-port $sw $sw-vxlangpe-0 -- set interface $sw-vxlangpe-0 type=vxlan options:remote_ip=flow options:dst_port=6633 options:nshc1=flow options:nshc2=flow options:nshc3=flow options:nshc4=flow options:nsp=flow options:nsi=flow options:key=flow\r
+#!/usr/bin/env bash
+
+set -e
+hostnum=${HOSTNAME#"gbpsfc"}
+sw="sw$hostnum"
+
+if [ "$hostnum" -eq "3" ]; then
+    TUNNEL=0xC0A83247
+elif [ "$hostnum" -eq "5" ]; then
+    TUNNEL=0xC0A83249
+else
+    echo "Invalid SF for this demo";
+    exit
+fi
+
+sudo ovs-vsctl add-br $sw
+sudo ovs-vsctl add-port $sw $sw-vxlangpe-0 -- set interface $sw-vxlangpe-0 type=vxlan options:remote_ip=flow options:dst_port=6633 options:nshc1=flow options:nshc2=flow options:nshc3=flow options:nshc4=flow options:nsp=flow options:nsi=flow options:key=flow
index 31b693ddbb33b3c3368fa13a0b800c729b4324c0..1d84f7e377894e36f5b073acdf180f311618e526 100644 (file)
@@ -1,20 +1,20 @@
-#!/usr/bin/env bash\r
-\r
-set -e\r
-hostnum=${HOSTNAME#"gbpsfc"}\r
-sw="sw$hostnum"\r
-nsp=$1\r
-\r
-if [ "$hostnum" -eq "3" ]; then\r
-    TUNNEL=0xC0A83246\r
-elif [ "$hostnum" -eq "5" ]; then\r
-    TUNNEL=0xC0A83247\r
-else\r
-    echo "Invalid SF for this demo";\r
-    exit\r
-fi\r
-# delete NORMAL, if present\r
-nsphex=`printf "%x\n" $nsp`\r
-sudo ovs-ofctl --strict del-flows $sw priority=0\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13\r
-sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13\r
+#!/usr/bin/env bash
+
+set -e
+hostnum=${HOSTNAME#"gbpsfc"}
+sw="sw$hostnum"
+nsp=$1
+
+if [ "$hostnum" -eq "3" ]; then
+    TUNNEL=0xC0A83246
+elif [ "$hostnum" -eq "5" ]; then
+    TUNNEL=0xC0A83247
+else
+    echo "Invalid SF for this demo";
+    exit
+fi
+# delete NORMAL, if present
+nsphex=`printf "%x\n" $nsp`
+sudo ovs-ofctl --strict del-flows $sw priority=0
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=255 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:254,IN_PORT" -OOpenFlow13
+sudo ovs-ofctl add-flow $sw "priority=1000,nsi=254 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],load:$TUNNEL->NXM_NX_TUN_IPV4_DST[],set_nsi:253,IN_PORT" -OOpenFlow13