Fix netgroup plugin to use correct member attribute names.

When the netgroup plugin was rebased it ended up using the member
attribute for its memberships and not memberuser/memberhost.

I also fixed this same attribute problem in the tests and tried to beef
them up a little. If nis/schema compat are enabled it will try to compare
the generated triplets with a known-good value.
This commit is contained in:
Rob Crittenden
2010-07-14 14:45:15 -04:00
parent 0d12b0344f
commit 57a9001f8d
2 changed files with 148 additions and 70 deletions

View File

@@ -46,6 +46,23 @@ from ipalib.plugins.baseldap import *
from ipalib import _, ngettext
output_params = (
Str('memberuser_user?',
label='Member User',
),
Str('memberuser_group?',
label='Member Group',
),
Str('memberhost_host?',
label=_('Member Host'),
),
Str('memberhost_hostgroup?',
label='Member Hostgroup',
),
Str('externalhost?',
label=_('External host'),
),
)
class netgroup(LDAPObject):
"""
Netgroup object.
@@ -55,13 +72,14 @@ class netgroup(LDAPObject):
object_name_plural = 'netgroups'
object_class = ['ipaobject', 'ipaassociation', 'ipanisnetgroup']
default_attributes = [
'cn', 'description', 'member', 'memberof', 'externalhost',
'nisdomainname',
'cn', 'description', 'memberof', 'externalhost',
'nisdomainname', 'memberuser', 'memberhost',
]
uuid_attribute = 'ipauniqueid'
attribute_members = {
'member': ['user', 'group', 'host', 'hostgroup', 'netgroup'],
'memberof': ['netgroup'],
'memberuser': ['user', 'group'],
'memberhost': ['host', 'hostgroup'],
}
label = _('Net Groups')
@@ -88,26 +106,6 @@ class netgroup(LDAPObject):
doc=_('IPA unique ID'),
flags=['no_create', 'no_update'],
),
Str('member_user?',
label='Member User',
flags=['no_create', 'no_update', 'no_search'],
),
Str('member_group?',
label='Member Group',
flags=['no_create', 'no_update', 'no_search'],
),
Str('member_host?',
label=_('Member host'),
flags=['no_create', 'no_update', 'no_search'],
),
Str('member_hostgroup?',
label='Member Hostgroup',
flags=['no_create', 'no_update', 'no_search'],
),
Str('externalhost?',
label=_('External host'),
flags=['no_create', 'no_update', 'no_search'],
),
)
def get_dn(self, *keys, **kwargs):
@@ -135,6 +133,7 @@ class netgroup_add(LDAPCreate):
"""
Create new netgroup.
"""
has_output_params = output_params
def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
if not dn.startswith('cn='):
msg = 'netgroup with name "%s" already exists' % keys[-1]
@@ -160,6 +159,7 @@ class netgroup_mod(LDAPUpdate):
"""
Modify netgroup.
"""
has_output_params = output_params
api.register(netgroup_mod)
@@ -168,6 +168,7 @@ class netgroup_find(LDAPSearch):
"""
Search the groups.
"""
has_output_params = output_params
api.register(netgroup_find)
@@ -176,6 +177,7 @@ class netgroup_show(LDAPRetrieve):
"""
Display netgroup.
"""
has_output_params = output_params
api.register(netgroup_show)
@@ -184,14 +186,18 @@ class netgroup_add_member(LDAPAddMember):
"""
Add members to netgroup.
"""
has_output_params = output_params
member_attributes = ['memberuser', 'memberhost']
def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options):
if 'member' in failed and 'host' in failed['member']:
completed_external = 0
# Sift through the host failures. We assume that these are all
# hosts that aren't stored in IPA, aka external hosts.
if 'memberhost' in failed and 'host' in failed['memberhost']:
(dn, entry_attrs_) = ldap.get_entry(dn, ['externalhost'])
members = entry_attrs.get('member', [])
members = entry_attrs.get('memberhost', [])
external_hosts = entry_attrs_.get('externalhost', [])
failed_hosts = []
completed_external = 0
for host in failed['member']['host']:
for host in failed['memberhost']['host']:
host = host.lower()
host_dn = self.api.Object['host'].get_dn(host)
if host not in external_hosts and host_dn not in members:
@@ -204,7 +210,7 @@ class netgroup_add_member(LDAPAddMember):
ldap.update_entry(dn, {'externalhost': external_hosts})
except errors.EmptyModlist:
pass
failed['member']['host'] = failed_hosts
failed['memberhost']['host'] = failed_hosts
entry_attrs['externalhost'] = external_hosts
return (completed + completed_external, dn)
@@ -216,13 +222,17 @@ class netgroup_remove_member(LDAPRemoveMember):
"""
Remove members from netgroup.
"""
has_output_params = output_params
member_attributes = ['memberuser', 'memberhost']
def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options):
if 'member' in failed and 'host' in failed['member']:
# Run through the host failures and gracefully remove any defined as
# as an externalhost.
if 'memberhost' in failed and 'host' in failed['memberhost']:
(dn, entry_attrs) = ldap.get_entry(dn, ['externalhost'])
external_hosts = entry_attrs.get('externalhost', [])
failed_hosts = []
completed_external = 0
for host in failed['member']['host']:
for host in failed['memberhost']['host']:
host = host.lower()
if host in external_hosts:
external_hosts.remove(host)
@@ -234,7 +244,7 @@ class netgroup_remove_member(LDAPRemoveMember):
ldap.update_entry(dn, {'externalhost': external_hosts})
except errors.EmptyModlist:
pass
failed['member']['host'] = failed_hosts
failed['memberhost']['host'] = failed_hosts
entry_attrs['externalhost'] = external_hosts
return (completed + completed_external, dn)