Пример #1
0
def test_tagged_endpoint_order_via_tag_names(stc):
    ctor = CScriptableCreator()
    project = CStcSystem.Instance().GetObject('project')
    create_port_with_ipv4_device(ctor, project)
    create_port_with_ipv4_device(ctor, project)

    tags = project.GetObject('Tags')
    tag1 = ctor.Create('Tag', tags)
    tag1.Set('Name', 'Sample')
    tag2 = ctor.Create('Tag', tags)
    tag2.Set('Name', 'Sample2')

    devices = project.GetObjects('EmulatedDevice')
    assert len(devices) == 2

    tag_names = []
    for device, tag in zip(devices, [tag2, tag1]):
        device.AddObject(tag, RelationType('UserTag'))
        tag_names.append(tag.Get("Name"))

    endpoints = tag_utils.get_tagged_endpoints_given_tag_names(tag_names)
    assert len(endpoints) == 2

    for device, endpoint in zip(devices, endpoints):
        ipv4 = device.GetObject('Ipv4If', RelationType('TopLevelIf'))
        assert endpoint.GetObjectHandle() == ipv4.GetObjectHandle()
Пример #2
0
def test_tag_name_wrong_thing(stc):
    ctor = CScriptableCreator()
    project = CStcSystem.Instance().GetObject('project')
    tags = project.GetObject('Tags')
    tag = ctor.Create('Tag', tags)
    tag.Set('Name', 'Sample')
    port = create_port_with_ipv4_device(ctor, project)
    device = project.GetObject('EmulatedDevice')
    assert device
    # Project should never be tagged
    project.AddObject(tag, RelationType('UserTag'))
    got_list = tag_utils.get_tagged_endpoints_given_tag_names([tag.Get("Name")])
    assert len(got_list) == 0
    project.RemoveObject(tag, RelationType('UserTag'))
    # Port neither
    port.AddObject(tag, RelationType('UserTag'))
    got_list = tag_utils.get_tagged_endpoints_given_tag_names([tag.Get("Name")])
    assert len(got_list) == 0
Пример #3
0
def test_tag_name_interface(stc):
    ctor = CScriptableCreator()
    project = CStcSystem.Instance().GetObject('project')
    tags = project.GetObject('Tags')
    tag = ctor.Create('Tag', tags)
    tag.Set('Name', 'Sample')
    create_port_with_ipv4_device(ctor, project)
    device = project.GetObject('EmulatedDevice')
    assert device
    ipv4 = device.GetObject('Ipv4If')
    ipv4.AddObject(tag, RelationType('UserTag'))
    eth = device.GetObject('EthIIIf')
    got_list = tag_utils.get_tagged_endpoints_given_tag_names([tag.Get("Name")])
    assert len(got_list) == 1
    assert got_list[0].GetObjectHandle() == ipv4.GetObjectHandle()
    ipv4.RemoveObject(tag, RelationType('UserTag'))
    eth.AddObject(tag, RelationType('UserTag'))
    got_list = tag_utils.get_tagged_endpoints_given_tag_names([tag.Get("Name")])
    assert len(got_list) == 1
    assert got_list[0].GetObjectHandle() == eth.GetObjectHandle()
Пример #4
0
def test_tag_mcast_group(stc):
    ctor = CScriptableCreator()
    project = CStcSystem.Instance().GetObject('project')
    tags = project.GetObject('Tags')
    tag = ctor.Create('Tag', tags)
    tag.Set('Name', 'Sample')
    v4grp = ctor.Create('Ipv4Group', project)
    assert v4grp
    nb = v4grp.GetObject('Ipv4NetworkBlock')
    assert nb
    v4grp.AddObject(tag, RelationType('UserTag'))
    got_list = tag_utils.get_tagged_endpoints_given_tag_names([tag.Get("Name")])
    assert len(got_list) == 1
    assert got_list[0].GetObjectHandle() == nb.GetObjectHandle()
Пример #5
0
def test_tag_name_route(stc):
    ctor = CScriptableCreator()
    project = CStcSystem.Instance().GetObject('project')
    tags = project.GetObject('Tags')
    tag = ctor.Create('Tag', tags)
    tag.Set('Name', 'Sample')
    create_port_with_ipv4_device(ctor, project)
    device = project.GetObject('EmulatedDevice')
    assert device
    bgp = ctor.Create('BgpRouterConfig', device)
    bgproute = ctor.Create('BgpIpv4RouteConfig', bgp)
    nb = bgproute.GetObject('Ipv4NetworkBlock')
    assert nb
    bgproute.AddObject(tag, RelationType('UserTag'))
    got_list = tag_utils.get_tagged_endpoints_given_tag_names([tag.Get("Name")])
    assert len(got_list) == 1
    assert got_list[0].GetObjectHandle() == nb.GetObjectHandle()
Пример #6
0
def expand_traffic_mix_group(tp_map):
    # tp_map:
    #   { "src_subnets":
    #       [{"traffix_mix": /traffic_mix_hnd/,
    #         "src_tag": /src_tag_hnd/}
    #        {...}, ...]
    #      "dst_tags" = [/dst_tag_hnd/]
    #   }
    plLogger = PLLogger.GetLogger("expand_util")
    hnd_reg = CHandleRegistry.Instance()
    ctor = CScriptableCreator()

    dst_tags = tp_map["dst_tags"]

    dst_count = 0
    dst_ep_list = tag_utils.get_tagged_endpoints_given_tag_names(dst_tags)
    for dst_ep in dst_ep_list:
        plLogger.LogInfo("dst_ep: " + dst_ep.Get("Name"))
    if len(dst_ep_list) > 0:
        dst_count = len(dst_ep_list)
    else:
        raise Exception("no destination device found")

    cur_dst_ep_idx = 0

    for src_subnet in tp_map["src_subnets"]:
        trf_mix_hnd = src_subnet["traffix_mix"]
        trf_mix = hnd_reg.Find(trf_mix_hnd)
        if trf_mix is None:
            plLogger.LogError("TrafficMix with handle " + str(trf_mix_hnd) +
                              " was not found")
        tmi = trf_mix.Get('MixInfo')
        if tmi == '':
            raise Exception("MixInfo is empty")

        # Gather the endpoints
        src_tag = src_subnet["src_tag"]
        src_ep_list = tag_utils.get_tagged_endpoints_given_tag_names([src_tag])
        src_count = len(src_ep_list)
        for src_ep in src_ep_list:
            plLogger.LogInfo("src_ep: " + src_ep.Get("Name"))
        if src_count < 0:
            raise Exception("no source device found")

        # Expand the StmTemplateConfig objects
        template_list = trf_mix.GetObjects('StmTemplateConfig')
        for template in template_list:
            local_dst_ep_idx = cur_dst_ep_idx
            cmd = ctor.CreateCommand("spirent.methodology.ExpandTemplateCommand")
            cmd.SetCollection("StmTemplateConfigList",
                              [template.GetObjectHandle()])
            cmd.Execute()
            cmd.MarkDelete()

            proj_sb = template.GetObject("StreamBlock",
                                         RelationType("GeneratedObject"))
            if proj_sb is None:
                plLogger.LogInfo("Skipping template " + template.Get("Name") +
                                 " as it has no Project-level Streamblock " +
                                 "to expand")
                continue
            # enable preload
            enable_preload(proj_sb)
            # Retrieve all tags for this streamblock
            tag_list = proj_sb.GetObjects('Tag', RelationType('UserTag'))
            plLogger.LogInfo("Expanding proj_sb: " + proj_sb.Get("Name"))
            if proj_sb.Get("TrafficPattern") == "PAIR":
                for ep in src_ep_list:
                    if local_dst_ep_idx < dst_count:
                        proj_sb.AddObject(ep, RelationType("SrcBinding"))
                        proj_sb.AddObject(dst_ep_list[local_dst_ep_idx],
                                          RelationType("DstBinding"))
                        local_dst_ep_idx += 1
                    else:
                        break
            else:
                for ep in src_ep_list:
                    proj_sb.AddObject(ep, RelationType("SrcBinding"))
                for ep in dst_ep_list:
                    proj_sb.AddObject(ep, RelationType("DstBinding"))

            # Call StreamBlockExpandCommand
            exp_cmd = ctor.CreateCommand("StreamBlockExpandCommand")
            exp_cmd.SetCollection("StreamBlockList",
                                  [proj_sb.GetObjectHandle()])
            exp_cmd.Execute()
            exp_cmd.MarkDelete()

            gen_sb_list = exp_cmd.GetCollection("ExpandedStreamBlockList")
            for gen_sb in gen_sb_list:
                sb = hnd_reg.Find(gen_sb)
                if sb is None:
                    plLogger.LogError("Invalid handle " + str(gen_sb))
                    continue
                plLogger.LogInfo("adding gen sb: " + sb.Get("Name"))
                template.AddObject(sb, RelationType("GeneratedObject"))
                # Tag the duplicated port-level streamblock with original's tags
                for tag in tag_list:
                    sb.AddObject(tag, RelationType('UserTag'))
                cur_dst_ep_list = sb.GetObjects('Scriptable',
                                                RelationType('DstBinding'))
                dst_port_map = {}
                # Go through each destination endpoint and find the port
                for dst_ep in cur_dst_ep_list:
                    walk = dst_ep
                    # If we've walked to Project we've run out of parents
                    while not walk.IsTypeOf('Project'):
                        if walk.IsTypeOf('EmulatedDevice'):
                            port = walk.GetObject('Port',
                                                  RelationType('AffiliationPort'))
                            if port.GetObjectHandle() not in dst_port_map:
                                dst_port_map[port.GetObjectHandle()] = port
                            break
                        else:
                            walk = walk.GetParent()
                for port in dst_port_map.itervalues():
                    sb.AddObject(port, RelationType('ExpectedRx'))
        cur_dst_ep_idx += src_count

        # Allocate the Load based on the Weight
        mix_elem = etree.fromstring(tmi)
        load = mix_elem.get("Load")
        load_unit = mix_elem.get("LoadUnit")

        cmd = ctor.CreateCommand("spirent.methodology.traffic.AllocateTrafficMixLoad1Command")
        cmd.Set("Load", load)
        cmd.Set("LoadUnit", load_unit)
        cmd.Set("StmTrafficMix", trf_mix.GetObjectHandle())
        cmd.Execute()
        cmd.MarkDelete()
def run(StmTemplateMix):
    plLogger = PLLogger.GetLogger("methodology")
    hnd_reg = CHandleRegistry.Instance()
    ctor = CScriptableCreator()
    trf_mix = hnd_reg.Find(StmTemplateMix)
    if trf_mix is None:
        plLogger.LogError("TrafficMix with handle " + str(StmTemplateMix) +
                          " was not found")

    tmi = trf_mix.Get('MixInfo')
    if tmi == '':
        plLogger.LogError("MixInfo is empty")
        return False
    root = etree.fromstring(tmi)

    # Expand the StmTemplateConfig objects
    template_list = trf_mix.GetObjects('StmTemplateConfig')
    for template in template_list:
        cmd = ctor.CreateCommand(PKG + ".ExpandTemplateCommand")
        cmd.SetCollection("StmTemplateConfigList",
                          [template.GetObjectHandle()])
        cmd.Execute()
        cmd.MarkDelete()

        # Gather the endpoints
        src_tag_ele_list = root.findall(".//SrcEndpoint")
        plLogger.LogInfo("src_tag_ele_list: " + str(src_tag_ele_list))
        src_tag_list = []
        for src_tag_ele in src_tag_ele_list:
            src_tag_list.append(src_tag_ele.text)
        plLogger.LogInfo("src_tag_list: " + str(src_tag_list))

        dst_tag_ele_list = root.findall(".//DstEndpoint")
        plLogger.LogInfo("dst_tag_ele_list: " + str(dst_tag_ele_list))
        dst_tag_list = []
        for dst_tag_ele in dst_tag_ele_list:
            dst_tag_list.append(dst_tag_ele.text)
        plLogger.LogInfo("dst_tag_list: " + str(dst_tag_list))

        src_count = 0
        src_ep_list = tag_utils.get_tagged_endpoints_given_tag_names(src_tag_list)
        for src_ep in src_ep_list:
            plLogger.LogInfo("src_ep: " + src_ep.Get("Name"))

        if len(src_ep_list) > 0:
            src_count = len(src_ep_list)
        else:
            # Normally this would be had from the src-dst bindings of the
            # TrafficProfile.  However, we don't have those.  Need to
            # figure out what is being associated here.
            pass

        dst_count = 0
        dst_ep_list = tag_utils.get_tagged_endpoints_given_tag_names(dst_tag_list)
        for dst_ep in dst_ep_list:
            plLogger.LogInfo("dst_ep: " + dst_ep.Get("Name"))

        if len(dst_ep_list) > 0:
            dst_count = len(dst_ep_list)
        else:
            # Normally this would be had from the src-dst bindings of the
            # TrafficProfile.  However, we don't hvae those.  Need to
            # figure out what is being associated here.
            pass

        min_count = min(src_count, dst_count)

        # Expand the Project-level StreamBlock
        proj_sb = template.GetObject("StreamBlock",
                                     RelationType("GeneratedObject"))
        if proj_sb is None:
            plLogger.LogInfo("Skipping template " + template.Get("Name") +
                             " as it has no Project-level Streamblock " +
                             "to expand")
            continue
        # Retrieve all tags for this streamblock
        tag_list = proj_sb.GetObjects('Tag', RelationType('UserTag'))
        if len(src_ep_list) > 0 and len(dst_ep_list) > 0:
            plLogger.LogInfo("Expanding proj_sb: " + proj_sb.Get("Name"))

            if proj_sb.Get("TrafficPattern") == "PAIR":
                if src_count == 1:
                    plLogger.LogInfo("Streamblocks are configured between " +
                                     "a source end point and all dest end point." +
                                     " src_list has " + str(src_count) +
                                     " dst_list has " + str(dst_count))
                    for ep in dst_ep_list:
                        proj_sb.AddObject(src_ep_list[0], RelationType("SrcBinding"))
                        proj_sb.AddObject(ep, RelationType("DstBinding"))
                elif dst_count == 1:
                    plLogger.LogInfo("Streamblocks are configured between " +
                                     "all source end point and a dest end point." +
                                     " src_list has " + str(src_count) +
                                     " dst_list has " + str(dst_count))
                    for ep in src_ep_list:
                        proj_sb.AddObject(ep, RelationType("SrcBinding"))
                        proj_sb.AddObject(dst_ep_list[0], RelationType("DstBinding"))
                else:
                    if src_count != dst_count:
                        plLogger.LogInfo("Streamblocks are configured between " +
                                         "endpoint pairs until one side runs " +
                                         "out of endpoints: src_list has " +
                                         str(src_count) + " dst_list has " +
                                         str(dst_count))
                    index = 0
                    for ep in src_ep_list:
                        if index < min_count:
                            proj_sb.AddObject(ep, RelationType("SrcBinding"))
                            index = index + 1
                    index = 0
                    for ep in dst_ep_list:
                        if index < min_count:
                            proj_sb.AddObject(ep, RelationType("DstBinding"))
                            index = index + 1
            else:
                for ep in src_ep_list:
                    proj_sb.AddObject(ep, RelationType("SrcBinding"))
                for ep in dst_ep_list:
                    proj_sb.AddObject(ep, RelationType("DstBinding"))
        else:
            plLogger.LogError("No Src or Dst bindings...fix this to use TLI")

        # Call StreamBlockExpandCommand
        exp_cmd = ctor.CreateCommand("StreamBlockExpandCommand")
        exp_cmd.SetCollection("StreamBlockList",
                              [proj_sb.GetObjectHandle()])
        exp_cmd.Execute()
        exp_cmd.MarkDelete()

        gen_sb_list = exp_cmd.GetCollection("ExpandedStreamBlockList")
        for gen_sb in gen_sb_list:
            sb = hnd_reg.Find(gen_sb)
            if sb is None:
                plLogger.LogError("Invalid handle " + str(gen_sb))
                continue
            plLogger.LogInfo("adding gen sb: " + sb.Get("Name"))
            template.AddObject(sb, RelationType("GeneratedObject"))
            # Tag the duplicated port-level streamblock with original's tags
            for tag in tag_list:
                sb.AddObject(tag, RelationType('UserTag'))
            dst_ep_list = sb.GetObjects('Scriptable',
                                        RelationType('DstBinding'))
            dst_port_map = {}
            # Go through each destination endpoint and find the port
            for dst_ep in dst_ep_list:
                walk = dst_ep
                # If we've walked to Project we've run out of parents
                while not walk.IsTypeOf('Project'):
                    if walk.IsTypeOf('EmulatedDevice'):
                        port = walk.GetObject('Port',
                                              RelationType('AffiliationPort'))
                        if port.GetObjectHandle() not in dst_port_map:
                            dst_port_map[port.GetObjectHandle()] = port
                        break
                    else:
                        walk = walk.GetParent()
            for port in dst_port_map.itervalues():
                sb.AddObject(port, RelationType('ExpectedRx'))

    # Allocate the Load based on the Weight
    mix_elem = etree.fromstring(tmi)
    load = mix_elem.get("Load")
    load_unit = mix_elem.get("LoadUnit")

    cmd = ctor.CreateCommand(PKG_TRF + ".AllocateTrafficMixLoad1Command")
    cmd.Set("Load", load)
    cmd.Set("LoadUnit", load_unit)
    cmd.Set("StmTrafficMix", trf_mix.GetObjectHandle())
    cmd.Execute()
    cmd.MarkDelete()

    return True