Compare commits

..

2 Commits

Author SHA1 Message Date
a4050ac521
added get_changes function .
All checks were successful
buildbot/multibuild_parent Build done.
buildbot/travis_bionic Build done.
2024-06-11 06:40:43 +05:30
4b476a8c3d
created common.py for extracting deep comparision function.
All checks were successful
buildbot/travis_bionic Build done.
buildbot/multibuild_parent Build done.
2024-06-06 10:36:30 +05:30
3 changed files with 39 additions and 396 deletions

View File

@ -0,0 +1,36 @@
import json
def deep_equal(a, b):
"""
Compare two data structures for deep equality by converting them to JSON strings.
Parameters:
a (any): First data structure to compare.
b (any): Second data structure to compare.
Returns:
bool: True if the two data structures are equal, False otherwise.
"""
return json.dumps(a, sort_keys=True) == json.dumps(b, sort_keys=True)
def get_changes(module_params, module_args_keys_list, current_config):
"""
Function to get changes by comparing module parameters with current configuration.
Args:
module_params (dict): The parameters of the module.
module_args_keys_list (list): List of keys to check in module parameters.
current_config (dict): The current configuration to compare against.
Returns:
dict: A dictionary containing the changes.
"""
changes = {}
for key, value in module_params.items():
if key in module_args_keys_list:
if value is not None:
if not deep_equal(value, current_config.get(key)):
changes[key] = value
return changes

View File

@ -151,10 +151,7 @@ response:
'''
from ansible_collections.community.syncthing.plugins.module_utils.syncthing_api import SyncthingModule
import json
def deep_equal(a, b):
return json.dumps(a, sort_keys=True) == json.dumps(b, sort_keys=True)
from ansible_collections.community.syncthing.plugins.module_utils.common import get_changes
def run_module():
module_args = dict(
@ -187,17 +184,8 @@ def run_module():
module_args_keys_list = list(module_args.keys())
changes = {}
for key, value in module.params.items():
# Check if the key is in module_args_keys_list
if key in module_args_keys_list:
# Check if the value is not None
if value is not None:
# Check if the value is different from the current_config
if not deep_equal(value, current_config.get(key)):
# If all conditions are met, add the key-value pair to changes
changes[key] = value
# Using get_changes function to determine what has changed
changes = get_changes(module.params, current_config)
if module.check_mode or len(changes.keys()) == 0:
module.result['device_defaults'] = current_config

View File

@ -1,381 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright: (c) 2018, Rafael Bodill <justrafi at google mail>
# Copyright: (c) 2020, Borjan Tchakaloff <first name at last name dot fr>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
ANSIBLE_METADATA = {
'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'
}
DOCUMENTATION = '''
---
module: folder_defaults
short_description: Manage Syncthing folder default configurations
version_added: "2.7"
description:
- "This module allows you to manage Syncthing folder default configurations.
You can update the default configurations using this module.
It uses the Syncthing REST API to perform these operations."
options:
id:
description:
- The ID of the module.
type: str
required: false
label:
description:
- The label for the module.
type: str
required: false
filesystemType:
description:
- The filesystem type for the module.
type: str
required: false
default: basic
path:
description:
- The path for the module.
type: str
required: false
default: ~
type:
description:
- The type of the module.
type: str
required: false
default: sendreceive
choices: [sendreceive, sendonly, receiveonly]
devices:
description:
- List of devices for the module.
type: list
required: false
default: []
rescanIntervalS:
description:
- The rescan interval for the module in seconds.
type: int
required: false
default: 3600
fsWatcherEnabled:
description:
- Whether the filesystem watcher is enabled for the module.
type: bool
required: false
default: true
fsWatcherDelayS:
description:
- The filesystem watcher delay for the module in seconds.
type: int
required: false
default: 10
ignorePerms:
description:
- Whether to ignore permissions for the module.
type: bool
required: false
default: false
autoNormalize:
description:
- Whether to automatically normalize for the module.
type: bool
required: false
default: true
minDiskFree:
description:
- The minimum disk free for the module.
type: dict
required: false
default: {value: 1, unit: '%'}
versioning:
description:
- The versioning for the module.
type: dict
required: false
default: {type: '', params: {}, cleanupIntervalS: 3600, fsPath: '', fsType: 'basic'}
copiers:
description:
- The number of copiers for the module.
type: int
required: false
default: 0
pullerMaxPendingKiB:
description:
- The maximum pending puller size for the module in KiB.
type: int
required: false
default: 0
hashers:
description:
- The number of hashers for the module.
type: int
required: false
default: 0
order:
description:
- The order for the module.
type: str
required: false
default: random
ignoreDelete:
description:
- Whether to ignore delete for the module.
type: bool
required: false
default: false
scanProgressIntervalS:
description:
- The scan progress interval for the module in seconds.
type: int
required: false
default: 0
pullerPauseS:
description:
- The puller pause for the module in seconds.
type: int
required: false
default: 0
maxConflicts:
description:
- The maximum number of conflicts for the module.
type: int
required: false
default: 10
disableSparseFiles:
description:
- Whether to disable sparse files for the module.
type: bool
required: false
default: false
disableTempIndexes:
description:
- Whether to disable temporary indexes for the module.
type: bool
required: false
default: false
paused:
description:
- Whether the module is paused.
type: bool
required: false
default: false
weakHashThresholdPct:
description:
- The weak hash threshold for the module in percentage.
type: int
required: false
default: 25
markerName:
description:
- The marker name for the module.
type: str
required: false
default: .stfolder
copyOwnershipFromParent:
description:
- Whether to copy ownership from parent for the module.
type: bool
required: false
default: false
modTimeWindowS:
description:
- The modification time window for the module in seconds.
type: int
required: false
default: 0
maxConcurrentWrites:
description:
- The maximum number of concurrent writes for the module.
type: int
required: false
default: 2
disableFsync:
description:
- Whether to disable fsync for the module.
type: bool
required: false
default: false
blockPullOrder:
description:
- The block pull order for the module.
type: str
required: false
default: standard
copyRangeMethod:
description:
- The copy range method for the module.
type: str
required: false
default: standard
caseSensitiveFS:
description:
- Whether the filesystem is case sensitive for the module.
type: bool
required: false
default: false
junctionsAsDirs:
description:
- Whether to treat junctions as directories for the module.
type: bool
required: false
default: false
syncOwnership:
description:
- Whether to synchronize ownership for the module.
type: bool
required: false
default: false
sendOwnership:
description:
- Whether to send ownership for the module.
type: bool
required: false
default: false
syncXattrs:
description:
- Whether to synchronize extended attributes for the module.
type: bool
required: false
default: false
sendXattrs:
description:
- Whether to send extended attributes for the module.
type: bool
required: false
default: false
xattrFilter:
description:
- The extended attribute filter for the module.
type: dict
required: false
default: {entries: [], maxSingleEntrySize: 1024, maxTotalSize: 4096}
author:
- Rafael Bodill (@rafi)
'''
EXAMPLES = '''
# Get/Update folder_defaults
- name: Get folder_defaults
become: yes
become_user: syncthing
community.syncthing.folder_defaults:
host: http://localhost
unix_socket: /run/syncthing/syncthing.sock
config_file: /var/lib/syncthing/.config/syncthing/config.xml
id: "default"
label: "default"
path: "/"
paused: false
register: folder_defaults
'''
RETURN = '''
folder_defaults:
description: The default configuration of the folder after the operation.
type: dict
changed:
description: Whether any changes were made.
type: bool
response:
description: The API response, in-case of an error.
type: dict
'''
from ansible_collections.community.syncthing.plugins.module_utils.syncthing_api import SyncthingModule
import json
def deep_equal(a, b):
return json.dumps(a, sort_keys=True) == json.dumps(b, sort_keys=True)
def run_module():
module_args = dict(
id=dict(type='str', required=False),
label=dict(type='str', required=False),
filesystemType=dict(type='str', required=False, default='basic'),
path=dict(type='str', required=False, default='~'),
type=dict(type='str', default='sendreceive',
choices=['sendreceive', 'sendonly', 'receiveonly']),
devices=dict(type='list', required=False, default=[]),
rescanIntervalS=dict(type='int', required=False, default=3600),
fsWatcherEnabled=dict(type='bool', required=False, default=True),
fsWatcherDelayS=dict(type='int', required=False, default=10),
ignorePerms=dict(type='bool', required=False, default=False),
autoNormalize=dict(type='bool', required=False, default=True),
minDiskFree=dict(type='dict', required=False, default=dict(value=1, unit='%')),
versioning=dict(type='dict', required=False,
default=dict(type='', params={}, cleanupIntervalS=3600, fsPath='', fsType='basic')),
copiers=dict(type='int', required=False, default=0),
pullerMaxPendingKiB=dict(type='int', required=False, default=0),
hashers=dict(type='int', required=False, default=0),
order=dict(type='str', required=False, default='random'),
ignoreDelete=dict(type='bool', required=False, default=False),
scanProgressIntervalS=dict(type='int', required=False, default=0),
pullerPauseS=dict(type='int', required=False, default=0),
maxConflicts=dict(type='int', required=False, default=10),
disableSparseFiles=dict(type='bool', required=False, default=False),
disableTempIndexes=dict(type='bool', required=False, default=False),
paused=dict(type='bool', required=False, default=False),
weakHashThresholdPct=dict(type='int', required=False, default=25),
markerName=dict(type='str', required=False, default='.stfolder'),
copyOwnershipFromParent=dict(type='bool', required=False, default=False),
modTimeWindowS=dict(type='int', required=False, default=0),
maxConcurrentWrites=dict(type='int', required=False, default=2),
disableFsync=dict(type='bool', required=False, default=False),
blockPullOrder=dict(type='str', required=False, default='standard'),
copyRangeMethod=dict(type='str', required=False, default='standard'),
caseSensitiveFS=dict(type='bool', required=False, default=False),
junctionsAsDirs=dict(type='bool', required=False, default=False),
syncOwnership=dict(type='bool', required=False, default=False),
sendOwnership=dict(type='bool', required=False, default=False),
syncXattrs=dict(type='bool', required=False, default=False),
sendXattrs=dict(type='bool', required=False, default=False),
xattrFilter=dict(type='dict', required=False,
default=dict(entries=[], maxSingleEntrySize=1024, maxTotalSize=4096)),
)
module = SyncthingModule(
api_url='/rest/config/defaults/folder',
argument_spec=module_args,
)
current_config = module.get_call()
module_args_keys_list = list(module_args.keys())
changes = {}
for key, value in module.params.items():
# Check if the key is in module_args_keys_list
if key in module_args_keys_list:
# Check if the value is not None
if value is not None:
# Check if the value is different from the current_config
if not deep_equal(value, current_config.get(key)):
# If all conditions are met, add the key-value pair to changes
changes[key] = value
if module.check_mode or len(changes.keys()) == 0:
module.result['folder_defaults'] = current_config
module.exit_json()
module.patch_call(data=module.params)
module.result['folder_defaults'] = module.get_call()
module.result['changed'] = True
module.result['changes'] = changes
module.exit_json()
def main():
run_module()
if __name__ == '__main__':
main()