def attach_vnic(compute_client, module): avd = AttachVnicDetails() avd.display_name = module.params.get("display_name", None) avd.instance_id = module.params.get("instance_id") avd.create_vnic_details = get_vnic_details(module) avd.nic_index = module.params.get("nic_index", None) result = oci_utils.create_and_wait( resource_type=RESOURCE_NAME, client=compute_client, create_fn=compute_client.attach_vnic, kwargs_create={"attach_vnic_details": avd}, get_fn=compute_client.get_vnic_attachment, get_param="vnic_attachment_id", module=module) return result
def main(): my_logger = oci_utils.get_logger("oci_instance") set_logger(my_logger) module_args = oci_utils.get_common_arg_spec(supports_wait=True) module_args.update( dict( display_name=dict(type="str", required=False, aliases=["name"]), instance_id=dict(type="str", required=False), vnic_attachment_id=dict(type="str", required=False, aliases=["id"]), nic_index=dict(type="int", required=False, default=0), create_vnic_details=dict(type="dict", required=False, aliases=["vnic"]), state=dict( type="str", required=False, default="present", choices=["present", "absent"], ), ) ) module = AnsibleModule( argument_spec=module_args, supports_check_mode=False, mutually_exclusive=["id", "create_vnic_details"], required_if=[("state", "absent", ["vnic_attachment_id"])], ) if not HAS_OCI_PY_SDK: module.fail_json(msg="oci python sdk required for this module.") compute_client = oci_utils.create_service_client(module, ComputeClient) state = module.params["state"] result = dict(changed=False) vna_id = module.params["vnic_attachment_id"] debug("VNIC attachment Id provided by user is " + str(vna_id)) try: if vna_id is not None: vna = oci_utils.get_existing_resource( compute_client.get_vnic_attachment, module, vnic_attachment_id=vna_id ) if state == "absent": if vna is not None: debug("Deleting " + vna.id) result = oci_utils.delete_and_wait( resource_type=RESOURCE_NAME, client=compute_client, get_fn=compute_client.get_vnic_attachment, kwargs_get={"vnic_attachment_id": vna_id}, delete_fn=compute_client.detach_vnic, kwargs_delete={"vnic_attachment_id": vna_id}, module=module, wait_applicable=True, ) else: debug( "VNIC attachment " + vna_id + " already detached. So returning changed=False." ) else: module.fail_json("To delete a VNIC attachment, set state=absent") else: # Create a secondary VNIC and attach it to an instance instance_id = module.params.get("instance_id") exclude_attributes = {"display_name": True} default_attribute_values = {"nic_index": 0} compartment_id = compute_client.get_instance( instance_id=instance_id ).data.compartment_id result = oci_utils.check_and_create_resource( resource_type=RESOURCE_NAME, create_fn=attach_vnic, kwargs_create={"compute_client": compute_client, "module": module}, list_fn=compute_client.list_vnic_attachments, kwargs_list={ "compartment_id": compartment_id, "instance_id": instance_id, }, module=module, model=AttachVnicDetails(), exclude_attributes=exclude_attributes, default_attribute_values=default_attribute_values, ) except ServiceError as ex: module.fail_json(msg=ex.message) except MaximumWaitTimeExceeded as mwte: module.fail_json(msg=str(mwte)) module.exit_json(**result)