def main():
    module = ForemanSettingModule(foreman_spec=dict(
        name=dict(required=True),
        value=dict(type='raw'),
    ), )

    with module.api_connection():
        entity = module.lookup_entity('entity')

        if 'value' not in module.foreman_params:
            module.foreman_params['value'] = entity['default'] or ''

        settings_type = entity['settings_type']
        new_value = module.foreman_params['value']
        # Allow to pass integers as string
        if settings_type == 'integer':
            new_value = int(new_value)
        module.foreman_params['value'] = parameter_value_to_str(
            new_value, settings_type)
        old_value = entity['value']
        entity['value'] = parameter_value_to_str(old_value, settings_type)

        entity = module.ensure_entity('settings',
                                      module.foreman_params,
                                      entity,
                                      state='present')

        if entity:
            # Fake the not serialized input value as output
            entity['value'] = new_value

        module.exit_json(foreman_setting=entity)
def main():
    module = ForemanCommonParameterModule(
        foreman_spec=dict(
            name=dict(required=True),
            value=dict(type='raw'),
            parameter_type=dict(default='string', choices=['string', 'boolean', 'integer', 'real', 'array', 'hash', 'yaml', 'json']),
        ),
        argument_spec=dict(
            state=dict(default='present', choices=['present_with_defaults', 'present', 'absent']),
            updated_name=dict(),
        ),
        required_if=(
            ['state', 'present_with_defaults', ['value']],
            ['state', 'present', ['value']],
        ),
    )

    with module.api_connection():
        entity = module.lookup_entity('entity')

        if not module.desired_absent:
            # Convert values according to their corresponding parameter_type
            if entity and 'parameter_type' not in entity:
                entity['parameter_type'] = 'string'
            module.foreman_params['value'] = parameter_value_to_str(module.foreman_params['value'], module.foreman_params['parameter_type'])
            if entity and 'value' in entity:
                entity['value'] = parameter_value_to_str(entity['value'], entity.get('parameter_type', 'string'))

        module.run()
def main():
    module = ForemanSettingModule(foreman_spec=dict(
        name=dict(required=True),
        value=dict(type='raw'),
    ), )

    # TODO Maybe refactor this into a EntityMixin
    module.foreman_spec.update(
        _foreman_spec_helper(
            dict(entity=dict(type='entity',
                             flat_name='id',
                             resource_type='settings',
                             failsafe=False,
                             thin=False,
                             ensure=False), ))[0])
    module.foreman_params['entity'] = module.foreman_params['name']

    with module.api_connection():
        entity = module.lookup_entity('entity')

        if 'value' not in module.foreman_params:
            module.foreman_params['value'] = entity['default'] or ''

        settings_type = entity['settings_type']
        new_value = module.foreman_params['value']
        # Allow to pass integers as string
        if settings_type == 'integer':
            new_value = int(new_value)
        module.foreman_params['value'] = parameter_value_to_str(
            new_value, settings_type)
        old_value = entity['value']
        entity['value'] = parameter_value_to_str(old_value, settings_type)

        entity = module.ensure_entity('settings',
                                      module.foreman_params,
                                      entity,
                                      state='present')

        if entity:
            # Fake the not serialized input value as output
            entity['value'] = new_value

        module.exit_json(foreman_setting=entity)
    def ensure_override_values(self, entity, expected_override_values):
        if expected_override_values is not None:
            parameter_type = entity.get('parameter_type', 'string')
            scope = {'smart_class_parameter_id': entity['id']}
            if not self.desired_absent:
                current_override_values = {
                    override_value['match']: override_value
                    for override_value in entity.get('override_values', [])
                }
                desired_override_values = {
                    override_value['match']: override_value
                    for override_value in expected_override_values
                }

                for match in desired_override_values:
                    desired_override_value = desired_override_values[match]
                    if 'value' in desired_override_value:
                        desired_override_value[
                            'value'] = parameter_value_to_str(
                                desired_override_value['value'],
                                parameter_type)
                    current_override_value = current_override_values.pop(
                        match, None)
                    if current_override_value:
                        current_override_value[
                            'value'] = parameter_value_to_str(
                                current_override_value['value'],
                                parameter_type)
                    self.ensure_entity(
                        'override_values',
                        desired_override_value,
                        current_override_value,
                        state="present",
                        foreman_spec=override_value_foreman_spec,
                        params=scope)
                for current_override_value in current_override_values.values():
                    self.ensure_entity(
                        'override_values',
                        None,
                        current_override_value,
                        state="absent",
                        foreman_spec=override_value_foreman_spec,
                        params=scope)
def main():
    module = ForemanSmartClassParameterModule(
        argument_spec=dict(
            puppetclass_name=dict(required=True),
            parameter=dict(required=True),
            state=dict(default='present',
                       choices=['present_with_defaults', 'present']),
        ),
        foreman_spec=dict(
            parameter_type=dict(choices=[
                'string', 'boolean', 'integer', 'real', 'array', 'hash',
                'yaml', 'json', 'none'
            ]),
            validator_type=dict(choices=['list', 'regexp']),
            validator_rule=dict(),
            description=dict(),
            default_value=dict(type='raw'),
            omit=dict(type='bool'),
            override=dict(type='bool'),
            merge_default=dict(type='bool'),
            merge_overrides=dict(type='bool'),
            avoid_duplicates=dict(type='bool'),
            required=dict(type='bool'),
            hidden_value=dict(type='bool'),
            override_value_order=dict(type='list', elements='str'),
            # tried nested_list here but, if using nested_list, override_values are not part of loaded entity.
            # override_values=dict(type='nested_list', elements='dict', foreman_spec=override_value_foreman_spec),
            override_values=dict(type='list', elements='dict'),
        ),
        # smart_class_parameters are created on puppetclass import and cannot be created/deleted from API,
        # so if we don't find it, it's an error.
        entity_opts=dict(failsafe=False),
    )

    module_params = module.foreman_params
    if module_params.get('parameter_type', 'string') not in ['array', 'hash']:
        if 'merge_default' in module_params or 'merge_overrides' in module_params:
            module.fail_json(
                msg=
                "merge_default or merge_overrides can be used only with array or hash parameter_type"
            )
    if module_params.get(
            'parameter_type',
            'string') != 'array' and 'avoid_duplicates' in module_params:
        module.fail_json(
            msg="avoid_duplicates can be used only with array parameter_type")

    search = "puppetclass_name={0} and parameter={1}".format(
        module_params['puppetclass_name'], module_params['parameter'])
    override_values = module_params.pop('override_values', None)

    if 'override_value_order' in module_params:
        module_params['override_value_order'] = '\n'.join(
            module_params['override_value_order'])
    if 'parameter_type' in module_params and module_params[
            'parameter_type'] == 'none':
        module_params['parameter_type'] = ''

    with module.api_connection():
        entity = module.find_resource('smart_class_parameters', search=search)
        module.set_entity('entity', entity)
        # When override is set to false, foreman API don't accept parameter_type and all 'override options' have to be set to false if present
        if not module_params.get('override', False):
            module_params['parameter_type'] = ''
            for override_option in [
                    'merge_default', 'merge_overrides', 'avoid_duplicates'
            ]:
                if override_option in entity and entity[override_option]:
                    module_params[override_option] = False

        # Foreman API returns 'hidden_value?' instead of 'hidden_value' this is a bug ?
        if 'hidden_value?' in entity:
            entity['hidden_value'] = entity.pop('hidden_value?')
        if 'default_value' in module_params:
            module_params['default_value'] = parameter_value_to_str(
                module_params['default_value'],
                module_params.get('parameter_type', 'string'))
        if 'default_value' in entity:
            entity['default_value'] = parameter_value_to_str(
                entity['default_value'], entity.get('parameter_type',
                                                    'string'))

        entity = module.run()
        module.ensure_override_values(entity, override_values)