plcsh_test_leases.py is a utility script but not yet integrated in daily build
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Mon, 14 Oct 2024 16:55:22 +0000 (18:55 +0200)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Mon, 14 Oct 2024 16:55:22 +0000 (18:55 +0200)
system/plcsh_test_leases.py [new file with mode: 0755]

diff --git a/system/plcsh_test_leases.py b/system/plcsh_test_leases.py
new file mode 100755 (executable)
index 0000000..22eb5d6
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+"""
+a utility used in oct 2024 while checking the deletion of leases by slices
+not integrated in the nightly yet
+"""
+
+import sys
+sys.path.append('/usr/share/plc_api')
+
+from PLC.Shell import Shell
+
+api = Shell()
+
+# our test plc has one site only if we ignore the auto site
+
+def populate(expires: False):
+
+    login_base = 'reserv'
+
+    try:
+        site_id = api.AddSite({
+        'name': "a site for hosting reservable nodes",
+        'abbreviated_name': "res_site",
+        'login_base': login_base,
+        'max_slices': 100,
+    })
+    except:
+        print("the site already exists")
+        site_id = api.GetSites({'login_base': login_base})[0]['site_id']
+
+    try:
+        node_id = api.AddNode(site_id, {
+        'hostname': f'leases.testplc.org',
+        'node_type': 'reservable',
+    })
+    except:
+        print("the node already exists")
+        node_id = api.GetNodes({'hostname': 'leases.testplc.org'})[0]['node_id']
+
+    try:
+        slice_id = api.AddSlice({'name': f'{login_base}_leases'})
+        if expires:
+            import time
+            now = int(time.time())
+            slice_expires = {'expires': now + 30}
+            api.UpdateSlice(slice_id, slice_expires)
+
+    except:
+        print("the slice already exists")
+        slice_id = api.GetSlices({'name': f'{login_base}_leases'})[0]['slice_id']
+
+    # create a lease
+    leases = api.AddLeases(
+        node_id,
+        slice_id,
+        '2025-01-01 00:00:00',
+        '2025-01-01 01:00:00',
+    )
+    try:
+        lease_id = leases['new_ids'][0]
+    except:
+        print("the lease already exists")
+        lease_id = api.GetLeases({'hostname': 'leases.testplc.org'})[0]['lease_id']
+    print(f"{site_id=}, {node_id=}, {slice_id=} {lease_id=}")
+
+
+def unpopulate(full=False):
+    """
+    our main objective is to see what happens when a slice is deleted
+    however for testing it is somtimes useful to clean up the full mounty
+    """
+
+    if full:
+        leases = api.GetLeases({'hostname': 'leases.testplc.org'})
+        if not leases:
+            print("the lease was deleted already")
+        else:
+            api.DeleteLeases([leases[0]['lease_id']])
+
+    slices = api.GetSlices({'name': 'reserv_leases'})
+    if not slices:
+        print("the slice was deleted already")
+    else:
+        api.DeleteSlice(slices[0]['slice_id'])
+
+    if full:
+        nodes = api.GetNodes({'hostname': 'leases.testplc.org'})
+        if not nodes:
+            print("the node was deleted already")
+        else:
+            api.DeleteNode(nodes[0]['node_id'])
+
+    if full:
+        sites = api.GetSites({'login_base': 'reserv'})
+        if not sites:
+            print("the site was deleted already")
+        else:
+            api.DeleteSite(sites[0]['site_id'])
+
+
+from argparse import ArgumentParser
+parser = ArgumentParser()
+parser.add_argument('-p', '--populate', action='store_true')
+parser.add_argument('-e', '--expires', action='store_true', help='make the slice expire in 30')
+parser.add_argument('-u', '--unpopulate', action='store_true')
+parser.add_argument('-f', '--full', action='store_true', help='unpopulate everything, not just the slice')
+args = parser.parse_args()
+
+if args.populate:
+    populate(expires=args.expires)
+if args.unpopulate:
+    unpopulate(full=args.full)