Init commit for standalone enodebd

Change-Id: I88eeef5135dd7ba8551ddd9fb6a0695f5325337b
diff --git a/device_config/configuration_util.py b/device_config/configuration_util.py
new file mode 100644
index 0000000..cf746c1
--- /dev/null
+++ b/device_config/configuration_util.py
@@ -0,0 +1,67 @@
+"""
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+from typing import NamedTuple, Optional
+
+from lte.protos.mconfig.mconfigs_pb2 import EnodebD
+
+EnodebConfig = NamedTuple(
+    'EnodebConfig', [
+        ('serial_num', str),
+        ('config', EnodebD.EnodebConfig),
+    ],
+)
+
+
+def get_enb_rf_tx_desired(mconfig: EnodebD, enb_serial: str) -> bool:
+    """ True if the mconfig specifies to enable transmit on the eNB """
+    if mconfig.enb_configs_by_serial is not None and \
+            len(mconfig.enb_configs_by_serial) > 0:
+        if enb_serial in mconfig.enb_configs_by_serial:
+            enb_config = mconfig.enb_configs_by_serial[enb_serial]
+            return enb_config.transmit_enabled
+        else:
+            raise KeyError('Missing eNB from mconfig: %s' % enb_serial)
+    return mconfig.allow_enodeb_transmit
+
+
+def is_enb_registered(mconfig: EnodebD, enb_serial: str) -> bool:
+    """
+    True if either:
+        - the eNodeB is registered by serial to the Access Gateway
+        or
+        - the Access Gateway accepts all eNodeB devices
+    """
+    if mconfig.enb_configs_by_serial is not None and \
+            len(mconfig.enb_configs_by_serial) > 0:
+        if enb_serial in mconfig.enb_configs_by_serial:
+            return True
+        else:
+            return False
+    return True
+
+
+def find_enb_by_cell_id(mconfig: EnodebD, cell_id: int) \
+        -> Optional[EnodebConfig]:
+    """
+    Returns eNB config if:
+        - the eNodeB is registered by serial to the Access Gateway
+        - cell ID is found in eNB status by serial
+    else: returns None
+    """
+    if mconfig.enb_configs_by_serial is not None and \
+            len(mconfig.enb_configs_by_serial) > 0:
+        for sn, enb in mconfig.enb_configs_by_serial.items():
+            if cell_id == enb.cell_id:
+                config = EnodebConfig(serial_num=sn, config=enb)
+                return config
+    return None