code: def create_frozen_vm_from_ovf(self, node_config, vm_name_target):
      resource_pool_id = None
      datastore_name = node_config.get("frozen_vm").get("datastore")
      if not datastore_name:
          raise ValueError(
              "The datastore name must be provided when deploying frozen"
              "VM from OVF"
          )
      datastore_id = self.get_pyvmomi_sdk_provider().name_to_id(
          [vim.Datastore], datastore_name
      )
  
      if node_config.get("frozen_vm").get("resource_pool"):
          resource_pool_id = self.get_vsphere_sdk_provider().get_resource_pool_id_by_name(
              node_config.get("frozen_vm").get("resource_pool")
          )
      else:
          cluster_name = node_config.get("frozen_vm").get("cluster")
          if not cluster_name:
              raise ValueError(
                  "The cluster name must be provided when deploying a single frozen"
                  " VM from OVF"
              )
  
          host_id = self.get_pyvmomi_sdk_provider().get_host_id_of_datastore_cluster(
              datastore_name, cluster_name
          )
          if not host_id:
              raise ValueError("No available host to be assigned")
  
          logger.info("Found a host {}".format(host_id))
          node_config["host_id"] = host_id
          resource_pool_id = self.get_pyvmomi_sdk_provider().get_resource_pool_id_in_cluster(
              cluster_name
          )
  
      vm_name = self.get_vsphere_sdk_provider().deploy_ovf(
          node_config["frozen_vm"]["library_item"],
          vm_name_target,
          resource_pool_id,
          node_config.get("host_id"),
          datastore_id,
      )
      return self.ensure_frozen_vm_status(vm_name)
  
imports: import copy
  import logging
  import threading
  import uuid
  from concurrent.futures import ThreadPoolExecutor
  from typing import Any, Dict
  from pyVmomi import vim
  from ray.autoscaler._private.vsphere.config import bootstrap_vsphere, is_dynamic_passthrough
  from ray.autoscaler._private.vsphere.gpu_utils import get_gpu_cards_from_vm, get_vm_2_gpu_cards_map, plug_gpu_cards_to_vm, set_gpu_placeholder, split_vm_2_gpu_cards_map
  from ray.autoscaler._private.vsphere.pyvmomi_sdk_provider import PyvmomiSdkProvider
  from ray.autoscaler._private.vsphere.scheduler import SchedulerFactory
  from ray.autoscaler._private.vsphere.utils import Constants, now_ts
  from ray.autoscaler._private.vsphere.vsphere_sdk_provider import VsphereSdkProvider
  from ray.autoscaler.node_provider import NodeProvider
  from ray.autoscaler.tags import TAG_RAY_CLUSTER_NAME, TAG_RAY_NODE_NAME
label_desc: Use image node_id 16 for calling the VsphereNodeProvider obj's underlying member method code with example usage: obj.create_frozen_vm_from_ovf(node_config, vm_name_target) and returns: self