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 }