users_added,
group_memberships)
print("Adding users to groups", file=sys.stderr)
- add_users_to_groups(ldb, instance_id, assignments.assignments)
+ add_users_to_groups(ldb, instance_id, assignments)
memberships_added = assignments.total()
if (groups_added > 0 and users_added == 0 and
def __init__(self, number_of_groups, groups_added, number_of_users,
users_added, group_memberships):
+ self.count = 0
self.generate_group_distribution(number_of_groups)
self.generate_user_distribution(number_of_users, group_memberships)
self.assignments = self.assign_groups(number_of_groups,
return user, group
+ def users_in_group(self, group):
+ return self.assignments[group]
+
+ def get_groups(self):
+ return self.assignments.keys()
+
def assign_groups(self, number_of_groups, groups_added,
number_of_users, users_added, group_memberships):
"""Allocate users to groups.
assignments = set()
if group_memberships <= 0:
- return assignments
+ return {}
# Calculate the number of group menberships required
group_memberships = math.ceil(
# group or user number
assignments.add(((user + 1), (group + 1)))
- return assignments
+ # convert the set into a dictionary, where key=group, value=list-of-
+ # users-in-group (indexing by group-ID allows us to optimize for
+ # DB membership writes)
+ assignment_dict = defaultdict(list)
+ for (user, group) in assignments:
+ assignment_dict[group].append(user)
+ self.count += 1
+
+ return assignment_dict
def total(self):
- return len(self.assignments)
+ return self.count
def add_users_to_groups(db, instance_id, assignments):
- """Add users to their assigned groups.
-
- Takes the list of (group,user) tuples generated by assign_groups and
- assign the users to their specified groups."""
+ """Takes the assignments of users to groups and applies them to the DB."""
ou = ou_name(db, instance_id)
def build_dn(name):
return("cn=%s,%s" % (name, ou))
- for (user, group) in assignments:
- user_dn = build_dn(user_name(instance_id, user))
- group_dn = build_dn(group_name(instance_id, group))
+ for group in assignments.get_groups():
+ for user in assignments.users_in_group(group):
+ user_dn = build_dn(user_name(instance_id, user))
+ group_dn = build_dn(group_name(instance_id, group))
- m = ldb.Message()
- m.dn = ldb.Dn(db, group_dn)
- m["member"] = ldb.MessageElement(user_dn, ldb.FLAG_MOD_ADD, "member")
- start = time.time()
- db.modify(m)
- end = time.time()
- duration = end - start
- LOGGER.info("%f\t0\tadd\tuser\t%f\tTrue\t" % (end, duration))
+ m = ldb.Message()
+ m.dn = ldb.Dn(db, group_dn)
+ m["member"] = ldb.MessageElement(user_dn, ldb.FLAG_MOD_ADD, "member")
+ start = time.time()
+ db.modify(m)
+ end = time.time()
+ duration = end - start
+ LOGGER.info("%f\t0\tadd\tuser\t%f\tTrue\t" % (end, duration))
def generate_stats(statsdir, timing_file):