code: def install_linkerd_smi(self) -> None:
      self._log.info("Installing Linkerd SMI to Cluster...")
      proc = subprocess.Popen(
          [f"{Path.home()}/.linkerd2/bin/linkerd-smi", "install"],
          stdout=subprocess.PIPE,
          env={"KUBECONFIG": str(self._cluster.kubeconfig_path)},
      )
      kube_out = subprocess.check_output(
          (
              str(self._cluster.kubectl_path),
              "apply",
              "-f",
              "-",
          ),
          stdin=proc.stdout,
          env=os.environ,
      )
      self._log.info("Poll status of linkerd smi install")
      returncode = proc.poll()
      self._log.info(
          f"Installing Linkerd to Cluster returned code {returncode}, kubectl output was {kube_out}"
      )
      if returncode is not None and returncode != 0:
          raise Exception(
              f"Installing linkerd failed with {returncode}"
          )
  
      self._log.info("check linkerd status")
      try:
          out = subprocess.check_output(
              [f"{Path.home()}/.linkerd2/bin/linkerd-smi", "check"],
              env=os.environ,
              stderr=subprocess.STDOUT,
          )
          print(
              f'linkerd check yields {out.decode() if out else "nothing"}'
          )
      except subprocess.CalledProcessError as e:
          print(
              f"linkerd check failed with error code { e.returncode } and output { e.output }"
          )
  
imports: import contextlib
  import os
  import subprocess
  import tempfile
  import time
  from pathlib import Path
  from typing import Dict, List
  import docker
  import pytest
  from pytest import FixtureRequest
  from pytest_kind import KindCluster
  from jina.logging.logger import JinaLogger
label_desc: Use image node_id 4 for calling the KindClusterWrapper obj's underlying member method code with example usage: obj.install_linkerd_smi() without return types