]> www.infradead.org Git - users/dhowells/kafs-utils.git/commitdiff
Better iterate over list of ptservers upon failure
authorDavid Howells <dhowells@redhat.com>
Tue, 13 May 2014 20:27:56 +0000 (21:27 +0100)
committerDavid Howells <dhowells@redhat.com>
Tue, 13 May 2014 20:27:56 +0000 (21:27 +0100)
Separate out the iteration over a list of ptservers when one fails.  We don't
want to have to intermingle it with a loop over a list of calls to make (eg. a
list of IDs to be deleted).

Signed-off-by: David Howells <dhowells@redhat.com>
suite/commands/pts/createuser.py
suite/commands/pts/delete.py
suite/commands/pts/listentries.py
suite/commands/pts/listmax.py
suite/lib/cell.py

index 2c8cc14e71316815d158b4e8bdc8c4526e561e55..b8e8f200720ce00f572173113e286f30b6c84188 100644 (file)
@@ -55,7 +55,6 @@ Create a user or machine entry in the Protection Database
 def main(params):
     exitcode = 0
     cell = params["cell"]
-    pt_conn = cell.open_pt_server(params)
 
     names = params["name"]
     if "id" in params:
@@ -68,20 +67,11 @@ def main(params):
             verbose("Adding user ", name, "\n")
             if i < len(ids):
                 new_id = int(ids[i])
-                ret = kafs.PR_INewEntry(pt_conn, name, new_id, 0)
+                ret = cell.call_pt_server(params, kafs.PR_INewEntry, name, new_id, 0)
             else:
-                ret = kafs.PR_NewEntry(pt_conn, name, 0, 0)
+                ret = cell.call_pt_server(params, kafs.PR_INewEntry, name, 0, 0)
                 new_id = ret.id
             output("User ", name, " has id ", new_id, "\n")
-        except ConnectionRefusedError:
-            # Move on to the next server
-            verbose("Connection refused\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
-        except kafs.AbortUNOTSYNC:
-            verbose("Server is not synchronised\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
         except kafs.AbortPREXIST:
             error("Entry for name already exists ; unable to create user ", name, "\n")
             if "force" not in params:
@@ -90,10 +80,4 @@ def main(params):
             error("Entry for id already exists ; unable to create user ", name, " with id ", new_id, "\n")
             if "force" not in params:
                 break
-        except kafs.RemoteAbort as e:
-            if str(e) == "Aborted 17":
-                error("failed to add user ", i, " (File exists)\n")
-                exitcode = 1
-            else:
-                raise
     return exitcode
index fa173fcdb5f412c0206e0993a42163758eb660fe..c49e42b7173213cd0fd3a9758a338a8bbffe65c8 100644 (file)
@@ -53,7 +53,6 @@ Delete a Protection Database entry
 
 def main(params):
     cell = params["cell"]
-    pt_conn = cell.open_pt_server(params)
 
     for name in params["nameorid"]:
         try:
@@ -63,29 +62,21 @@ def main(params):
                 # Convert the id to a name for message purposes - note that if
                 # the entry does not exist, this will just stringify the ID for
                 # us.
-                ret = kafs.PR_IDToName(pt_conn, [ uid ])
+                ret = cell.call_pt_server(params, kafs.PR_IDToName, [ uid ])
                 name = ret.nlist[0].prname
-                verbose("Deleting user ", uid, " (", name, ")\n")
-                ret = kafs.PR_Delete(pt_conn, uid)
             else:
                 verbose("Name ", name, "\n")
-                ret = kafs.PR_NameToID(pt_conn, [ name ])
+                ret = cell.call_pt_server(params, kafs.PR_NameToID, [ name ])
                 uid = ret.ilist[0]
                 if uid == kafs.PR_ANONYMOUSID and name != "anonymous":
                     error("User or group doesn't exist so couldn't look up id for " + name + "\n")
-                else:
-                    verbose("Deleting user ", uid, " (", name, ")\n")
-                    ret = kafs.PR_Delete(pt_conn, uid)
+                    if "force" not in params:
+                        break
+                    continue
+
+            verbose("Deleting user ", uid, " (", name, ")\n")
+            ret = cell.call_pt_server(params, kafs.PR_Delete, uid)
 
-        except ConnectionRefusedError:
-            # Move on to the next server
-            verbose("Connection refused\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
-        except kafs.AbortUNOTSYNC:
-            verbose("Server is not synchronised\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
         except kafs.AbortPRNOENT:
             error("User or group doesn't exist deleting ", name, " (id ", uid, ")\n")
             if "force" not in params:
index fb35ad6741a894b521280a3d5197b4343ec435e3..7c04a8d92d90ad3360d3d578b91a255e2b2f247f 100644 (file)
@@ -50,7 +50,6 @@ Display all users or groups in the Protection Database
 
 def main(params):
     cell = params["cell"]
-    pt_conn = cell.open_pt_server(params)
 
     if "users" in params and "groups" in params:
         flags = kafs.PRWANTUSERS | kafs.PRWANTGROUPS
@@ -59,21 +58,8 @@ def main(params):
     else:
         flags = kafs.PRWANTUSERS
 
-    while True:
-        try:
-            ret = kafs.PR_ListEntries(pt_conn, flags, 0)
+    ret = cell.call_pt_server(params,  kafs.PR_ListEntries, flags, 0)
 
-            output("Name                          ID   Owner Creator\n")
-            for i in ret.entries:
-                outputf("{:24s} {:7d} {:7d} {:7d}\n", i.name, i.id, i.owner, i.creator)
-
-        except ConnectionRefusedError:
-            # Move on to the next server
-            verbose("Connection refused\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
-        except kafs.AbortUNOTSYNC:
-            verbose("Server is not synchronised\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
-        break
+    output("Name                          ID   Owner Creator\n")
+    for i in ret.entries:
+        outputf("{:24s} {:7d} {:7d} {:7d}\n", i.name, i.id, i.owner, i.creator)
index 8660d8a00821f9f5180b56516a76b3c1027161e5..01c9e5e458e152b24f3ae0249546203ff9798071 100644 (file)
@@ -48,20 +48,6 @@ Display the max user id and max group id counters
 
 def main(params):
     cell = params["cell"]
-    pt_conn = cell.open_pt_server(params)
 
-    while True:
-        try:
-            ret = kafs.PR_ListMax(pt_conn)
-            output("Max user id is ", ret.uid, " and max group id is ", ret.gid, ".\n")
-
-        except ConnectionRefusedError:
-            # Move on to the next server
-            verbose("Connection refused\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
-        except kafs.AbortUNOTSYNC:
-            verbose("Server is not synchronised\n");
-            pt_conn = cell.open_pt_server(params)
-            continue
-        break
+    ret = cell.call_pt_server(params, kafs.PR_ListMax)
+    output("Max user id is ", ret.uid, " and max group id is ", ret.gid, ".\n")
index ca9d1543fb56baa62018b0d146f16cfb47b9397b..3e346214a4dfe2026fb7ac93e21c87cfc33f17e8 100644 (file)
@@ -51,7 +51,8 @@ class cell:
         self.__vlserver_names = dict()
         self.__vlservers = []
         self.__vlconn = None
-        self.__ptservers = None
+        self.__ptserver_index = None
+        self.__ptconn = None
 
     def __repr__(self):
         return "<" + "AFS:" + self.__name + ">"
@@ -213,13 +214,13 @@ class cell:
 
     # Open a Protection Server connection
     def open_pt_server(self, params=None):
-        if self.__ptservers == None:
+        if self.__ptserver_index == None:
             self.__ptservers = self.query_vl_addrs()
+            self.__ptserver_index = 0
 
-        if len(self.__ptservers) == 0:
+        if self.__ptserver_index >= len(self.__ptservers):
             raise CellError("Couldn't connect to a PT server")
-        server = self.__ptservers[0]
-        self.__ptservers[0] = self.__ptservers[1:]
+        server = self.__ptservers[self.__ptserver_index]
 
         key, security = self.determine_security(params)
 
@@ -230,3 +231,20 @@ class cell:
                                          kafs.PR_SERVICE,
                                          key, security)
         return pt_conn
+
+    # Find and call out to a working protection server
+    def call_pt_server(self, params, rpc, *args):
+        while True:
+            if not self.__ptconn:
+                self.__ptconn = self.open_pt_server(params)
+            try:
+                return rpc(self.__ptconn, *args)
+            except ConnectionRefusedError:
+                # Move on to the next server
+                verbose("Connection refused\n");
+            except kafs.AbortUNOTSYNC:
+                verbose("Server is not synchronised\n");
+            except OSError as e:
+                verbose(e, "\n");
+            self.__ptconn = None
+            self.__ptserver_index += 1