From 0c5f03d3f4e3c3a2f30285e44274c4d44abf645d Mon Sep 17 00:00:00 2001 From: Beni Cherniavsky-Paskin Date: Sun, 8 Apr 2018 19:36:51 +0300 Subject: [PATCH] manageiq_provider: don't send top-level null fields on creation (#38448) * manageiq_provider: method docstrings fixes * manageiq_provider: refactoring step towards DRY `resource` is now same in `edit_provider()` and `create_provider()`, to be extracted to main later. * manageiq_provider: Fix creation of openshift provider Fixes #38331. Sending `api_version` to openshift provider would cause error: "OpenShift api_version cannot be modified" due to https://github.com/ManageIQ/manageiq-providers-kubernetes/blob/gaprindashvili-2/app/models/manageiq/providers/kubernetes/container_manager.rb#L37 In `edit_provider` we `delete_nulls()` on the whole data being sent so `api_version` was omitted if not specified. In `create_provider()` we only did it on endpoints list so `api_version` was always sent - now doing on whole data. --- .../manageiq/manageiq_provider.py | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/lib/ansible/modules/remote_management/manageiq/manageiq_provider.py b/lib/ansible/modules/remote_management/manageiq/manageiq_provider.py index 773623dde9..d3d1433db4 100644 --- a/lib/ansible/modules/remote_management/manageiq/manageiq_provider.py +++ b/lib/ansible/modules/remote_management/manageiq/manageiq_provider.py @@ -694,7 +694,7 @@ class ManageIQProvider(object): def edit_provider(self, provider, name, provider_type, endpoints, zone_id, provider_region, host_default_vnc_port_start, host_default_vnc_port_end, subscription, project, uid_ems, tenant_mapping_enabled, api_version): - """ Edit a user from manageiq. + """ Edit a provider from manageiq. Returns: a short message describing the operation executed. @@ -737,33 +737,32 @@ class ManageIQProvider(object): def create_provider(self, name, provider_type, endpoints, zone_id, provider_region, host_default_vnc_port_start, host_default_vnc_port_end, subscription, project, uid_ems, tenant_mapping_enabled, api_version): - """ Creates the user in manageiq. + """ Creates the provider in manageiq. Returns: - the created user id, name, created_on timestamp, - updated_on timestamp, userid and current_group_id. + a short message describing the operation executed. """ + resource = dict( + name=name, + zone={'id': zone_id}, + provider_region=provider_region, + host_default_vnc_port_start=host_default_vnc_port_start, + host_default_vnc_port_end=host_default_vnc_port_end, + subscription=subscription, + project=project, + uid_ems=uid_ems, + tenant_mapping_enabled=tenant_mapping_enabled, + api_version=api_version, + connection_configurations=endpoints, + ) + # clean nulls, we do not send nulls to the api - endpoints = delete_nulls(endpoints) + resource = delete_nulls(resource) # try to create a new provider try: url = '%s/providers' % (self.api_url) - result = self.client.post( - url, - name=name, - type=supported_providers()[provider_type]['class_name'], - zone={'id': zone_id}, - provider_region=provider_region, - host_default_vnc_port_start=host_default_vnc_port_start, - host_default_vnc_port_end=host_default_vnc_port_end, - subscription=subscription, - project=project, - uid_ems=uid_ems, - tenant_mapping_enabled=tenant_mapping_enabled, - api_version=api_version, - connection_configurations=endpoints, - ) + result = self.client.post(url, type=supported_providers()[provider_type]['class_name'], **resource) except Exception as e: self.module.fail_json(msg="failed to create provider %s: %s" % (name, str(e)))