Repository: ansible-collections/community.general

Issue:
keycloak_client detects changes on check_mode but not in run mode
<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
Running a `keycloak_client` task with check mode (`--check`) shows that `"authorizationServicesEnabled": false,` will be added, but no change is done in normal mode.

State of the realm client: Authorization is disabled.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
Ansible `keycloak_client` module.

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
ansible 2.10.3
  config file = /Users/workstation/PROJECTS/ansible_project/ansible.cfg
  configured module search path = ['/Users/workstation/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/workstation/.local/share/virtualenvs/ansible_project-6ES-zTZc/lib/python3.6/site-packages/ansible
  executable location = /Users/workstation/.local/share/virtualenvs/ansible_project-6ES-zTZc/bin/ansible
  python version = 3.6.8 (default, Nov  3 2020, 14:24:35) [GCC Apple LLVM 12.0.0 (clang-1200.0.32.21)]
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below
ANSIBLE_PIPELINING(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = True
DEFAULT_CALLBACK_WHITELIST(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['profile_tasks']
DEFAULT_INVENTORY_PLUGIN_PATH(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['/Users/workstation/PROJECTS/ansible_project/additional_plugins/inventory'
DEFAULT_LOOKUP_PLUGIN_PATH(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['/Users/workstation/PROJECTS/ansible_project/additional_plugins/lookup']
DEFAULT_ROLES_PATH(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['/Users/workstation/PROJECTS/ansible_project/roles', '/etc/ansible/roles']
DEFAULT_STDOUT_CALLBACK(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = skippy
DEFAULT_VAULT_PASSWORD_FILE(env: ANSIBLE_VAULT_PASSWORD_FILE) = /Users/workstation/.vault_password
INVENTORY_ENABLED(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['host_list', 'script', 'yaml', 'auto', 'ini', 'tpm_inventory']
```

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->
Ansible host: macOS Catalina
Target: CentOS 7.7

##### STEPS TO REPRODUCE
<!--- Describe exactly how to reproduce the problem, using a minimal test-case -->
Sample task:
```
- name: Config | Create the awesome-app client
  keycloak_client:
    state: present
    auth_keycloak_url: "{{ keycloak_auth_url }}/auth"
    auth_realm: master
    realm: "{{ keycloak_cs_realm }}"
    auth_username: "{{ keycloak_admin_username }}"
    auth_password: "{{ keycloak_admin_password }}"
    client_id: "{{ keycloak_client_desktopapp.id }}"
    description: "{{ keycloak_client_desktopapp.desc }}"
    enabled: "{{ keycloak_client_desktopapp.enabled }}"
    consent_required: false
    protocol: "openid-connect"
    public_client: false
    standard_flow_enabled: true
    implicit_flow_enabled: false
    direct_access_grants_enabled: true
    service_accounts_enabled: false
    authorization_services_enabled: false
    root_url: "{{ keycloak_base_url }}"
    redirect_uris:
      - "http://localhost:*"
      - "{{ keycloak_base_url }}/*"
    admin_url: "{{ keycloak_base_url }}"
    web_origins:
      - '*'
  when: keycloak_client_desktopapp.id is defined
```

<!--- Paste example playbooks or commands between quotes below -->
```yaml
ansible-playbook --check --diff -u root playbooks/site.yml
```

This has been tested with Python 3.9 as well, with the same result:

```
ansible 2.10.3
  config file = /Users/workstation/PROJECTS/ansible_project_testlatest/ansible.cfg
  configured module search path = ['/Users/workstation/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/workstation/PROJECTS/ansible_project_testlatest/venvtest/lib/python3.9/site-packages/ansible
  executable location = /Users/workstation/PROJECTS/ansible_project_testlatest/venvtest/bin/ansible
  python version = 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) [Clang 6.0 (clang-600.0.57)]
```

<!--- HINT: You can paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- Describe what you expected to happen when running the steps above -->
Check mode should not display the change.

##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->
```
TASK [keycloak-task : Config | Create the awesome-app client] ************************************
Wednesday 04 November 2020  14:17:16 +0100 (0:00:00.066)       0:00:13.691 ****
--- before
+++ after
@@ -7,6 +7,7 @@
     "adminUrl": "https://keycloak.localdomain.lcl",
     "attributes": {},
     "authenticationFlowBindingOverrides": {},
+    "authorizationServicesEnabled": false,
     "bearerOnly": false,
     "clientAuthenticatorType": "client-secret",
     "clientId": "awesome-app",

changed: [targetserver]
```

<!--- Paste verbatim command output between quotes -->
Verbose output: https://gist.github.com/guerzon/b43cf3843553d8c41356ec8c6feedf6a
keycloak_client detects changes on check_mode but not in run mode
<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
Running a `keycloak_client` task with check mode (`--check`) shows that `"authorizationServicesEnabled": false,` will be added, but no change is done in normal mode.

State of the realm client: Authorization is disabled.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
Ansible `keycloak_client` module.

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
ansible 2.10.3
  config file = /Users/workstation/PROJECTS/ansible_project/ansible.cfg
  configured module search path = ['/Users/workstation/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/workstation/.local/share/virtualenvs/ansible_project-6ES-zTZc/lib/python3.6/site-packages/ansible
  executable location = /Users/workstation/.local/share/virtualenvs/ansible_project-6ES-zTZc/bin/ansible
  python version = 3.6.8 (default, Nov  3 2020, 14:24:35) [GCC Apple LLVM 12.0.0 (clang-1200.0.32.21)]
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below
ANSIBLE_PIPELINING(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = True
DEFAULT_CALLBACK_WHITELIST(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['profile_tasks']
DEFAULT_INVENTORY_PLUGIN_PATH(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['/Users/workstation/PROJECTS/ansible_project/additional_plugins/inventory'
DEFAULT_LOOKUP_PLUGIN_PATH(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['/Users/workstation/PROJECTS/ansible_project/additional_plugins/lookup']
DEFAULT_ROLES_PATH(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['/Users/workstation/PROJECTS/ansible_project/roles', '/etc/ansible/roles']
DEFAULT_STDOUT_CALLBACK(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = skippy
DEFAULT_VAULT_PASSWORD_FILE(env: ANSIBLE_VAULT_PASSWORD_FILE) = /Users/workstation/.vault_password
INVENTORY_ENABLED(/Users/workstation/PROJECTS/ansible_project/ansible.cfg) = ['host_list', 'script', 'yaml', 'auto', 'ini', 'tpm_inventory']
```

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->
Ansible host: macOS Catalina
Target: CentOS 7.7

##### STEPS TO REPRODUCE
<!--- Describe exactly how to reproduce the problem, using a minimal test-case -->
Sample task:
```
- name: Config | Create the awesome-app client
  keycloak_client:
    state: present
    auth_keycloak_url: "{{ keycloak_auth_url }}/auth"
    auth_realm: master
    realm: "{{ keycloak_cs_realm }}"
    auth_username: "{{ keycloak_admin_username }}"
    auth_password: "{{ keycloak_admin_password }}"
    client_id: "{{ keycloak_client_desktopapp.id }}"
    description: "{{ keycloak_client_desktopapp.desc }}"
    enabled: "{{ keycloak_client_desktopapp.enabled }}"
    consent_required: false
    protocol: "openid-connect"
    public_client: false
    standard_flow_enabled: true
    implicit_flow_enabled: false
    direct_access_grants_enabled: true
    service_accounts_enabled: false
    authorization_services_enabled: false
    root_url: "{{ keycloak_base_url }}"
    redirect_uris:
      - "http://localhost:*"
      - "{{ keycloak_base_url }}/*"
    admin_url: "{{ keycloak_base_url }}"
    web_origins:
      - '*'
  when: keycloak_client_desktopapp.id is defined
```

<!--- Paste example playbooks or commands between quotes below -->
```yaml
ansible-playbook --check --diff -u root playbooks/site.yml
```

This has been tested with Python 3.9 as well, with the same result:

```
ansible 2.10.3
  config file = /Users/workstation/PROJECTS/ansible_project_testlatest/ansible.cfg
  configured module search path = ['/Users/workstation/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/workstation/PROJECTS/ansible_project_testlatest/venvtest/lib/python3.9/site-packages/ansible
  executable location = /Users/workstation/PROJECTS/ansible_project_testlatest/venvtest/bin/ansible
  python version = 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) [Clang 6.0 (clang-600.0.57)]
```

<!--- HINT: You can paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- Describe what you expected to happen when running the steps above -->
Check mode should not display the change.

##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->
```
TASK [keycloak-task : Config | Create the awesome-app client] ************************************
Wednesday 04 November 2020  14:17:16 +0100 (0:00:00.066)       0:00:13.691 ****
--- before
+++ after
@@ -7,6 +7,7 @@
     "adminUrl": "https://keycloak.localdomain.lcl",
     "attributes": {},
     "authenticationFlowBindingOverrides": {},
+    "authorizationServicesEnabled": false,
     "bearerOnly": false,
     "clientAuthenticatorType": "client-secret",
     "clientId": "awesome-app",

changed: [targetserver]
```

<!--- Paste verbatim command output between quotes -->
Verbose output: https://gist.github.com/guerzon/b43cf3843553d8c41356ec8c6feedf6a


Discussion:
Files identified in the description:
* [`plugins/modules/identity/keycloak/keycloak_client.py`](https://github.com/ansible-collections/community.general/blob/master/plugins/modules/identity/keycloak/keycloak_client.py)

If these files are inaccurate, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @eikef @ndclt
[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: notify --->
Files identified in the description:
* [`plugins/modules/keycloak_client.py`](https://github.com/ansible-collections/community.general/blob/main/plugins/modules/keycloak_client.py)

If these files are incorrect, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @mattock
[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: notify --->
Files identified in the description:
* [`plugins/modules/identity/keycloak/keycloak_client.py`](https://github.com/ansible-collections/community.general/blob/master/plugins/modules/identity/keycloak/keycloak_client.py)

If these files are inaccurate, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @eikef @ndclt
[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: notify --->
Files identified in the description:
* [`plugins/modules/keycloak_client.py`](https://github.com/ansible-collections/community.general/blob/main/plugins/modules/keycloak_client.py)

If these files are incorrect, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @mattock
[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: notify --->

Resolving patch:
diff --git a/plugins/modules/keycloak_client.py b/plugins/modules/keycloak_client.py
--- a/plugins/modules/keycloak_client.py
+++ b/plugins/modules/keycloak_client.py
@@ -717,13 +717,14 @@
 '''
 
 from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \
-    keycloak_argument_spec, get_token, KeycloakError
+    keycloak_argument_spec, get_token, KeycloakError, is_struct_included
 from ansible.module_utils.basic import AnsibleModule
 import copy
 
 
 PROTOCOL_OPENID_CONNECT = 'openid-connect'
 PROTOCOL_SAML = 'saml'
+CLIENT_META_DATA = ['authorizationServicesEnabled']
 
 
 def normalise_cr(clientrep, remove_ids=False):
@@ -946,7 +947,7 @@ def main():
                 if module._diff:
                     result['diff'] = dict(before=sanitize_cr(before_norm),
                                           after=sanitize_cr(desired_norm))
-                result['changed'] = (before_norm != desired_norm)
+                result['changed'] = not is_struct_included(desired_norm, before_norm, CLIENT_META_DATA)
 
                 module.exit_json(**result)
 


Test patch:
diff --git a/tests/integration/targets/keycloak_client/README.md b/tests/integration/targets/keycloak_client/README.md
--- a/tests/integration/targets/keycloak_client/README.md
+++ b/tests/integration/targets/keycloak_client/README.md
@@ -4,14 +4,16 @@ GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://w
 SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
-The integration test can be performed as follows:
+# Running keycloak_client module integration test
 
-```
-# 1. Start docker-compose:
-docker-compose -f tests/integration/targets/keycloak_client/docker-compose.yml stop
-docker-compose -f tests/integration/targets/keycloak_client/docker-compose.yml rm -f -v
-docker-compose -f tests/integration/targets/keycloak_client/docker-compose.yml up -d
+To run Keycloak client module's integration test, start a keycloak server using Docker:
 
-# 2. Run the integration tests:
-ansible-test integration keycloak_client --allow-unsupported -v
-```
+    docker run -d --rm --name mykeycloak -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=password quay.io/keycloak/keycloak:latest start-dev --http-relative-path /auth
+
+Run the integration tests:
+
+    ansible-test integration -v keycloak_client --allow-unsupported --docker fedora35 --docker-network host
+
+Cleanup:
+
+    docker stop mykeycloak
diff --git a/tests/integration/targets/keycloak_client/docker-compose.yml b/tests/integration/targets/keycloak_client/docker-compose.yml
deleted file mode 100644
--- a/tests/integration/targets/keycloak_client/docker-compose.yml
+++ /dev/null
@@ -1,31 +0,0 @@
----
-# Copyright (c) Ansible Project
-# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-version: '3.4'
-
-services:
-  postgres:
-    image: postgres:9.6
-    restart: always
-    environment:
-      POSTGRES_USER: postgres
-      POSTGRES_DB: postgres
-      POSTGRES_PASSWORD: postgres
-
-  keycloak:
-    image: jboss/keycloak:12.0.4
-    ports:
-      - 8080:8080
-
-    environment:
-      DB_VENDOR: postgres
-      DB_ADDR: postgres
-      DB_DATABASE: postgres
-      DB_USER: postgres
-      DB_SCHEMA: public
-      DB_PASSWORD: postgres
-
-      KEYCLOAK_USER: admin
-      KEYCLOAK_PASSWORD: password
diff --git a/tests/integration/targets/keycloak_client/tasks/main.yml b/tests/integration/targets/keycloak_client/tasks/main.yml
--- a/tests/integration/targets/keycloak_client/tasks/main.yml
+++ b/tests/integration/targets/keycloak_client/tasks/main.yml
@@ -2,58 +2,78 @@
 # Copyright (c) Ansible Project
 # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
 # SPDX-License-Identifier: GPL-3.0-or-later
+- name: Wait for Keycloak
+  uri:
+    url: "{{ url }}/admin/"
+    status_code: 200
+    validate_certs: no
+  register: result
+  until: result.status == 200
+  retries: 10
+  delay: 10
 
 - name: Delete realm
-  community.general.keycloak_realm: "{{ auth_args | combine(call_args) }}"
-  vars:
-    call_args:
-      id: "{{ realm }}"
-      realm: "{{ realm }}"
-      state: absent
+  community.general.keycloak_realm:
+    auth_keycloak_url: "{{ url }}"
+    auth_realm: "{{ admin_realm }}"
+    auth_username: "{{ admin_user }}"
+    auth_password: "{{ admin_password }}"
+    id: "{{ realm }}"
+    realm: "{{ realm }}"
+    state: absent
 
 - name: Create realm
-  community.general.keycloak_realm: "{{ auth_args | combine(call_args) }}"
-  vars:
-    call_args:
-      id: "{{ realm }}"
-      realm: "{{ realm }}"
-      state: present
+  community.general.keycloak_realm:
+    auth_keycloak_url: "{{ url }}"
+    auth_realm: "{{ admin_realm }}"
+    auth_username: "{{ admin_user }}"
+    auth_password: "{{ admin_password }}"
+    id: "{{ realm }}"
+    realm: "{{ realm }}"
+    state: present
 
 - name: Desire client
-  community.general.keycloak_client: "{{ auth_args | combine(call_args) }}"
-  vars:
-    call_args:
-      realm: "{{ realm }}"
-      client_id: "{{ client_id }}"
-      state: present
-      redirect_uris: '{{redirect_uris1}}'
-      attributes: '{{client_attributes1}}'
-      protocol_mappers: '{{protocol_mappers1}}'
+  community.general.keycloak_client:
+    auth_keycloak_url: "{{ url }}"
+    auth_realm: "{{ admin_realm }}"
+    auth_username: "{{ admin_user }}"
+    auth_password: "{{ admin_password }}"
+    realm: "{{ realm }}"
+    client_id: "{{ client_id }}"
+    state: present
+    redirect_uris: '{{redirect_uris1}}'
+    attributes: '{{client_attributes1}}'
+    protocol_mappers: '{{protocol_mappers1}}'
   register: desire_client_not_present
 
 - name: Desire client again with same props
-  community.general.keycloak_client: "{{ auth_args | combine(call_args) }}"
-  vars:
-    call_args:
-      realm: "{{ realm }}"
-      client_id: "{{ client_id }}"
-      state: present
-      redirect_uris: '{{redirect_uris1}}'
-      attributes: '{{client_attributes1}}'
-      protocol_mappers: '{{protocol_mappers1}}'
+  community.general.keycloak_client:
+    auth_keycloak_url: "{{ url }}"
+    auth_realm: "{{ admin_realm }}"
+    auth_username: "{{ admin_user }}"
+    auth_password: "{{ admin_password }}"
+    realm: "{{ realm }}"
+    client_id: "{{ client_id }}"
+    state: present
+    redirect_uris: '{{redirect_uris1}}'
+    attributes: '{{client_attributes1}}'
+    protocol_mappers: '{{protocol_mappers1}}'
   register: desire_client_when_present_and_same
 
 - name: Check client again with same props
-  community.general.keycloak_client: "{{ auth_args | combine(call_args) }}"
+  community.general.keycloak_client:
+    auth_keycloak_url: "{{ url }}"
+    auth_realm: "{{ admin_realm }}"
+    auth_username: "{{ admin_user }}"
+    auth_password: "{{ admin_password }}"
+    realm: "{{ realm }}"
+    client_id: "{{ client_id }}"
+    state: present
+    redirect_uris: '{{redirect_uris1}}'
+    attributes: '{{client_attributes1}}'
+    protocol_mappers: '{{protocol_mappers1}}'
+    authorization_services_enabled: False
   check_mode: true
-  vars:
-    call_args:
-      realm: "{{ realm }}"
-      client_id: "{{ client_id }}"
-      state: present
-      redirect_uris: '{{redirect_uris1}}'
-      attributes: '{{client_attributes1}}'
-      protocol_mappers: '{{protocol_mappers1}}'
   register: check_client_when_present_and_same
 
 - name: Assert changes not detected in last two tasks (desire when same, and check)
@@ -61,3 +81,25 @@
     that:
       - desire_client_when_present_and_same is not changed
       - check_client_when_present_and_same is not changed
+
+- name: Check client again with changed props
+  community.general.keycloak_client:
+    auth_keycloak_url: "{{ url }}"
+    auth_realm: "{{ admin_realm }}"
+    auth_username: "{{ admin_user }}"
+    auth_password: "{{ admin_password }}"
+    realm: "{{ realm }}"
+    client_id: "{{ client_id }}"
+    state: present
+    redirect_uris: '{{redirect_uris1}}'
+    attributes: '{{client_attributes1}}'
+    protocol_mappers: '{{protocol_mappers1}}'
+    authorization_services_enabled: False
+    service_accounts_enabled: True
+  check_mode: true
+  register: check_client_when_present_and_changed
+
+- name: Assert changes detected in last tasks
+  assert:
+    that:
+      - check_client_when_present_and_changed is changed
diff --git a/tests/integration/targets/keycloak_client/vars/main.yml b/tests/integration/targets/keycloak_client/vars/main.yml
--- a/tests/integration/targets/keycloak_client/vars/main.yml
+++ b/tests/integration/targets/keycloak_client/vars/main.yml
@@ -24,7 +24,7 @@ redirect_uris1:
   - "http://example.b.com/"
   - "http://example.a.com/"
 
-client_attributes1: {"backchannel.logout.session.required": true, "backchannel.logout.revoke.offline.tokens": false}
+client_attributes1: {"backchannel.logout.session.required": true, "backchannel.logout.revoke.offline.tokens": false, "client.secret.creation.time": 0}
 
 protocol_mappers1:
   - name: 'email'