Bug3738: Coexistence demo environment 00/33300/7
authorVladimir Lavor <vlavor@cisco.com>
Fri, 22 Jan 2016 10:19:48 +0000 (11:19 +0100)
committerKeith Burns (alagalah) <alagalah@gmail.com>
Fri, 22 Jan 2016 16:44:36 +0000 (08:44 -0800)
This is a low risk change as it is only the demo environment.
Self-merging this under duress as I made original cherry pick,
and there are no other committers on deck. Need to keep master
and stable/be in sync.

Change-Id: Id016afd8b52b094c9e7b1f97d985db6db0e34c13
Signed-off-by: Vladimir Lavor <vlavor@cisco.com>
Signed-off-by: Keith Burns (alagalah) <alagalah@gmail.com>
demos/gbpsfc-env/demo-asymmetric-chain/get-nsps.py
demos/gbpsfc-env/demo-asymmetric-chain/sf-flows.sh [new file with mode: 0644]
demos/gbpsfc-env/demo-asymmetric-coexistence/rest.py [new file with mode: 0644]
demos/gbpsfc-env/demo-asymmetric-coexistence/sf-config.sh [new file with mode: 0644]
demos/gbpsfc-env/demo-asymmetric-coexistence/sf-flows.sh [new file with mode: 0644]
demos/gbpsfc-env/demo-symmetric-chain/get-nsps.py
demos/gbpsfc-env/demo-symmetric-chain/sf-flows.sh [new file with mode: 0644]
demos/gbpsfc-env/demo-symmetric-coexistence/rest.py [new file with mode: 0644]
demos/gbpsfc-env/demo-symmetric-coexistence/sf-config.sh [new file with mode: 0644]
demos/gbpsfc-env/demo-symmetric-coexistence/sf-flows.sh [new file with mode: 0644]

index 94650e81c35f5c093f62b1b246d8409dfc83ede1..9fb91cb05597d24113167aec0517b555ee0f632d 100755 (executable)
@@ -56,5 +56,5 @@ if __name__ == "__main__":
                   print "******************************"
                   print "Adding flows for %s as an SF." % sw_name
                   print "******************************"
-                  doCmd('sudo /vagrant/utils/sf-flows.sh %s' % min(nsps))
+                  doCmd('sudo /vagrant/demo-asymmetric-chain/sf-flows.sh %s' % min(nsps))
 
diff --git a/demos/gbpsfc-env/demo-asymmetric-chain/sf-flows.sh b/demos/gbpsfc-env/demo-asymmetric-chain/sf-flows.sh
new file mode 100644 (file)
index 0000000..4d577b4
--- /dev/null
@@ -0,0 +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
diff --git a/demos/gbpsfc-env/demo-asymmetric-coexistence/rest.py b/demos/gbpsfc-env/demo-asymmetric-coexistence/rest.py
new file mode 100644 (file)
index 0000000..13b30b0
--- /dev/null
@@ -0,0 +1,713 @@
+#!/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
diff --git a/demos/gbpsfc-env/demo-asymmetric-coexistence/sf-config.sh b/demos/gbpsfc-env/demo-asymmetric-coexistence/sf-config.sh
new file mode 100644 (file)
index 0000000..3438985
--- /dev/null
@@ -0,0 +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
diff --git a/demos/gbpsfc-env/demo-asymmetric-coexistence/sf-flows.sh b/demos/gbpsfc-env/demo-asymmetric-coexistence/sf-flows.sh
new file mode 100644 (file)
index 0000000..31b693d
--- /dev/null
@@ -0,0 +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
index 94650e81c35f5c093f62b1b246d8409dfc83ede1..4850dcf6fe7e79591f80943296b82833a7d99d8d 100755 (executable)
@@ -56,5 +56,5 @@ if __name__ == "__main__":
                   print "******************************"
                   print "Adding flows for %s as an SF." % sw_name
                   print "******************************"
-                  doCmd('sudo /vagrant/utils/sf-flows.sh %s' % min(nsps))
+                  doCmd('sudo /vagrant/demo-symmetric-chain/sf-flows.sh %s' % min(nsps))
 
diff --git a/demos/gbpsfc-env/demo-symmetric-chain/sf-flows.sh b/demos/gbpsfc-env/demo-symmetric-chain/sf-flows.sh
new file mode 100644 (file)
index 0000000..4d577b4
--- /dev/null
@@ -0,0 +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
diff --git a/demos/gbpsfc-env/demo-symmetric-coexistence/rest.py b/demos/gbpsfc-env/demo-symmetric-coexistence/rest.py
new file mode 100644 (file)
index 0000000..bc06db7
--- /dev/null
@@ -0,0 +1,713 @@
+#!/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
diff --git a/demos/gbpsfc-env/demo-symmetric-coexistence/sf-config.sh b/demos/gbpsfc-env/demo-symmetric-coexistence/sf-config.sh
new file mode 100644 (file)
index 0000000..3438985
--- /dev/null
@@ -0,0 +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
diff --git a/demos/gbpsfc-env/demo-symmetric-coexistence/sf-flows.sh b/demos/gbpsfc-env/demo-symmetric-coexistence/sf-flows.sh
new file mode 100644 (file)
index 0000000..31b693d
--- /dev/null
@@ -0,0 +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