From 7ab385524d05db770c0a669016ce1b7daac0ca22 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Tue, 24 May 2016 12:45:54 -0400 Subject: [PATCH] added roles support for organization_factory --- awx/main/tests/factories/tower.py | 48 +++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/awx/main/tests/factories/tower.py b/awx/main/tests/factories/tower.py index 43793a0d7a..9b142eaadf 100644 --- a/awx/main/tests/factories/tower.py +++ b/awx/main/tests/factories/tower.py @@ -12,6 +12,7 @@ from awx.main.models import ( Credential, Inventory, Label, + Role, ) @@ -112,7 +113,7 @@ class _Mapped(object): def __init__(self, d): self.d = d for k,v in d.items(): - setattr(self, k, v) + setattr(self, k.replace(' ','_'), v) def all(self): return self.d.values() @@ -158,7 +159,7 @@ def create_job_template(name, **kwargs): job_type=job_type) def create_organization(name, **kwargs): - Objects = namedtuple("Objects", "organization,teams,users,superusers,projects,labels") + Objects = namedtuple("Objects", "organization,teams,users,superusers,projects,labels,roles") org = mk_organization(name, '%s-desc'.format(name)) @@ -167,6 +168,7 @@ def create_organization(name, **kwargs): teams = {} projects = {} labels = {} + roles = {} persisted = kwargs.get('persisted', True) if 'teams' in kwargs: @@ -216,11 +218,47 @@ def create_organization(name, **kwargs): else: labels[l] = mk_label(l, org, persisted=persisted) + if 'roles' in kwargs: + # refactor this .. alot + if not persisted: + raise RuntimeError('roles can not be used when persisted=False') + + all_objects = {} + for d in [superusers, users, teams, projects, labels]: + for k,v in d.iteritems(): + if all_objects.get(k) is not None: + raise KeyError('object names must be unique when using roles \ + {} key already exists with value {}'.format(k,v)) + all_objects[k] = v + + for role in kwargs.get('roles'): + obj_role, sep, member_role = role.partition(':') + if not member_role: + raise RuntimeError('you must an assignment role, got None') + + obj_str, o_role_str = obj_role.split('.') + member_str, m_sep, m_role_str = member_role.partition('.') + + obj = all_objects[obj_str] + obj_role = getattr(obj, o_role_str) + + member = all_objects[member_str] + if m_role_str: + if hasattr(member, m_role_str): + member_role = getattr(member, m_role_str) + obj_role.parents.add(member_role) + else: + raise RuntimeError('unable to find {} role for {}'.format(m_role_str, member_str)) + else: + if type(member) is User: + obj_role.members.add(member) + else: + raise RuntimeError('unable to add non-user {} for members list of {}'.format(member_str, obj_str)) + return Objects(organization=org, superusers=_Mapped(superusers), users=_Mapped(users), teams=_Mapped(teams), projects=_Mapped(projects), - labels=_Mapped(labels)) - - + labels=_Mapped(labels), + roles=_Mapped(roles))