PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/qa/tests/nlri_tests.py

https://gitlab.com/rendoaw/exabgp
Python | 377 lines | 358 code | 11 blank | 8 comment | 0 complexity | f54ed1ce1e76b10f384848ff5811c811 MD5 | raw file
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. open.py
  5. Created by Thomas Morin, Orange on 2015-07-10.
  6. Copyright (c) 2009-2015 Orange. All rights reserved.
  7. """
  8. import unittest
  9. from exabgp.reactor.protocol import AFI, SAFI
  10. from exabgp.bgp.message.update import Attributes
  11. from exabgp.bgp.message.update.attribute.localpref import LocalPreference
  12. from exabgp.bgp.message.update.attribute.community.extended.communities \
  13. import ExtendedCommunities
  14. from exabgp.bgp.message.update.attribute.community.extended \
  15. import RouteTargetASN2Number as RouteTarget
  16. from exabgp.bgp.message.update.attribute.community.extended.encapsulation \
  17. import Encapsulation
  18. from exabgp.bgp.message.update.nlri.ipvpn import IPVPN
  19. from exabgp.bgp.message.update.nlri.rtc import RTC
  20. from exabgp.bgp.message.update.nlri.evpn.mac import MAC as EVPNMAC
  21. from exabgp.bgp.message.update.nlri.evpn.multicast import Multicast as EVPNMulticast
  22. from exabgp.bgp.message.update.nlri.evpn.prefix import Prefix as EVPNPrefix
  23. from exabgp.bgp.message.update.nlri.evpn.nlri import EVPN
  24. from exabgp.bgp.message.update.nlri.qualifier.rd import RouteDistinguisher
  25. from exabgp.bgp.message.update.nlri.qualifier.labels import Labels
  26. from exabgp.bgp.message.update.nlri.qualifier.esi import ESI
  27. from exabgp.bgp.message.update.nlri.qualifier.etag import EthernetTag
  28. from exabgp.bgp.message.update.nlri.qualifier.mac import MAC
  29. from exabgp.protocol.ip import IP
  30. from exabgp.bgp.message import OUT
  31. from exabgp.configuration.setup import environment
  32. environment.setup('')
  33. class TestNLRIs(unittest.TestCase):
  34. # Tests on IPVPN NLRIs
  35. def test200_IPVPNCreatePackUnpack(self):
  36. '''Test pack/unpack for IPVPN routes'''
  37. nlri = IPVPN.new(AFI(AFI.ipv4), SAFI(SAFI.mpls_vpn),
  38. IP.pton("1.2.3.0"), 24,
  39. Labels([42], True),
  40. RouteDistinguisher.fromElements("42.42.42.42", 5))
  41. packed = nlri.pack()
  42. unpacked,leftover = IPVPN.unpack_nlri(AFI(AFI.ipv4), SAFI(SAFI.mpls_vpn),
  43. packed, OUT.UNSET, None)
  44. self.assertEqual(0, len(leftover))
  45. # TODO: compare packed with a reference encoding verified
  46. # as conformant with RFC4364
  47. self.assertTrue(isinstance(unpacked, IPVPN))
  48. self.assertEqual("1.2.3.0/24", unpacked.cidr.prefix())
  49. self.assertEqual(1, len(unpacked.labels.labels))
  50. self.assertEqual(42, unpacked.labels.labels[0])
  51. self.assertEqual("42.42.42.42:5", unpacked.rd._str())
  52. # Tests on EVPN NLRIs
  53. def test99_EVPNMACCreatePackUnpack(self):
  54. '''Test pack/unpack for E-VPN MAC routes'''
  55. nlri = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  56. ESI(),
  57. EthernetTag(111),
  58. MAC("01:02:03:04:05:06"), 6*8,
  59. Labels([42], True),
  60. IP.create("1.1.1.1"))
  61. packed = nlri.pack()
  62. unpacked,leftover = EVPN.unpack_nlri(AFI(AFI.l2vpn), SAFI(SAFI.evpn),
  63. packed, OUT.UNSET, None)
  64. self.assertEqual(0, len(leftover))
  65. # TODO: compare packed with a reference encoding verified
  66. # as conformant with RFC7432
  67. self.assertTrue(isinstance(unpacked, EVPNMAC))
  68. self.assertEqual("42.42.42.42:5", unpacked.rd._str())
  69. self.assertEqual(ESI.DEFAULT, unpacked.esi.esi)
  70. self.assertEqual(EthernetTag(111), unpacked.etag)
  71. self.assertEqual(MAC("01:02:03:04:05:06"), unpacked.mac)
  72. self.assertEqual(IP.create("1.1.1.1"), unpacked.ip)
  73. self.assertEqual(1, len(unpacked.label.labels))
  74. self.assertEqual(42, unpacked.label.labels[0])
  75. def test99_EVPNMulticastCreatePackUnpack(self):
  76. '''Test pack/unpack for E-VPN Multicast routes'''
  77. nlri = EVPNMulticast(RouteDistinguisher.fromElements("42.42.42.42", 5),
  78. EthernetTag(111),
  79. IP.create("1.1.1.1"))
  80. packed = nlri.pack()
  81. unpacked,leftover = EVPN.unpack_nlri(AFI(AFI.l2vpn), SAFI(SAFI.evpn),
  82. packed, OUT.UNSET, None)
  83. self.assertEqual(0, len(leftover))
  84. # TODO: compare packed with a reference encoding verified
  85. # as conformant with RFC7432
  86. self.assertTrue(isinstance(unpacked, EVPNMulticast))
  87. self.assertEqual("42.42.42.42:5", unpacked.rd._str())
  88. self.assertEqual(EthernetTag(111), unpacked.etag)
  89. self.assertEqual(IP.create("1.1.1.1"), unpacked.ip)
  90. def test99_EVPNPrefixCreatePackUnpack(self):
  91. '''Test pack/unpack for E-VPN Prefix routes'''
  92. nlri = EVPNPrefix(RouteDistinguisher.fromElements("42.42.42.42", 5),
  93. ESI(),
  94. EthernetTag(111),
  95. Labels([42], True),
  96. IP.create("1.1.1.0"),24,
  97. IP.create("2.2.2.2"),
  98. )
  99. packed = nlri.pack()
  100. unpacked,leftover = EVPN.unpack_nlri(AFI(AFI.l2vpn), SAFI(SAFI.evpn),
  101. packed, OUT.UNSET, None)
  102. self.assertEqual(0, len(leftover))
  103. # TODO: compare packed with a reference encoding verified
  104. # as conformant with RFC7432
  105. self.assertTrue(isinstance(unpacked, EVPNPrefix))
  106. self.assertEqual("42.42.42.42:5", unpacked.rd._str())
  107. self.assertEqual(ESI.DEFAULT, unpacked.esi.esi)
  108. self.assertEqual(EthernetTag(111), unpacked.etag)
  109. self.assertEqual(IP.create("1.1.1.0"), unpacked.ip)
  110. self.assertEqual(24, unpacked.iplen)
  111. self.assertEqual(IP.create("2.2.2.2"), unpacked.gwip)
  112. self.assertEqual(1, len(unpacked.label.labels))
  113. self.assertEqual(42, unpacked.label.labels[0])
  114. def test100_EVPNMACHashEqual(self):
  115. '''
  116. Two indistinct EVPN NLRI should
  117. hash to the same value, and be equal
  118. '''
  119. nlri1 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  120. ESI(),
  121. EthernetTag(111),
  122. MAC("01:02:03:04:05:06"), 6*8,
  123. Labels([42], True),
  124. IP.create("1.1.1.1"))
  125. nlri2 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  126. ESI(),
  127. EthernetTag(111),
  128. MAC("01:02:03:04:05:06"), 6*8,
  129. Labels([42], True),
  130. IP.create("1.1.1.1"))
  131. self.assertEqual(hash(nlri1), hash(nlri2))
  132. self.assertEqual(nlri1, nlri2)
  133. def test101_EVPNHashEqual_somefieldsvary(self):
  134. '''
  135. Two EVPN MAC NLRIs differing by their ESI or label or RD,
  136. or nexthop, but otherwise identical should hash to the same value,
  137. and be equal
  138. '''
  139. nlri0 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  140. ESI(),
  141. EthernetTag(111),
  142. MAC("01:02:03:04:05:06"), 6*8,
  143. Labels([42], True),
  144. IP.create("1.1.1.1"))
  145. # Esi
  146. nlri1 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  147. ESI(['1' for _ in range(0,10)]),
  148. EthernetTag(111),
  149. MAC("01:02:03:04:05:06"), 6*8,
  150. Labels([42], True),
  151. IP.create("1.1.1.1"))
  152. # label
  153. nlri2 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  154. ESI(),
  155. EthernetTag(111),
  156. MAC("01:02:03:04:05:06"), 6*8,
  157. Labels([4444], True),
  158. IP.create("1.1.1.1"))
  159. # IP: different IPs, but same MACs: different route
  160. nlri3 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  161. ESI(),
  162. EthernetTag(111),
  163. MAC("01:02:03:04:05:06"), 6*8,
  164. Labels([42], True),
  165. IP.create("2.2.2.2"))
  166. # with a next hop...
  167. nlri4 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  168. ESI(),
  169. EthernetTag(111),
  170. MAC("01:02:03:04:05:06"), 6*8,
  171. Labels([42], True),
  172. IP.create("1.1.1.1"),
  173. IP.pton("10.10.10.10"))
  174. nlri5 = EVPNMAC(RouteDistinguisher.fromElements("42.42.42.42", 5),
  175. ESI(),
  176. EthernetTag(111),
  177. MAC("01:02:03:04:05:06"), 6*8,
  178. Labels([42], True),
  179. IP.create("1.1.1.1"),
  180. IP.pton("11.11.11.11"))
  181. self.assertEqual(hash(nlri0), hash(nlri1))
  182. self.assertEqual(hash(nlri0), hash(nlri2))
  183. self.assertEqual(hash(nlri0), hash(nlri4))
  184. self.assertEqual(nlri0, nlri1)
  185. self.assertEqual(nlri0, nlri2)
  186. self.assertEqual(nlri0, nlri4)
  187. self.assertEqual(nlri1, nlri2)
  188. self.assertEqual(nlri1, nlri4)
  189. self.assertEqual(nlri2, nlri4)
  190. self.assertEqual(nlri4, nlri5)
  191. self.assertNotEqual(hash(nlri0), hash(nlri3))
  192. self.assertNotEqual(nlri0, nlri3)
  193. self.assertNotEqual(nlri1, nlri3)
  194. self.assertNotEqual(nlri2, nlri3)
  195. self.assertNotEqual(nlri3, nlri4)
  196. # tests on RTC NLRI
  197. def test99_RTCCreatePackUnpack(self):
  198. '''Test pack/unpack for RTC routes'''
  199. nlri = RTC.new(AFI(AFI.ipv4), SAFI(SAFI.rtc),
  200. 64512,
  201. RouteTarget(64577,123))
  202. packed = nlri.pack()
  203. unpacked,leftover = RTC.unpack_nlri(AFI(AFI.ipv4), SAFI(SAFI.mpls_vpn),
  204. packed, OUT.UNSET, None)
  205. self.assertEqual(0, len(leftover))
  206. # TODO: compare packed with a reference encoding verified
  207. # as conformant with RFC4684
  208. self.assertTrue(isinstance(unpacked, RTC))
  209. self.assertEqual(64512, unpacked.origin)
  210. self.assertTrue(isinstance(unpacked.rt, RouteTarget))
  211. self.assertEqual(64577, unpacked.rt.asn)
  212. self.assertEqual(123, unpacked.rt.number)
  213. def test98_RTCWildcardPackUnpack(self):
  214. '''Test pack/unpack for RTC routes'''
  215. nlri = RTC.new(AFI(AFI.ipv4), SAFI(SAFI.rtc),
  216. 0, None)
  217. packed = nlri.pack()
  218. unpacked,leftover = RTC.unpack_nlri(AFI(AFI.ipv4), SAFI(SAFI.mpls_vpn),
  219. packed, OUT.UNSET, None)
  220. self.assertEqual(0, len(leftover))
  221. # TODO: compare packed with a reference encoding verified
  222. # as conformant with RFC4684
  223. self.assertTrue(isinstance(unpacked, RTC))
  224. self.assertEqual(0, unpacked.origin)
  225. self.assertIsNone(unpacked.rt)
  226. # tests on attributes
  227. def test4_DistinctAttributes(self):
  228. atts1 = Attributes()
  229. atts1.add(LocalPreference(10))
  230. atts2 = Attributes()
  231. atts2.add(LocalPreference(20))
  232. self.assertNotEqual(atts1, atts2)
  233. def test5_SameAttributes(self):
  234. atts1 = Attributes()
  235. atts1.add(LocalPreference(10))
  236. atts2 = Attributes()
  237. atts2.add(LocalPreference(10))
  238. self.assertEqual(hash(atts1), hash(atts2))
  239. self.assertEqual(atts1, atts2)
  240. def test6_SameAttributesOrderMultivalued(self):
  241. atts1 = Attributes()
  242. eComs1 = ExtendedCommunities()
  243. eComs1.communities.append(RouteTarget(64512, 1))
  244. eComs1.communities.append(Encapsulation(Encapsulation.Type.VXLAN))
  245. eComs1.communities.append(RouteTarget(64512, 2))
  246. atts1.add(eComs1)
  247. atts2 = Attributes()
  248. eComs2 = ExtendedCommunities()
  249. eComs2.communities.append(RouteTarget(64512, 2))
  250. eComs2.communities.append(RouteTarget(64512, 1))
  251. eComs2.communities.append(Encapsulation(Encapsulation.Type.VXLAN))
  252. atts2.add(eComs2)
  253. self.assertEqual(hash(atts1), hash(atts2))
  254. self.assertEqual(atts1, atts2)
  255. def test10_Ecoms(self):
  256. eComs1 = ExtendedCommunities()
  257. eComs1.communities.append(Encapsulation(Encapsulation.Type.VXLAN))
  258. atts1 = Attributes()
  259. atts1.add(eComs1)
  260. eComs2 = ExtendedCommunities()
  261. eComs2.communities.append(Encapsulation(Encapsulation.Type.VXLAN))
  262. eComs2.communities.append(RouteTarget(64512, 1))
  263. atts2 = Attributes()
  264. atts2.add(eComs2)
  265. self.assertFalse(atts1.sameValuesAs(atts2))
  266. self.assertFalse(atts2.sameValuesAs(atts1))
  267. def test11_RTs(self):
  268. rt1a = RouteTarget(64512, 1)
  269. rt1b = RouteTarget(64512, 1)
  270. rt3 = RouteTarget(64512, 2)
  271. rt4 = RouteTarget(64513, 1)
  272. self.assertEqual(hash(rt1a), hash(rt1b))
  273. self.assertNotEqual(hash(rt1a), hash(rt3))
  274. self.assertNotEqual(hash(rt1a), hash(rt4))
  275. self.assertEqual(rt1a, rt1b)
  276. self.assertNotEqual(rt1a, rt3)
  277. self.assertNotEqual(rt1a, rt4)
  278. self.assertEqual(set([rt1a]), set([rt1b]))
  279. self.assertEqual(1, len(set([rt1a]).intersection(set([rt1b]))))
  280. if __name__ == '__main__':
  281. unittest.main()