Skip to content

Commit 8a5392d

Browse files
Merge pull request #486 from netscaler/rresources
Handling non-updatable attributes while updating a resource
2 parents 98f1b1e + 76c6085 commit 8a5392d

File tree

1 file changed

+44
-16
lines changed

1 file changed

+44
-16
lines changed

plugins/module_utils/module_executor.py

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -361,13 +361,9 @@ def is_resource_identical(self):
361361
if not self.module_result["diff_list"]:
362362
del self.module_result["diff_list"]
363363
if immutable_resource_module_params != []:
364-
msg = (
365-
"Cannot change value for the following non-updateable attributes %s"
366-
% immutable_resource_module_params
367-
)
368-
self.return_failure(msg)
364+
return (False, immutable_resource_module_params)
369365

370-
return False if diff_list else True
366+
return (False, None) if diff_list else (True, None)
371367

372368
@trace
373369
def create_or_update(self):
@@ -430,8 +426,13 @@ def create_or_update(self):
430426
self.resource_module_params["sitename"] = sitename
431427

432428
else:
433-
# Update only if resource is not identical (idempotent)
434-
if self.is_resource_identical():
429+
# Update process will go through 2 iterations of is_resource_identical
430+
# 1. First iteration will check if the resource is identical. If not, it will give the list of non-updatable attributes that exists
431+
# in the user playbook. If non-updatable attributes are present, it will remove them from the module_params and update the resource
432+
# 2. Second iteration will check if the resource is identical. If not, it will update the resource after ignoring the
433+
# non-updatable resources
434+
is_identical, immutable_keys_list = self.is_resource_identical()
435+
if is_identical:
435436
log(
436437
"INFO: Resource `%s:%s` exists and is identical. No change required."
437438
% (
@@ -451,19 +452,46 @@ def create_or_update(self):
451452
ok, err = create_resource(
452453
self.client, self.resource_name, self.resource_module_params
453454
)
454-
else:
455+
456+
elif immutable_keys_list is None:
457+
self.module_result["changed"] = True
455458
log(
456-
"INFO: Resource %s:%s exists. Will be UPDATED."
457-
% (
458-
self.resource_name,
459-
self.resource_id,
460-
)
459+
"INFO: Resource %s:%s exists and is different. Will be UPDATED."
460+
% (self.resource_name, self.resource_id)
461461
)
462462
ok, err = update_resource(
463463
self.client, self.resource_name, self.resource_module_params
464464
)
465-
if not ok:
466-
self.return_failure(err)
465+
if not ok:
466+
self.return_failure(err)
467+
else:
468+
for key in immutable_keys_list:
469+
self.resource_module_params.pop(key)
470+
471+
is_identical, temp_immutable_list = self.is_resource_identical()
472+
# temp_immutable_list is a dummy as '_' is not allowed in lint.
473+
if is_identical:
474+
msg = (
475+
f"Resource {self.resource_name}/{self.resource_id} not updated because user is trying to "
476+
f"update following non-updatable keys: {immutable_keys_list}"
477+
)
478+
self.module.warn(msg)
479+
log(msg)
480+
self.module_result["changed"] = False
481+
self.module.exit_json(**self.module_result)
482+
else:
483+
self.module_result["changed"] = True
484+
msg = (
485+
f"Resource {self.resource_name}/{self.resource_id} is updated after ignoring following "
486+
f"non-updatable keys: {immutable_keys_list}"
487+
)
488+
self.module.warn(msg)
489+
log(msg)
490+
ok, err = update_resource(
491+
self.client, self.resource_name, self.resource_module_params
492+
)
493+
if not ok:
494+
self.return_failure(err)
467495

468496
@trace
469497
def enable_or_disable(self, desired_state):

0 commit comments

Comments
 (0)