コード例 #1
0
 def _create_irt(self, name, prefix_list):
     irt_routes = RouteTableType()
     for prefixv in prefix_list or []:
         route = RouteType(prefix=prefixv)
         irt_routes.add_route(route)
     irt_obj = InterfaceRouteTable(name)
     irt_obj.set_interface_route_table_routes(irt_routes)
     return self._vnc_lib.interface_route_table_create(irt_obj)
コード例 #2
0
    def test_add_delete_static_route(self):

        vn1_name = self.id() + 'vn1'
        vn2_name = self.id() + 'vn2'
        vn1 = self.create_virtual_network(vn1_name, "1.0.0.0/24")
        vn2 = self.create_virtual_network(vn2_name, "2.0.0.0/24")

        rt = RouteTable("rt1")
        self._vnc_lib.route_table_create(rt)
        vn1.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn1)
        comm_attr = CommunityAttributes(community_attribute=['1:1'])
        routes = RouteTableType()
        route = RouteType(prefix="1.1.1.1/0",
                          next_hop="10.10.10.10", next_hop_type="ip-address",
                          community_attributes=comm_attr)
        routes.add_route(route)
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        @retries(5)
        def _match_route_table(vn, prefix, next_hop, communities,
                               should_be_present=True):
            ri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(vn))
            sr_list = ri.get_static_route_entries()
            if sr_list is None:
                if should_be_present:
                    raise Exception("sr is None")
                else:
                    return
            found = False
            for sr in sr_list.get_route() or []:
                if (sr.prefix == prefix and sr.next_hop == next_hop and
                        sr.community == communities):
                    found = True
                    break
            if found != should_be_present:
                raise Exception("route %s %s not found" % (prefix, next_hop))
            return

        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1'])

        route.community_attributes.community_attribute.append('1:2')
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)
        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])

        route = RouteType(prefix="2.2.2.2/0",
                          next_hop="20.20.20.20", next_hop_type="ip-address")
        routes.add_route(route)
        rt.set_routes(routes)

        self._vnc_lib.route_table_update(rt)
        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table(vn1, "2.2.2.2/0", "20.20.20.20", [])

        vn2.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn2)

        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table(vn1, "2.2.2.2/0", "20.20.20.20", [])
        _match_route_table(vn2, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table(vn2, "2.2.2.2/0", "20.20.20.20", [])

        # delete second route and check vn ri sr entries
        routes.delete_route(route)
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        _match_route_table(vn1, "2.2.2.2/0", "20.20.20.20", [], False)
        _match_route_table(vn2, "2.2.2.2/0", "20.20.20.20", [], False)

        @retries(5)
        def _match_route_table_cleanup(vn):
            ri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(vn))
            sr = ri.get_static_route_entries()
            if sr and sr.route:
                raise Exception("sr has route")

        vn2.del_route_table(rt)
        self._vnc_lib.virtual_network_update(vn2)
        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table_cleanup(vn2)

        # delete first route and check vn ri sr entries
        rt.set_routes(None)
        self._vnc_lib.route_table_update(rt)

        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", [], False)

        vn1.del_route_table(rt)
        self._vnc_lib.virtual_network_update(vn1)
        _match_route_table_cleanup(vn1)

        vn1.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn1)

        vn2.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn2)

        routes.set_route([])
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        _match_route_table_cleanup(vn1)
        _match_route_table_cleanup(vn2)

        self._vnc_lib.virtual_network_delete(fq_name=vn1.get_fq_name())
        self._vnc_lib.virtual_network_delete(fq_name=vn2.get_fq_name())
        self._vnc_lib.route_table_delete(fq_name=rt.get_fq_name())
コード例 #3
0
    def test_add_delete_static_route(self):

        vn1_name = self.id() + 'vn1'
        vn2_name = self.id() + 'vn2'
        vn1 = self.create_virtual_network(vn1_name, "1.0.0.0/24")
        vn2 = self.create_virtual_network(vn2_name, "2.0.0.0/24")

        rt = RouteTable("rt1")
        self._vnc_lib.route_table_create(rt)
        vn1.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn1)
        comm_attr = CommunityAttributes(community_attribute=['1:1'])
        routes = RouteTableType()
        route = RouteType(prefix="1.1.1.1/0",
                          next_hop="10.10.10.10",
                          next_hop_type="ip-address",
                          community_attributes=comm_attr)
        routes.add_route(route)
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        @retries(5)
        def _match_route_table(vn,
                               prefix,
                               next_hop,
                               communities,
                               should_be_present=True):
            ri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(vn))
            sr_list = ri.get_static_route_entries()
            if sr_list is None:
                if should_be_present:
                    raise Exception("sr is None")
                else:
                    return
            found = False
            for sr in sr_list.get_route() or []:
                if (sr.prefix == prefix and sr.next_hop == next_hop
                        and sr.community == communities):
                    found = True
                    break
            if found != should_be_present:
                raise Exception("route %s %s not found" % (prefix, next_hop))
            return

        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1'])

        route.community_attributes.community_attribute.append('1:2')
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)
        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])

        route = RouteType(prefix="2.2.2.2/0",
                          next_hop="20.20.20.20",
                          next_hop_type="ip-address")
        routes.add_route(route)
        rt.set_routes(routes)

        self._vnc_lib.route_table_update(rt)
        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table(vn1, "2.2.2.2/0", "20.20.20.20", [])

        vn2.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn2)

        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table(vn1, "2.2.2.2/0", "20.20.20.20", [])
        _match_route_table(vn2, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table(vn2, "2.2.2.2/0", "20.20.20.20", [])

        # delete second route and check vn ri sr entries
        routes.delete_route(route)
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        _match_route_table(vn1, "2.2.2.2/0", "20.20.20.20", [], False)
        _match_route_table(vn2, "2.2.2.2/0", "20.20.20.20", [], False)

        @retries(5)
        def _match_route_table_cleanup(vn):
            ri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(vn))
            sr = ri.get_static_route_entries()
            if sr and sr.route:
                raise Exception("sr has route")

        vn2.del_route_table(rt)
        self._vnc_lib.virtual_network_update(vn2)
        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", ['1:1', '1:2'])
        _match_route_table_cleanup(vn2)

        # delete first route and check vn ri sr entries
        rt.set_routes(None)
        self._vnc_lib.route_table_update(rt)

        _match_route_table(vn1, "1.1.1.1/0", "10.10.10.10", [], False)

        vn1.del_route_table(rt)
        self._vnc_lib.virtual_network_update(vn1)
        _match_route_table_cleanup(vn1)

        vn1.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn1)

        vn2.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn2)

        routes.set_route([])
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        _match_route_table_cleanup(vn1)
        _match_route_table_cleanup(vn2)

        self._vnc_lib.virtual_network_delete(fq_name=vn1.get_fq_name())
        self._vnc_lib.virtual_network_delete(fq_name=vn2.get_fq_name())
        self._vnc_lib.route_table_delete(fq_name=rt.get_fq_name())
コード例 #4
0
    def test_add_delete_route(self):
        lvn_name = self.id() + 'lvn'
        rvn_name = self.id() + 'rvn'
        lvn = self.create_virtual_network(lvn_name, "10.0.0.0/24")
        rvn = self.create_virtual_network(rvn_name, "20.0.0.0/24")

        service_name = self.id() + 's1'
        np = self.create_network_policy(lvn,
                                        rvn, [service_name],
                                        service_mode="in-network-nat")

        vn_name = self.id() + 'vn100'
        vn = self.create_virtual_network(vn_name, "1.0.0.0/24")
        rtgt_list = RouteTargetList(route_target=['target:1:1'])
        vn.set_route_target_list(rtgt_list)
        exp_rtgt_list = RouteTargetList(route_target=['target:2:1'])
        vn.set_export_route_target_list(exp_rtgt_list)
        imp_rtgt_list = RouteTargetList(route_target=['target:3:1'])
        vn.set_import_route_target_list(imp_rtgt_list)
        self._vnc_lib.virtual_network_update(vn)
        rt = RouteTable("rt1")
        self._vnc_lib.route_table_create(rt)
        vn.add_route_table(rt)
        self._vnc_lib.virtual_network_update(vn)
        routes = RouteTableType()
        route = RouteType(prefix="0.0.0.0/0",
                          next_hop="default-domain:default-project:" +
                          service_name)
        routes.add_route(route)
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        @retries(5)
        def _match_route_table(rtgt_list):
            lri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(lvn))
            sr = lri.get_static_route_entries()
            if sr is None:
                raise Exception("sr is None")
            route = sr.route[0]
            self.assertEqual(route.prefix, "0.0.0.0/0")
            self.assertEqual(route.next_hop, "10.0.0.252")
            for rtgt in rtgt_list:
                self.assertIn(rtgt, route.route_target)
            ri100 = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(vn))
            rt100 = set(ref['to'][0] for ref in ri100.get_route_target_refs())
            lrt = set(ref['to'][0]
                      for ref in lri.get_route_target_refs() or [])
            if rt100 & lrt:
                return (rt100 & lrt)
            raise Exception("rt100 route-target ref not found")

        rt100 = _match_route_table(rtgt_list.get_route_target() +
                                   imp_rtgt_list.get_route_target())

        rtgt_list.add_route_target('target:1:2')
        vn.set_route_target_list(rtgt_list)
        exp_rtgt_list.add_route_target('target:2:2')
        vn.set_export_route_target_list(exp_rtgt_list)
        imp_rtgt_list.add_route_target('target:3:2')
        vn.set_import_route_target_list(imp_rtgt_list)
        self._vnc_lib.virtual_network_update(vn)
        _match_route_table(rtgt_list.get_route_target())

        rtgt_list.delete_route_target('target:1:1')
        vn.set_route_target_list(rtgt_list)
        exp_rtgt_list.delete_route_target('target:2:1')
        vn.set_export_route_target_list(exp_rtgt_list)
        imp_rtgt_list.delete_route_target('target:3:1')
        vn.set_import_route_target_list(imp_rtgt_list)
        self._vnc_lib.virtual_network_update(vn)
        _match_route_table(rtgt_list.get_route_target())

        routes.set_route([])
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)

        @retries(5)
        def _match_route_table_cleanup(rt100):
            lri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(lvn))
            sr = lri.get_static_route_entries()
            if sr and sr.route:
                raise Exception("sr has route")
            ri = self._vnc_lib.routing_instance_read(
                fq_name=self.get_ri_name(lvn))
            rt_refs = ri.get_route_target_refs()
            rt_set = set(ref['to'][0]
                         for ref in ri.get_route_target_refs() or [])
            if rt100 & rt_set:
                raise Exception("route-target ref still found: %s" %
                                (rt100 & rt_set))

        _match_route_table_cleanup(rt100)

        # add the route again, then delete the network without deleting the
        # link to route table
        route = RouteType(prefix="0.0.0.0/0",
                          next_hop="default-domain:default-project:" +
                          service_name)
        routes.add_route(route)
        rt.set_routes(routes)
        self._vnc_lib.route_table_update(rt)
        _match_route_table(rtgt_list.get_route_target())
        self._vnc_lib.virtual_network_delete(fq_name=vn.get_fq_name())
        _match_route_table_cleanup(rt100)

        self._vnc_lib.route_table_delete(fq_name=rt.get_fq_name())
        self.delete_network_policy(np, auto_policy=True)
        gevent.sleep(1)
        self._vnc_lib.virtual_network_delete(fq_name=lvn.get_fq_name())
        self._vnc_lib.virtual_network_delete(fq_name=rvn.get_fq_name())
        # check if vn is deleted
        self.check_vn_is_deleted(uuid=lvn.uuid)
        self.check_vn_is_deleted(uuid=rvn.uuid)
        self.check_vn_is_deleted(uuid=vn.uuid)
        self.check_ri_is_deleted(fq_name=lvn.fq_name + [lvn.name])
        self.check_ri_is_deleted(fq_name=rvn.fq_name + [rvn.name])
        self.check_ri_is_deleted(fq_name=vn.fq_name + [vn.name])