neels has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37882?usp=email )
Change subject: ctrl, hnbgw: access rate counter groups by given ID instead of index ......................................................................
ctrl, hnbgw: access rate counter groups by given ID instead of index
Teach Osmocom_CTRL_Functions to retrieve rate counters by the ID that the program has set with rate_ctr_group_set_name() (e.g. a hNodeB's cell id).
In our tests, the logic is firmly built on indexed arrays. For example, for CN pooling, the tests conveniently have an array of msc.0, msc.1 etc.. This clashes with objects where the indexes on the CTRL interface may vary dynamically. This patch allows the same indexed handling of rate counters even when using the ID names instead of the indexes: still keep the objects in an indexed array, and also provide a mapping from index to ID name.
Specific motivation:
Since osmo-hnbgw commit 61e278a452bf4fd240e45f1fe8c094a4b3795317 "hnb_persistent: Use incrementing counter for rate_ctr + stat_item index" the hnb rate counter index increments after a hnbp has expired.
Instead, use the hNodeB's cell ID (which osmo-hnbgw sets on the counter group with rate_ctr_group_set_name()) to retrieve counters from the CTRL interface.
Related: OS#6545 Change-Id: I70e74e7554482df67aa1d90bc04314124dea444f --- M hnbgw/HNBGW_Tests.ttcn M library/Osmocom_CTRL_Functions.ttcn 2 files changed, 55 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/82/37882/1
diff --git a/hnbgw/HNBGW_Tests.ttcn b/hnbgw/HNBGW_Tests.ttcn index 3765411..a06e28f 100644 --- a/hnbgw/HNBGW_Tests.ttcn +++ b/hnbgw/HNBGW_Tests.ttcn @@ -358,6 +358,7 @@ /* Counter state */ var CounterNameValsList g_ctr_cn; var CounterNameValsList g_ctr_hnb; + var charstring_list g_hnb_instance_id_map; }
/* global altstep for global guard timer; */ @@ -1032,8 +1033,10 @@ };
private function f_ctrs_hnb_init(integer hnb_start := 0, integer hnb_count := 1, - CounterNameVals counternames := counternames_hnb) runs on test_CT { + CounterNameVals counternames := counternames_hnb, + charstring_list instance_id_map := {}) runs on test_CT { g_ctr_hnb := f_counter_name_vals_get_n(IPA_CTRL, "hnb", hnb_count, counternames, start_idx := hnb_start); + g_hnb_instance_id_map := instance_id_map; log("initial hnb rate counters: ", g_ctr_hnb); }
@@ -1047,7 +1050,7 @@ */ private function f_ctrs_hnb_verify() runs on test_CT { log("verifying hnb rate counters: ", g_ctr_hnb); - f_counter_name_vals_expect_n(IPA_CTRL, "hnb", g_ctr_hnb); + f_counter_name_vals_expect_n(IPA_CTRL, "hnb", g_ctr_hnb, instance_id_map := g_hnb_instance_id_map); }
/* convenience: f_ctrs_hnb_add() and f_ctrs_hnb_verify() in one call. @@ -1089,7 +1092,7 @@ f_vty_run_hnbgw(HNBGWVTY, "timer hnbgw X35 5");
/* Init the counters when the hnb already exists. There should be a nonzero iuh:established count now. */ - f_ctrs_hnb_init(); + f_ctrs_hnb_init(instance_id_map := { "001-01-L2342-R0-S55-C1" });
/* Drop the Iuh link */ f_drop_hnodeb(0); diff --git a/library/Osmocom_CTRL_Functions.ttcn b/library/Osmocom_CTRL_Functions.ttcn index f8788b9..97863c8 100644 --- a/library/Osmocom_CTRL_Functions.ttcn +++ b/library/Osmocom_CTRL_Functions.ttcn @@ -153,19 +153,39 @@ } }
- template charstring ts_ctrl_ratectr(CtrlVariable grp, integer instance, CtrlVariable name, - CtrlVariable kind := "abs") := - "rate_ctr." & kind & "." & grp & "." & int2str(instance) & "." & name; + /* Some objects in osmocom programs have volatile instance indexes that are created by external events rather + * than a fixed config. To access these, allow passing a mapping of an index number as the test expects them to + * instance names given dynamically. + * + * For example, in osmo-hnbgw, hnb.0 could be hnb.123 depending on how many HNB connected beforehand. To use the + * cell ID instad, pass in a mapping of index to cell id, to use the name given by rate_ctr_group_set_name() + * instead; so this would ask the CTRL for 'hnb.my-cell-id-foo' as instance_id_map[0] == 'my-cell-id-foo': + * f_ctrl_ctr_resolve_instance_id(0, { "my-cell-id-foo", "my-cell-id-bar" }); + */ + private function f_ctrl_ctr_resolve_instance_id(integer instance_idx, charstring_list instance_id_map) return charstring + { + if (lengthof(instance_id_map) > instance_idx) { + return instance_id_map[instance_idx]; + } + return int2str(instance_idx); + } + + private template charstring ts_ctrl_ratectr(CtrlVariable grp, integer instance, CtrlVariable name, + CtrlVariable kind := "abs", charstring_list instance_id_map) := + "rate_ctr." & kind & "." & grp & "." & f_ctrl_ctr_resolve_instance_id(instance, instance_id_map) & "." & name;
function f_ctrl_get_ratectr_abs(IPA_CTRL_PT pt, CtrlVariable grp, integer instance, - CtrlVariable name) return integer { - return str2int(f_ctrl_get(pt, valueof(ts_ctrl_ratectr(grp, instance, name)), on_err := "-1")); + CtrlVariable name, charstring_list instance_id_map := {}) return integer { + return str2int(f_ctrl_get(pt, + valueof(ts_ctrl_ratectr(grp, instance, name, instance_id_map := instance_id_map)), + on_err := "-1")); }
function f_ctrl_get_exp_ratectr_abs(IPA_CTRL_PT pt, CtrlVariable grp, integer instance, - CtrlVariable name, template integer exp) { + CtrlVariable name, template integer exp, + charstring_list instance_id_map := {}) { var charstring ctrl_resp; - var CtrlVariable variable := valueof(ts_ctrl_ratectr(grp, instance, name)); + var CtrlVariable variable := valueof(ts_ctrl_ratectr(grp, instance, name, instance_id_map := instance_id_map)); ctrl_resp := f_ctrl_get(pt, variable); if (not match(str2int(ctrl_resp), exp)) { setverdict(fail, variable & " value " & ctrl_resp & " didn't match ", exp); @@ -223,13 +243,15 @@
/* Retrieve one instance's rate counter values of the given names. */ function f_counter_name_vals_get(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, - CounterNameVals counternames) + CounterNameVals counternames, + charstring_list instance_id_map := {}) return CounterNameVals { var CounterNameVals vals; for (var integer i := 0; i < lengthof(counternames); i := i + 1) { vals[i] := { name := counternames[i].name, - val := f_ctrl_get_ratectr_abs(pt, instance_name, instance_nr, counternames[i].name) + val := f_ctrl_get_ratectr_abs(pt, instance_name, instance_nr, counternames[i].name, + instance_id_map := instance_id_map) }; } return vals; @@ -298,14 +320,16 @@ /* For a specific instance, call f_counter_name_vals_get() and compare with expected counter values. * Set the test verdict accordingly. */ function f_counter_name_vals_expect(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, - CounterNameVals vals) { - var CounterNameVals last := f_counter_name_vals_get(pt, instance_name, instance_nr, vals); + CounterNameVals vals, charstring_list instance_id_map := {}) { + var CounterNameVals last := f_counter_name_vals_get(pt, instance_name, instance_nr, vals, + instance_id_map := instance_id_map); for (var integer i := 0; i < lengthof(vals); i := i + 1) { if (last[i].name != vals[i].name) { setverdict(fail, "Internal error"); } if (last[i].val != vals[i].val) { - setverdict(fail, "Rate counter mismatch: ", instance_name, " ", instance_nr, + setverdict(fail, "Rate counter mismatch: ", instance_name, " ", + f_ctrl_ctr_resolve_instance_id(instance_nr, instance_id_map), " ", vals[i].name, " is at ", last[i].val, " but expected ", vals[i].val); } } @@ -314,19 +338,22 @@
/* For N instances, call f_counter_name_vals_get() and compare with expected counter values. * Set the test verdict accordingly. The number of instances is given by lengthof(valslist). */ - function f_counter_name_vals_expect_n(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist) { + function f_counter_name_vals_expect_n(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist, + charstring_list instance_id_map := {}) { for (var integer instance_nr := 0; instance_nr < lengthof(valslist); instance_nr := instance_nr + 1) { - f_counter_name_vals_expect(pt, instance_name, instance_nr, valslist[instance_nr]); + f_counter_name_vals_expect(pt, instance_name, instance_nr, valslist[instance_nr], + instance_id_map := instance_id_map); } }
/* For a specific instance, call f_counter_name_vals_get() and indentify counters that have changed with respect * to 'vals'. Return list of the changed counter names in the order they appear in 'vals'. */ - function f_counter_name_vals_get_changed(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, - CounterNameVals vals) + private function f_counter_name_vals_get_changed(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, + CounterNameVals vals, + charstring_list instance_id_map := {}) return charstring_list { var charstring_list changed := {}; - var CounterNameVals last := f_counter_name_vals_get(pt, instance_name, instance_nr, vals); + var CounterNameVals last := f_counter_name_vals_get(pt, instance_name, instance_nr, vals, instance_id_map); for (var integer i := 0; i < lengthof(vals); i := i + 1) { if (last[i].name != vals[i].name) { setverdict(fail, "Internal error"); @@ -340,11 +367,14 @@
/* For N instances, call f_counter_name_vals_get() and indentify counters that have changed with respect * to 'vals'. Return list of the changed counter names in the order they appear in 'vals'. */ - function f_counter_name_vals_get_changed_n(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist) + function f_counter_name_vals_get_changed_n(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist, + charstring_list instance_id_map := {}) return charstring_list { var charstring_list changed := {}; for (var integer instance_nr := 0; instance_nr < lengthof(valslist); instance_nr := instance_nr + 1) { - changed := changed & f_counter_name_vals_get_changed(pt, instance_name, instance_nr, valslist[instance_nr]); + changed := changed & f_counter_name_vals_get_changed(pt, instance_name, instance_nr, + valslist[instance_nr], + instance_id_map := instance_id_map); } return changed; }