code: def get_run_lock_info(self, run_hash: str) -> LockInfo:
      # check locks created prior to 3.15 version
      locked = False
      created_at = None
      lock_version = None
      lock_type = None
  
      run_lock_path = self.locks_path / self.softlock_fname(run_hash)
      if run_lock_path.exists():
          locked = True
          created_at = datetime.datetime.fromtimestamp(
              run_lock_path.stat().st_mtime
          )
          lock_version = LockingVersion.NEW
          lock_type = LockType.SOFT_LOCK
      else:
          # consider Run as locked if one of it's containers is locked
          for container_dir in ("meta", "seqs"):
              lock_dir = self.repo_path / container_dir / "locks"
              lock_path = lock_dir / run_hash
              soft_lock_path = lock_dir / self.softlock_fname(run_hash)
              if lock_path.exists():
                  try:
                      lock = UnixFileLock(lock_path, timeout=0)
                      with lock.acquire():
                          pass
                  except Timeout:
                      locked = True
                      lock_version = LockingVersion.LEGACY
                      lock_type = LockType.UNIX_LOCK
              elif soft_lock_path.exists():
                  locked = True
                  created_at = datetime.datetime.fromtimestamp(
                      soft_lock_path.stat().st_mtime
                  )
                  lock_version = LockingVersion.LEGACY
                  lock_type = LockType.SOFT_LOCK
  
      return LockInfo(
          run_hash=run_hash,
          locked=locked,
          created_at=created_at,
          version=lock_version,
          type=lock_type,
      )
  
imports: import datetime
  import uuid
  import psutil
  import os
  import time
  import logging
  import weakref
  from typing import Union
  from enum import Enum
  from pathlib import Path
  from dataclasses import dataclass, field
  from dateutil.relativedelta import relativedelta
  from filelock import UnixFileLock, SoftFileLock, Timeout
  from aim.sdk.errors import RunLockingError
  from aim.storage.locking import RunLock
label_desc: Use image node_id 3 for calling the LockManager obj's underlying member method code with example usage: obj.get_run_lock_info(run_hash) and returns: LockInfo