summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kraft <george.kraft@calxeda.com>2012-08-17 12:25:46 -0500
committerGeorge Kraft <george.kraft@calxeda.com>2012-08-17 12:25:46 -0500
commit6c45a4c7edfdb900f0471a39e178638427c63ab0 (patch)
tree7491f06a9f1dd9d95b5369966b52433571aa1102
parenta6b75432354e1ec3af421bdf1042c39845d9070e (diff)
downloadcxmanage-6c45a4c7edfdb900f0471a39e178638427c63ab0.tar.gz
target: Some improvements to partition selection
Mainly, when selecting an "INACTIVE" partition, take into account the valid flag. Also use sorting instead of branching if statements.
-rw-r--r--cxmanage/target.py54
1 files changed, 20 insertions, 34 deletions
diff --git a/cxmanage/target.py b/cxmanage/target.py
index b69c7c9..0b2ad77 100644
--- a/cxmanage/target.py
+++ b/cxmanage/target.py
@@ -377,43 +377,29 @@ class Target:
raise CxmanageError("No second partition found on host")
return partitions[1]
elif partition_arg == "OLDEST":
- # Choose second partition if both are the same version
- if (len(partitions) == 1 or
- partitions[0].version < partitions[1].version):
- return partitions[0]
- else:
- return partitions[1]
+ # Return the oldest partition
+ partitions.sort(key=lambda x: x.partition, reverse=True)
+ partitions.sort(key=lambda x: x.version)
+ return partitions[0]
elif partition_arg == "NEWEST":
- # Choose first partition if both are the same version
- if (len(partitions) == 1 or
- partitions[0].version >= partitions[1].version):
- return partitions[0]
- else:
- return partitions[1]
+ # Return the newest partition
+ partitions.sort(key=lambda x: x.partition)
+ partitions.sort(key=lambda x: x.version, reverse=True)
+ return partitions[0]
elif partition_arg == "INACTIVE":
- # Get inactive partitions
- partitions = [x for x in partitions if x.in_use != "1"]
- if len(partitions) < 1:
- raise CxmanageError("No inactive partitions found on host")
-
- # Choose second partition if both are the same version
- if (len(partitions) == 1 or
- partitions[0].version < partitions[1].version):
- return partitions[0]
- else:
- return partitions[1]
+ # Return the partition that's not in use (or least likely to be)
+ partitions.sort(key=lambda x: x.partition, reverse=True)
+ partitions.sort(key=lambda x: x.version)
+ partitions.sort(key=lambda x: int(x.flags, 16) & 2 == 0)
+ partitions.sort(key=lambda x: x.in_use == "1")
+ return partitions[0]
elif partition_arg == "ACTIVE":
- # Get active partitions
- partitions = [x for x in partitions if x.in_use != "0"]
- if len(partitions) < 1:
- raise CxmanageError("No active partitions found on host")
-
- # Choose first partition if both are the same version
- if (len(partitions) == 1 or
- partitions[0].version >= partitions[1].version):
- return partitions[0]
- else:
- return partitions[1]
+ # Return the partition that's in use (or most likely to be)
+ partitions.sort(key=lambda x: x.partition)
+ partitions.sort(key=lambda x: x.version, reverse=True)
+ partitions.sort(key=lambda x: int(x.flags, 16) & 2 == 1)
+ partitions.sort(key=lambda x: x.in_use == "0")
+ return partitions[0]
else:
raise ValueError("Invalid partition argument: %s" % partition_arg)