Introduce initial Amarisoft ENB support

* object class expects the amarisoft software to be placed in directory
  provided by env var AMARISOFT_PATH_ENB. On local runs, it will run the
  software from there. On remote runs it will copy over that directory to
  the slave.
* Configuration provided works with 6 PRBs, but probably won't work for
  other values (yet).
* ZMQ support not yet available, only UHD.

One can select the Amarisoft ENB by declaring it in resources.conf:
"""
- label: AmarisoftENB-B200
  type: amarisoftenb
  rf_dev_type: uhd
  rf_dev_args: "type=b200,serial=317B9FE,recv_frame_size=9232,send_frame_size=9232"
  remote_user: jenkins
  addr: 10.12.1.206
"""

And running:
"""
$ export AMARISOFT_PATH_ENB=/path/to/binaries
$ osmo-gsm-tester.py ... -s 4g:amarisoftenb-rftype@uhd+srsue-rftype@UHD+mod-enb-nprb@6 -t ping
"""

Change-Id: I1ddf4962ea6438ad977382ab201b724028ca46b3
diff --git a/src/osmo_gsm_tester/srs_enb.py b/src/osmo_gsm_tester/srs_enb.py
index 772b447..f5d3fdf 100644
--- a/src/osmo_gsm_tester/srs_enb.py
+++ b/src/osmo_gsm_tester/srs_enb.py
@@ -21,6 +21,7 @@
 import pprint
 
 from . import log, util, config, template, process, remote
+from . import enb
 
 def rf_type_valid(rf_type_str):
     return rf_type_str in ('zmq', 'UHD', 'soapy', 'bladeRF')
@@ -44,7 +45,7 @@
 def num_prb2base_srate(num_prb):
     return num_prb2symbol_sz(num_prb) * 15 * 1000
 
-class srsENB(log.Origin):
+class srsENB(enb.eNodeB):
 
     REMOTE_DIR = '/osmo-gsm-tester-srsenb'
     BINFILE = 'srsenb'
@@ -56,12 +57,7 @@
     PCAPFILE = 'srsenb.pcap'
 
     def __init__(self, suite_run, conf):
-        super().__init__(log.C_RUN, 'srsenb')
-        self._conf = conf
-        self._addr = conf.get('addr', None)
-        if self._addr is None:
-            raise log.Error('addr not set')
-        self.set_name('srsenb_%s' % self._addr)
+        super().__init__(suite_run, conf, srsENB.BINFILE)
         self.ue = None
         self.epc = None
         self.run_dir = None
@@ -188,7 +184,8 @@
     def gen_conf_file(self, path, filename):
         self.dbg(config_file=path)
 
-        values = dict(enb=config.get_defaults('srsenb'))
+        values = dict(enb=config.get_defaults('enb'))
+        config.overlay(values, dict(enb=config.get_defaults('srsenb')))
         config.overlay(values, dict(enb=self.suite_run.config().get('enb', {})))
         config.overlay(values, dict(enb=self._conf))
         config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() }))
@@ -245,9 +242,6 @@
     def running(self):
         return not self.process.terminated()
 
-    def addr(self):
-        return self._addr
-
     def num_prb(self):
         return self._num_prb