code: def create_new_or_fetch_existing_frozen_vms(self, node_config):
      frozen_vm_obj = None
      frozen_vm_config = node_config["frozen_vm"]
      frozen_vm_resource_pool_name = frozen_vm_config.get(
          "resource_pool"
      )
      if frozen_vm_resource_pool_name and not self.frozen_vm_scheduler:
          self.frozen_vm_scheduler = SchedulerFactory.get_scheduler(
              self.get_pyvmomi_sdk_provider(),
              frozen_vm_resource_pool_name,
          )
  
      # If library_item is present then create new frozen VM(s)
      # The logic under the if block will only be executed during creating the head
      # node. When creating the worker node, the frozen VMs must have been existing.
      # will never need to be deployed from OVF.
      if frozen_vm_config.get("library_item"):
          # If resource_pool config is present then create frozen VMs on each
          # host and put them in the specified resource pool.
          if frozen_vm_resource_pool_name:
              self.create_frozen_vm_on_each_host(
                  node_config,
                  frozen_vm_config.get("name", "frozen-vm"),
                  frozen_vm_resource_pool_name,
              )
          # If resource_pool config is not present then create a frozen VM
          # with name as specified.
          else:
              frozen_vm_obj = self.create_frozen_vm_from_ovf(
                  node_config, frozen_vm_config["name"]
              )
  
      # If library_item config is not present then select already existing
      # frozen VM.
      else:
          # If resource_pool is present, select a frozen VM out of all those
          # present in the resource pool specified.
          if frozen_vm_resource_pool_name:
              self.ensure_frozen_vms_status(
                  frozen_vm_resource_pool_name
              )
          # If resource_pool is not present then select the frozen VM with
          # name as specified.
          else:
              frozen_vm_name = frozen_vm_config.get("name", "frozen-vm")
              frozen_vm_obj = self.ensure_frozen_vm_status(
                  frozen_vm_name
              )
  
      return frozen_vm_obj
  
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 18 for calling the VsphereNodeProvider obj's underlying member method code with example usage: obj.create_new_or_fetch_existing_frozen_vms(node_config) and returns: frozen_vm_obj