@@ -73,53 +73,27 @@ def cmp(a, b):
73
73
74
74
75
75
def issubset (subset , superset ):
76
- """Recurse through nested dictionary and compare entries """
76
+ """Recurse through a nested dictionary and check if it is a subset of another. """
77
77
78
- # Both objects are the same object
79
- if subset is superset :
80
- return True
81
-
82
- # Both objects are identical
83
- if subset == superset :
84
- return True
85
-
86
- # Both objects have a different type
87
- if isinstance (subset ) is not isinstance (superset ):
78
+ if type (subset ) is not type (superset ):
88
79
return False
89
80
81
+ if not isinstance (subset , dict ):
82
+ if isinstance (subset , list ):
83
+ return all (item in superset for item in subset )
84
+ return subset == superset
85
+
90
86
for key , value in subset .items ():
91
- # Ignore empty values
92
87
if value is None :
93
- return True
88
+ continue
94
89
95
- # Item from subset is missing from superset
96
90
if key not in superset :
97
91
return False
98
92
99
- # Item has different types in subset and superset
100
- if isinstance (superset .get (key )) is not isinstance (value ):
101
- return False
93
+ superset_value = superset .get (key )
102
94
103
- # Compare if item values are subset
104
- if isinstance (value , dict ):
105
- if not issubset (superset .get (key ), value ):
106
- return False
107
- elif isinstance (value , list ):
108
- try :
109
- # NOTE: Fails for lists of dicts
110
- if not set (value ) <= set (superset .get (key )):
111
- return False
112
- except TypeError :
113
- # Fall back to exact comparison for lists of dicts
114
- diff = list (filterfalse (lambda i : i in value , superset .get (key ))) + list (filterfalse (lambda j : j in superset .get (key ), value ))
115
- if diff :
116
- return False
117
- elif isinstance (value , set ):
118
- if not value <= superset .get (key ):
119
- return False
120
- else :
121
- if not value == superset .get (key ):
122
- return False
95
+ if not issubset (value , superset_value ):
96
+ return False
123
97
124
98
return True
125
99
@@ -210,6 +184,9 @@ def __init__(self, module):
210
184
211
185
# info output
212
186
self .previous = dict ()
187
+ self .before = []
188
+ self .commands = []
189
+ self .after = []
213
190
self .proposed = dict ()
214
191
self .sent = dict ()
215
192
self .stdout = None
@@ -433,6 +410,7 @@ def exit_json(self, **kwargs):
433
410
if self .params .get ("state" ) in ALLOWED_STATES_TO_APPEND_SENT_AND_PROPOSED :
434
411
if self .params .get ("output_level" ) in ("debug" , "info" ):
435
412
self .result ["previous" ] = self .previous
413
+ self .result ["before" ] = self .before
436
414
# FIXME: Modified header only works for PATCH
437
415
if not self .has_modified and self .previous != self .existing :
438
416
self .result ["changed" ] = True
@@ -450,8 +428,10 @@ def exit_json(self, **kwargs):
450
428
if self .params .get ("state" ) in ALLOWED_STATES_TO_APPEND_SENT_AND_PROPOSED :
451
429
self .result ["sent" ] = self .sent
452
430
self .result ["proposed" ] = self .proposed
431
+ self .result ["commands" ] = self .commands
453
432
454
433
self .result ["current" ] = self .existing
434
+ self .result ["after" ] = self .after
455
435
456
436
if self .module ._diff and self .result .get ("changed" ) is True :
457
437
self .result ["diff" ] = dict (
@@ -468,6 +448,7 @@ def fail_json(self, msg, **kwargs):
468
448
if self .params .get ("state" ) in ALLOWED_STATES_TO_APPEND_SENT_AND_PROPOSED :
469
449
if self .params .get ("output_level" ) in ("debug" , "info" ):
470
450
self .result ["previous" ] = self .previous
451
+ self .result ["before" ] = self .before
471
452
# FIXME: Modified header only works for PATCH
472
453
if not self .has_modified and self .previous != self .existing :
473
454
self .result ["changed" ] = True
@@ -486,8 +467,10 @@ def fail_json(self, msg, **kwargs):
486
467
if self .params .get ("state" ) in ALLOWED_STATES_TO_APPEND_SENT_AND_PROPOSED :
487
468
self .result ["sent" ] = self .sent
488
469
self .result ["proposed" ] = self .proposed
470
+ self .result ["commands" ] = self .commands
489
471
490
472
self .result ["current" ] = self .existing
473
+ self .result ["after" ] = self .after
491
474
492
475
self .result .update (** kwargs )
493
476
self .module .fail_json (msg = msg , ** self .result )
@@ -499,23 +482,30 @@ def check_changed(self):
499
482
existing ["password" ] = self .sent .get ("password" )
500
483
return not issubset (self .sent , existing )
501
484
502
- def get_diff (self , unwanted = None ):
485
+ def get_diff (self , unwanted = None , previous = None , payload = None ):
503
486
"""Check if existing payload and sent payload and removing keys that are not required"""
504
487
if unwanted is None :
505
488
unwanted = []
506
- if not self .existing and self .sent :
507
- return True
489
+
490
+ if previous is None and payload is None :
491
+ if not self .existing and self .sent :
492
+ return True
508
493
509
494
existing = self .existing
510
495
sent = self .sent
511
496
497
+ if previous and payload :
498
+ existing = previous
499
+ sent = payload
500
+
512
501
for key in unwanted :
513
502
if isinstance (key , str ):
514
503
if key in existing :
515
504
try :
516
505
del existing [key ]
517
506
except KeyError :
518
507
pass
508
+ if key in sent :
519
509
try :
520
510
del sent [key ]
521
511
except KeyError :
@@ -524,12 +514,14 @@ def get_diff(self, unwanted=None):
524
514
key_path , last = key [:- 1 ], key [- 1 ]
525
515
try :
526
516
existing_parent = reduce (dict .get , key_path , existing )
527
- del existing_parent [last ]
517
+ if existing_parent is not None :
518
+ del existing_parent [last ]
528
519
except KeyError :
529
520
pass
530
521
try :
531
522
sent_parent = reduce (dict .get , key_path , sent )
532
- del sent_parent [last ]
523
+ if sent_parent is not None :
524
+ del sent_parent [last ]
533
525
except KeyError :
534
526
pass
535
527
return not issubset (sent , existing )
@@ -567,3 +559,8 @@ def get_object_by_nested_key_value(self, path, nested_key_path, value, data_key=
567
559
return obj
568
560
569
561
return None
562
+
563
+ def delete (self , check_mode , path ):
564
+ if not check_mode :
565
+ self .request (path , method = "DELETE" )
566
+ return {"path" : path , "method" : "DELETE" }
0 commit comments