Index: root/xen-unstable.hg/tools/python/xen/util/acmpolicy.py =================================================================== --- root.orig/xen-unstable.hg/tools/python/xen/util/acmpolicy.py +++ root/xen-unstable.hg/tools/python/xen/util/acmpolicy.py @@ -1323,6 +1323,13 @@ class ACMPolicy(XSPolicy): if ACM_LABEL_UNLABELED in resnames: resnames.remove(ACM_LABEL_UNLABELED) + # check for duplicate labels + if len(vmlabels) != len(set(vmlabels)) or \ + len(resnames) != len(set(resnames)) or \ + len(stes) != len(set(stes)) or \ + len(chws) != len(set(chws)): + return -xsconstants.XSERR_POLICY_HAS_DUPLICATES, "", "" + max_chw_ssids = 1 + len(vms_with_chws) max_chw_types = 1 + len(vms_with_chws) max_ste_ssids = 1 + len(vms_with_stes) + len(resnames) Index: root/xen-unstable.hg/tools/python/xen/util/xsconstants.py =================================================================== --- root.orig/xen-unstable.hg/tools/python/xen/util/xsconstants.py +++ root/xen-unstable.hg/tools/python/xen/util/xsconstants.py @@ -59,7 +59,8 @@ XSERR_HV_OP_FAILED = 24 + XS XSERR_BOOTPOLICY_INSTALL_ERROR = 25 + XSERR_BASE XSERR_VM_NOT_AUTHORIZED = 26 + XSERR_BASE XSERR_VM_IN_CONFLICT = 27 + XSERR_BASE -XSERR_LAST = 27 + XSERR_BASE ## KEEP LAST +XSERR_POLICY_HAS_DUPLICATES = 28 + XSERR_BASE +XSERR_LAST = 28 + XSERR_BASE ## KEEP LAST XSERR_MESSAGES = [ '', @@ -89,7 +90,8 @@ XSERR_MESSAGES = [ 'Operation failed in hypervisor', 'Boot policy installation error', 'VM is not authorized to run', - 'VM label conflicts with another VM' + 'VM label conflicts with another VM', + 'Duplicate labels or types in policy' ] def xserr2string(err):