mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
automember rebuild nowait feature added
automember-rebuild uses asynchronous 389 task, and returned success even if the task didn't run. this patch fixes this issue adding a --nowait parameter to 'ipa automember-rebuild', defaulting to False, thus when the script runs without it, it waits for the 'nstaskexitcode' attribute, which means the task has finished. Old usage can be enabled using --nowait, and returns the DN of the task for further polling. New tests added also. https://fedorahosted.org/freeipa/ticket/4239 Reviewed-By: Petr Viktorin <pviktori@redhat.com>
This commit is contained in:
committed by
Petr Viktorin
parent
c58d6b2689
commit
8b91d9a6e8
@@ -17,8 +17,11 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
import uuid
|
||||
import time
|
||||
|
||||
import ldap as _ldap
|
||||
from ipalib import api, errors, Str, StrEnum, _, ngettext
|
||||
|
||||
from ipalib import api, errors, Str, StrEnum, DNParam, _, ngettext
|
||||
from ipalib.plugins.baseldap import *
|
||||
from ipalib.request import context
|
||||
from ipapython.dn import DN
|
||||
@@ -623,9 +626,21 @@ class automember_rebuild(Command):
|
||||
label=_('Hosts'),
|
||||
doc=_('Rebuild membership for specified hosts'),
|
||||
),
|
||||
Flag(
|
||||
'no_wait?',
|
||||
default=False,
|
||||
label=_('No wait'),
|
||||
doc=_("Don't wait for rebuilding membership"),
|
||||
),
|
||||
)
|
||||
has_output = output.standard_entry
|
||||
has_output_params = (
|
||||
DNParam(
|
||||
'dn',
|
||||
label=_('Task DN'),
|
||||
doc=_('DN of the started task'),
|
||||
),
|
||||
)
|
||||
has_output = output.standard_value
|
||||
msg_summary = _('Automember rebuild membership task completed')
|
||||
|
||||
def validate(self, **kw):
|
||||
"""
|
||||
@@ -693,20 +708,51 @@ class automember_rebuild(Command):
|
||||
else:
|
||||
search_filter = '(%s=*)' % obj.primary_key.name
|
||||
|
||||
task_dn = DN(
|
||||
('cn', cn),
|
||||
('cn', 'automember rebuild membership'),
|
||||
('cn', 'tasks'),
|
||||
('cn', 'config'))
|
||||
|
||||
entry = ldap.make_entry(
|
||||
DN(
|
||||
('cn', cn),
|
||||
('cn', 'automember rebuild membership'),
|
||||
('cn', 'tasks'),
|
||||
('cn', 'config'),
|
||||
),
|
||||
task_dn,
|
||||
objectclass=['top', 'extensibleObject'],
|
||||
cn=[cn],
|
||||
basedn=[basedn],
|
||||
filter=[search_filter],
|
||||
scope=['sub']
|
||||
)
|
||||
scope=['sub'],
|
||||
ttl=[3600])
|
||||
ldap.add_entry(entry)
|
||||
return dict(result=True, value=u'')
|
||||
|
||||
summary = _('Automember rebuild membership task started')
|
||||
result = {'dn': task_dn}
|
||||
|
||||
if not options.get('no_wait'):
|
||||
summary = _('Automember rebuild membership task completed')
|
||||
result = {}
|
||||
start_time = time.time()
|
||||
|
||||
while True:
|
||||
try:
|
||||
task = ldap.get_entry(task_dn)
|
||||
except errors.NotFound:
|
||||
break
|
||||
|
||||
if 'nstaskexitcode' in task:
|
||||
if str(task.single_value['nstaskexitcode']) == '0':
|
||||
summary=task.single_value['nstaskstatus']
|
||||
break
|
||||
else:
|
||||
raise errors.DatabaseError(
|
||||
desc=task.single_value['nstaskstatus'],
|
||||
info=_("Task DN = '%s'" % task_dn))
|
||||
time.sleep(1)
|
||||
if time.time() > (start_time + 60):
|
||||
raise errors.TaskTimeout(task=_('Automember'), task_dn=task_dn)
|
||||
|
||||
return dict(
|
||||
result=result,
|
||||
summary=unicode(summary),
|
||||
value=u'')
|
||||
|
||||
api.register(automember_rebuild)
|
||||
|
||||
Reference in New Issue
Block a user