1 # Copyright (c) 2017 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 """This module implements keywords to manipulate routing tables using
15 Honeycomb REST API."""
17 from robot.api import logger
19 from resources.libraries.python.HTTPRequest import HTTPCodes
20 from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError
21 from resources.libraries.python.honeycomb.HoneycombUtil \
22 import HoneycombUtil as HcUtil
23 from resources.libraries.python.honeycomb.HoneycombUtil \
24 import DataRepresentation
25 from resources.libraries.python.VatExecutor import VatTerminal
28 class RoutingKeywords(object):
29 """Implementation of keywords which make it possible to:
30 - add/remove routing tables,
31 - add/remove routing table entries
32 - get operational data about routing tables,
39 def _set_routing_table_properties(node, path, data=None):
40 """Set routing table properties and check the return code.
42 :param node: Honeycomb node.
43 :param path: Path which is added to the base path to identify the data.
44 :param data: The new data to be set. If None, the item will be removed.
48 :return: Content of response.
50 :raises HoneycombError: If the status code in response is not
55 status_code, resp = HcUtil.\
56 put_honeycomb_data(node, "config_routing_table", data, path,
57 data_representation=DataRepresentation.JSON)
59 status_code, resp = HcUtil.\
60 delete_honeycomb_data(node, "config_routing_table", path)
62 if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
63 if data is None and '"error-tag":"data-missing"' in resp:
64 logger.debug("data does not exist in path.")
67 "The configuration of routing table was not successful. "
68 "Status code: {0}.".format(status_code))
72 def configure_routing_table(node, name, ip_version, data, vrf=1,
74 """Configure a routing table according to the data provided.
76 :param node: Honeycomb node.
77 :param name: Name for the table.
78 :param ip_version: IP protocol version, ipv4 or ipv6.
79 :param data: Route configuration that should be set.
80 :param vrf: vrf-id to attach configuration to.
81 :param special: Must be True if the configuration is a special route.
88 :returns: Content of response.
92 ip_version = "hc2vpp-ietf-{0}-unicast-routing:{0}".format(
94 protocol = "vpp-routing-ra:vpp-protocol-attributes"
96 ip_version = ip_version
97 protocol = "vpp-protocol-attributes"
100 "routing-protocol": [
103 "description": "hc2vpp-csit test route",
118 path = "/routing-protocol/{0}".format(name)
119 return RoutingKeywords._set_routing_table_properties(
120 node, path, full_data)
123 def delete_routing_table(node, name):
124 """Delete the specified routing table from configuration data.
126 :param node: Honeycomb node.
127 :param name: Name of the table.
130 :returns: Content of response.
134 path = "/routing-protocol/{0}".format(name)
135 return RoutingKeywords._set_routing_table_properties(node, path)
138 def get_routing_table_oper(node, name, ip_version):
139 """Retrieve operational data about the specified routing table.
141 :param node: Honeycomb node.
142 :param name: Name of the routing table.
143 :param ip_version: IP protocol version, ipv4 or ipv6.
146 :type ip_version: str
147 :returns: Routing table operational data.
149 :raises HoneycombError: If the operation fails.
152 path = "/routing-protocol/{0}".format(name)
153 status_code, resp = HcUtil.\
154 get_honeycomb_data(node, "oper_routing_table", path)
156 if status_code != HTTPCodes.OK:
157 raise HoneycombError(
158 "Not possible to get operational information about the "
159 "classify tables. Status code: {0}.".format(status_code))
161 data = RoutingKeywords.clean_routing_oper_data(
162 resp['routing-protocol'][0]['static-routes']
163 ['hc2vpp-ietf-{0}-unicast-routing:{0}'.format(ip_version)]['route'])
168 def clean_routing_oper_data(data):
169 """Prepare received routing operational data to be verified against
172 :param data: Routing operational data.
174 :returns: Routing operational data without entry ID numbers.
179 # ID values are auto-incremented based on existing routes in VPP
181 if "next-hop-list" in item.keys():
182 for item2 in item["next-hop-list"]["next-hop"]:
183 item2.pop("id", None)
185 if "next-hop-list" in item.keys():
186 # List items come in random order
187 item["next-hop-list"]["next-hop"].sort()
192 def log_routing_configuration(node):
193 """Retrieve route configuration using VAT and print the response
196 :param node: VPP node.
200 with VatTerminal(node) as vat:
201 vat.vat_terminal_exec_cmd("ip_fib_dump")