class_docstr: NodeProvider for private/local clusters.
  
  `node_id` is overloaded to also be `node_ip` in this class.
  
  When `cluster_name` is provided, it manages a single cluster in a cluster
  specific state file. But when `cluster_name` is None, it manages multiple
  clusters in a unified state file that requires each node to be tagged with
  TAG_RAY_CLUSTER_NAME in create and non_terminated_nodes function calls to
  associate each node with the right cluster.
  
  The current use case of managing multiple clusters is by
  OnPremCoordinatorServer which receives node provider HTTP requests
  from CoordinatorSenderNodeProvider and uses LocalNodeProvider to get
  the responses.
code: def is_terminated(self, node_id):
      return not self.is_running(node_id)
  
imports: import json
  import logging
  import os
  import socket
  from threading import RLock
  from filelock import FileLock
  from ray.autoscaler._private.local.config import LOCAL_CLUSTER_NODE_TYPE, bootstrap_local, get_lock_path, get_state_path
  from ray.autoscaler.node_provider import NodeProvider
  from ray.autoscaler.tags import NODE_KIND_HEAD, NODE_KIND_WORKER, STATUS_UP_TO_DATE, TAG_RAY_NODE_KIND, TAG_RAY_NODE_NAME, TAG_RAY_NODE_STATUS, TAG_RAY_USER_NODE_TYPE
label_desc: Use image node_id 4 for calling the LocalNodeProvider obj's underlying member method code with example usage: obj.is_terminated(node_id) and returns: unknown