Generate schemas dynamically from pieces provided by each object class

This way we benefit from:
* knowing which attributes are used/required by each object class and
  subclass
* Having validation function definitions near the class going to use them

Change-Id: I8fd6773c51d19405a585977af4ed72cad2b21db1
diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py
index cdc8d18..7d08b66 100644
--- a/src/osmo_gsm_tester/obj/ms_srs.py
+++ b/src/osmo_gsm_tester/obj/ms_srs.py
@@ -21,6 +21,7 @@
 import pprint
 
 from ..core import log, util, config, template, process, remote
+from ..core import schema
 from .run_node import RunNode
 from ..core.event_loop import MainLoop
 from .ms import MS
@@ -28,6 +29,26 @@
 def rf_type_valid(rf_type_str):
     return rf_type_str in ('zmq', 'uhd', 'soapy', 'bladerf')
 
+def on_register_schemas():
+    resource_schema = {
+        'remote_user': schema.STR,
+        'addr': schema.IPV4,
+        'rf_dev_type': schema.STR,
+        'rf_dev_args': schema.STR,
+        'num_carriers': schema.UINT,
+        'additional_args': schema.STR,
+        'airplane_t_on_ms': schema.INT,
+        'airplane_t_off_ms': schema.INT,
+        'tx_gain': schema.UINT,
+        'rx_gain': schema.UINT,
+        }
+    schema.register_resource_schema('modem', resource_schema)
+
+    config_schema = {
+        'enable_pcap': schema.BOOL_STR,
+        }
+    schema.register_config_schema('modem', config_schema)
+
 #reference: srsLTE.git srslte_symbol_sz()
 def num_prb2symbol_sz(num_prb):
     if num_prb <= 6: