1
2
3
4
19
20 package gce
21
22 import (
23 "context"
24 "fmt"
25 "strings"
26 "time"
27
28 v1 "k8s.io/api/core/v1"
29 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30 "k8s.io/apimachinery/pkg/util/wait"
31 clientset "k8s.io/client-go/kubernetes"
32 "k8s.io/kubernetes/test/e2e/framework"
33 )
34
35
36 func RecreateNodes(c clientset.Interface, nodes []v1.Node) error {
37
38 nodeNamesByZone := make(map[string][]string)
39 for i := range nodes {
40 node := &nodes[i]
41
42 if zone, ok := node.Labels[v1.LabelFailureDomainBetaZone]; ok {
43 nodeNamesByZone[zone] = append(nodeNamesByZone[zone], node.Name)
44 continue
45 }
46
47 if zone, ok := node.Labels[v1.LabelTopologyZone]; ok {
48 nodeNamesByZone[zone] = append(nodeNamesByZone[zone], node.Name)
49 continue
50 }
51
52 defaultZone := framework.TestContext.CloudConfig.Zone
53 nodeNamesByZone[defaultZone] = append(nodeNamesByZone[defaultZone], node.Name)
54 }
55
56
57 var instanceGroup string
58 if strings.Contains(framework.TestContext.CloudConfig.NodeInstanceGroup, ",") {
59 return fmt.Errorf("Test does not support cluster setup with more than one managed instance group: %s", framework.TestContext.CloudConfig.NodeInstanceGroup)
60 }
61 instanceGroup = framework.TestContext.CloudConfig.NodeInstanceGroup
62
63
64 for zone, nodeNames := range nodeNamesByZone {
65 args := []string{
66 "compute",
67 fmt.Sprintf("--project=%s", framework.TestContext.CloudConfig.ProjectID),
68 "instance-groups",
69 "managed",
70 "recreate-instances",
71 instanceGroup,
72 }
73
74 args = append(args, fmt.Sprintf("--instances=%s", strings.Join(nodeNames, ",")))
75 args = append(args, fmt.Sprintf("--zone=%s", zone))
76 framework.Logf("Recreating instance group %s.", instanceGroup)
77 stdout, stderr, err := framework.RunCmd("gcloud", args...)
78 if err != nil {
79 return fmt.Errorf("error recreating nodes: %s\nstdout: %s\nstderr: %s", err, stdout, stderr)
80 }
81 }
82 return nil
83 }
84
85
86 func WaitForNodeBootIdsToChange(ctx context.Context, c clientset.Interface, nodes []v1.Node, timeout time.Duration) error {
87 errMsg := []string{}
88 for i := range nodes {
89 node := &nodes[i]
90 if err := wait.PollWithContext(ctx, 30*time.Second, timeout, func(ctx context.Context) (bool, error) {
91 newNode, err := c.CoreV1().Nodes().Get(ctx, node.Name, metav1.GetOptions{})
92 if err != nil {
93 framework.Logf("Could not get node info: %s. Retrying in %v.", err, 30*time.Second)
94 return false, nil
95 }
96 return node.Status.NodeInfo.BootID != newNode.Status.NodeInfo.BootID, nil
97 }); err != nil {
98 errMsg = append(errMsg, "Error waiting for node %s boot ID to change: %s", node.Name, err.Error())
99 }
100 }
101 if len(errMsg) > 0 {
102 return fmt.Errorf(strings.Join(errMsg, ","))
103 }
104 return nil
105 }
106
View as plain text