You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: install_test.go
    path of file: ./repos/linkerd2/test/integration/multicluster
    
    the code of the file until where you have to start completion: package multiclustertest

import (
	"bytes"
	"crypto/ecdsa"
	"crypto/elliptic"
	"crypto/rand"
	"crypto/x509"
	"crypto/x509/pkix"
	"encoding/pem"
	"fmt"
	"math/big"
	"os"
	"testing"
	"time"

	mcHealthcheck "github.com/linkerd/linkerd2/multicluster/cmd"
	"github.com/linkerd/linkerd2/pkg/healthcheck"
	"github.com/linkerd/linkerd2/pkg/version"
	"github.com/linkerd/linkerd2/testutil"
)

//////////////////////
///   TEST SETUP   ///
//////////////////////

var (
	TestHelper     *testutil.TestHelper
	contexts       map[string]string
	testDataDiffer testutil.TestDataDiffer
)

type (
	multiclusterCerts struct {
		ca         []byte
		issuerCert []byte
		issuerKey  []byte
	}
)

func TestMain(m *testing.M) {
	TestHelper = testutil.NewTestHelper()
	os.Exit(m.Run())
}

// TestInstall will install the linkerd control plane to be used in the rest of
// the deep suite tests.
func TestInstall(t *testing.T) {
	// Create temporary directory to create shared trust anchor and issuer
	// certificates
	tmpDir, err := os.MkdirTemp("", "multicluster-certs")
	if err != nil
    
func TestLinkClusters(t *testing.T) {
	// Get the control plane node IP, this is used to communicate with the
	// API Server address.
	// k3s runs an API server on the control plane node, the docker
	// container IP suffices for a connection between containers to happen
	// since they run on a shared network.
	lbCmd := []string{
		"get", "node",
		"-n", " -l=node-role.kubernetes.io/control-plane=true",
		"-o", "go-template={{ (index (index .items 0).status.addresses 0).address }}",
	}

	// Link target cluster to source
	// * source cluster should support headless services
	linkName := "target"
	lbIP, err := TestHelper.KubectlWithContext("", contexts[testutil.TargetContextKey], lbCmd...)
	if err != nil {
		testutil.AnnotatedFatalf(t, "'kubectl get' command failed",
			"'kubectl get' command failed\n%s", lbIP)
	}

	linkCmd := []string{
		"--context=" + contexts[testutil.TargetContextKey],
		"--cluster-name", linkName,
		"--api-server-address", fmt.Sprintf("https://%s:6443", lbIP),
		"--set", "enableHeadlessServices=true",
		"multicluster", "link",
		"--log-format", "json",
		"--log-level", "debug",
	}

	out, err := TestHelper.LinkerdRun(linkCmd...)
	if err != nil {
		testutil.AnnotatedFatalf(t, "'linkerd multicluster link' command failed", "'linkerd multicluster link' command failed: %s\n%s", out, err)
	}

	out, err = TestHelper.KubectlApplyWithContext(out, contexts[testutil.SourceContextKey], "-f", "-")
	if err != nil {
		testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
			"'kubectl apply' command failed\n%s", out)
	}

	// Link source cluster to target
	// * source cluster does not have a gateway, so the link will reflect that
	linkName = "source"
	lbIP, err = TestHelper.KubectlWithContext("", contexts[testutil.SourceContextKey], lbCmd...)
	if err != nil {
		testutil.AnnotatedFatalf(t, "'kubectl get' command failed",
			"'kubectl get' command failed\n%s", lbIP)
	}

	linkCmd = []string{
		"--context=" + contexts[testutil.SourceContextKey],
		"--cluster-name", linkName, "--gateway=false",
		"--api-server-address", fmt.Sprintf("https://%s:6443", lbIP),
		"multicluster", "link",
		"--log-format", "json",
		"--log-level", "debug",
	}

	out, err = TestHelper.LinkerdRun(linkCmd...)
	if err != nil {
		testutil.AnnotatedFatalf(t, "'linkerd multicluster link' command failed", "'linkerd multicluster link' command failed: %s\n%s", out, err)
	}

	out, err = TestHelper.KubectlApplyWithContext(out, contexts[testutil.TargetContextKey], "-f", "-")
	if err != nil {
		testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
			"'kubectl apply' command failed\n%s", out)
	}

}