ansible-for-nsxt icon indicating copy to clipboard operation
ansible-for-nsxt copied to clipboard

nsxt_edge_clusters module throws "Existing [xxx] new [yyy]" error if cluster members are in unexpected order

Open kcslb92 opened this issue 3 years ago • 3 comments

Hi Guys,

I've found what I believe to be a bug in the nsxt_edge_clusters module when making subsequent playbook reruns depending on the order of the edge cluster members. Let me articulate this:

Here is my task:

    - name: Add edge cluster
      nsxt_edge_clusters:
        hostname: "{{ nsx_manager }}"
        username: "{{ nsx_username }}"
        password: "{{ nsx_password }}"
        validate_certs: "{{ validate_certs }}"
        display_name: "{{ item.display_name }}"
        cluster_profile_bindings: "{{ item.cluster_profile_bindings }}"
        members: "{{ item.members }}"
        state: "{{ state }}"
      with_items:
        - "{{ edge_clusters }}"

Here is the definition of the edge clusters (following the same format as the examples provided in the repo):

"edge_clusters": [
    {
      "display_name": "a-edgecluster-01",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-01" },
        { "transport_node_name": "a-nsxedge-02" }
      ]
    },
    {
      "display_name": "a-edgecluster-02",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-03" },
        { "transport_node_name": "a-nsxedge-04" }
      ]
    },
    {
      "display_name": "a-edgecluster-03",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-05" },
        { "transport_node_name": "a-nsxedge-06" }
      ]
    },
    {
      "display_name": "a-edgecluster-04",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-07" },
        { "transport_node_name": "a-nsxedge-08" }
      ]
    }
  ]

On first run, it will create the edge clusters successfully:

TASK [Add edge cluster] ***************************************************************************************************************************************
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-01', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-01'}, {'transport_node_name': 'a-nsxedge-02'}]})
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-02', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-03'}, {'transport_node_name': 'a-nsxedge-04'}]})
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-03', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-05'}, {'transport_node_name': 'a-nsxedge-06'}]})
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-04', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-07'}, {'transport_node_name': 'a-nsxedge-08'}]})

Subsequent runs were throwing errors for edge clusters 02, 03, 04:

TASK [Add edge cluster] ***************************************************************************************************************************************
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-01', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-01'}, {'transport_node_name': 'a-nsxedge-02'}]})
failed: [127.0.0.1] (item={'display_name': 'a-edgecluster-02', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-03'}, {'transport_node_name': 'a-nsxedge-04'}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"cluster_profile_bindings": [{"profile_name": "nsx-default-edge-high-availability-profile"}], "display_name": "a-edgecluster-02", "members": [{"transport_node_name": "a-nsxedge-03"}, {"transport_node_name": "a-nsxedge-04"}]}, "msg": "Existing [9e03fbcf-c346-4c54-a955-56fc853f27dd] new [a008b51c-a2de-40a1-a130-0a0f89c636a7]"}
failed: [127.0.0.1] (item={'display_name': 'a-edgecluster-03', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-05'}, {'transport_node_name': 'a-nsxedge-06'}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"cluster_profile_bindings": [{"profile_name": "nsx-default-edge-high-availability-profile"}], "display_name": "a-edgecluster-03", "members": [{"transport_node_name": "a-nsxedge-05"}, {"transport_node_name": "a-nsxedge-06"}]}, "msg": "Existing [cd694163-c586-4ec9-801c-47abd9aa71b3] new [b6b8a15c-a784-4b1c-8d24-8e3578f6f53d]"}
failed: [127.0.0.1] (item={'display_name': 'a-edgecluster-04', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-07'}, {'transport_node_name': 'a-nsxedge-08'}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"cluster_profile_bindings": [{"profile_name": "nsx-default-edge-high-availability-profile"}], "display_name": "a-edgecluster-04", "members": [{"transport_node_name": "a-nsxedge-07"}, {"transport_node_name": "a-nsxedge-08"}]}, "msg": "Existing [b7de735d-bec5-423e-92be-2503bee62e5a] new [cc3161b1-38d4-41a2-b055-b77c1669198e]"}

I tried rearranging the edge cluster member definition in JSON (using a-edgecluster-02 as an example):

...
{
      "display_name": "a-edgecluster-03",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-04" },
        { "transport_node_name": "a-nsxedge-03" }
      ]
    },
...

This immediately fixed a-edgecluster-02, indicating that there is a bug whereby the next_edge_cluster module needs to have the edge cluster members listed in a particular order otherwise it throws the error defined at nsxt_edge_clusters.py:197.

Can someone please confirm that they are seeing the same behaviour?

To summarise:

edge cluster definition used to create edge clusters:

"edge_clusters": [
    {
      "display_name": "a-edgecluster-01",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-01" },
        { "transport_node_name": "a-nsxedge-02" }
      ]
    },
    {
      "display_name": "a-edgecluster-02",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-03" },
        { "transport_node_name": "a-nsxedge-04" }
      ]
    },
    {
      "display_name": "a-edgecluster-03",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-05" },
        { "transport_node_name": "a-nsxedge-06" }
      ]
    },
    {
      "display_name": "a-edgecluster-04",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-07" },
        { "transport_node_name": "a-nsxedge-08" }
      ]
    }
  ]
  • Subsequent runs threw the above errors

Modified edge cluster definitions used to avoid error in subsequent runs (observe the re-ordering of edge cluster members:

"edge_clusters": [
    {
      "display_name": "a-edgecluster-01",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-01" },
        { "transport_node_name": "a-nsxedge-02" }
      ]
    },
    {
      "display_name": "a-edgecluster-02",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-04" },
        { "transport_node_name": "a-nsxedge-03" }
      ]
    },
    {
      "display_name": "a-edgecluster-03",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-06" },
        { "transport_node_name": "a-nsxedge-05" }
      ]
    },
    {
      "display_name": "a-edgecluster-04",
      "cluster_profile_bindings": [
        { "profile_name": "nsx-default-edge-high-availability-profile" }
      ],
      "members": [
        { "transport_node_name": "a-nsxedge-08" },
        { "transport_node_name": "a-nsxedge-07" }
      ]
    }
  ]

This is the expected output (regardless of order) that was seen only when the reordering of members was done:

TASK [Add edge cluster] ***************************************************************************************************************************************
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-01', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-01'}, {'transport_node_name': 'a-nsxedge-02'}]})
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-02', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-04'}, {'transport_node_name': 'a-nsxedge-03'}]})
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-03', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-06'}, {'transport_node_name': 'a-nsxedge-05'}]})
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-04', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-08'}, {'transport_node_name': 'a-nsxedge-07'}]})

kcslb92 avatar Sep 13 '21 01:09 kcslb92

I believe the relevant code was merged in #340

Looping in @madhukark and @kaushiklele for visibility as they submitted/reviewed the PR.

kcslb92 avatar Sep 13 '21 01:09 kcslb92

up

alecorps avatar Sep 30 '21 16:09 alecorps

Hi - When is this going to be addressed? I've raised a SR with VMware to get a fix on this as its breaking our NSX code.

ImranJMughal avatar Feb 22 '22 14:02 ImranJMughal