diff options
4 files changed, 1377 insertions, 1 deletions
diff --git a/bgp/bgp_postman_collection.json b/bgp/bgp_postman_collection.json new file mode 100644 index 000000000..fe42432ff --- /dev/null +++ b/bgp/bgp_postman_collection.json @@ -0,0 +1,537 @@ +{ + "id": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "name": "Hc2vpp BGP RESTCONF calls", + "description": "Examples of BGP configration based on \nhttp://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html", + "order": [ + "0779736c-2276-3275-b5c1-eccf8cf2fd22", + "0aae4294-1688-f0c1-3f20-21fc93a6dead", + "7097be0f-e36b-2e43-715b-a3d47c47fd94", + "3762ddc0-d7bc-57c9-e9b8-d536a1809fa8", + "5f1886a1-f957-126b-7093-963bce523c90", + "554e0087-3b7a-ea91-80aa-059400fee2ad", + "d13aea58-fb5f-3d4a-d6f4-25b4a67b3539", + "a62df5d6-53ab-f91c-c90c-efb054ef1aa3", + "02a81cd8-758b-8ba9-58f4-1744afb1ea74", + "b69ed7d0-cd9d-82d5-ae17-3be02a254a5f", + "3c3abdc7-0613-0260-46ec-020f0ff5d9d7", + "b49b3af6-cb64-cd30-8294-cc0bd2a61f76", + "1b683e04-c542-df6b-783e-dc1b16ae8f52", + "a24b4cde-e80a-8571-7c64-efaeb2fc1238", + "0b0f2068-5fbb-4d44-e58e-8c4562cda8ad", + "c30eb27b-8883-ab64-2286-a8bbabd95ba9" + ], + "folders": [], + "timestamp": 1494477000331, + "owner": "567303", + "public": false, + "requests": [ + { + "folder": null, + "id": "02a81cd8-758b-8ba9-58f4-1744afb1ea74", + "name": "show speeker's Loc-RIB", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "GET", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/loc-rib", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": null, + "headerData": null, + "pathVariableData": null, + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<neighbor xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions\">\n <neighbor-address>10.25.1.9</neighbor-address>\n <config>\n <peer-group>application-peers</peer-group>\n </config>\n</neighbor>" + }, + { + "folder": null, + "id": "0779736c-2276-3275-b5c1-eccf8cf2fd22", + "name": "show hc-bgp-instance", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "GET", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": null, + "headerData": null, + "pathVariableData": null, + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<neighbor xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions\">\n <neighbor-address>192.0.2.1</neighbor-address>\n <timers>\n <config>\n <hold-time>90</hold-time>\n <connect-retry>10</connect-retry>\n </config>\n </timers>\n <transport>\n <config>\n <remote-port>179</remote-port>\n <passive-mode>false</passive-mode>\n </config>\n </transport>\n <config>\n <peer-type>INTERNAL</peer-type>\n </config>\n</neighbor>" + }, + { + "id": "0aae4294-1688-f0c1-3f20-21fc93a6dead", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/hc-bgp-instance/bgp/bgp-openconfig-extensions:neighbors/neighbor/127.0.0.2", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "PUT", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1500013934256, + "name": "add bgp peer", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "responses": [], + "rawModeData": "{\n\t\"neighbor\": {\n \"neighbor-address\": \"127.0.0.2\",\n \"config\": {\n \"peer-type\": \"INTERNAL\"\n },\n \"timers\": {\n \"config\": {\n \"connect-retry\": 10,\n \"hold-time\": 90\n }\n },\n \"transport\": {\n \"config\": {\n \"remote-port\": 17900,\n \"passive-mode\": false\n }\n },\n \"afi-safis\": {\n \"afi-safi\": [\n {\n \"afi-safi-name\": \"openconfig-bgp-types:IPV4-UNICAST\",\n \"receive\": true,\n \"send-max\": 0\n }\n ]\n }\n}\n}" + }, + { + "id": "0b0f2068-5fbb-4d44-e58e-8c4562cda8ad", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/hc-bgp-instance/bgp/bgp-openconfig-extensions:neighbors/neighbor/127.0.0.2", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "PUT", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1500014475038, + "name": "update bgp peer", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "responses": [], + "rawModeData": "{\n\t\"neighbor\": {\n \"neighbor-address\": \"127.0.0.2\",\n \"config\": {\n \"peer-type\": \"INTERNAL\"\n },\n \"timers\": {\n \"config\": {\n \"connect-retry\": 10,\n \"hold-time\": 91\n }\n },\n \"transport\": {\n \"config\": {\n \"remote-port\": 17900,\n \"passive-mode\": false\n }\n },\n \"afi-safis\": {\n \"afi-safi\": [\n {\n \"afi-safi-name\": \"openconfig-bgp-types:IPV4-UNICAST\",\n \"receive\": true,\n \"send-max\": 0\n }\n ]\n }\n}\n}" + }, + { + "folder": null, + "id": "1b683e04-c542-df6b-783e-dc1b16ae8f52", + "name": "remove second ipv4unicast route", + "dataMode": "raw", + "data": [], + "rawModeData": "", + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "DELETE", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route/10.0.0.12%2F32/0", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": [], + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "pathVariableData": [], + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d" + }, + { + "folder": null, + "id": "3762ddc0-d7bc-57c9-e9b8-d536a1809fa8", + "name": "show 127.0.0.2 peer state", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "GET", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/peer/bgp:%2F%2F127.0.0.2", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": null, + "headerData": null, + "pathVariableData": null, + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<neighbor xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions\">\n <neighbor-address>192.0.2.1</neighbor-address>\n <timers>\n <config>\n <hold-time>90</hold-time>\n <connect-retry>10</connect-retry>\n </config>\n </timers>\n <transport>\n <config>\n <remote-port>179</remote-port>\n <passive-mode>false</passive-mode>\n </config>\n </transport>\n <config>\n <peer-type>INTERNAL</peer-type>\n </config>\n</neighbor>" + }, + { + "id": "3c3abdc7-0613-0260-46ec-020f0ff5d9d7", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "headerData": [ + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + }, + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/operational/hc2vpp-ietf-routing:routing-state/routing-instance/vpp-routing-instance/routing-protocols/routing-protocol/learned-protocol-0/static-routes/hc2vpp-ietf-ipv4-unicast-routing:ipv4", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "GET", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "data": [], + "dataMode": "raw", + "name": "get VPP IPv4 routes", + "description": "", + "descriptionFormat": "html", + "time": 1501156310525, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\n \"routing-instance\":\n {\n \"name\":\"routing-1\",\n \"enabled\":\"true\",\n \"router-id\":\"192.168.2.1\",\n \"description\":\"Test routing instance\",\n \"routing-protocols\":{\n \"routing-protocol\":[\n {\n \"name\":\"test-routing-protocol\",\n \"description\":\"Test routing protocol\",\n \"enabled\":\"true\",\n \"type\":\"static\",\n \"static-routes\":{\n \"ipv4\":{\n \"route\":[\n {\n \"id\":1,\n \"description\":\"Test static route\",\n \"destination-prefix\":\"192.168.2.3/32\",\n \"next-hop\":\"192.168.2.8\"\n }\n ]\n }\n }\n } \n ]\n }\n } \n}" + }, + { + "id": "554e0087-3b7a-ea91-80aa-059400fee2ad", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/peer/bgp:%2F%2F10.25.1.9", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "GET", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1500015544451, + "name": "show 10.25.1.9 app peer state", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<neighbor xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions\">\n <neighbor-address>192.0.2.1</neighbor-address>\n <timers>\n <config>\n <hold-time>90</hold-time>\n <connect-retry>10</connect-retry>\n </config>\n </timers>\n <transport>\n <config>\n <remote-port>179</remote-port>\n <passive-mode>false</passive-mode>\n </config>\n </transport>\n <config>\n <peer-type>INTERNAL</peer-type>\n </config>\n</neighbor>" + }, + { + "id": "5f1886a1-f957-126b-7093-963bce523c90", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/hc-bgp-instance/bgp/bgp-openconfig-extensions:neighbors/neighbor/10.25.1.9", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "PUT", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1500014801163, + "name": "add application peer", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "responses": [], + "rawModeData": "{\n \"neighbor\": {\n \"neighbor-address\": \"10.25.1.9\",\n \"config\": {\n \"peer-group\": \"application-peers\"\n },\n \"afi-safis\": {\n \"afi-safi\": [\n {\n \"afi-safi-name\": \"openconfig-bgp-types:IPV4-UNICAST\",\n \"receive\": true,\n \"send-max\": 0\n },\n {\n \"afi-safi-name\": \"openconfig-bgp-types:IPV4-LABELLED-UNICAST\",\n \"receive\": true,\n \"send-max\": 0\n }\n ]\n }\n }\n}" + }, + { + "id": "7097be0f-e36b-2e43-715b-a3d47c47fd94", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "GET", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1499946714543, + "name": "read network instance (config)", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "responses": [], + "rawModeData": "<neighbor xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions\">\n <neighbor-address>192.0.2.1</neighbor-address>\n <timers>\n <config>\n <hold-time>90</hold-time>\n <connect-retry>10</connect-retry>\n </config>\n </timers>\n <transport>\n <config>\n <remote-port>179</remote-port>\n <passive-mode>false</passive-mode>\n </config>\n </transport>\n <config>\n <peer-type>INTERNAL</peer-type>\n </config>\n</neighbor>" + }, + { + "folder": null, + "id": "a24b4cde-e80a-8571-7c64-efaeb2fc1238", + "name": "add IPv4 labeled unicast route", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "POST", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-labeled-unicast:labeled-unicast-subsequent-address-family/bgp-labeled-unicast:labeled-unicast-routes", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": [], + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "pathVariableData": [], + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<labeled-unicast-route xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp-labeled-unicast\">\n <route-key>label1</route-key>\n <prefix>1.1.1.1/32</prefix>\n <path-id>1</path-id>\n <label-stack>\n <label-value>800322</label-value>\n </label-stack>\n <attributes>\n <ipv4-next-hop>\n <global>199.20.160.41</global>\n </ipv4-next-hop>\n <origin>\n <value>igp</value>\n </origin>\n <as-path/>\n <local-pref>\n <pref>100</pref>\n </local-pref>\n </attributes>\n</labeled-unicast-route>" + }, + { + "folder": null, + "id": "a62df5d6-53ab-f91c-c90c-efb054ef1aa3", + "name": "show 127.0.0.2 peer's adj-rib-out", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "GET", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/peer/bgp:%2F%2F127.0.0.2/adj-rib-out/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": null, + "headerData": null, + "pathVariableData": null, + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<neighbor xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions\">\n <neighbor-address>192.0.2.1</neighbor-address>\n <timers>\n <config>\n <hold-time>90</hold-time>\n <connect-retry>10</connect-retry>\n </config>\n </timers>\n <transport>\n <config>\n <remote-port>179</remote-port>\n <passive-mode>false</passive-mode>\n </config>\n </transport>\n <config>\n <peer-type>INTERNAL</peer-type>\n </config>\n</neighbor>" + }, + { + "folder": null, + "id": "b49b3af6-cb64-cd30-8294-cc0bd2a61f76", + "name": "update second ipv4unicast route", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "PUT", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route/10.0.0.12%2F32/0", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": [], + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "pathVariableData": [], + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<ipv4-route xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp-inet\">\n <path-id>0</path-id>\n <prefix>10.0.0.12/32</prefix>\n <attributes>\n <as-path></as-path>\n <origin>\n <value>igp</value>\n </origin>\n <local-pref>\n <pref>102</pref>\n </local-pref>\n <ipv4-next-hop>\n <global>10.11.1.1</global>\n </ipv4-next-hop>\n </attributes>\n</ipv4-route>" + }, + { + "folder": null, + "id": "b69ed7d0-cd9d-82d5-ae17-3be02a254a5f", + "name": "add another ipv4unicast route", + "dataMode": "raw", + "data": [], + "descriptionFormat": null, + "description": "", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "method": "PUT", + "pathVariables": {}, + "url": "http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route/10.0.0.12%2F32/0", + "preRequestScript": null, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "queryParams": [], + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "pathVariableData": [], + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<ipv4-route xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp-inet\">\n <path-id>0</path-id>\n <prefix>10.0.0.12/32</prefix>\n <attributes>\n <as-path></as-path>\n <origin>\n <value>igp</value>\n </origin>\n <local-pref>\n <pref>100</pref>\n </local-pref>\n <ipv4-next-hop>\n <global>10.11.1.1</global>\n </ipv4-next-hop>\n </attributes>\n</ipv4-route>" + }, + { + "id": "c30eb27b-8883-ab64-2286-a8bbabd95ba9", + "headers": "Content-Type: application/json\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/hc-bgp-instance/bgp/bgp-openconfig-extensions:neighbors/neighbor/127.0.0.2", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "DELETE", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1500014574942, + "name": "delete bgp peer", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "responses": [], + "rawModeData": "" + }, + { + "id": "d13aea58-fb5f-3d4a-d6f4-25b4a67b3539", + "headers": "Content-Type: application/xml\nAuthorization: Basic YWRtaW46YWRtaW4=\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/xml", + "description": "", + "enabled": true + }, + { + "key": "Authorization", + "value": "Basic YWRtaW46YWRtaW4=", + "description": "", + "enabled": true + } + ], + "url": "http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route/10.0.0.11%2F32/0", + "queryParams": [], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "PUT", + "data": [], + "dataMode": "raw", + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1501153693347, + "name": "add ipv4unicast route", + "description": "", + "collectionId": "93836ad6-9489-6642-2539-b0a0aefd8f4d", + "rawModeData": "<ipv4-route xmlns=\"urn:opendaylight:params:xml:ns:yang:bgp-inet\">\n <path-id>0</path-id>\n <prefix>10.0.0.11/32</prefix>\n <attributes>\n <as-path></as-path>\n <origin>\n <value>igp</value>\n </origin>\n <local-pref>\n <pref>100</pref>\n </local-pref>\n <ipv4-next-hop>\n <global>10.11.1.1</global>\n </ipv4-next-hop>\n </attributes>\n</ipv4-route>" + } + ] +}
\ No newline at end of file diff --git a/release-notes/src/main/asciidoc/user_guide/bgp_in_honeycomb_user_guide.adoc b/release-notes/src/main/asciidoc/user_guide/bgp_in_honeycomb_user_guide.adoc new file mode 100644 index 000000000..71285db7f --- /dev/null +++ b/release-notes/src/main/asciidoc/user_guide/bgp_in_honeycomb_user_guide.adoc @@ -0,0 +1,833 @@ += Overview + +link:release_notes.html[< Home] + +Honeycomb uses link:https://wiki.opendaylight.org/view/BGP_LS_PCEP:BGP_Use_Cases[Opendaylight's BGP] +as a part of default distribution. + +Following guide is based on ODL's link:http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#overview[BGP User Guide]. + +== Basic configuration + +BGP HC modules are disabled by default. To enable it, edit + + modules/io-fd-honeycomb_minimal-distribution_1-17-07-module-config + +in distribution dir (/opt/honeycomb in case honeycomb was installed from package): + +[source] +---- +[...] +io.fd.honeycomb.infra.bgp.BgpModule +io.fd.honeycomb.infra.bgp.BgpReadersModule +io.fd.honeycomb.infra.bgp.BgpWritersModule +---- + +=== BGP server configuration + +Use config/bgp.json to configure BGP server: + +[source,json] +---- +{ + "bgp-binding-address": "127.0.0.1", + "bgp-port": 1790, + "bgp-as-number": 65000, + "bgp-receive-multiple-paths": "true", + "bgp-send-max-paths": 0, + "bgp-network-instance-name": "global-bgp", + "bgp-protocol-instance-name": "hc-bgp-instance", + "bgp-netty-threads": 2 +} +---- + +NOTE: bgp-binding-address is also used as identifier of BGP speaker. + +=== Running BGP + +After enabling BGP modules and configuring BGP server, +link:user_running_honeycomb.html#_starting_honeycomb_agent[start honeycomb]. + +BGP server configuration can be verified using RESTCONF/NETCONF. We + + curl -u admin:admin http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance + +[source,json] +---- +{ + "rib": [ + { + "id": "hc-bgp-instance", + "loc-rib": { + "tables": [ + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": {}, + "attributes": { + "uptodate": true + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family", + "bgp-labeled-unicast:labeled-unicast-routes": {}, + "attributes": { + "uptodate": true + } + } + ] + } + } + ] +} +---- + +== BGP peer configuration + +Here is a sample basic neighbor configuration: + +*URL:* http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/hc-bgp-instance/bgp/bgp-openconfig-extensions:neighbors/neighbor/127.0.0.2 + +*Method:* PUT + +*Request body:* + +[source,json] +---- +{ + "neighbor": { + "neighbor-address": "127.0.0.2", + "config": { + "peer-type": "INTERNAL" + }, + "timers": { + "config": { + "connect-retry": 10, + "hold-time": 90 + } + }, + "transport": { + "config": { + "remote-port": 17900, + "passive-mode": false + } + }, + "afi-safis": { + "afi-safi": [ + { + "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST", + "receive": true, + "send-max": 0 + } + ] + } +} +} +---- + +We can use link:http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#bgp-test-tool[BGP's testtool] +to simulate remote BGP peer: + + java -jar ./target/bgp-testtool-0.6.3-Boron-SR3-executable.jar -ra 127.0.0.1:1790 -la 127.0.0.2:17900 -pr 2 -ll DEBUG --active true -as 65000 -mp true + +After connection is established, testtol will display following message in the log: + + [...] + 12:13:52.744 [epollEventLoopGroup-5-1] DEBUG o.o.p.b.r.i.p.BGPProtocolSessionPromise - Promise BGPProtocolSessionPromise@750e2b97(incomplete) completed + 12:13:52.745 [epollEventLoopGroup-5-1] INFO o.o.p.b.r.i.AbstractBGPSessionNegotiator - BGP Session with peer [id: 0xcab58201, L:/127.0.0.2:17900 - R:127.0.0.1/127.0.0.1:1790] established successfully. + 12:14:22.716 [epollEventLoopGroup-5-1] DEBUG o.o.p.b.r.i.BGPSessionImpl - Message was received: Keepalive [augmentation=[]] + 12:14:22.746 [epollEventLoopGroup-5-1] DEBUG o.o.p.b.r.i.BGPMessageToByteEncoder - Message sent to output: Keepalive [augmentation=[]] + + +Once the remote peer is connected and it advertised routes to local BGP system, routes are stored in peer’s RIBs. +The RIBs can be checked via REST: + +*URL:*: http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/peer/bgp:%2F%2F127.0.0.2 + +*Method:* GET + +*Response Body:* + +[source,json] +---- +{ + "peer": [ + { + "peer-id": "bgp://127.0.0.2", + "supported-tables": [ + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "send-receive": "both" + }, + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family" + } + ], + "effective-rib-in": { + "tables": [ + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family", + "bgp-linkstate:linkstate-routes": {}, + "attributes": { + "uptodate": true + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": { + "ipv4-route": [ + { + "path-id": 5, + "prefix": "1.1.1.1/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + }, + { + "path-id": 5, + "prefix": "1.1.1.2/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + } + ] + }, + "attributes": { + "uptodate": true + } + } + ] + }, + "adj-rib-out": { + "tables": [ + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family", + "bgp-linkstate:linkstate-routes": {}, + "attributes": { + "uptodate": false + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": {}, + "attributes": { + "uptodate": false + } + } + ] + }, + "peer-role": "ibgp", + "adj-rib-in": { + "tables": [ + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family", + "bgp-linkstate:linkstate-routes": {}, + "attributes": { + "uptodate": true + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": { + "ipv4-route": [ + { + "path-id": 5, + "prefix": "1.1.1.1/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + }, + { + "path-id": 5, + "prefix": "1.1.1.2/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + } + ] + }, + "attributes": { + "uptodate": true + } + } + ] + } + } + ] +} +---- + +== RIB programming + +The OpenDaylight BGP implementation also supports routes injection via Application Peer. +Such peer has its own programmable RIB, which can be modified by user. +This concept allows user to originate new routes and advertise them to all connected peers. + +Following configuration sample show a way to configure the Application Peer: + +*URL:* http://localhost:8183/restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/hc-bgp-instance/bgp/bgp-openconfig-extensions:neighbors/neighbor/10.25.1.9 + +*Method:* PUT + +*Request body:* + +[source,json] +---- +{ + "neighbor": { + "neighbor-address": "10.25.1.9", + "config": { + "peer-group": "application-peers" + }, + "afi-safis": { + "afi-safi": [ + { + "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST", + "receive": true, + "send-max": 0 + }, + { + "afi-safi-name": "openconfig-bgp-types:IPV4-LABELLED-UNICAST", + "receive": true, + "send-max": 0 + } + ] + } + } +} +---- + +The Application Peer presence can be verified via REST: + +*URL:* http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/peer/bgp:%2F%2F10.25.1.9 + +*Method:* GET + +*Response body:* + +[source,json] +---- +{ + "peer": [ + { + "peer-id": "bgp://10.25.1.9", + "effective-rib-in": { + "tables": [ + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": {}, + "attributes": { + "uptodate": false + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family", + "bgp-labeled-unicast:labeled-unicast-routes": {}, + "attributes": { + "uptodate": false + } + } + ] + }, + "peer-role": "internal", + "adj-rib-in": { + "tables": [ + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": {}, + "attributes": { + "uptodate": false + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family", + "bgp-labeled-unicast:labeled-unicast-routes": {}, + "attributes": { + "uptodate": false + } + } + ] + } + } + ] +} +---- + +=== Programmable RIB + +Next example shows how to inject a route into the programmable RIB. + +*URL:* http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route/10.0.0.11%2F32/0 + +*Method:* PUT + +*Request body:* + +[source,xml] +---- +<ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"> + <path-id>0</path-id> + <prefix>10.0.0.11/32</prefix> + <attributes> + <as-path></as-path> + <origin> + <value>igp</value> + </origin> + <local-pref> + <pref>100</pref> + </local-pref> + <ipv4-next-hop> + <global>10.11.1.1</global> + </ipv4-next-hop> + </attributes> +</ipv4-route> +---- + +Once the remote peer is connected (we used testtool to simulate it) +and it advertised routes to local BGP system, routes are stored in peer’s RIBs. The RIBs can be checked via REST: + + +*URL:* http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/peer/bgp:%2F%2F127.0.0.2 + +*Method:* GET + +*Response body:* + +[source,json] +---- +{ + "peer": [ + { + "peer-id": "bgp://127.0.0.2", + "supported-tables": [ + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "send-receive": "both" + }, + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family" + } + ], + "effective-rib-in": { + "tables": [ + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family", + "bgp-linkstate:linkstate-routes": {}, + "attributes": { + "uptodate": true + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": { + "ipv4-route": [ + { + "path-id": 5, + "prefix": "1.1.1.1/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + }, + { + "path-id": 5, + "prefix": "1.1.1.2/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + } + ] + }, + "attributes": { + "uptodate": true + } + } + ] + }, + "adj-rib-out": { + "tables": [ + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family", + "bgp-linkstate:linkstate-routes": {}, + "attributes": { + "uptodate": false + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": { + "ipv4-route": [ + { + "path-id": 1, + "prefix": "10.0.0.11/32", + "attributes": { + "as-path": {}, + "origin": { + "value": "igp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "10.11.1.1" + } + } + } + ] + }, + "attributes": { + "uptodate": false + } + } + ] + }, + "peer-role": "ibgp", + "adj-rib-in": { + "tables": [ + { + "afi": "bgp-linkstate:linkstate-address-family", + "safi": "bgp-linkstate:linkstate-subsequent-address-family", + "bgp-linkstate:linkstate-routes": {}, + "attributes": { + "uptodate": true + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": { + "ipv4-route": [ + { + "path-id": 5, + "prefix": "1.1.1.1/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + }, + { + "path-id": 5, + "prefix": "1.1.1.2/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + } + ] + }, + "attributes": { + "uptodate": true + } + } + ] + } + } + ] +} +---- + +Also the same route should appeared in Loc-RIB now: + +*URL:* http://localhost:8183/restconf/operational/bgp-rib:bgp-rib/rib/hc-bgp-instance/loc-rib + +*Method:* GET + +*Response body:* + +[source,json] +---- +{ + "loc-rib": { + "tables": [ + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-types:unicast-subsequent-address-family", + "bgp-inet:ipv4-routes": { + "ipv4-route": [ + { + "path-id": 1, + "prefix": "10.0.0.11/32", + "attributes": { + "as-path": {}, + "origin": { + "value": "igp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "10.11.1.1" + } + } + }, + { + "path-id": 1, + "prefix": "1.1.1.1/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + }, + { + "path-id": 1, + "prefix": "1.1.1.2/31", + "attributes": { + "as-path": {}, + "origin": { + "value": "egp" + }, + "local-pref": { + "pref": 100 + }, + "ipv4-next-hop": { + "global": "127.1.1.1" + }, + "multi-exit-disc": { + "med": 0 + } + } + } + ] + } + }, + { + "afi": "bgp-types:ipv4-address-family", + "safi": "bgp-labeled-unicast:labeled-unicast-subsequent-address-family", + "bgp-labeled-unicast:labeled-unicast-routes": {} + } + ] + } +} +---- + + +== Integration with VPP + +Honeycomb BGP implementation emits notifications on loc-rib modifications. +Hc2vpp provides BgpInetModule module which translates +link:http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#ip-unicast-api[IPv4/IPv6 unicast] +routes from loc-rib into VPP FIB. + +The BgpInetModule is disabled by default. To enable it, edit + + modules/io-fd-hc2vpp-integration_vpp-integration-distribution_1-17-07-module-config + +in distribution dir (/opt/honeycomb in case honeycomb was installed from package), then restart honeycomb. + +Let's add route using Application Peer: + +*URL:* http://localhost:8183/restconf/config/bgp-rib:application-rib/10.25.1.9/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes/ipv4-route/10.0.0.12%2F32/0 + +*Method:* PUT + +*Request body:* + +[source,xml] +---- +<ipv4-route xmlns="urn:opendaylight:params:xml:ns:yang:bgp-inet"> + <path-id>0</path-id> + <prefix>10.0.0.12/32</prefix> + <attributes> + <as-path></as-path> + <origin> + <value>igp</value> + </origin> + <local-pref> + <pref>100</pref> + </local-pref> + <ipv4-next-hop> + <global>10.11.1.1</global> + </ipv4-next-hop> + </attributes> +</ipv4-route> +---- + +Also the same route should appeared in VPP now: + +*URL:* http://localhost:8183/restconf/operational/hc2vpp-ietf-routing:routing-state/routing-instance/vpp-routing-instance/routing-protocols/routing-protocol/learned-protocol-0/static-routes/hc2vpp-ietf-ipv4-unicast-routing:ipv4 + +*Method:* GET + +*Response body:* + +[source,json] +---- +{ + "hc2vpp-ietf-ipv4-unicast-routing:ipv4": { + "route": [ + { + "id": 0, + "vpp-ipv4-route-state": {}, + "next-hop": "0.0.0.0", + "destination-prefix": "0.0.0.0/0" + }, + { + "id": 1, + "vpp-ipv4-route-state": {}, + "next-hop": "0.0.0.0", + "destination-prefix": "0.0.0.0/32" + }, + { + "id": 7, + "vpp-ipv4-route-state": {}, + "next-hop": "10.11.1.1", + "destination-prefix": "10.0.0.12/32" + }, + { + "id": 8, + "vpp-ipv4-route-state": {}, + "next-hop": "0.0.0.0", + "destination-prefix": "10.11.1.1/32" + }, + { + "id": 2, + "vpp-ipv4-route-state": {}, + "next-hop": "0.0.0.0", + "destination-prefix": "224.0.0.0/4" + }, + { + "id": 3, + "vpp-ipv4-route-state": {}, + "next-hop": "0.0.0.0", + "destination-prefix": "240.0.0.0/4" + }, + { + "id": 4, + "vpp-ipv4-route-state": {}, + "next-hop": "0.0.0.0", + "destination-prefix": "255.255.255.255/32" + } + ] + } +} +---- + +NOTE: Honeycomb persists config state between restarts. So you may also see 10.0.0.11 route that was added first. +In order to remove persisted configuration, simply rm -rf /var/lib/honeycomb before starting honeycomb. + +== Postman collection with examples + +All the request examples can be found {project-git-web}/bgp/bgp_postman_collection?h={project-branch}[BGP postman collection].
\ No newline at end of file diff --git a/release-notes/src/main/asciidoc/user_guide/user_guide.adoc b/release-notes/src/main/asciidoc/user_guide/user_guide.adoc index 1c7390a0b..e66e1af77 100644 --- a/release-notes/src/main/asciidoc/user_guide/user_guide.adoc +++ b/release-notes/src/main/asciidoc/user_guide/user_guide.adoc @@ -81,3 +81,5 @@ Honeycomb's configuration files present within its distribution: * VPP classifier plugin ** {project-git-web}/vpp-classifier/vpp_classifier_postman_collection.json?h={project-branch}[VPP classifier postman collection] ** {project-git-web}/vpp-classifier/policer_postman_collection.json?h={project-branch}[Policer postman collection] +* BGP plugin +** {project-git-web}/bgp/bgp_postman_collection?h={project-branch}[BGP postman collection]. diff --git a/release-notes/src/main/asciidoc/user_guide/user_running_honeycomb.adoc b/release-notes/src/main/asciidoc/user_guide/user_running_honeycomb.adoc index a60025c39..aeefbd935 100644 --- a/release-notes/src/main/asciidoc/user_guide/user_running_honeycomb.adoc +++ b/release-notes/src/main/asciidoc/user_guide/user_running_honeycomb.adoc @@ -116,4 +116,8 @@ To use: NOTE: All POSTMAN collections are listed under User Guide. ==== Listening for notifications -Notifications over RESTCONF are not supported due to ODL's RESTCONF limitations.
\ No newline at end of file +Notifications over RESTCONF are not supported due to ODL's RESTCONF limitations. + +=== Using BGP + +* link:bgp_in_honeycomb_user_guide.html[BGP configuration in Honeycomb]
\ No newline at end of file |