Import Upstream version 4.12.4

This commit is contained in:
geos_one
2025-08-12 22:28:56 +02:00
parent 03a8170b15
commit 9181ee2487
1629 changed files with 874094 additions and 554378 deletions

View File

@@ -87,6 +87,11 @@ class AutomemberTracker(Tracker):
return self.make_command('automember_add_condition', self.cn,
*args, **kwargs)
def make_remove_condition_command(self, *args, **kwargs):
""" Make function that issues automember_remove_condition """
return self.make_command('automember_remove_condition', self.cn,
*args, **kwargs)
def track_create(self):
""" Updates expected state for automember creation"""
self.attrs = dict(
@@ -189,6 +194,17 @@ class AutomemberTracker(Tracker):
result = command()
self.check_add_condition(result)
def add_condition_exclusive(self, key, type, exclusiveregex):
""" Add a condition with given exclusive regex and check for result.
Only one condition can be added. For more specific uses please
use make_add_condition_command instead. """
command = self.make_add_condition_command(
key=key, type=type, automemberexclusiveregex=exclusiveregex)
self.attrs['automemberexclusiveregex'] = [u'%s=%s' %
(key, exclusiveregex[0])]
result = command()
self.check_add_condition(result)
def rebuild(self, no_wait=False):
""" Rebuild automember conditions and check for result """
command = self.make_rebuild_command(type=self.membertype,

View File

@@ -155,9 +155,7 @@ class ModificationTracker(BaseTracker):
result = command()
self.attrs.update(updates)
self.attrs.update(expected_updates)
for key, value in self.attrs.items():
if value is None:
del self.attrs[key]
self.attrs = {k: v for k, v in self.attrs.items() if v is not None}
self.check_update(
result,
@@ -302,6 +300,11 @@ class EnableTracker(BaseTracker):
(enabled/disabled) after the test as it was before it.
"""
def cleanup():
if isinstance(self, CreationTracker):
# special case: if it already got deleted there is
# nothing to enable or disable
return
if self.original_enabled != self.enabled:
if self.original_enabled:
command = self.make_enable_command()

View File

@@ -6,7 +6,7 @@ from __future__ import absolute_import
import six
from ipapython.dn import DN
from ipatests.test_xmlrpc.tracker.base import Tracker
from ipatests.test_xmlrpc.tracker.base import Tracker, EnableTracker
from ipatests.util import assert_deepequal
from ipatests.test_xmlrpc.xmlrpc_test import (
fuzzy_issuer,
@@ -22,11 +22,12 @@ if six.PY3:
unicode = str
class CATracker(Tracker):
class CATracker(Tracker, EnableTracker):
"""Implementation of a Tracker class for CA plugin."""
ldap_keys = {
'dn', 'cn', 'ipacaid', 'ipacasubjectdn', 'ipacaissuerdn', 'description'
'dn', 'cn', 'ipacaid', 'ipacasubjectdn', 'ipacaissuerdn',
'description', 'ipacarandomserialnumberversion',
}
cert_keys = {
'certificate',
@@ -42,7 +43,7 @@ class CATracker(Tracker):
update_keys = ldap_keys - {'dn'}
def __init__(self, name, subject, desc=u"Test generated CA",
default_version=None):
default_version=None, auto_disable_for_delete=True):
super(CATracker, self).__init__(default_version=default_version)
self.attrs = {}
self.ipasubjectdn = subject
@@ -52,6 +53,9 @@ class CATracker(Tracker):
self.api.env.container_ca,
self.api.env.basedn)
# Whether to run ca-disable automatically before deleting the CA.
self.auto_disable_for_delete = auto_disable_for_delete
def make_create_command(self):
"""Make function that creates the plugin entry object."""
return self.make_command(
@@ -78,11 +82,29 @@ class CATracker(Tracker):
certificate_chain=fuzzy_sequence_of(fuzzy_bytes),
objectclass=objectclasses.ca
)
if self.description == 'IPA CA':
self.attrs['ipacarandomserialnumberversion'] = ('0',)
self.exists = True
def make_disable_command(self):
return self.make_command('ca_disable', self.name)
def check_disable(self, result):
assert_deepequal(dict(
result=True,
value=self.name,
summary=f'Disabled CA "{self.name}"',
), result)
def make_delete_command(self):
"""Make function that deletes the plugin entry object."""
return self.make_command('ca_del', self.name)
if self.auto_disable_for_delete:
def disable_then_delete():
self.make_command('ca_disable', self.name)()
return self.make_command('ca_del', self.name)()
return disable_then_delete
else:
return self.make_command('ca_del', self.name)
def check_delete(self, result):
assert_deepequal(dict(

View File

@@ -39,7 +39,7 @@ class CAACLTracker(Tracker):
u'ipamemberca_ca'}
category_keys = {
u'ipacacategory', u'ipacertprofilecategory', u'usercategory',
u'hostcategory', u'servicecategory', u'ipacacategory'}
u'hostcategory', u'servicecategory'}
retrieve_keys = {
u'dn', u'cn', u'description', u'ipaenabledflag',
u'ipamemberca', u'ipamembercertprofile', u'memberuser',
@@ -49,7 +49,7 @@ class CAACLTracker(Tracker):
u'usercategory', u'hostcategory', u'ipacacategory',
u'servicecategory', u'ipaenabledflag', u'objectclass',
u'ipauniqueid'}
update_keys = create_keys - {u'dn'}
update_keys = retrieve_keys - {"dn"}
def __init__(self, name, ipacertprofile_category=None, user_category=None,
service_category=None, host_category=None,
@@ -105,11 +105,11 @@ class CAACLTracker(Tracker):
ipauniqueid=[fuzzy_uuid],
cn=[self.name],
objectclass=objectclasses.caacl,
ipaenabledflag=[u'TRUE'])
ipaenabledflag=[True])
self.attrs.update(self.create_categories)
if self.description:
self.attrs.update({u'description', [self.description]})
self.attrs.update({"description": [self.description]})
self.exists = True
@@ -157,7 +157,7 @@ class CAACLTracker(Tracker):
def make_update_command(self, updates):
return self.make_command('caacl_mod', self.name, **updates)
def update(self, updates, expected_updates=None, silent=False):
def update(self, updates, expected_updates=None):
"""If removing a category, delete it from tracker as well"""
# filter out empty categories and track changes
@@ -165,11 +165,7 @@ class CAACLTracker(Tracker):
for key, value in updates.items():
if key in self.category_keys:
if not value:
try:
del self.attrs[key]
except IndexError:
if silent:
pass
del self.attrs[key]
else:
# if there is a value, prepare the pair for update
filtered_updates.update({key: value})
@@ -184,12 +180,13 @@ class CAACLTracker(Tracker):
try:
result = command()
except errors.EmptyModlist:
if silent:
self.attrs.update(filtered_updates)
self.attrs.update(expected_updates)
self.check_update(result,
extra_keys=set(self.update_keys) |
set(expected_updates.keys()))
pass
else:
self.attrs.update(filtered_updates)
self.attrs.update(expected_updates)
self.check_update(result,
extra_keys=set(self.update_keys) |
set(expected_updates.keys()))
def check_update(self, result, extra_keys=()):
assert_deepequal(dict(
@@ -374,10 +371,10 @@ class CAACLTracker(Tracker):
def enable(self):
command = self.make_command(u'caacl_enable', self.name)
self.attrs.update({u'ipaenabledflag': [u'TRUE']})
self.attrs.update({u'ipaenabledflag': [True]})
command()
def disable(self):
command = self.make_command(u'caacl_disable', self.name)
self.attrs.update({u'ipaenabledflag': [u'FALSE']})
self.attrs.update({u'ipaenabledflag': [False]})
command()

View File

@@ -52,7 +52,7 @@ class CertmapruleTracker(Tracker, EnableTracker):
self.attrs = {
'dn': self.dn,
'cn': [self.name],
'ipaenabledflag': [u'TRUE'],
'ipaenabledflag': [True],
'objectclass': objectclasses.certmaprule,
}
self.attrs.update({

View File

@@ -86,7 +86,7 @@ class CertprofileTracker(Tracker):
dn=unicode(self.dn),
cn=[self.name],
description=[self.description],
ipacertprofilestoreissued=[unicode(self.store).upper()],
ipacertprofilestoreissued=[self.store],
objectclass=objectclasses.certprofile
)
self.exists = True

View File

@@ -4,6 +4,8 @@
from ipatests.test_xmlrpc import objectclasses
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_digits, fuzzy_uuid
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_user_or_group_sid
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_set_optional_oc
from ipatests.test_xmlrpc.tracker.base import Tracker
from ipatests.util import assert_deepequal, get_group_dn
@@ -21,9 +23,10 @@ class GroupTracker(Tracker):
'idoverrideuser'
}
retrieve_all_keys = retrieve_keys | {u'ipauniqueid', u'objectclass'}
retrieve_all_keys = retrieve_keys | {u'ipauniqueid', u'objectclass',
'ipantsecurityidentifier'}
create_keys = retrieve_all_keys
create_keys = retrieve_all_keys - {u'ipantsecurityidentifier'}
update_keys = retrieve_keys - {u'dn'}
add_member_keys = retrieve_keys | {u'description'}
@@ -91,7 +94,9 @@ class GroupTracker(Tracker):
description=[self.description],
gidnumber=[fuzzy_digits],
ipauniqueid=[fuzzy_uuid],
objectclass=objectclasses.posixgroup,
objectclass=fuzzy_set_optional_oc(
objectclasses.posixgroup, 'ipantgroupattrs'),
ipantsecurityidentifier=[fuzzy_user_or_group_sid],
)
self.exists = True

View File

@@ -0,0 +1,170 @@
#
# Copyright (C) 2021 FreeIPA Contributors see COPYING for license
#
from ipalib import api
from ipapython.dn import DN
from ipatests.test_xmlrpc.tracker.base import Tracker
from ipatests.test_xmlrpc import objectclasses
from ipatests.util import assert_deepequal
class IdpTracker(Tracker):
"""Class for ipd tests"""
retrieve_keys = {
'dn', 'cn', 'ipaidpauthendpoint', 'ipaidpdevauthendpoint',
'ipaidpuserinfoendpoint', 'ipaidpkeysendpoint',
'ipaidptokenendpoint', 'ipaidpissuerurl',
'ipaidpclientid', 'ipaidpscope', 'ipaidpsub'}
retrieve_all_keys = retrieve_keys | {
'objectclass', 'ipaidpclientsecret'
}
create_keys = retrieve_all_keys
update_keys = retrieve_keys - {'dn'}
find_keys = retrieve_keys
find_all_keys = retrieve_all_keys
primary_keys = {'cn', 'dn'}
def __init__(self, cn, **kwargs):
super(IdpTracker, self).__init__(default_version=None)
self.cn = cn
self.dn = DN(('cn', cn), api.env.container_idp, api.env.basedn)
self.kwargs = kwargs
def make_create_command(self):
""" Make function that creates an idp using idp-add """
return self.make_command('idp_add', self.cn, **self.kwargs)
def track_create(self):
""" Update expected state for idp creation """
self.attrs = dict(
dn=self.dn,
cn=[self.cn],
objectclass=objectclasses.idp,
)
for key, value in self.kwargs.items():
if key == 'ipaidpclientsecret':
self.attrs[key] = [value.encode('utf-8')]
continue
if type(value) is not list:
self.attrs[key] = [value]
else:
self.attrs[key] = value
self.exists = True
def check_create(self, result, extra_keys=()):
""" Check idp-add command result """
expected = self.filter_attrs(self.create_keys | set(extra_keys))
assert_deepequal(
dict(
value=self.cn,
summary='Added Identity Provider reference "%s"' % self.cn,
result=self.filter_attrs(expected),
), result)
def make_delete_command(self):
""" Make function that deletes an idp using idp-del """
return self.make_command('idp_del', self.cn)
def check_delete(self, result):
""" Check idp-del command result """
assert_deepequal(
dict(
value=[self.cn],
summary='Deleted Identity Provider reference "%s"' % self.cn,
result=dict(failed=[]),
), result)
def make_retrieve_command(self, all=False, raw=False):
""" Make function that retrieves an idp using idp-show """
return self.make_command('idp_show', self.cn, all=all)
def check_retrieve(self, result, all=False, raw=False):
""" Check idp-show command result """
if all:
expected = self.filter_attrs(self.retrieve_all_keys)
else:
expected = self.filter_attrs(self.retrieve_keys)
assert_deepequal(dict(
value=self.cn,
summary=None,
result=expected,
), result)
def make_find_command(self, *args, **kwargs):
""" Make function that finds idp using idp-find """
return self.make_command('idp_find', *args, **kwargs)
def check_find(self, result, all=False, raw=False, pkey_only=False):
""" Check idp-find command result """
if all:
expected = self.filter_attrs(self.find_all_keys)
elif pkey_only:
expected = self.filter_attrs(self.primary_keys)
else:
expected = self.filter_attrs(self.find_keys)
assert_deepequal(dict(
count=1,
truncated=False,
summary='1 Identity Provider reference matched',
result=[expected],
), result)
def make_update_command(self, updates):
""" Make function that updates an idp using idp_mod """
return self.make_command('idp_mod', self.cn, **updates)
def update(self, updates, expected_updates=None):
"""Helper function to update this idp and check the result
Overriding Tracker method for setting self.attrs correctly;
* most attributes stores its value in list
* the rest can be overridden by expected_updates
* allow deleting parameters if update value is None
"""
if expected_updates is None:
expected_updates = {}
self.ensure_exists()
command = self.make_update_command(updates)
result = command()
for key, value in updates.items():
if value is None or value == '':
del self.attrs[key]
elif key == 'rename':
self.attrs['cn'] = [value]
else:
if type(value) is list:
self.attrs[key] = value
else:
self.attrs[key] = [value]
for key, value in expected_updates.items():
if value is None or value == '':
del self.attrs[key]
else:
self.attrs[key] = value
self.check_update(
result,
extra_keys=set(updates.keys()) | set(expected_updates.keys())
)
if 'rename' in updates:
self.cn = self.attrs['cn'][0]
def check_update(self, result, extra_keys=()):
""" Check idp-mod command result """
expected = self.filter_attrs(self.update_keys | set(extra_keys))
assert_deepequal(dict(
value=self.cn,
summary='Modified Identity Provider reference "%s"' % self.cn,
result=expected
), result)

View File

@@ -0,0 +1,126 @@
#
# Copyright (C) 2022 FreeIPA Contributors see COPYING for license
#
from ipapython.dn import DN
from ipatests.test_xmlrpc import objectclasses
from ipatests.test_xmlrpc.tracker.base import ConfigurationTracker
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_string
from ipatests.util import assert_deepequal
class PasskeyconfigTracker(ConfigurationTracker):
retrieve_keys = {
'dn',
'iparequireuserverification',
}
retrieve_all_keys = retrieve_keys | {
'cn',
'objectclass',
'aci',
}
update_keys = retrieve_keys - {'dn'}
singlevalue_keys = {'iparequireuserverification'}
def __init__(self, default_version=None):
super(PasskeyconfigTracker, self).__init__(
default_version=default_version)
self.attrs = {
'dn': DN(self.api.env.container_passkey, self.api.env.basedn),
'cn': [self.api.env.container_passkey[0].value],
'objectclass': objectclasses.passkeyconfig,
'aci': [fuzzy_string],
'iparequireuserverif': self.api.Command.passkeyconfig_show(
)['result']['iparequireuserverification'],
}
def make_update_command(self, updates):
return self.make_command('passkeyconfig_mod', **updates)
def check_update(self, result, extra_keys=()):
assert_deepequal(
dict(
value=None,
summary=None,
result=self.filter_attrs(self.update_keys | set(extra_keys)),
),
result
)
def make_retrieve_command(self, all=False, raw=False):
return self.make_command('passkeyconfig_show', all=all, raw=raw)
def check_retrieve(self, result, all=False, raw=False):
if all:
expected = self.filter_attrs(self.retrieve_all_keys)
else:
expected = self.filter_attrs(self.retrieve_keys)
assert_deepequal(
dict(
value=None,
summary=None,
result=expected,
),
result
)
class PasskeyMixin:
def _make_add_passkey(self):
raise NotImplementedError("_make_add_passkey method must be "
"implemented in instance.")
def _make_remove_passkey(self):
raise NotImplementedError("_make_remove_passkey method must be "
"implemented in instance.")
def add_passkey(self, **kwargs):
cmd = self._make_add_passkey()
result = cmd(**kwargs)
data = kwargs.get('ipapasskey', [])
if not isinstance(data, list):
data = [data]
self.attrs.setdefault('ipapasskey', []).extend(data)
expected = dict(
summary=('Added passkey mappings to user '
'"{}"'.format(self.name)),
value=self.name,
result=dict(
uid=(self.name,),
),
)
if self.attrs['ipapasskey']:
expected['result']['ipapasskey'] = (
self.attrs['ipapasskey'])
assert_deepequal(expected, result)
def remove_passkey(self, **kwargs):
cmd = self._make_remove_passkey()
result = cmd(**kwargs)
data = kwargs.get('ipapasskey', [])
if not isinstance(data, list):
data = [data]
for key in data:
self.attrs['ipapasskey'].remove(key)
expected = dict(
summary=('Removed passkey mappings from user '
'"{}"'.format(self.name)),
value=self.name,
result=dict(
uid=(self.name,),
),
)
if self.attrs['ipapasskey']:
expected['result']['ipapasskey'] = (
self.attrs['ipapasskey'])
assert_deepequal(expected, result)

View File

@@ -8,6 +8,7 @@ from ipalib import api, errors
from ipaplatform.constants import constants as platformconstants
from ipatests.test_xmlrpc.tracker.base import Tracker
from ipatests.test_xmlrpc.tracker.passkey_plugin import PasskeyMixin
from ipatests.test_xmlrpc.tracker.kerberos_aliases import KerberosAliasMixin
from ipatests.test_xmlrpc import objectclasses
from ipatests.test_xmlrpc.xmlrpc_test import (
@@ -30,7 +31,7 @@ sshpubkeyfp = (u'SHA256:cStA9o5TRSARbeketEOooMUMSWRSsArIAXloBZ4vNsE '
'public key test (ssh-rsa)')
class StageUserTracker(KerberosAliasMixin, Tracker):
class StageUserTracker(PasskeyMixin, KerberosAliasMixin, Tracker):
""" Tracker class for staged user LDAP object
Implements helper functions for host plugin.
@@ -147,7 +148,7 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
loginshell=[platformconstants.DEFAULT_SHELL],
has_keytab=False,
has_password=False,
nsaccountlock=[u'true'],
nsaccountlock=True,
)
for key in self.kwargs:
@@ -201,14 +202,6 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
else:
expected = self.filter_attrs(self.retrieve_keys)
# small override because stageuser-find returns different
# type of nsaccountlock value than DS, but overall the value
# fits expected result
if expected[u'nsaccountlock'] == [u'true']:
expected[u'nsaccountlock'] = True
elif expected[u'nsaccountlock'] == [u'false']:
expected[u'nsaccountlock'] = False
assert_deepequal(dict(
value=self.uid,
summary=None,
@@ -222,14 +215,6 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
else:
expected = self.filter_attrs(self.find_keys)
# small override because stageuser-find returns different
# type of nsaccountlock value than DS, but overall the value
# fits expected result
if expected[u'nsaccountlock'] == [u'true']:
expected[u'nsaccountlock'] = True
elif expected[u'nsaccountlock'] == [u'false']:
expected[u'nsaccountlock'] = False
assert_deepequal(dict(
count=1,
truncated=False,
@@ -301,3 +286,10 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
def _make_remove_alias_cmd(self):
return self.make_command('stageuser_remove_principal', self.name)
# Passkey mapping methods
def _make_add_passkey(self):
return self.make_command('stageuser_add_passkey', self.name)
def _make_remove_passkey(self):
return self.make_command('stageuser_remove_passkey', self.name)

View File

@@ -11,16 +11,19 @@ import six
from ipatests.util import assert_deepequal, get_group_dn
from ipatests.test_xmlrpc import objectclasses
from ipatests.test_xmlrpc.xmlrpc_test import (
fuzzy_digits, fuzzy_uuid, raises_exact)
fuzzy_set_optional_oc,
fuzzy_digits, fuzzy_uuid, fuzzy_user_or_group_sid, raises_exact)
from ipatests.test_xmlrpc.tracker.base import Tracker
from ipatests.test_xmlrpc.tracker.kerberos_aliases import KerberosAliasMixin
from ipatests.test_xmlrpc.tracker.certmapdata import CertmapdataMixin
from ipatests.test_xmlrpc.tracker.passkey_plugin import PasskeyMixin
if six.PY3:
unicode = str
class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
class UserTracker(PasskeyMixin, CertmapdataMixin, KerberosAliasMixin,
Tracker):
""" Class for host plugin like tests """
retrieve_keys = {
@@ -40,7 +43,8 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
u'l', u'mobile', u'krbextradata', u'krblastpwdchange',
u'krbpasswordexpiration', u'pager', u'st', u'manager', u'cn',
u'ipauniqueid', u'objectclass', u'mepmanagedentry',
u'displayname', u'gecos', u'initials', u'preserved'}
u'displayname', u'gecos', u'initials', u'preserved',
'ipantsecurityidentifier'}
retrieve_preserved_keys = (retrieve_keys - {u'memberof_group'}) | {
u'preserved'}
@@ -50,6 +54,7 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
u'krbextradata', u'krbpasswordexpiration', u'krblastpwdchange',
u'krbprincipalkey', u'userpassword', u'randompassword'}
create_keys = create_keys - {u'nsaccountlock'}
create_keys = create_keys - {'ipantsecurityidentifier'}
update_keys = retrieve_keys - {u'dn'}
activate_keys = retrieve_keys
@@ -122,7 +127,8 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
api.env.container_deleteuser,
api.env.basedn
)
self.attrs[u'objectclass'] = objectclasses.user_base
self.attrs[u'objectclass'] = objectclasses.user_base \
+ ['ipantuserattrs']
return self.make_command(
'user_del', self.uid,
@@ -173,7 +179,8 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
displayname=[u'%s %s' % (self.givenname, self.sn)],
cn=[u'%s %s' % (self.givenname, self.sn)],
initials=[u'%s%s' % (self.givenname[0], self.sn[0])],
objectclass=objectclasses.user,
objectclass=fuzzy_set_optional_oc(
objectclasses.user, 'ipantuserattrs'),
description=[u'__no_upg__'],
ipauniqueid=[fuzzy_uuid],
uidnumber=[fuzzy_digits],
@@ -188,26 +195,29 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
mepmanagedentry=[get_group_dn(self.uid)],
memberof_group=[u'ipausers'],
nsaccountlock=[u'false'],
ipantsecurityidentifier=[fuzzy_user_or_group_sid],
)
for key in self.kwargs:
if key == u'krbprincipalname':
for key, value in self.kwargs.items():
if key == "krbprincipalname":
try:
self.attrs[key] = [u'%s@%s' % (
(self.kwargs[key].split('@'))[0].lower(),
(self.kwargs[key].split('@'))[1]
)]
princ_splitted = value.split("@", maxsplit=1)
self.attrs[key] = [
"{}@{}".format(
princ_splitted[0].lower(),
princ_splitted[1],
)
]
except IndexError:
# we can provide just principal part
self.attrs[key] = [u'%s@%s' % (
(self.kwargs[key].lower(),
self.api.env.realm)
)]
self.attrs[key] = [
"{}@{}".format(value.lower(), self.api.env.realm)
]
else:
if type(self.kwargs[key]) is not list:
self.attrs[key] = [self.kwargs[key]]
if not isinstance(value, list):
self.attrs[key] = [value]
else:
self.attrs[key] = self.kwargs[key]
self.attrs[key] = value
self.exists = True
@@ -265,9 +275,14 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
def check_delete(self, result):
""" Check 'user-del' command result """
if u'preserved' in self.attrs and self.attrs[u'preserved']:
summary = u'Preserved user "%s"' % self.uid
else:
summary = u'Deleted user "%s"' % self.uid
assert_deepequal(dict(
value=[self.uid],
summary=u'Deleted user "%s"' % self.uid,
summary=summary,
result=dict(failed=[]),
), result)
@@ -299,7 +314,7 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
result=expected,
), result)
def check_find(self, result, all=False, pkey_only=False, raw=False,
def check_find(self, result, all=False, raw=False, pkey_only=False,
expected_override=None):
""" Check 'user-find' command result """
if all:
@@ -540,3 +555,10 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
def _make_remove_certmap(self):
return self.make_command('user_remove_certmapdata', self.name)
# Passkey mapping methods
def _make_add_passkey(self):
return self.make_command('user_add_passkey', self.name)
def _make_remove_passkey(self):
return self.make_command('user_remove_passkey', self.name)