diff options
7 files changed, 690 insertions, 222 deletions
diff --git a/v3po/api/src/main/yang/v3po.yang b/v3po/api/src/main/yang/v3po.yang index 2ebb24f9a..c1210a923 100644 --- a/v3po/api/src/main/yang/v3po.yang +++ b/v3po/api/src/main/yang/v3po.yang @@ -100,6 +100,26 @@ module v3po { } } + identity vxlan-gpe-tunnel { + base if:interface-type; + } + + typedef vxlan-gpe-vni { + description "VNI used in a VXLAN-GPE tunnel"; + type uint32 { + range "0..16777215"; + } + } + + typedef vxlan-gpe-next-protocol { + type enumeration { + enum ipv4; + enum ipv6; + enum ethernet; + enum nsh; + } + } + grouping bridge-domain-attributes { leaf flood { type boolean; @@ -261,6 +281,30 @@ module v3po { } } + grouping vxlan-gpe-base-attributes { + leaf local { + /*mandatory true;*/ + type inet:ip-address; + } + leaf remote { + /*mandatory true;*/ + type inet:ip-address; + } + leaf vni { + /*mandatory true;*/ + type vxlan-gpe-vni; + } + leaf next-protocol { + type vxlan-gpe-next-protocol; + } + leaf encap-vrf-id { + type uint32; + } + leaf decap-vrf-id { + type uint32; + } + } + grouping vlan-tag-rewrite-attributes { leaf rewrite-operation { type tag-rewrite-operation; @@ -376,6 +420,12 @@ module v3po { uses l2-attributes; } + + container vxlan-gpe { + when "../if:type = 'v3po:vxlan-gpe-tunnel'"; + + uses vxlan-gpe-base-attributes; + } } container vpp { @@ -451,6 +501,11 @@ module v3po { when "../if:type = 'v3po:vxlan-tunnel'"; uses vxlan-base-attributes; } + container vxlan-gpe { + when "../if:type = 'v3po:vxlan-gpe-tunnel'"; + + uses vxlan-gpe-base-attributes; + } container l2 { must "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " + diff --git a/v3po/postman_rest_collection.json b/v3po/postman_rest_collection.json index 39661ed13..6ad3a02de 100644 --- a/v3po/postman_rest_collection.json +++ b/v3po/postman_rest_collection.json @@ -1,97 +1,125 @@ { - "id": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "id": "61475d83-1808-fa49-7ca6-32f701e38b19", "name": "Honeycomb RESTCONF calls", "description": "Common mgmt operations on VPP using Honeycomb REST interface", "order": [ - "3db63169-6861-2620-c219-4c342a2bbcc7", - "c8d329d3-1fc3-af2b-48f5-0cf385d809f7", - "9d4e619c-6a09-5b83-5f9a-a753d83ab34a", - "f3822b78-f031-d4db-5f9a-1a15e1b69e82", - "6ffdf6e3-5ec5-ecf0-3da0-74c3969124f1", - "e3f9de11-4c5b-bc82-ca10-e7aed4832831", - "d40b0462-07ff-6a9b-4784-759d04d4bae3", - "b33405c7-38c2-c3d8-72b5-02098d95e5f5", - "d29faea5-ca20-7de0-b67b-f20bac4340a2", - "98f82cf8-fd6d-67bd-3894-e435663b34c4" + "1ff26126-1cfe-898f-f068-cbeecd0c3366", + "c2b623b7-7110-3f81-1f73-482eca7bb41e", + "eeeb8b70-d222-6d9a-6521-1e16bf8db401", + "f19bf50c-b847-a7a0-cabe-31b2cf23b745", + "fce0239b-0d55-5578-e216-51a7a0f57cc4", + "0405ec33-82d8-4183-fcd7-6201d8eeb48f", + "7b848cbb-b41b-8855-8d8a-8438a415e5ad", + "bc3ade2a-51de-cb6d-f2c1-ee0598a8cb8a", + "be7a6dc3-144e-be00-76e5-34395f8eb76f", + "84f9c4e9-f5d9-7e73-a95d-b657c7c9b24f" ], "folders": [ { - "id": "a23b89ae-1545-01a6-519a-5705b001691f", + "id": "4ff8ebe4-bd44-681a-7093-9422424099b1", "name": "TAP", "description": "", "order": [ - "b5f2de6a-458a-353f-ff06-b54a11dab564", - "e0c0b5c9-dabd-3440-c402-037e99a9a292", - "79bb5b9c-a369-1af2-3402-0a39f2e0f983", - "56b1e071-4a09-3994-451f-5b9c8aab5400" + "7d71e781-31a9-3274-659d-474bdf74ed70", + "56f60295-995b-1ea3-9934-b81fe23545f7", + "77360902-d830-f4df-684a-c6c2f28111ec", + "d46e1911-cf84-3805-a085-2219a49a7557" ], - "owner": "45557" + "owner": "652751" }, { - "id": "d188f806-127a-9383-5d63-49d7b79c6986", + "id": "0bca9dad-0798-f750-91ba-cc6ff8f277d5", "name": "VHOST", "description": "", "order": [ - "a22ce9b1-777b-cbcf-4e42-55b850d7e5a1", - "4be9909c-f2e1-a5f3-36e5-f98d34be86d3", - "ca3fd773-8d38-7017-cee8-4688bc08f8ba" + "95a948ed-5345-939b-280c-74f97920343e", + "d14a1086-43f2-f595-5c20-cba8b8f6a992", + "2e8634e0-4272-9b06-e237-7748437be978" ], - "owner": "45557" + "owner": "652751" }, { - "id": "c9d44561-8ad1-b987-31b5-5545a259ca14", + "id": "ba52e764-f1ec-b1cc-747f-54681ed93859", "name": "VLAN", "description": "", "order": [ - "c546e0f5-e18f-f6b5-9dfc-de6bc0da785f", - "5d423f40-847d-dc07-0c5b-6036fe190c85", - "adc51817-69b3-5d40-6060-696b5ebda2a8", - "ac9d34bc-b4fe-8cf3-a30c-3507e86d8b96", - "3102a92d-4091-217e-31c9-868c905b6ec0" + "a4d647b9-b951-c775-2cf4-d193cd5f2c04", + "c543d2d7-6e40-e8a3-ee37-330a9335b002", + "2e550aeb-f33b-b947-f2e1-807062bd0271", + "65f944f8-e9a8-c418-7eaf-b5efa8923efe", + "4d88cf6f-8cfd-f101-9b98-0bec8f1531a1" ], - "owner": "45557", + "owner": "652751", "collectionId": "e9ba4e80-fb4d-1eae-07e7-97b323164130" }, { - "id": "fc251f0e-7d4a-83f5-7af2-95d21873e7cb", + "id": "e89467a0-a016-7da6-0adf-2fbc1f45687e", + "name": "VXLAN-GPE-TUNNEL", + "description": "", + "order": [ + "a7a7c0f3-4dea-09f5-8c28-be3d7e084331", + "6cc428c7-72c2-35c5-5232-3d378d906557" + ], + "owner": "652751" + }, + { + "id": "f8061658-c931-5f3c-c119-857c8b1508b1", "name": "VXLAN-TUNNEL", "description": "", "order": [ - "2081bf9a-d623-f209-8984-6e11c0a57e85", - "02debd5e-6603-edf3-9c95-f6bde5070ba8" + "2b2b62dc-5530-971e-c6d5-03afd3fcbf0a", + "f0faabc8-eab8-bb4d-1042-b45716ecb155" ], - "owner": "45557" + "owner": "652751" } ], "timestamp": 1460119141419, - "owner": "45557", - "remoteLink": "https://www.getpostman.com/collections/2395f06a7925d901710a", + "owner": "652751", + "remoteLink": "", "public": false, "requests": [ { - "id": "02debd5e-6603-edf3-9c95-f6bde5070ba8", + "id": "0405ec33-82d8-4183-fcd7-6201d8eeb48f", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vxlanTun1", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/local0", "preRequestScript": "", "pathVariables": {}, - "method": "DELETE", + "method": "PUT", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", - "helperAttributes": "{}", - "time": 1462892071867, - "name": "Delete virtual ifc - cfg", + "helperAttributes": {}, + "time": 1460540047356, + "name": "Enable local0 interface - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "folder": "fc251f0e-7d4a-83f5-7af2-95d21873e7cb", - "timestamp": null, - "rawModeData": "" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"local0\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"v3po:ethernet\": {\r\n \"mtu\": 64\r\n }\r\n }\r\n ]\r\n \r\n}" + }, + { + "id": "1ff26126-1cfe-898f-f068-cbeecd0c3366", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/", + "preRequestScript": "", + "pathVariables": {}, + "method": "GET", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1460539962712, + "name": "List ifcs - cfg", + "description": "List ifcs - cfg", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", + "responses": [], + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "2081bf9a-d623-f209-8984-6e11c0a57e85", + "id": "2b2b62dc-5530-971e-c6d5-03afd3fcbf0a", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vxlanTun1", "preRequestScript": "", @@ -103,142 +131,141 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462891972310, + "time": 1464767860505, "name": "Add virtual ifc - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vxlanTun1\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vxlan-tunnel\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"routing\" : {\r\n \"vrf-id\" : \"0\"\r\n },\r\n \"vxlan\" : {\r\n \"src\" : \"192.168.1.6\",\r\n \"dst\" : \"192.168.1.9\",\r\n \"vni\" : \"88\",\r\n \"encap-vrf-id\" : \"0\"\r\n }\r\n }\r\n ]\r\n \r\n}", - "folder": "fc251f0e-7d4a-83f5-7af2-95d21873e7cb" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vxlanTun1\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vxlan-tunnel\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"routing\" : {\r\n \"vrf-id\" : \"0\"\r\n },\r\n \"vxlan\" : {\r\n \"src\" : \"192.168.1.6\",\r\n \"dst\" : \"192.168.1.9\",\r\n \"vni\" : \"88\",\r\n \"encap-vrf-id\" : \"0\"\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "3102a92d-4091-217e-31c9-868c905b6ec0", + "id": "2e550aeb-f33b-b947-f2e1-807062bd0271", "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10/v3po:l2/vlan-tag-rewrite", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10", "preRequestScript": "", "pathVariables": {}, - "method": "DELETE", + "method": "PUT", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1463400417797, - "name": "Disable tag rewrite - cfg", - "description": "Corresponds to invoking:\n\nvppctl set interface l2 tag-rewrite GigabitEthernet0/9/0.10 disable\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1463140928036, + "name": "Add vlan to bridge domain eth - cfg", + "description": "Adds l2 interconnection of bridge-based type to GigabitEthernet0/9/0.10 interface\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "", - "folder": "c9d44561-8ad1-b987-31b5-5545a259ca14" + "folder": "ba52e764-f1ec-b1cc-747f-54681ed93859", + "rawModeData": "{\n \"interface\": [\n {\n \"name\": \"GigabitEthernet0/9/0.10\",\n \"description\": \"sub interface for testing purposes\",\n \"type\": \"v3po:sub-interface\",\n \"enabled\": \"false\",\n \"sub-interface\" : {\n \"super-interface\": \"GigabitEthernet0/9/0\",\n \"identifier\": \"10\",\n \"exact-match\": {}\n },\n \"v3po:l2\": {\n \"bridge-domain\": \"testBD\",\n \"split-horizon-group\": \"0\",\n \"bridged-virtual-interface\": \"false\"\n }\n }\n ]\n}" }, { - "id": "3db63169-6861-2620-c219-4c342a2bbcc7", + "id": "2e8634e0-4272-9b06-e237-7748437be978", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vhost1", "preRequestScript": "", "pathVariables": {}, - "method": "GET", + "method": "DELETE", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", - "helperAttributes": {}, - "time": 1460539962712, - "name": "List ifcs - cfg", - "description": "List ifcs - cfg", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "helperAttributes": "{}", + "time": 1462891488523, + "name": "Delete vhost user ifc - cfg", + "description": "Deletes vhost user interface.\nCorresponding vpp CLI command:\n\nvppctl delete vhost-user sw_if_index [index]\n\nTo verify invoke:\n\nvppctl show vhost-user\n\nor\n\nvppctl show int", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" + "folder": "0bca9dad-0798-f750-91ba-cc6ff8f277d5", + "rawModeData": "", + "descriptionFormat": null }, { - "id": "4be9909c-f2e1-a5f3-36e5-f98d34be86d3", - "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vhost1", + "id": "4d88cf6f-8cfd-f101-9b98-0bec8f1531a1", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10/v3po:l2/vlan-tag-rewrite", "preRequestScript": "", "pathVariables": {}, - "method": "PUT", + "method": "DELETE", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462891483790, - "name": "Modify vhost user ifc - cfg", - "description": "Modifies vhost-user interface socket.\nTo verify invoke:\n\nvppctl show vhost-user", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1463400417797, + "name": "Disable tag rewrite - cfg", + "description": "Corresponds to invoking:\n\nvppctl set interface l2 tag-rewrite GigabitEthernet0/9/0.10 disable\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vhost1\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vhost-user\",\r\n \"enabled\": \"true\",\r\n \"vhost-user\" : {\r\n \"socket\": \"/tmp/soc2\",\r\n \"role\": \"server\"\r\n }\r\n }\r\n ]\r\n \r\n}", - "folder": "d188f806-127a-9383-5d63-49d7b79c6986" + "rawModeData": "", + "folder": "ba52e764-f1ec-b1cc-747f-54681ed93859" }, { - "id": "56b1e071-4a09-3994-451f-5b9c8aab5400", + "id": "56f60295-995b-1ea3-9934-b81fe23545f7", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/tapp2", "preRequestScript": "", "pathVariables": {}, - "method": "DELETE", + "method": "PUT", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462796994090, - "name": "Delete complex tap ifc - cfg", + "time": 1462796722186, + "name": "Add complex tap ifc - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "", - "folder": "a23b89ae-1545-01a6-519a-5705b001691f" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"tapp2\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:tap\",\r\n \"tap\" :{\r\n \"tap-name\" : \"tapp2\",\r\n \"mac\" : \"00:ff:ff:ff:ff:ff\",\r\n \"device-instance\" : 55\r\n }\r\n }\r\n ]\r\n \r\n}", + "folder": "4ff8ebe4-bd44-681a-7093-9422424099b1" }, { - "id": "5d423f40-847d-dc07-0c5b-6036fe190c85", - "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "id": "65f944f8-e9a8-c418-7eaf-b5efa8923efe", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10", - "pathVariables": {}, "preRequestScript": "", - "method": "GET", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "pathVariables": {}, + "method": "PUT", "data": [], "dataMode": "raw", - "name": "Get sub interface - cfg", - "description": "", - "descriptionFormat": "html", - "time": 1463139741935, "version": 2, - "responses": [], "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "folder": "c9d44561-8ad1-b987-31b5-5545a259ca14", - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"GigabitEthernet0/9/0.10\",\r\n \"description\": \"sub interface for testing purposes\",\r\n \"type\": \"v3po:sub-interface\",\r\n \"enabled\": \"false\",\r\n \"sub-interface\" : {\r\n \"super-interface\": \"GigabitEthernet0/9/0\",\r\n \"identifier\": \"10\",\r\n \"exact-match\": {}\r\n }\r\n }\r\n ]\r\n \r\n}" + "time": 1463140942520, + "name": "Set tag rewrite pop 1 - cfg", + "description": "Corresponds to invoking:\n\nvppctl set interface l2 tag-rewrite GigabitEthernet0/9/0.10 pop 1\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", + "responses": [], + "folder": "ba52e764-f1ec-b1cc-747f-54681ed93859", + "rawModeData": "{\n \"interface\": [\n {\n \"name\": \"GigabitEthernet0/9/0.10\",\n \"description\": \"sub interface for testing purposes\",\n \"type\": \"v3po:sub-interface\",\n \"enabled\": \"false\",\n \"sub-interface\" : {\n \"super-interface\": \"GigabitEthernet0/9/0\",\n \"identifier\": \"10\",\n \"exact-match\": {}\n },\n \"v3po:l2\": {\n \"bridge-domain\": \"testBD\",\n \"split-horizon-group\": \"0\",\n \"bridged-virtual-interface\": \"false\",\n \"vlan-tag-rewrite\" : {\n \"rewrite-operation\": \"pop-1\"\n }\n }\n }\n ]\n}" }, { - "id": "6ffdf6e3-5ec5-ecf0-3da0-74c3969124f1", + "id": "6cc428c7-72c2-35c5-5232-3d378d906557", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/operational/naming-context:contexts", - "pathVariables": {}, + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vxlanGpeTun3", "preRequestScript": "", - "method": "GET", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "pathVariables": {}, + "method": "DELETE", "data": [], "dataMode": "raw", - "name": "List naming contexts - context", - "description": "List mapping context stored in context datastore", - "descriptionFormat": "html", - "time": 1463556756647, "version": 2, - "responses": [], "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" + "time": 1464764638498, + "name": "Delete vxlan-gpe - cfg", + "description": "", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", + "responses": [], + "rawModeData": "" }, { - "id": "79bb5b9c-a369-1af2-3402-0a39f2e0f983", + "id": "77360902-d830-f4df-684a-c6c2f28111ec", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/tapp2", "preRequestScript": "", @@ -253,15 +280,15 @@ "time": 1462796801468, "name": "Modify complex tap ifc - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"tapp2\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:tap\",\r\n \"tap\" :{\r\n \"tap-name\" : \"tapp2\",\r\n \"mac\" : \"00:ff:ff:ff:ff:ae\",\r\n \"device-instance\" : 77\r\n }\r\n }\r\n ]\r\n \r\n}", - "folder": "a23b89ae-1545-01a6-519a-5705b001691f" + "folder": "4ff8ebe4-bd44-681a-7093-9422424099b1" }, { - "id": "98f82cf8-fd6d-67bd-3894-e435663b34c4", - "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/local0", + "id": "7b848cbb-b41b-8855-8d8a-8438a415e5ad", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -271,37 +298,38 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462534221488, - "name": "Add local0 to bridge domain", - "description": "Adds l2 interconnection of bridge-based type to local0 interface\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1460636113690, + "name": "Set interfaces bulk edit - cfg", + "description": "", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\n \"interface\": [\n {\n \"name\": \"local0\",\n \"description\": \"for testing purposes\",\n \"type\": \"iana-if-type:ethernetCsmacd\",\n \"v3po:routing\": {\n \"vrf-id\": 7\n },\n \"v3po:ethernet\": {\n \"mtu\": 64\n },\n \"enabled\": true,\n \"v3po:l2\": {\n \"bridge-domain\": \"testBD\",\n \"split-horizon-group\": \"0\",\n \"bridged-virtual-interface\": \"false\"\n }\n }\n ]\n}" + "rawModeData": "{\n \"interfaces\": {\n \"interface\": [\n {\n \"name\": \"pg/stream-2\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n },\n {\n \"name\": \"pg/stream-3\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n },\n {\n \"name\": \"pg/stream-0\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n },\n {\n \"name\": \"local0\",\n \"description\": \"for testing purposes\",\n \"type\": \"iana-if-type:ethernetCsmacd\",\n \"enabled\": true\n },\n {\n \"name\": \"pg/stream-1\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n }\n ]\n }\n}" }, { - "id": "9d4e619c-6a09-5b83-5f9a-a753d83ab34a", + "id": "7d71e781-31a9-3274-659d-474bdf74ed70", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/operational/v3po:vpp-state", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/tapp", "preRequestScript": "", "pathVariables": {}, - "method": "GET", + "method": "PUT", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1460539994330, - "name": "Read vpp-state - oper", + "time": 1462535811974, + "name": "Add simple tap ifc -cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" + "folder": "4ff8ebe4-bd44-681a-7093-9422424099b1", + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"tapp\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:tap\",\r\n \"tap\" :{\r\n \"tap-name\" : \"tapp\"\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "a22ce9b1-777b-cbcf-4e42-55b850d7e5a1", - "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vhost1", + "id": "84f9c4e9-f5d9-7e73-a95d-b657c7c9b24f", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/local0", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -311,18 +339,17 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462891472552, - "name": "Add vhost user ifc - cfg", - "description": "Adds vhost-user interface.\nCorresponsing vpp cli command:\n\ncreate vhost-user socket /tmp/soc1 server\n\nTo verify invoke:\n\nvppctl show vhost-user\n\nor\n\nvppctl show int", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1462534221488, + "name": "Add local0 to bridge domain", + "description": "Adds l2 interconnection of bridge-based type to local0 interface\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vhost1\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vhost-user\",\r\n \"enabled\": \"true\",\r\n \"vhost-user\" : {\r\n \"socket\": \"/tmp/soc1\",\r\n \"role\": \"server\"\r\n }\r\n }\r\n ]\r\n \r\n}", - "folder": "d188f806-127a-9383-5d63-49d7b79c6986" + "rawModeData": "{\n \"interface\": [\n {\n \"name\": \"local0\",\n \"description\": \"for testing purposes\",\n \"type\": \"iana-if-type:ethernetCsmacd\",\n \"v3po:routing\": {\n \"vrf-id\": 7\n },\n \"v3po:ethernet\": {\n \"mtu\": 64\n },\n \"enabled\": true,\n \"v3po:l2\": {\n \"bridge-domain\": \"testBD\",\n \"split-horizon-group\": \"0\",\n \"bridged-virtual-interface\": \"false\"\n }\n }\n ]\n}" }, { - "id": "ac9d34bc-b4fe-8cf3-a30c-3507e86d8b96", - "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10", + "id": "95a948ed-5345-939b-280c-74f97920343e", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vhost1", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -332,17 +359,17 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1463140942520, - "name": "Set tag rewrite pop 1 - cfg", - "description": "Corresponds to invoking:\n\nvppctl set interface l2 tag-rewrite GigabitEthernet0/9/0.10 pop 1\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1462891472552, + "name": "Add vhost user ifc - cfg", + "description": "Adds vhost-user interface.\nCorresponsing vpp cli command:\n\ncreate vhost-user socket /tmp/soc1 server\n\nTo verify invoke:\n\nvppctl show vhost-user\n\nor\n\nvppctl show int", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "folder": "c9d44561-8ad1-b987-31b5-5545a259ca14", - "rawModeData": "{\n \"interface\": [\n {\n \"name\": \"GigabitEthernet0/9/0.10\",\n \"description\": \"sub interface for testing purposes\",\n \"type\": \"v3po:sub-interface\",\n \"enabled\": \"false\",\n \"sub-interface\" : {\n \"super-interface\": \"GigabitEthernet0/9/0\",\n \"identifier\": \"10\",\n \"exact-match\": {}\n },\n \"v3po:l2\": {\n \"bridge-domain\": \"testBD\",\n \"split-horizon-group\": \"0\",\n \"bridged-virtual-interface\": \"false\",\n \"vlan-tag-rewrite\" : {\n \"rewrite-operation\": \"pop-1\"\n }\n }\n }\n ]\n}" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vhost1\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vhost-user\",\r\n \"enabled\": \"true\",\r\n \"vhost-user\" : {\r\n \"socket\": \"/tmp/soc1\",\r\n \"role\": \"server\"\r\n }\r\n }\r\n ]\r\n \r\n}", + "folder": "0bca9dad-0798-f750-91ba-cc6ff8f277d5" }, { - "id": "adc51817-69b3-5d40-6060-696b5ebda2a8", - "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "id": "a4d647b9-b951-c775-2cf4-d193cd5f2c04", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10", "preRequestScript": "", "pathVariables": {}, @@ -353,18 +380,18 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1463140928036, - "name": "Add vlan to bridge domain eth - cfg", - "description": "Adds l2 interconnection of bridge-based type to GigabitEthernet0/9/0.10 interface\n\nTo verify invoke:\n\nvppctl show bridge-domain [bd_id] detail", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1463139460244, + "name": "Add sub interface - cfg", + "description": "Adds sub interface\nCorresponsing vpp cli command:\n\ncreate sub GigabitEthernet0/9/0 10\n\nTo verify invoke:\n\nvppctl show int", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "folder": "c9d44561-8ad1-b987-31b5-5545a259ca14", - "rawModeData": "{\n \"interface\": [\n {\n \"name\": \"GigabitEthernet0/9/0.10\",\n \"description\": \"sub interface for testing purposes\",\n \"type\": \"v3po:sub-interface\",\n \"enabled\": \"false\",\n \"sub-interface\" : {\n \"super-interface\": \"GigabitEthernet0/9/0\",\n \"identifier\": \"10\",\n \"exact-match\": {}\n },\n \"v3po:l2\": {\n \"bridge-domain\": \"testBD\",\n \"split-horizon-group\": \"0\",\n \"bridged-virtual-interface\": \"false\"\n }\n }\n ]\n}" + "folder": "ba52e764-f1ec-b1cc-747f-54681ed93859", + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"GigabitEthernet0/9/0.10\",\r\n \"description\": \"sub interface for testing purposes\",\r\n \"type\": \"v3po:sub-interface\",\r\n \"enabled\": \"false\",\r\n \"sub-interface\" : {\r\n \"super-interface\": \"GigabitEthernet0/9/0\",\r\n \"identifier\": \"10\",\r\n \"exact-match\": {}\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "b33405c7-38c2-c3d8-72b5-02098d95e5f5", + "id": "a7a7c0f3-4dea-09f5-8c28-be3d7e084331", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/local0", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vxlanGpeTun3", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -374,17 +401,17 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1460640004531, - "name": "Set vrf id for local0 - cfg", + "time": 1464768006369, + "name": "Add vxlan-gpe - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"local0\",\r\n \"description\": \"for testing purposes only\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"routing\" : {\r\n \"vrf-id\" : \"7\"\r\n },\r\n \"v3po:ethernet\": {\r\n \"mtu\": 64\r\n }\r\n }\r\n ]\r\n \r\n}" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vxlanGpeTun3\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vxlan-gpe-tunnel\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"routing\" : {\r\n \"vrf-id\" : \"0\"\r\n },\r\n \"vxlan-gpe\" : {\r\n \"local\" : \"192.168.50.76\",\r\n \"remote\" : \"192.168.50.71\",\r\n \"vni\" : \"9\",\r\n \"next-protocol\" : \"ethernet\",\r\n \"encap-vrf-id\" : \"0\",\r\n \"decap-vrf-id\" : \"0\"\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "b5f2de6a-458a-353f-ff06-b54a11dab564", + "id": "bc3ade2a-51de-cb6d-f2c1-ee0598a8cb8a", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/tapp", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/local0", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -394,18 +421,17 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462535811974, - "name": "Add simple tap ifc -cfg", + "time": 1460640004531, + "name": "Set vrf id for local0 - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "folder": "a23b89ae-1545-01a6-519a-5705b001691f", - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"tapp\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:tap\",\r\n \"tap\" :{\r\n \"tap-name\" : \"tapp\"\r\n }\r\n }\r\n ]\r\n \r\n}" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"local0\",\r\n \"description\": \"for testing purposes only\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"routing\" : {\r\n \"vrf-id\" : \"7\"\r\n },\r\n \"v3po:ethernet\": {\r\n \"mtu\": 64\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "c546e0f5-e18f-f6b5-9dfc-de6bc0da785f", - "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10", + "id": "be7a6dc3-144e-be00-76e5-34395f8eb76f", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "url": "http://localhost:8181/restconf/config/v3po:vpp/bridge-domains/bridge-domain/testBD", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -415,16 +441,15 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1463139460244, - "name": "Add sub interface - cfg", - "description": "Adds sub interface\nCorresponsing vpp cli command:\n\ncreate sub GigabitEthernet0/9/0 10\n\nTo verify invoke:\n\nvppctl show int", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1460540096743, + "name": "Add bridge domain - cfg", + "description": "", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "folder": "c9d44561-8ad1-b987-31b5-5545a259ca14", - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"GigabitEthernet0/9/0.10\",\r\n \"description\": \"sub interface for testing purposes\",\r\n \"type\": \"v3po:sub-interface\",\r\n \"enabled\": \"false\",\r\n \"sub-interface\" : {\r\n \"super-interface\": \"GigabitEthernet0/9/0\",\r\n \"identifier\": \"10\",\r\n \"exact-match\": {}\r\n }\r\n }\r\n ]\r\n \r\n}" + "rawModeData": "{\r\n \"bridge-domain\": [\r\n {\r\n \"name\": \"testBD\",\r\n \"flood\": \"true\",\r\n \"forward\": \"false\",\r\n \"learn\": \"false\",\r\n \"unknown-unicast-flood\": \"false\",\r\n \"arp-termination\": \"false\"\r\n }\r\n ]\r\n}" }, { - "id": "c8d329d3-1fc3-af2b-48f5-0cf385d809f7", + "id": "c2b623b7-7110-3f81-1f73-482eca7bb41e", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", "url": "http://localhost:8181/restconf/operational/ietf-interfaces:interfaces-state/", "preRequestScript": "", @@ -439,36 +464,36 @@ "time": 1460539972177, "name": "List ifcs - oper", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "ca3fd773-8d38-7017-cee8-4688bc08f8ba", + "id": "c543d2d7-6e40-e8a3-ee37-330a9335b002", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vhost1", - "preRequestScript": "", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/GigabitEthernet0%2F9%2F0.10", "pathVariables": {}, - "method": "DELETE", + "preRequestScript": "", + "method": "GET", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "data": [], "dataMode": "raw", + "name": "Get sub interface - cfg", + "description": "", + "descriptionFormat": "html", + "time": 1463139741935, "version": 2, + "responses": [], "tests": "", "currentHelper": "normal", - "helperAttributes": "{}", - "time": 1462891488523, - "name": "Delete vhost user ifc - cfg", - "description": "Deletes vhost user interface.\nCorresponding vpp CLI command:\n\nvppctl delete vhost-user sw_if_index [index]\n\nTo verify invoke:\n\nvppctl show vhost-user\n\nor\n\nvppctl show int", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", - "responses": [], - "folder": "d188f806-127a-9383-5d63-49d7b79c6986", - "rawModeData": "", - "descriptionFormat": null + "helperAttributes": {}, + "folder": "ba52e764-f1ec-b1cc-747f-54681ed93859", + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"GigabitEthernet0/9/0.10\",\r\n \"description\": \"sub interface for testing purposes\",\r\n \"type\": \"v3po:sub-interface\",\r\n \"enabled\": \"false\",\r\n \"sub-interface\" : {\r\n \"super-interface\": \"GigabitEthernet0/9/0\",\r\n \"identifier\": \"10\",\r\n \"exact-match\": {}\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "d29faea5-ca20-7de0-b67b-f20bac4340a2", - "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", - "url": "http://localhost:8181/restconf/config/v3po:vpp/bridge-domains/bridge-domain/testBD", + "id": "d14a1086-43f2-f595-5c20-cba8b8f6a992", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vhost1", "preRequestScript": "", "pathVariables": {}, "method": "PUT", @@ -478,76 +503,79 @@ "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1460540096743, - "name": "Add bridge domain - cfg", - "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "time": 1462891483790, + "name": "Modify vhost user ifc - cfg", + "description": "Modifies vhost-user interface socket.\nTo verify invoke:\n\nvppctl show vhost-user", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \"bridge-domain\": [\r\n {\r\n \"name\": \"testBD\",\r\n \"flood\": \"true\",\r\n \"forward\": \"false\",\r\n \"learn\": \"false\",\r\n \"unknown-unicast-flood\": \"false\",\r\n \"arp-termination\": \"false\"\r\n }\r\n ]\r\n}" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"vhost1\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:vhost-user\",\r\n \"enabled\": \"true\",\r\n \"vhost-user\" : {\r\n \"socket\": \"/tmp/soc2\",\r\n \"role\": \"server\"\r\n }\r\n }\r\n ]\r\n \r\n}", + "folder": "0bca9dad-0798-f750-91ba-cc6ff8f277d5" }, { - "id": "d40b0462-07ff-6a9b-4784-759d04d4bae3", + "id": "d46e1911-cf84-3805-a085-2219a49a7557", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/tapp2", "preRequestScript": "", "pathVariables": {}, - "method": "PUT", + "method": "DELETE", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1460636113690, - "name": "Set interfaces bulk edit - cfg", + "time": 1462796994090, + "name": "Delete complex tap ifc - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\n \"interfaces\": {\n \"interface\": [\n {\n \"name\": \"pg/stream-2\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n },\n {\n \"name\": \"pg/stream-3\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n },\n {\n \"name\": \"pg/stream-0\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n },\n {\n \"name\": \"local0\",\n \"description\": \"for testing purposes\",\n \"type\": \"iana-if-type:ethernetCsmacd\",\n \"enabled\": true\n },\n {\n \"name\": \"pg/stream-1\",\n \"enabled\": true,\n \"type\": \"iana-if-type:ethernetCsmacd\"\n }\n ]\n }\n}" + "rawModeData": "", + "folder": "4ff8ebe4-bd44-681a-7093-9422424099b1" }, { - "id": "e0c0b5c9-dabd-3440-c402-037e99a9a292", + "id": "eeeb8b70-d222-6d9a-6521-1e16bf8db401", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/tapp2", + "url": "http://localhost:8181/restconf/operational/v3po:vpp-state", "preRequestScript": "", "pathVariables": {}, - "method": "PUT", + "method": "GET", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", "helperAttributes": {}, - "time": 1462796722186, - "name": "Add complex tap ifc - cfg", + "time": 1460539994330, + "name": "Read vpp-state - oper", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"tapp2\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"v3po:tap\",\r\n \"tap\" :{\r\n \"tap-name\" : \"tapp2\",\r\n \"mac\" : \"00:ff:ff:ff:ff:ff\",\r\n \"device-instance\" : 55\r\n }\r\n }\r\n ]\r\n \r\n}", - "folder": "a23b89ae-1545-01a6-519a-5705b001691f" + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" }, { - "id": "e3f9de11-4c5b-bc82-ca10-e7aed4832831", + "id": "f0faabc8-eab8-bb4d-1042-b45716ecb155", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", - "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/local0", + "url": "http://localhost:8181/restconf/config/ietf-interfaces:interfaces/interface/vxlanTun1", "preRequestScript": "", "pathVariables": {}, - "method": "PUT", + "method": "DELETE", "data": [], "dataMode": "raw", "version": 2, "tests": "", "currentHelper": "normal", - "helperAttributes": {}, - "time": 1460540047356, - "name": "Enable local0 interface - cfg", + "helperAttributes": "{}", + "time": 1462892071867, + "name": "Delete virtual ifc - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], - "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"local0\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"v3po:ethernet\": {\r\n \"mtu\": 64\r\n }\r\n }\r\n ]\r\n \r\n}" + "folder": "f8061658-c931-5f3c-c119-857c8b1508b1", + "timestamp": null, + "rawModeData": "" }, { - "id": "f3822b78-f031-d4db-5f9a-1a15e1b69e82", + "id": "f19bf50c-b847-a7a0-cabe-31b2cf23b745", "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", "url": "http://localhost:8181/restconf/config/v3po:vpp", "preRequestScript": "", @@ -562,9 +590,30 @@ "time": 1460540006597, "name": "Read vpp - cfg", "description": "", - "collectionId": "9a250d84-57ff-11a7-d034-97dc21a7c35c", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", "responses": [], "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" + }, + { + "id": "fce0239b-0d55-5578-e216-51a7a0f57cc4", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8181/restconf/operational/naming-context:contexts", + "pathVariables": {}, + "preRequestScript": "", + "method": "GET", + "collectionId": "61475d83-1808-fa49-7ca6-32f701e38b19", + "data": [], + "dataMode": "raw", + "name": "List naming contexts - context", + "description": "List mapping context stored in context datastore", + "descriptionFormat": "html", + "time": 1463556756647, + "version": 2, + "responses": [], + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\r\n \r\n \"interface\": [\r\n {\r\n \"name\": \"testInterface\",\r\n \"description\": \"for testing purposes\",\r\n \"type\": \"iana-if-type:ethernetCsmacd\",\r\n \"enabled\": \"true\",\r\n \"link-up-down-trap-enable\": \"enabled\",\r\n \"ietf-ip:ipv4\": {\r\n \"enabled\": \"true\",\r\n \"mtu\": \"1500\",\r\n \"address\": [\r\n {\r\n \"ip\": \"1.2.3.0\",\r\n \"netmask\": \"255.255.255.0\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n \r\n}" } ] }
\ No newline at end of file diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/initializers/InterfacesInitializer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/initializers/InterfacesInitializer.java index 3571fbc90..38ab58af1 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/initializers/InterfacesInitializer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/initializers/InterfacesInitializer.java @@ -31,18 +31,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanGpeVni; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.EthernetBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.SubInterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.TapBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUserBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanGpeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Ethernet; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.L2; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.SubInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Tap; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VhostUser; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.attributes.Interconnection; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.attributes.VlanTagRewrite; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.attributes.VlanTagRewriteBuilder; @@ -99,6 +102,11 @@ public class InterfacesInitializer extends AbstractDataTreeConverter<InterfacesS setVxlan(augmentBuilder, vxlan); } + final VxlanGpe vxlanGpe = vppIfcAugmentation.getVxlanGpe(); + if(vxlanGpe != null) { + setVxlanGpe(augmentBuilder, vxlanGpe); + } + final Tap tap = vppIfcAugmentation.getTap(); if(tap != null) { setTap(input, augmentBuilder, tap); @@ -224,4 +232,15 @@ public class InterfacesInitializer extends AbstractDataTreeConverter<InterfacesS vxlanBuilder.setVni(new VxlanVni(vxlan.getVni())); augmentBuilder.setVxlan(vxlanBuilder.build()); } + + private static void setVxlanGpe(final VppInterfaceAugmentationBuilder augmentBuilder, final VxlanGpe vxlanGpe) { + final VxlanGpeBuilder vxlanGpeBuilder = new VxlanGpeBuilder(); + vxlanGpeBuilder.setLocal(vxlanGpe.getLocal()); + vxlanGpeBuilder.setRemote(vxlanGpe.getRemote()); + vxlanGpeBuilder.setVni(new VxlanGpeVni(vxlanGpe.getVni())); + vxlanGpeBuilder.setNextProtocol(vxlanGpe.getNextProtocol()); + vxlanGpeBuilder.setEncapVrfId(vxlanGpe.getEncapVrfId()); + vxlanGpeBuilder.setDecapVrfId(vxlanGpe.getDecapVrfId()); + augmentBuilder.setVxlanGpe(vxlanGpeBuilder.build()); + } } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VxlanGpeCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VxlanGpeCustomizer.java new file mode 100644 index 000000000..7d9641122 --- /dev/null +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VxlanGpeCustomizer.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.v3po.translate.v3po.interfaces; + +import static com.google.common.base.Preconditions.checkArgument; + +import com.google.common.base.Optional; +import com.google.common.net.InetAddresses; +import io.fd.honeycomb.v3po.translate.v3po.util.AbstractInterfaceTypeCustomizer; +import io.fd.honeycomb.v3po.translate.v3po.util.NamingContext; +import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException; +import io.fd.honeycomb.v3po.translate.v3po.util.TranslateUtils; +import io.fd.honeycomb.v3po.translate.write.WriteContext; +import io.fd.honeycomb.v3po.translate.write.WriteFailedException; +import java.net.InetAddress; +import java.util.concurrent.CompletionStage; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanGpeTunnel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanGpe; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.openvpp.jvpp.dto.VxlanGpeAddDelTunnel; +import org.openvpp.jvpp.dto.VxlanGpeAddDelTunnelReply; +import org.openvpp.jvpp.future.FutureJVpp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// TODO extract common code from all Interface type specific writer customizers into a superclass +public class VxlanGpeCustomizer extends AbstractInterfaceTypeCustomizer<VxlanGpe> { + + private static final Logger LOG = LoggerFactory.getLogger(VxlanGpeCustomizer.class); + private final NamingContext interfaceContext; + + public VxlanGpeCustomizer(final FutureJVpp vppApi, final NamingContext interfaceContext) { + super(vppApi); + this.interfaceContext = interfaceContext; + } + + @Nonnull + @Override + public Optional<VxlanGpe> extract(@Nonnull final InstanceIdentifier<VxlanGpe> currentId, + @Nonnull final DataObject parentData) { + return Optional.fromNullable(((VppInterfaceAugmentation) parentData).getVxlanGpe()); + } + + @Override + protected Class<? extends InterfaceType> getExpectedInterfaceType() { + return VxlanGpeTunnel.class; + } + + @Override + protected final void writeInterface(@Nonnull final InstanceIdentifier<VxlanGpe> id, @Nonnull final VxlanGpe dataAfter, + @Nonnull final WriteContext writeContext) + throws WriteFailedException.CreateFailedException { + try { + createVxlanGpeTunnel(id.firstKeyOf(Interface.class).getName(), dataAfter, writeContext); + } catch (VppApiInvocationException | IllegalInterfaceTypeException e) { + LOG.warn("Write of VxlanGpe failed", e); + throw new WriteFailedException.CreateFailedException(id, dataAfter, e); + } + } + + @Override + public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<VxlanGpe> id, @Nonnull final VxlanGpe dataBefore, + @Nonnull final VxlanGpe dataAfter, @Nonnull final WriteContext writeContext) + throws WriteFailedException.UpdateFailedException { + throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, + new UnsupportedOperationException("VxlanGpe tunnel update is not supported")); + } + + @Override + public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<VxlanGpe> id, @Nonnull final VxlanGpe dataBefore, + @Nonnull final WriteContext writeContext) + throws WriteFailedException.DeleteFailedException { + try { + deleteVxlanGpeTunnel(id.firstKeyOf(Interface.class).getName(), dataBefore, writeContext); + } catch (VppApiInvocationException e) { + LOG.warn("Delete of VxlanGpe tunnel failed", e); + throw new WriteFailedException.DeleteFailedException(id, e); + } + } + + private void createVxlanGpeTunnel(final String swIfName, final VxlanGpe VxlanGpe, final WriteContext writeContext) throws VppApiInvocationException { + final byte isIpv6 = (byte) (isIpv6(VxlanGpe) ? 1 : 0); + final InetAddress Local = InetAddresses.forString(getAddressString(VxlanGpe.getLocal())); + final InetAddress Remote = InetAddresses.forString(getAddressString(VxlanGpe.getRemote())); + + int vni = VxlanGpe.getVni().getValue().intValue(); + byte protocol = (byte) VxlanGpe.getNextProtocol().getIntValue(); + int encapVrfId = VxlanGpe.getEncapVrfId().intValue(); + int decapVrfId = VxlanGpe.getDecapVrfId().intValue(); + + LOG.debug("Setting VxlanGpe tunnel for interface: {}. VxlanGpe: {}", swIfName, VxlanGpe); + final CompletionStage<VxlanGpeAddDelTunnelReply> VxlanGpeAddDelTunnelReplyCompletionStage = + getFutureJVpp().vxlanGpeAddDelTunnel(getVxlanGpeTunnelRequest((byte) 1 /* is add */, Local.getAddress(), + Remote.getAddress(), vni, protocol, encapVrfId, decapVrfId, isIpv6)); + + final VxlanGpeAddDelTunnelReply reply = + TranslateUtils.getReply(VxlanGpeAddDelTunnelReplyCompletionStage.toCompletableFuture()); + if (reply.retval < 0) { + LOG.debug("Failed to set VxlanGpe tunnel for interface: {}, VxlanGpe: {}", swIfName, VxlanGpe); + throw new VppApiInvocationException("VxlanGpeAddDelTunnel", reply.context, reply.retval); + } else { + LOG.debug("VxlanGpe tunnel set successfully for: {}, VxlanGpe: {}", swIfName, VxlanGpe); + if(interfaceContext.containsName(reply.swIfIndex, writeContext.getMappingContext())) { + final String formerName = interfaceContext.getName(reply.swIfIndex, writeContext.getMappingContext()); + LOG.debug("Removing updated mapping of a vxlan-gpe tunnel, id: {}, former name: {}, new name: {}", + reply.swIfIndex, formerName, swIfName); + interfaceContext.removeName(formerName, writeContext.getMappingContext()); + } + // Add new interface to our interface context + interfaceContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext()); + } + } + + private boolean isIpv6(final VxlanGpe VxlanGpe) { + if (VxlanGpe.getLocal().getIpv4Address() == null) { + checkArgument(VxlanGpe.getRemote().getIpv4Address() == null, "Inconsistent ip addresses: %s, %s", VxlanGpe.getLocal(), + VxlanGpe.getRemote()); + return true; + } else { + checkArgument(VxlanGpe.getRemote().getIpv6Address() == null, "Inconsistent ip addresses: %s, %s", VxlanGpe.getLocal(), + VxlanGpe.getRemote()); + return false; + } + } + + private String getAddressString(final IpAddress addr) { + return addr.getIpv4Address() == null ? addr.getIpv6Address().getValue() : addr.getIpv4Address().getValue(); + } + + private void deleteVxlanGpeTunnel(final String swIfName, final VxlanGpe VxlanGpe, final WriteContext writeContext) throws VppApiInvocationException { + final byte isIpv6 = (byte) (isIpv6(VxlanGpe) ? 1 : 0); + final InetAddress local = InetAddresses.forString(getAddressString(VxlanGpe.getLocal())); + final InetAddress remote = InetAddresses.forString(getAddressString(VxlanGpe.getRemote())); + + int vni = VxlanGpe.getVni().getValue().intValue(); + byte protocol = (byte) VxlanGpe.getNextProtocol().getIntValue(); + int encapVrfId = VxlanGpe.getEncapVrfId().intValue(); + int decapVrfId = VxlanGpe.getDecapVrfId().intValue(); + + LOG.debug("Deleting VxlanGpe tunnel for interface: {}. VxlanGpe: {}", swIfName, VxlanGpe); + final CompletionStage<VxlanGpeAddDelTunnelReply> VxlanGpeAddDelTunnelReplyCompletionStage = + getFutureJVpp().vxlanGpeAddDelTunnel(getVxlanGpeTunnelRequest((byte) 0 /* is delete */, local.getAddress(), + remote.getAddress(), vni, protocol, encapVrfId, decapVrfId, isIpv6)); + + final VxlanGpeAddDelTunnelReply reply = + TranslateUtils.getReply(VxlanGpeAddDelTunnelReplyCompletionStage.toCompletableFuture()); + if (reply.retval < 0) { + LOG.debug("Failed to delete VxlanGpe tunnel for interface: {}, VxlanGpe: {}", swIfName, VxlanGpe); + throw new VppApiInvocationException("VxlanGpeAddDelTunnel", reply.context, reply.retval); + } else { + LOG.debug("VxlanGpe tunnel deleted successfully for: {}, VxlanGpe: {}", swIfName, VxlanGpe); + // Remove interface from our interface context + interfaceContext.removeName(swIfName, writeContext.getMappingContext()); + } + } + + private static VxlanGpeAddDelTunnel getVxlanGpeTunnelRequest(final byte isAdd, final byte[] local, final byte[] remote, + final int vni, final byte protocol, final int encapVrfId, final int decapVrfId, + final byte isIpv6) { + final VxlanGpeAddDelTunnel VxlanGpeAddDelTunnel = new VxlanGpeAddDelTunnel(); + VxlanGpeAddDelTunnel.isAdd = isAdd; + VxlanGpeAddDelTunnel.local = local; + VxlanGpeAddDelTunnel.remote = remote; + VxlanGpeAddDelTunnel.vni = vni; + VxlanGpeAddDelTunnel.protocol = protocol; + VxlanGpeAddDelTunnel.encapVrfId = encapVrfId; + VxlanGpeAddDelTunnel.decapVrfId = decapVrfId; + VxlanGpeAddDelTunnel.isIpv6 = isIpv6; + return VxlanGpeAddDelTunnel; + } +} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/VxlanGpeCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/VxlanGpeCustomizer.java new file mode 100644 index 000000000..64a5b895a --- /dev/null +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/VxlanGpeCustomizer.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.v3po.translate.v3po.interfacesstate; + +import static com.google.common.base.Preconditions.checkState; + +import io.fd.honeycomb.v3po.translate.read.ReadContext; +import io.fd.honeycomb.v3po.translate.read.ReadFailedException; +import io.fd.honeycomb.v3po.translate.spi.read.ChildReaderCustomizer; +import io.fd.honeycomb.v3po.translate.v3po.util.FutureJVppCustomizer; +import io.fd.honeycomb.v3po.translate.v3po.util.NamingContext; +import io.fd.honeycomb.v3po.translate.v3po.util.TranslateUtils; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.concurrent.CompletionStage; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanGpeTunnel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanGpeVni; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpeBuilder; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.openvpp.jvpp.dto.VxlanGpeTunnelDetails; +import org.openvpp.jvpp.dto.VxlanGpeTunnelDetailsReplyDump; +import org.openvpp.jvpp.dto.VxlanGpeTunnelDump; +import org.openvpp.jvpp.future.FutureJVpp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VxlanGpeCustomizer extends FutureJVppCustomizer + implements ChildReaderCustomizer<VxlanGpe, VxlanGpeBuilder> { + + private static final Logger LOG = LoggerFactory.getLogger(VxlanGpeCustomizer.class); + private NamingContext interfaceContext; + + public VxlanGpeCustomizer(@Nonnull final FutureJVpp jvpp, @Nonnull final NamingContext interfaceContext) { + super(jvpp); + this.interfaceContext = interfaceContext; + } + + @Override + public void merge(@Nonnull Builder<? extends DataObject> parentBuilder, + @Nonnull VxlanGpe readValue) { + ((VppInterfaceStateAugmentationBuilder) parentBuilder).setVxlanGpe(readValue); + } + + @Nonnull + @Override + public VxlanGpeBuilder getBuilder(@Nonnull InstanceIdentifier<VxlanGpe> id) { + return new VxlanGpeBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull final InstanceIdentifier<VxlanGpe> id, + @Nonnull final VxlanGpeBuilder builder, + @Nonnull final ReadContext ctx) throws ReadFailedException { + final InterfaceKey key = id.firstKeyOf(Interface.class); + // Relying here that parent InterfaceCustomizer was invoked first (PREORDER) + // to fill in the context with initial ifc mapping + final int index = interfaceContext.getIndex(key.getName(), ctx.getMappingContext()); + if (!InterfaceUtils.isInterfaceOfType(ctx.getModificationCache(), index, VxlanGpeTunnel.class)) { + return; + } + + LOG.debug("Reading attributes for VxlanGpe tunnel: {}", key.getName()); + // Dump just a single + final VxlanGpeTunnelDump request = new VxlanGpeTunnelDump(); + request.swIfIndex = index; + + final CompletionStage<VxlanGpeTunnelDetailsReplyDump> swInterfaceVxlanGpeDetailsReplyDumpCompletionStage = + getFutureJVpp().vxlanGpeTunnelDump(request); + final VxlanGpeTunnelDetailsReplyDump reply = + TranslateUtils.getReply(swInterfaceVxlanGpeDetailsReplyDumpCompletionStage.toCompletableFuture()); + + // VPP keeps VxlanGpe tunnel interfaces even after they were deleted (optimization) + // However there are no longer any VxlanGpe tunnel specific fields assigned to it and this call + // returns nothing + if (reply == null || reply.vxlanGpeTunnelDetails == null || reply.vxlanGpeTunnelDetails.isEmpty()) { + LOG.debug( + "VxlanGpe tunnel {}, id {} has no attributes assigned in VPP. Probably is a leftover interface placeholder" + + "after delete", key.getName(), index); + return; + } + + checkState(reply.vxlanGpeTunnelDetails.size() == 1, + "Unexpected number of returned VxlanGpe tunnels: {} for tunnel: {}", reply.vxlanGpeTunnelDetails, key.getName()); + LOG.trace("VxlanGpe tunnel: {} attributes returned from VPP: {}", key.getName(), reply); + + final VxlanGpeTunnelDetails swInterfaceVxlanGpeDetails = reply.vxlanGpeTunnelDetails.get(0); + if (swInterfaceVxlanGpeDetails.isIpv6 == 1) { + final Ipv6Address remote6 = + new Ipv6Address(parseAddress(swInterfaceVxlanGpeDetails.remote).getHostAddress()); + builder.setRemote(new IpAddress(remote6)); + final Ipv6Address local6 = + new Ipv6Address(parseAddress(swInterfaceVxlanGpeDetails.local).getHostAddress()); + builder.setLocal(new IpAddress(local6)); + } else { + final byte[] dstBytes = Arrays.copyOfRange(swInterfaceVxlanGpeDetails.remote, 0, 4); + final Ipv4Address remote4 = new Ipv4Address(parseAddress(dstBytes).getHostAddress()); + builder.setRemote(new IpAddress(remote4)); + final byte[] srcBytes = Arrays.copyOfRange(swInterfaceVxlanGpeDetails.local, 0, 4); + final Ipv4Address local4 = new Ipv4Address(parseAddress(srcBytes).getHostAddress()); + builder.setLocal(new IpAddress(local4)); + } + builder.setVni(new VxlanGpeVni((long) swInterfaceVxlanGpeDetails.vni)); + builder.setEncapVrfId((long) swInterfaceVxlanGpeDetails.encapVrfId); + builder.setDecapVrfId((long) swInterfaceVxlanGpeDetails.decapVrfId); + LOG.debug("VxlanGpe tunnel: {}, id: {} attributes read as: {}", key.getName(), index, builder); + } + + @Nonnull + private static InetAddress parseAddress(@Nonnull final byte[] addr) { + try { + return InetAddress.getByAddress(addr); + } catch (UnknownHostException e) { + throw new IllegalArgumentException("Cannot create InetAddress from " + Arrays.toString(addr), e); + } + } +} diff --git a/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesHoneycombWriterModule.java b/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesHoneycombWriterModule.java index d8b5b65f7..4a1e7f0dd 100644 --- a/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesHoneycombWriterModule.java +++ b/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesHoneycombWriterModule.java @@ -18,6 +18,7 @@ import io.fd.honeycomb.v3po.translate.v3po.interfaces.TapCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfaces.VhostUserCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfaces.VlanTagRewriteCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfaces.VxlanCustomizer; +import io.fd.honeycomb.v3po.translate.v3po.interfaces.VxlanGpeCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfaces.ip.Ipv4Customizer; import io.fd.honeycomb.v3po.translate.v3po.interfaces.ip.Ipv6Customizer; import io.fd.honeycomb.v3po.translate.write.ChildWriter; @@ -37,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Tap; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUser; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Vxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanGpe; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.attributes.VlanTagRewrite; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.ChildOf; @@ -105,6 +107,9 @@ public class InterfacesHoneycombWriterModule extends org.opendaylight.yang.gen.v final ChildWriter<Vxlan> vxlanWriter = new CompositeChildWriter<>(Vxlan.class, new VxlanCustomizer(getVppJvppIfcDependency(), getInterfaceContextDependency())); + final ChildWriter<VxlanGpe> vxlanGpeWriter = new CompositeChildWriter<>(VxlanGpe.class, + new VxlanGpeCustomizer(getVppJvppIfcDependency(), getInterfaceContextDependency())); + final ChildWriter<VhostUser> vhostUserWriter = new CompositeChildWriter<>(VhostUser.class, new VhostUserCustomizer(getVppJvppIfcDependency(), getInterfaceContextDependency())); @@ -133,6 +138,7 @@ public class InterfacesHoneycombWriterModule extends org.opendaylight.yang.gen.v final List<ChildWriter<? extends ChildOf<VppInterfaceAugmentation>>> vppIfcChildWriters = Lists.newArrayList(); vppIfcChildWriters.add(vhostUserWriter); vppIfcChildWriters.add(vxlanWriter); + vppIfcChildWriters.add(vxlanGpeWriter); vppIfcChildWriters.add(tapWriter); vppIfcChildWriters.add(ethernetWriter); vppIfcChildWriters.add(subIfWriter); diff --git a/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesStateHoneycombReaderModule.java b/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesStateHoneycombReaderModule.java index 4c8202c0b..7c97abf02 100644 --- a/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesStateHoneycombReaderModule.java +++ b/v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesStateHoneycombReaderModule.java @@ -23,6 +23,7 @@ import io.fd.honeycomb.v3po.translate.v3po.interfacesstate.TapCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfacesstate.VhostUserCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfacesstate.VlanTagRewriteCustomizer; import io.fd.honeycomb.v3po.translate.v3po.interfacesstate.VxlanCustomizer; +import io.fd.honeycomb.v3po.translate.v3po.interfacesstate.VxlanGpeCustomizer; import java.util.Collections; import java.util.List; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState; @@ -38,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Tap; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VhostUser; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.attributes.VlanTagRewrite; import org.opendaylight.yangtools.yang.binding.ChildOf; @@ -79,6 +81,10 @@ public class InterfacesStateHoneycombReaderModule extends new CompositeChildReader<>(Vxlan.class, new VxlanCustomizer(getVppJvppDependency(), getInterfaceContextIfcStateDependency())); + final ChildReader<? extends ChildOf<VppInterfaceStateAugmentation>> vxlanGpeReader = + new CompositeChildReader<>(VxlanGpe.class, + new VxlanGpeCustomizer(getVppJvppDependency(), getInterfaceContextIfcStateDependency())); + final ChildReader<? extends ChildOf<VppInterfaceStateAugmentation>> subInterfaceReader = new CompositeChildReader<>(SubInterface.class, new SubInterfaceCustomizer(getVppJvppDependency(), getInterfaceContextIfcStateDependency())); @@ -101,6 +107,7 @@ public class InterfacesStateHoneycombReaderModule extends childReaders.add(tapReader); childReaders.add(vhostUserReader); childReaders.add(vxlanReader); + childReaders.add(vxlanGpeReader); childReaders.add(subInterfaceReader); childReaders.add(l2Reader); |