k8s.io/test-infra@v0.0.0-20240520184403-27c6b4c223d8/kubetest/bash.go (about)

     1  /*
     2  Copyright 2017 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package main
    18  
    19  import (
    20  	"flag"
    21  	"fmt"
    22  	"os"
    23  	"os/exec"
    24  	"strconv"
    25  	"time"
    26  )
    27  
    28  type bashDeployer struct {
    29  	clusterIPRange          string
    30  	gcpProject              string
    31  	gcpZone                 string
    32  	gcpSSHProxyInstanceName string
    33  	provider                string
    34  	nodeLoggingEnabled      bool
    35  }
    36  
    37  var _ deployer = &bashDeployer{}
    38  
    39  var (
    40  	bashNodeLogging = flag.Bool("bash-node-logging", false, "(bash only) enable node logging to gcp")
    41  )
    42  
    43  func newBash(clusterIPRange *string, gcpProject, gcpZone, gcpSSHProxyInstanceName, provider string) *bashDeployer {
    44  	if *clusterIPRange == "" {
    45  		if numNodes, err := strconv.Atoi(os.Getenv("NUM_NODES")); err == nil {
    46  			*clusterIPRange = getClusterIPRange(numNodes)
    47  		}
    48  	}
    49  	b := &bashDeployer{*clusterIPRange, gcpProject, gcpZone, gcpSSHProxyInstanceName, provider, *bashNodeLogging}
    50  	return b
    51  }
    52  
    53  func (b *bashDeployer) Up() error {
    54  	script := "./hack/e2e-internal/e2e-up.sh"
    55  	cmd := exec.Command(script)
    56  	cmd.Env = os.Environ()
    57  	cmd.Env = append(cmd.Env, fmt.Sprintf("CLUSTER_IP_RANGE=%s", b.clusterIPRange))
    58  	cmd.Env = append(cmd.Env, fmt.Sprintf("KUBE_ENABLE_NODE_LOGGING=%t", b.nodeLoggingEnabled))
    59  	return control.FinishRunning(cmd)
    60  }
    61  
    62  func (b *bashDeployer) IsUp() error {
    63  	return control.FinishRunning(exec.Command("./hack/e2e-internal/e2e-status.sh"))
    64  }
    65  
    66  func (b *bashDeployer) DumpClusterLogs(localPath, gcsPath string) error {
    67  	return defaultDumpClusterLogs(localPath, gcsPath, b.provider)
    68  }
    69  
    70  func (b *bashDeployer) TestSetup() error {
    71  	if b.provider == "gce" && b.gcpSSHProxyInstanceName != "" {
    72  		if err := setKubeShhBastionEnv(b.gcpProject, b.gcpZone, b.gcpSSHProxyInstanceName); err != nil {
    73  			return err
    74  		}
    75  	}
    76  	return nil
    77  }
    78  
    79  func (b *bashDeployer) Down() error {
    80  	return control.FinishRunning(exec.Command("./hack/e2e-internal/e2e-down.sh"))
    81  }
    82  
    83  func (b *bashDeployer) GetClusterCreated(gcpProject string) (time.Time, error) {
    84  	res, err := control.Output(exec.Command(
    85  		"gcloud",
    86  		"compute",
    87  		"instance-groups",
    88  		"list",
    89  		"--project="+gcpProject,
    90  		"--format=json(name,creationTimestamp)"))
    91  	if err != nil {
    92  		return time.Time{}, fmt.Errorf("list instance-group failed : %w", err)
    93  	}
    94  
    95  	created, err := getLatestClusterUpTime(string(res))
    96  	if err != nil {
    97  		return time.Time{}, fmt.Errorf("parse time failed : got gcloud res %s, err %w", string(res), err)
    98  	}
    99  	return created, nil
   100  }
   101  
   102  func (b *bashDeployer) KubectlCommand() (*exec.Cmd, error) { return nil, nil }
   103  
   104  // Calculates the cluster IP range based on the no. of nodes in the cluster.
   105  // Note: This mimics the function get-cluster-ip-range used by kube-up script.
   106  func getClusterIPRange(numNodes int) string {
   107  	suggestedRange := "10.64.0.0/14"
   108  	if numNodes > 1000 {
   109  		suggestedRange = "10.64.0.0/13"
   110  	}
   111  	if numNodes > 2000 {
   112  		suggestedRange = "10.64.0.0/12"
   113  	}
   114  	if numNodes > 4000 {
   115  		suggestedRange = "10.64.0.0/11"
   116  	}
   117  	return suggestedRange
   118  }