async def _set(params, session): _in_query_parameters = PAYLOAD_FORMAT["set"]["query"].keys() payload = prepare_payload(params, PAYLOAD_FORMAT["set"]) subdevice_type = get_subdevice_type("/api/appliance/access/ssh") if subdevice_type and not params[subdevice_type]: _json = await exists(params, session, build_url(params)) if _json: params[subdevice_type] = _json["id"] _url = ("https://{vcenter_hostname}" "/api/appliance/access/ssh").format( **params ) + gen_args(params, _in_query_parameters) async with session.get(_url, json=payload, **session_timeout(params)) as resp: before = await resp.json() async with session.put(_url, json=payload, **session_timeout(params)) as resp: try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} if "value" not in _json: # 7.0.2 _json = {"value": _json} # The PUT answer does not let us know if the resource has actually been # modified if resp.status < 300: async with session.get( _url, json=payload, **session_timeout(params) ) as resp_get: after = await resp_get.json() if before == after: return await update_changed_flag(after, resp_get.status, "get") return await update_changed_flag(_json, resp.status, "set")
async def _set(params, session): _in_query_parameters = PAYLOAD_FORMAT["set"]["query"].keys() payload = prepare_payload(params, PAYLOAD_FORMAT["set"]) subdevice_type = get_subdevice_type( "/api/appliance/networking/dns/servers") if subdevice_type and not params[subdevice_type]: _json = await exists(params, session, build_url(params)) if _json: params[subdevice_type] = _json["id"] _url = ("https://{vcenter_hostname}" "/api/appliance/networking/dns/servers").format( **params) + gen_args(params, _in_query_parameters) async with session.get(_url, json=payload, **session_timeout(params)) as resp: before = await resp.json() async with session.put(_url, json=payload, **session_timeout(params)) as resp: try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} if "value" not in _json: # 7.0.2 _json = {"value": _json} if (resp.status == 500 and "messages" in _json["value"] and _json["value"]["messages"] and "id" in _json["value"]["messages"][0] and _json["value"]["messages"][0]["id"] == "com.vmware.applmgmt.err_operation_failed" and "args" in _json["value"]["messages"][0] and "changing state RUNNING → CLOSED" in _json["value"]["messages"][0]["args"][0]): # vSphere 7.0.2, a network configuration changes of the appliance raise a systemd error, # but the change is applied. The problem can be resolved by a yum update. async with session.get(_url, json=payload, **session_timeout(params)) as resp: _json = {"value": await resp.json()} # The PUT answer does not let us know if the resource has actually been # modified if resp.status < 300: async with session.get(_url, json=payload, **session_timeout(params)) as resp_get: after = await resp_get.json() if before == after: return await update_changed_flag(after, resp_get.status, "get") return await update_changed_flag(_json, resp.status, "set")
async def _update(params, session): payload = prepare_payload(params, PAYLOAD_FORMAT["update"]) _url = ("https://{vcenter_hostname}" "/api/vcenter/vm/{vm}/hardware/adapter/scsi/{adapter}").format( **params) async with session.get(_url, **session_timeout(params)) as resp: _json = await resp.json() if "value" in _json: value = _json["value"] else: # 7.0.2 and greater value = _json for k, v in value.items(): if k in payload: if isinstance(payload[k], dict) and isinstance(v, dict): to_delete = True for _k in list(payload[k].keys()): if payload[k][_k] != v.get(_k): to_delete = False if to_delete: del payload[k] elif payload[k] == v: del payload[k] elif payload[k] == {}: del payload[k] if payload == {} or payload == {"spec": {}}: # Nothing has changed if "value" not in _json: # 7.0.2 _json = {"value": _json} _json["id"] = params.get("adapter") return await update_changed_flag(_json, resp.status, "get") async with session.patch(_url, json=payload, **session_timeout(params)) as resp: try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} if "value" not in _json: # 7.0.2 _json = {"value": _json} # e.g: content_configuration if not _json and resp.status == 204: async with session.get(_url, **session_timeout(params)) as resp_get: _json_get = await resp_get.json() if _json_get: _json = _json_get _json["id"] = params.get("adapter") return await update_changed_flag(_json, resp.status, "update")
async def _sync(params, session): _in_query_parameters = PAYLOAD_FORMAT["sync"]["query"].keys() payload = prepare_payload(params, PAYLOAD_FORMAT["sync"]) subdevice_type = get_subdevice_type( "/api/content/subscribed-library/{library_id}?action=sync" ) if subdevice_type and not params[subdevice_type]: _json = await exists(params, session, build_url(params)) if _json: params[subdevice_type] = _json["id"] _url = ( "https://{vcenter_hostname}" # aa "/api/content/subscribed-library/{library_id}?action=sync" ).format(**params) + gen_args(params, _in_query_parameters) async with session.post(_url, json=payload, **session_timeout(params)) as resp: try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} if "value" not in _json: # 7.0.2 _json = {"value": _json} return await update_changed_flag(_json, resp.status, "sync")
async def _create(params, session): payload = prepare_payload(params, PAYLOAD_FORMAT["create"]) _url = ("https://{vcenter_hostname}" "/api/vcenter/vm/{vm}/guest/filesystem/directories?action=create" ).format(**params) async with session.post(_url, json=payload, **session_timeout(params)) as resp: if resp.status == 500: text = await resp.text() raise EmbeddedModuleFailure( f"Request has failed: status={resp.status}, {text}") try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} if (resp.status in [200, 201]) and "error" not in _json: if isinstance(_json, str): # 7.0.2 and greater _id = _json # TODO: fetch the object elif isinstance(_json, dict) and "value" not in _json: _id = list(_json["value"].values())[0] elif isinstance(_json, dict) and "value" in _json: _id = _json["value"] _json_device_info = await get_device_info(session, _url, _id) if _json_device_info: _json = _json_device_info return await update_changed_flag(_json, resp.status, "create")
async def entry_point(module, session): url = build_url(module.params) async with session.get(url, **session_timeout(module.params)) as resp: _json = await resp.json() if "value" not in _json: # 7.0.2+ _json = {"value": _json} return await update_changed_flag(_json, resp.status, "get")
async def _info(params, session): payload_format = list(PAYLOAD_FORMAT.values())[0] _in_query_parameters = payload_format["query"].keys() _url = ("https://{vcenter_hostname}" "/api/appliance/health/mem").format(**params) + gen_args( params, _in_query_parameters) async with session.get(_url, **session_timeout(params)) as resp: try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} return await update_changed_flag(_json, resp.status, "get")
async def _create(params, session): unicity_keys = ["library_id"] unicity_keys += ["name"] if params["library_id"]: _json = await get_device_info(session, build_url(params), params["library_id"]) else: _json = await exists(params, session, build_url(params), unicity_keys) if _json: if "value" not in _json: # 7.0.2+ _json = {"value": _json} if "_update" in globals(): params["library_id"] = _json["id"] return await globals()["_update"](params, session) return await update_changed_flag(_json, 200, "get") payload = prepare_payload(params, PAYLOAD_FORMAT["create"]) _url = ("https://{vcenter_hostname}" "/api/content/subscribed-library").format( **params ) async with session.post(_url, json=payload, **session_timeout(params)) as resp: if resp.status == 500: text = await resp.text() raise EmbeddedModuleFailure( f"Request has failed: status={resp.status}, {text}" ) try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} if (resp.status in [200, 201]) and "error" not in _json: if isinstance(_json, str): # 7.0.2 and greater _id = _json # TODO: fetch the object elif isinstance(_json, dict) and "value" not in _json: _id = list(_json["value"].values())[0] elif isinstance(_json, dict) and "value" in _json: _id = _json["value"] _json_device_info = await get_device_info(session, _url, _id) if _json_device_info: _json = _json_device_info return await update_changed_flag(_json, resp.status, "create")
async def _delete(params, session): _in_query_parameters = PAYLOAD_FORMAT["delete"]["query"].keys() payload = prepare_payload(params, PAYLOAD_FORMAT["delete"]) subdevice_type = get_subdevice_type("/api/vcenter/datacenter/{datacenter}") if subdevice_type and not params[subdevice_type]: _json = await exists(params, session, build_url(params)) if _json: params[subdevice_type] = _json["id"] _url = ("https://{vcenter_hostname}" "/api/vcenter/datacenter/{datacenter}").format( **params) + gen_args(params, _in_query_parameters) async with session.delete(_url, json=payload, **session_timeout(params)) as resp: try: if resp.headers["Content-Type"] == "application/json": _json = await resp.json() except KeyError: _json = {} return await update_changed_flag(_json, resp.status, "delete")
async def entry_point(module, session): url = build_url(module.params) async with session.get(url, **session_timeout(module.params)) as resp: _json = await resp.json() if "value" not in _json: # 7.0.2+ _json = {"value": _json} if module.params.get("adapter"): _json["id"] = module.params.get("adapter") elif module.params.get("label"): # TODO extend the list of filter _json = await exists(module.params, session, url) elif (isinstance(_json["value"], list) and len(_json["value"]) > 0 and isinstance(_json["value"][0], str)): # this is a list of id, we fetch the details full_device_list = await build_full_device_list( session, url, _json) _json = {"value": [i["value"] for i in full_device_list]} return await update_changed_flag(_json, resp.status, "get")