def test_update_generated_objects_errors(stc):
    ctor = CScriptableCreator()
    stc_sys = CStcSystem.Instance()
    plLogger = PLLogger.GetLogger("test_update_generated_objects")
    plLogger.LogInfo("start")
    project = stc_sys.GetObject("Project")
    template = ctor.Create("StmTemplateConfig", project)
    dev = ctor.Create("EmulatedDevice", project)

    # No ProtocolConfig
    template.AddObject(dev, RelationType("GeneratedObject"))
    res = AllocCmd.update_generated_objects(template, 13)
    assert "Could not find a parent ProtocolConfig for" in res
    template.RemoveObject(dev, RelationType("GeneratedObject"))

    # No NetworkBlocks
    bgp = ctor.Create("BgpRouterConfig", dev)
    bgp_auth_params = bgp.GetObject("BgpAuthenticationParams")
    assert bgp_auth_params
    template.AddObject(bgp_auth_params, RelationType("GeneratedObject"))
    res = AllocCmd.update_generated_objects(template, 13)
    assert res == "Could not find any NetworkBlocks to update route counts on."
    template.RemoveObject(bgp_auth_params, RelationType("GeneratedObject"))

    # Not enough route count
    v4_route_config = ctor.Create("BgpIpv4RouteConfig", bgp)
    v6_route_config = ctor.Create("BgpIpv6RouteConfig", bgp)
    template.AddObject(v4_route_config, RelationType("GeneratedObject"))
    template.AddObject(v6_route_config, RelationType("GeneratedObject"))
    res = AllocCmd.update_generated_objects(template, 1)
    assert "Could not distribute at least one route to each block" \
        in res
def test_update_generated_objects(stc):
    ctor = CScriptableCreator()
    stc_sys = CStcSystem.Instance()
    plLogger = PLLogger.GetLogger("test_update_generated_objects")
    plLogger.LogInfo("start")
    project = stc_sys.GetObject("Project")
    template = ctor.Create("StmTemplateConfig", project)

    # Single NetworkBlock
    dev = ctor.Create("EmulatedDevice", project)
    bgp = ctor.Create("BgpRouterConfig", dev)
    v4_route_config = ctor.Create("BgpIpv4RouteConfig", bgp)
    template.AddObject(v4_route_config, RelationType("GeneratedObject"))
    net_block = v4_route_config.GetObject("NetworkBlock")
    assert net_block
    assert net_block.Get("NetworkCount") == 1
    res = AllocCmd.update_generated_objects(template, 123)
    assert res == ""
    assert net_block.Get("NetworkCount") == 123

    # Multiple NetworkBlocks
    v6_route_config = ctor.Create("BgpIpv6RouteConfig", bgp)
    template.AddObject(v6_route_config, RelationType("GeneratedObject"))
    v6_net_block = v6_route_config.GetObject("NetworkBlock")
    assert v6_net_block
    assert v6_net_block.Get("NetworkCount") == 1
    res = AllocCmd.update_generated_objects(template, 123)
    assert res == ""
    assert net_block.Get("NetworkCount") == 62
    assert v6_net_block.Get("NetworkCount") == 61

    # Duplicate object type
    v6_route_config2 = ctor.Create("BgpIpv6RouteConfig", bgp)
    template.AddObject(v6_route_config2, RelationType("GeneratedObject"))
    v6_net_block2 = v6_route_config2.GetObject("NetworkBlock")
    assert v6_net_block2
    assert v6_net_block2.Get("NetworkCount") == 1
    res = AllocCmd.update_generated_objects(template, 125)
    assert res == ""
    assert net_block.Get("NetworkCount") == 42
    assert v6_net_block.Get("NetworkCount") == 42
    assert v6_net_block2.Get("NetworkCount") == 41

    # Different protocol type (ISIS)
    dev2 = ctor.Create("EmulatedDevice", project)
    isis = ctor.Create("IsisRouterConfig", dev2)
    lsp = ctor.Create("IsisLspConfig", isis)
    isis_v4_route_config = ctor.Create("Ipv4IsisRoutesConfig", lsp)
    template.AddObject(lsp, RelationType("GeneratedObject"))
    isis_v4_net_block = isis_v4_route_config.GetObject("NetworkBlock")
    assert isis_v4_net_block
    assert isis_v4_net_block.Get("NetworkCount") == 1
    res = AllocCmd.update_generated_objects(template, 200)
    assert res == ""
    assert net_block.Get("NetworkCount") == 67
    assert v6_net_block.Get("NetworkCount") == 67
    assert v6_net_block2.Get("NetworkCount") == 66
    assert isis_v4_net_block.Get("NetworkCount") == 200

    # Different protocol types on multiple objects
    bgp2 = ctor.Create("BgpRouterConfig", dev2)
    v6_route_config3 = ctor.Create("BgpIpv6RouteConfig", bgp2)
    v6_net_block3 = v6_route_config3.GetObject("NetworkBlock")
    assert v6_net_block3
    assert v6_net_block3.Get("NetworkCount") == 1
    template.AddObject(v6_route_config3, RelationType("GeneratedObject"))
    res = AllocCmd.update_generated_objects(template, 300)
    assert res == ""
    assert net_block.Get("NetworkCount") == 100
    assert v6_net_block.Get("NetworkCount") == 100
    assert v6_net_block2.Get("NetworkCount") == 100
    assert isis_v4_net_block.Get("NetworkCount") == 150
    assert v6_net_block3.Get("NetworkCount") == 150