nitb: Introduce subscriber_delete API

Change-Id: I62829ed243857681bcc40a4a1861c5c583907f4b
diff --git a/src/osmo_gsm_tester/osmo_nitb.py b/src/osmo_gsm_tester/osmo_nitb.py
index 3b396fa..be3b24b 100644
--- a/src/osmo_gsm_tester/osmo_nitb.py
+++ b/src/osmo_gsm_tester/osmo_nitb.py
@@ -119,6 +119,10 @@
         self.log('Add subscriber', msisdn=msisdn, imsi=modem.imsi())
         OsmoNitbCtrl(self).subscriber_add(modem.imsi(), msisdn, modem.ki())
 
+    def subscriber_delete(self, modem):
+        self.log('Delete subscriber', imsi=modem.imsi())
+        OsmoNitbCtrl(self).subscriber_delete(modem.imsi())
+
     def subscriber_attached(self, *modems):
         return self.imsi_attached(*[m.imsi() for m in modems])
 
@@ -138,6 +142,8 @@
     PORT = 4249
     SUBSCR_MODIFY_VAR = 'subscriber-modify-v1'
     SUBSCR_MODIFY_REPLY_RE = re.compile("SET_REPLY (\d+) %s OK" % SUBSCR_MODIFY_VAR)
+    SUBSCR_DELETE_VAR = 'subscriber-delete-v1'
+    SUBSCR_DELETE_REPLY_RE = re.compile("SET_REPLY (\d+) %s Removed" % SUBSCR_DELETE_VAR)
     SUBSCR_LIST_ACTIVE_VAR = 'subscriber-list-active-v1'
 
     def __init__(self, nitb):
@@ -167,6 +173,17 @@
                 raise RuntimeError('Cannot create subscriber %r (answer=%r)' % (imsi, answer_str))
             self.dbg('Created subscriber', imsi=imsi, msisdn=msisdn)
 
+    def subscriber_delete(self, imsi):
+        with self.ctrl() as ctrl:
+            ctrl.do_set(OsmoNitbCtrl.SUBSCR_DELETE_VAR, imsi)
+            data = ctrl.receive()
+            (answer, data) = ctrl.remove_ipa_ctrl_header(data)
+            answer_str = answer.decode('utf-8')
+            res = OsmoNitbCtrl.SUBSCR_DELETE_REPLY_RE.match(answer_str)
+            if not res:
+                raise RuntimeError('Cannot delete subscriber %r (answer=%r)' % (imsi, answer_str))
+            self.dbg('Deleted subscriber', imsi=imsi)
+
     def subscriber_list_active(self):
         aslist_str = ""
         with self.ctrl() as ctrl: