vmware / ansible-for-nsxt

Ansible delivers simple IT automation that ends repetitive tasks and frees up DevOps teams for more strategic work. This project is to enable this automation for NSX-T installation.
Other
169 stars 140 forks source link

KeyError: external_interface_info in nsxt_policy_tier0.py #501

Open notti1205 opened 4 months ago

notti1205 commented 4 months ago

Describe the bug

Error Message

The full traceback is:
Traceback (most recent call last):
  File "/home/nochi/.ansible/tmp/ansible-tmp-1714569466.6996984-267554-173320257008398/AnsiballZ_nsxt_policy_tier0.py", line 107, in <module>
    _ansiballz_main()
  File "/home/nochi/.ansible/tmp/ansible-tmp-1714569466.6996984-267554-173320257008398/AnsiballZ_nsxt_policy_tier0.py", line 99, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
  File "/home/nochi/.ansible/tmp/ansible-tmp-1714569466.6996984-267554-173320257008398/AnsiballZ_nsxt_policy_tier0.py", line 47, in invoke_module
    runpy.run_module(mod_name='ansible_collections.vmware.ansible_for_nsxt.plugins.modules.nsxt_policy_tier0', init_globals=dict(_module_fqn='ansible_collections.vmware.ansible_for_nsxt.plugins.modules.nsxt_policy_tier0', _modlib_path=modlib_path),
  File "/usr/lib/python3.10/runpy.py", line 224, in run_module
    return _run_module_code(code, init_globals, run_name, mod_spec)
  File "/usr/lib/python3.10/runpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/modules/nsxt_policy_tier0.py", line 2177, in <module>
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py", line 141, in realize
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py", line 765, in _achieve_state
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py", line 246, in achieve_subresource_state
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py", line 141, in realize
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py", line 758, in _achieve_state
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py", line 564, in _achieve_present_state
  File "/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/modules/nsxt_policy_tier0.py", line 1806, in update_resource_params
KeyError: 'external_interface_info'
fatal: [inet-ot0-ext120101 -> localhost]: FAILED! => {
    "changed": false,
    "module_stderr": "Traceback (most recent call last):\n  File \"/home/nochi/.ansible/tmp/ansible-tmp-1714569466.6996984-267554-173320257008398/AnsiballZ_nsxt_policy_tier0.py\", line 107, in <module>\n    _ansiballz_main()\n  File \"/home/nochi/.ansible/tmp/ansible-tmp-1714569466.6996984-267554-173320257008398/AnsiballZ_nsxt_policy_tier0.py\", line 99, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/home/nochi/.ansible/tmp/ansible-tmp-1714569466.6996984-267554-173320257008398/AnsiballZ_nsxt_policy_tier0.py\", line 47, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.vmware.ansible_for_nsxt.plugins.modules.nsxt_policy_tier0', init_globals=dict(_module_fqn='ansible_collections.vmware.ansible_for_nsxt.plugins.modules.nsxt_policy_tier0', _modlib_path=modlib_path),\n  File \"/usr/lib/python3.10/runpy.py\", line 224, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib/python3.10/runpy.py\", line 96, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib/python3.10/runpy.py\", line 86, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/modules/nsxt_policy_tier0.py\", line 2177, in <module>\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py\", line 141, in realize\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py\", line 765, in _achieve_state\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py\", line 246, in achieve_subresource_state\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py\", line 141, in realize\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py\", line 758, in _achieve_state\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/module_utils/nsxt_base_resource.py\", line 564, in _achieve_present_state\n  File \"/tmp/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload_u4fkssnw/ansible_vmware.ansible_for_nsxt.nsxt_policy_tier0_payload.zip/ansible_collections/vmware/ansible_for_nsxt/plugins/modules/nsxt_policy_tier0.py\", line 1806, in update_resource_params\nKeyError: 'external_interface_info'\n",
    "module_stdout": "",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 1
}

Reproduction steps

  1. Configure HA VIP on Tier0
  2. Do nsxt_policy_tier0 with only edge_cluster_info directive in locale_services directive
    - name: Create T0 Locale service (= Assign Edge Cluster)
    vmware.ansible_for_nsxt.nsxt_policy_tier0:
    hostname: "{{ nsxt_t0_nm_hostname }}"
    username: "{{ nsxt_t0_nm_username }}"
    password: "{{ nsxt_t0_nm_password }}"
    validate_certs: "{{ nsxt_t0_nm_validate }}"
    display_name: "{{ inventory_hostname_short }}"
    state: "{{ nsxt_t0_state }}"
    ha_mode: "{{ nsxt_t0_ha_mode }}"
    failover_mode: "{{ nsxt_t0_failover_mode }}"
    locale_services:
      - display_name: "{{ nsxt_t0_ls_id }}"
        state: present
        edge_cluster_info:
          edge_cluster_display_name: "{{ nsxt_t0_edgecl_name }}"
          site_id: "{{ nsxt_t0_site_id }}"
          enforcementpoint_id: "{{ nsxt_t0_enfp_id }}"
    delegate_to: localhost
  3. ...

Expected behavior

nsxt_policy_tier0 module passes in this case.

Additional context

No response

notti1205 commented 4 months ago

I think that need to check whether the external_interface_info key exists before pop this key in L1731.

like this

          if 'ha_vip_configs' in nsx_resource_params:
                for ha_vip_config in nsx_resource_params['ha_vip_configs']:
                    if 'external_interface_info' in ha_vip_config:
                        external_interface_info = ha_vip_config.pop(
                              'external_interface_info')
                        external_interface_paths = []
                        for external_interface in (
                                external_interface_info):
                            interface_base_url = (
                                NSXTTier0.NSXTTier0LocaleService.
                                NSXTTier0Interface.get_resource_base_url(
                                    self.get_parent_info()))
                            external_interface_paths.append(
                                interface_base_url + "/" +
                                self.get_id_using_attr_name_else_fail(
                                    None, external_interface,
                                    interface_base_url,
                                    NSXTTier0.NSXTTier0LocaleService.
                                    NSXTTier0Interface.__name__))
                        ha_vip_config[
                            'external_interface_paths'] = external_interface_paths