* Data processing can be understood as operations on sets (link:https://duckduckgo.com/?q=Venn+diagram[Venn diagram]) ---- $ src/osmo-gsm-tester.py "$TRIAL_JOB_DIR" -s 4g:srsenb-rftype@zmq+srsue-rftype@zmq+mod-enb-nprb@6 -t ping.py ---- * First Suite and scenarios dictionaries ('resources', 'modifiers', 'config') are combined (set union operation): [cols="1,5a,5a,10a,10a"] .Manual replica of 'suite.py resource_requirements()' and 'resource_modifiers()' methods |=== |File|original|after 'times' replication|python syntax|combined |4g | ---- run_node: - times: 1 enb: - times: 1 type: srsenb modem: - times: 2 type: srsue ---- | ---- run_node: - {} enb: - type: srsenb modem: - type: srsue - type: srsue ---- | ---- 'resources': { 'run_node': [{}], 'enb': [{'type': 'srsenb'}], 'modem': [{'type: 'srsue'}, {'type: 'srsue'}] } 'modifiers': {} ---- | ---- 'resources': { 'run_node': [{}], 'enb': [{'type': 'srsenb'}], 'modem': [{'type': 'srsue'}, {'type': 'srsue'}] } 'modifiers': {} ---- |srsenb-rftype@zmq | ---- resources: enb: - type: srsenb rf_dev_type: zmq ---- | ---- resources: enb: - type: srsenb rf_dev_type: zmq ---- | ---- 'resources': { 'enb': [{'type': 'srsenb', 'rf_dev_type': 'zmq'}] } 'modifiers': {} ---- | ---- 'resources': { 'run_node': [{}], 'enb': [{'type': 'srsenb', 'rf_dev_type': 'zmq'}], 'modem': [{'type': 'srsue'}, {'type': 'srsue'}] } 'modifiers': {} ---- |srsue-rftype@zmq | ---- resources: modem: - type: srsue rf_dev_type: zmq times: 1 ---- | ---- resources: modem: - type: srsue rf_dev_type: zmq ---- | ---- 'resources': { 'modem': [{'type': 'srsue', 'rf_dev_type': 'zmq'}] } 'modifiers': {} ---- | ---- 'resources': { 'run_node': [{}], 'enb': [{'type': 'srsenb', 'rf_dev_type': 'zmq'}], 'modem': [{'type': 'srsue', 'rf_dev_type': 'zmq'}, {'type': 'srsue'}] } 'modifiers': {} ---- |mod-enb-nprb@6 | ---- modifiers: enb: - num_prb: 6 times: 1 ---- | ---- modifiers: enb: - num_prb: 6 ---- | ---- 'resources': {} 'modifiers': { 'enb': [{'num_prb': 6}] } ---- | ---- 'resources': { 'run_node': [{}], 'enb': [{'type': 'srsenb', 'rf_dev_type': 'zmq'}], 'modem': [{'type': 'srsue', 'rf_dev_type': 'zmq'}, {'type': 'srsue'}] } 'modifiers': { 'enb': [{'num_prb': 6}] } ---- |=== * Second, the resulting 'resources' set is used to match a set of resources from 'resources.list' in order to allocate them (intersection of sets): [cols="5a,5a,10a"] .Manual replica of 'resource.py reserve()' method |=== |resources.conf|'resources' filters|matched | ---- run_node: - run_type: ssh run_addr: 10.12.1.195 ssh_user: jenkins ssh_addr: 10.12.1.195 enb: - label: srsENB-zmq type: srsenb rf_dev_type: zmq remote_user: jenkins addr: 10.12.1.206 - label: srsENB-B200 type: srsenb rf_dev_type: uhd rf_dev_args: "type=b200,serial=317B9FE" remote_user: jenkins addr: 10.12.1.206 modem: - label: srsUE-zmq_1 type: srsue rf_dev_type: zmq remote_user: jenkins addr: 10.12.1.195 imsi: '001010123456789' ki: '001123' - label: srsUE-zq_2 type: srsue rf_dev_type: zmq remote_user: jenkins addr: 10.12.1.180 imsi: '001010123456781' ki: '001124' ---- | ---- 'resources': { 'run_node': [{}], 'enb': [{'type': 'srsenb', 'rf_dev_type': 'zmq'}], 'modem': [ {'type': 'srsue', 'rf_dev_type': 'zmq'}, {'type': 'srsue'} ] } ---- | ---- 'resources': { 'run_node': [{'run_type': 'ssh', 'run_addr': '10.12.1.195', 'ssh_user': 'jenkins', 'ssh_addr': '10.12.1.195'}], 'enb': [{'label': 'srsENB-zmq', 'type': 'srsenb', 'rf_dev_type': 'zmq', 'remote_user': 'jenkins', 'addr': 10.12.1.206}], 'modem': [ {'label': 'srsUE-zmq_1', 'type': 'srsue', 'remote_user': jenkins, 'addr': '10.12.1.195', 'imsi': '001010123456789' 'ki': '001123', 'rf_dev_type': 'zmq'}, {'label': 'srsUE-zmq_2', 'type': 'srsue', 'remote_user': jenkins, 'addr': '10.12.1.180', 'imsi': '001010123456781' 'ki': '001124'} ] } ---- |=== * Finally, modifiers are applied on top of the combined configuration before being passed to the python class managing it: [cols="5a,5a,10a"] .Also done by 'resource.py reserve()' method after matching resources |=== |Matched resources|modifiers|Result | ---- 'resources': { 'run_node': [{'run_type': 'ssh', 'run_addr': '10.12.1.195', 'ssh_user': 'jenkins', 'ssh_addr': '10.12.1.195'}], 'enb': [{'label': 'srsENB-zmq', 'type': 'srsenb', 'rf_dev_type': 'zmq', 'remote_user': 'jenkins', 'addr': 10.12.1.206}], 'modem': [ {'label': 'srsUE-zmq_1', 'type': 'srsue', 'remote_user': jenkins, 'addr': '10.12.1.195', 'imsi': '001010123456789' 'ki': '001123', 'rf_dev_type': 'zmq'}, {'label': 'srsUE-zmq_2', 'type': 'srsue', 'remote_user': jenkins, 'addr': '10.12.1.180', 'imsi': '001010123456781' 'ki': '001124'} ] } ---- | ---- 'modifiers': { 'enb': [{'num_prb': 6}] } ---- | ---- 'resources': { 'run_node': [{'run_type': 'ssh', 'run_addr': '10.12.1.195', 'ssh_user': 'jenkins', 'ssh_addr': '10.12.1.195'}], 'enb': [{'label': 'srsENB-zmq', 'type': 'srsenb', 'rf_dev_type': 'zmq', 'remote_user': 'jenkins', 'addr': '10.12.1.206', 'num_prb': 6}], 'modem': [ {'label': 'srsUE-zmq_1', 'type': 'srsue', 'remote_user': jenkins, 'addr': 10.12.1.195, 'imsi': '001010123456789' 'ki': '001123', 'rf_dev_type': 'zmq'}, {'label': 'srsUE-zmq_2', 'type': 'srsue', 'remote_user': jenkins, 'addr': 10.12.1.180, 'imsi': '001010123456781' 'ki': '001124'} ] } ---- |=== WARNING: Right now algorithms based on lists of scalar/simple types being unordered vs complex types (dictionaries, list) being ordered. Other ways can be supported by explicitly using 'set' type from yaml in lists of scalars.