in eks/eks.go [1073:1662]
func (ts *Tester) Up() (err error) {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]UP START [default](%q, %q)\n"), ts.cfg.ConfigPath, user.Get())
now := time.Now()
defer func() {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]UP DEFER START [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintf(ts.logWriter, "\n\n# to delete cluster\naws-k8s-tester eks delete cluster --path %s\n\n", ts.cfg.ConfigPath)
ts.logFile.Sync()
if serr := ts.uploadToS3(); serr != nil {
ts.lg.Warn("failed to upload artifacts to S3", zap.Error(serr))
} else {
ts.s3Uploaded = true
}
if err == nil {
if ts.cfg.Status.Up {
if ts.cfg.TotalNodes < 10 {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]SSH [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintln(ts.logWriter, ts.cfg.SSHCommands())
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]kubectl [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintln(ts.logWriter, ts.cfg.KubectlCommands())
ts.lg.Info("Up succeeded",
zap.String("started", humanize.RelTime(now, time.Now(), "ago", "from now")),
)
ts.lg.Sugar().Infof("Up.defer end (%s, %s)", ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprint(ts.logWriter, ts.color("\n\nšÆ š š :) [light_green]UP SUCCESS\n\n\n"))
} else {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprint(ts.logWriter, ts.color("\n\nš² š² š² [light_magenta]UP ABORTED ???\n\n\n"))
}
fmt.Fprintf(ts.logWriter, "\n\n# to delete cluster\naws-k8s-tester eks delete cluster --path %s\n\n", ts.cfg.ConfigPath)
ts.logFile.Sync()
return
}
if !ts.cfg.OnFailureDelete {
if ts.cfg.Status.Up {
if ts.cfg.TotalNodes < 10 {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]SSH [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintln(ts.logWriter, ts.cfg.SSHCommands())
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]kubectl [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintln(ts.logWriter, ts.cfg.KubectlCommands())
}
ts.lg.Warn("Up failed",
zap.String("started", humanize.RelTime(now, time.Now(), "ago", "from now")),
zap.Error(err),
)
fmt.Fprintf(ts.logWriter, ts.color("\n\n\n[light_magenta]UP FAIL ERROR:\n\n[default]%v\n\n\n"), err)
fmt.Fprintf(ts.logWriter, "\n\n# to delete cluster\naws-k8s-tester eks delete cluster --path %s\n\n", ts.cfg.ConfigPath)
ts.lg.Sugar().Infof("Up.defer end (%s, %s)", ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprint(ts.logWriter, ts.color("\n\nš„ š š½ š± š” ā (-_-) [light_magenta]UP FAIL\n\n\n"))
fmt.Fprintf(ts.logWriter, "\n\n# to delete cluster\naws-k8s-tester eks delete cluster --path %s\n\n", ts.cfg.ConfigPath)
ts.logFile.Sync()
return
}
if ts.cfg.Status.Up {
if ts.cfg.TotalNodes < 10 {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]SSH [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintln(ts.logWriter, ts.cfg.SSHCommands())
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]kubectl [default](%q)\n"), ts.cfg.ConfigPath)
fmt.Fprintln(ts.logWriter, ts.cfg.KubectlCommands())
}
fmt.Fprintf(ts.logWriter, ts.color("\n\n\n[light_magenta]UP FAIL ERROR:\n\n[default]%v\n\n\n"), err)
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprint(ts.logWriter, ts.color("š„ š š½ š± š” ā (-_-) [light_magenta]UP FAIL\n"))
fmt.Fprintf(ts.logWriter, "\n\n# to delete cluster\naws-k8s-tester eks delete cluster --path %s\n\n", ts.cfg.ConfigPath)
ts.lg.Warn("Up failed; reverting resource creation",
zap.String("started", humanize.RelTime(now, time.Now(), "ago", "from now")),
zap.Error(err),
)
waitDur := time.Duration(ts.cfg.OnFailureDeleteWaitSeconds) * time.Second
if waitDur > 0 {
ts.lg.Info("waiting before clean up", zap.Duration("wait", waitDur))
select {
case <-ts.stopCreationCh:
ts.lg.Info("wait aborted before clean up")
case <-ts.osSig:
ts.lg.Info("wait aborted before clean up")
case <-time.After(waitDur):
}
}
derr := ts.down()
if derr != nil {
ts.lg.Warn("failed to revert Up", zap.Error(derr))
} else {
ts.lg.Warn("reverted Up")
}
fmt.Fprintf(ts.logWriter, ts.color("\n\n\n[light_magenta]UP FAIL ERROR:\n\n[default]%v\n\n\n"), err)
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprint(ts.logWriter, ts.color("\n\nš„ š š½ š± š” ā (-_-) [light_magenta]UP FAIL\n\n\n"))
fmt.Fprintf(ts.logWriter, "\n\n# to delete cluster\naws-k8s-tester eks delete cluster --path %s\n\n", ts.cfg.ConfigPath)
ts.lg.Sugar().Infof("Up.defer end (%s, %s)", ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
ts.logFile.Sync()
}()
ts.lg.Info("starting Up",
zap.String("version", version.Version()),
zap.String("user", user.Get()),
zap.String("name", ts.cfg.Name),
)
defer ts.cfg.Sync()
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]createS3 [default](%q)\n"), ts.cfg.ConfigPath)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.createS3,
"createS3",
); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]createKeyPair [default](%q)\n"), ts.cfg.ConfigPath)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.createKeyPair,
"createKeyPair",
); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]createCluster [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.clusterTester.Create,
ts.clusterTester.Name(),
); err != nil {
return err
}
ts.k8sClient = ts.clusterTester.Client()
if err := ts.createTesters(); err != nil {
return err
}
if ts.cfg.KubeControllerManagerQPS != "" &&
ts.cfg.KubeControllerManagerBurst != "" &&
ts.cfg.KubeSchedulerQPS != "" &&
ts.cfg.KubeSchedulerBurst != "" &&
ts.cfg.KubeAPIServerMaxRequestsInflight != "" &&
ts.cfg.FEUpdateMasterFlagsURL != "" {
time.Sleep(5 * time.Minute)
fmt.Fprint(ts.logWriter, ts.color("[light_green]waiting 5 minutes for another control plane instance in service\n"))
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprint(ts.logWriter, ts.color("[light_green]run awscurl Command.CommandAfterCreateCluster\n"))
curl := awscurl.New(awscurl.Config{
ClusterArn: ts.cfg.Status.ClusterARN,
MaxRequestsInflight: ts.cfg.KubeAPIServerMaxRequestsInflight,
KubeControllerManagerQPS: ts.cfg.KubeControllerManagerQPS,
KubeControllerManagerBurst: ts.cfg.KubeControllerManagerBurst,
KubeSchedulerQPS: ts.cfg.KubeSchedulerQPS,
KubeSchedulerBurst: ts.cfg.KubeSchedulerBurst,
URI: ts.cfg.FEUpdateMasterFlagsURL,
Service: "eks-internal",
Region: ts.cfg.Region,
Method: "POST",
})
res, err := curl.Do()
if err != nil {
return fmt.Errorf("failed to curl request %v", err)
}
fmt.Fprintf(ts.logWriter, "\nrun awscurl Command output:\n\n%s\n", res)
}
if ts.cfg.CommandAfterCreateCluster != "" {
if err := ts.cfg.EvaluateCommandRefs(); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]runCommand.CommandAfterCreateCluster [default](%q)\n"), ts.cfg.CommandAfterCreateCluster)
out, err := runCommand(ts.lg, ts.cfg.CommandAfterCreateCluster, ts.cfg.CommandAfterCreateClusterTimeout)
if err != nil {
err = ioutil.WriteFile(ts.cfg.CommandAfterCreateClusterOutputPath, []byte(ts.cfg.CommandAfterCreateCluster+"\n\n# output\n"+string(out)+"\n\n# error\n"+err.Error()), 0600)
if err != nil {
return fmt.Errorf("failed to write file %q (%v)", ts.cfg.CommandAfterCreateClusterOutputPath, err)
}
} else {
err = ioutil.WriteFile(ts.cfg.CommandAfterCreateClusterOutputPath, []byte(ts.cfg.CommandAfterCreateCluster+"\n\n# output\n"+string(out)), 0600)
if err != nil {
return fmt.Errorf("failed to write file %q (%v)", ts.cfg.CommandAfterCreateClusterOutputPath, err)
}
}
fmt.Fprintf(ts.logWriter, "\nrunCommand output:\n\n%s\n", string(out))
}
if serr := ts.uploadToS3(); serr != nil {
ts.lg.Warn("failed to upload artifacts to S3", zap.Error(serr))
}
if ts.cfg.IsEnabledAddOnCNIVPC() {
if ts.cniTester == nil {
return errors.New("ts.cniTester == nil when AddOnCNIVPC.Enable == true")
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]cniTester.Create [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand()+" --namespace kube-system")
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.cniTester.Create,
ts.cniTester.Name(),
); err != nil {
return err
}
}
if ts.cfg.IsEnabledAddOnNodeGroups() {
if ts.ngTester == nil {
return errors.New("ts.ngTester == nil when AddOnNodeGroups.Enable == true")
}
// create NG first, so MNG configmap update can be called afterwards
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]ngTester.Create [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.ngTester.Create,
ts.ngTester.Name(),
); err != nil {
return err
}
}
if ts.cfg.IsEnabledAddOnManagedNodeGroups() {
if ts.mngTester == nil {
return errors.New("ts.mngTester == nil when AddOnManagedNodeGroups.Enable == true")
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]mngTester.Create [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.mngTester.Create,
ts.mngTester.Name(),
); err != nil {
return err
}
}
needGPU := false
if ts.cfg.IsEnabledAddOnNodeGroups() {
gpuFound1:
for _, mv := range ts.cfg.AddOnNodeGroups.ASGs {
switch mv.AMIType {
case ec2config.AMITypeAL2X8664GPU:
needGPU = true
break gpuFound1
}
}
}
if !needGPU && ts.cfg.IsEnabledAddOnManagedNodeGroups() {
gpuFound2:
for _, mv := range ts.cfg.AddOnManagedNodeGroups.MNGs {
switch mv.AMIType {
case aws_eks.AMITypesAl2X8664Gpu:
needGPU = true
break gpuFound2
}
}
}
if needGPU {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]gpuTester.InstallNvidiaDriver [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.gpuTester.InstallNvidiaDriver,
ts.gpuTester.Name(),
); err != nil {
ts.lg.Warn("failed to install nvidia driver", zap.Error(err))
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]gpuTester.CreateNvidiaSMI [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.gpuTester.CreateNvidiaSMI,
ts.gpuTester.Name(),
); err != nil {
ts.lg.Warn("failed to create nvidia-smi", zap.Error(err))
return err
}
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]%q.CheckHealth [default](%q, %q)\n"), ts.clusterTester.Name(), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if ts.k8sClient == nil {
// TODO: investigate why "ts.k8sClient == nil"
ts.lg.Warn("[TODO] unexpected nil k8s client after cluster creation")
}
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.clusterTester.CheckHealth,
ts.clusterTester.Name(),
); err != nil {
return err
}
if serr := ts.uploadToS3(); serr != nil {
ts.lg.Warn("failed to upload artifacts to S3", zap.Error(serr))
}
for idx, cur := range ts.testers {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]testers[%02d].Create [cyan]%q [default](%q, %q)\n"), idx, cur.Name(), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
cur.Create,
cur.Name(),
)
if idx%10 == 0 {
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]testers[%02d] [cyan]%q.CheckHealth [default](%q, %q)\n"), idx, ts.clusterTester.Name(), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if ts.k8sClient == nil {
// TODO: investigate why "ts.k8sClient == nil"
ts.lg.Warn("[TODO] unexpected nil k8s client after cluster creation")
}
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.clusterTester.CheckHealth,
ts.clusterTester.Name(),
); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]testers[%02d] uploadToS3 [cyan]%q [default](%q, %q)\n"), idx, cur.Name(), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if serr := ts.uploadToS3(); serr != nil {
ts.lg.Warn("failed to upload artifacts to S3", zap.Error(serr))
}
}
if err != nil {
return err
}
}
if ts.cfg.IsEnabledAddOnNodeGroups() && ts.cfg.AddOnNodeGroups.Created && ts.cfg.AddOnNodeGroups.FetchLogs {
if ts.ngTester == nil {
return errors.New("ts.ngTester == nil when AddOnNodeGroups.Enable == true")
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]ngTester.FetchLogs [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
waitDur := 15 * time.Second
ts.lg.Info("sleeping before ngTester.FetchLogs", zap.Duration("wait", waitDur))
time.Sleep(waitDur)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.ngTester.FetchLogs,
ts.ngTester.Name(),
); err != nil {
return err
}
}
if ts.cfg.IsEnabledAddOnManagedNodeGroups() && ts.cfg.AddOnManagedNodeGroups.Created && ts.cfg.AddOnManagedNodeGroups.FetchLogs {
if ts.mngTester == nil {
return errors.New("ts.mngTester == nil when AddOnManagedNodeGroups.Enable == true")
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]mngTester.FetchLogs [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
waitDur := 15 * time.Second
ts.lg.Info("sleeping before mngTester.FetchLogs", zap.Duration("wait", waitDur))
time.Sleep(waitDur)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.mngTester.FetchLogs,
ts.mngTester.Name(),
); err != nil {
return err
}
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]%q.CheckHealth [default](%q, %q)\n"), ts.clusterTester.Name(), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
if ts.k8sClient == nil {
// TODO: investigate why "ts.k8sClient == nil"
ts.lg.Warn("[TODO] unexpected nil k8s client after cluster creation")
}
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.clusterTester.CheckHealth,
ts.clusterTester.Name(),
); err != nil {
return err
}
if ts.cfg.CommandAfterCreateAddOns != "" {
if err := ts.cfg.EvaluateCommandRefs(); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]runCommand.CommandAfterCreateAddOns [default](%q)\n"), ts.cfg.CommandAfterCreateAddOns)
out, err := runCommand(ts.lg, ts.cfg.CommandAfterCreateAddOns, ts.cfg.CommandAfterCreateAddOnsTimeout)
if err != nil {
err = ioutil.WriteFile(ts.cfg.CommandAfterCreateAddOnsOutputPath, []byte(ts.cfg.CommandAfterCreateAddOns+"\n\n# output\n"+string(out)+"\n\n# error\n"+err.Error()), 0600)
if err != nil {
return fmt.Errorf("failed to write file %q (%v)", ts.cfg.CommandAfterCreateAddOnsOutputPath, err)
}
} else {
err = ioutil.WriteFile(ts.cfg.CommandAfterCreateAddOnsOutputPath, []byte(ts.cfg.CommandAfterCreateAddOns+"\n\n# output\n"+string(out)), 0600)
if err != nil {
return fmt.Errorf("failed to write file %q (%v)", ts.cfg.CommandAfterCreateAddOnsOutputPath, err)
}
}
fmt.Fprintf(ts.logWriter, "\nrunCommand output:\n\n%s\n", string(out))
}
logFetchAgain := false
if ts.cfg.IsEnabledAddOnManagedNodeGroups() && ts.cfg.AddOnManagedNodeGroups.Created {
if ts.mngTester == nil {
return errors.New("ts.mngTester == nil when AddOnManagedNodeGroups.Enable == true")
}
scaleFound:
for _, cur := range ts.cfg.AddOnManagedNodeGroups.MNGs {
for _, up := range cur.ScaleUpdates {
if up.Enable {
logFetchAgain = true
break scaleFound
}
}
}
if !logFetchAgain {
for _, cur := range ts.cfg.AddOnManagedNodeGroups.MNGs {
if cur.VersionUpgrade != nil && cur.VersionUpgrade.Enable {
logFetchAgain = true
break
}
}
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]mngTester.Scale [default](%q, logFetchAgain %v)\n"), ts.cfg.ConfigPath, logFetchAgain)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.mngTester.Scale,
ts.mngTester.Name(),
); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]mngTester.UpgradeVersion [default](%q, logFetchAgain %v)\n"), ts.cfg.ConfigPath, logFetchAgain)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.mngTester.UpgradeVersion,
ts.mngTester.Name(),
); err != nil {
return err
}
}
if logFetchAgain && ts.cfg.IsEnabledAddOnManagedNodeGroups() && ts.cfg.AddOnManagedNodeGroups.Created && ts.cfg.AddOnManagedNodeGroups.FetchLogs {
if ts.mngTester == nil {
return errors.New("ts.mngTester == nil when AddOnManagedNodeGroups.Enable == true")
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]mngTester.FetchLogs after upgrade [default](%q, %q)\n"), ts.cfg.ConfigPath, ts.cfg.KubectlCommand())
waitDur := 15 * time.Second
ts.lg.Info("sleeping before mngTester.FetchLogs", zap.Duration("wait", waitDur))
time.Sleep(waitDur)
if err := catchInterrupt(
ts.lg,
ts.stopCreationCh,
ts.stopCreationChOnce,
ts.osSig,
ts.mngTester.FetchLogs,
ts.mngTester.Name(),
); err != nil {
return err
}
}
if ts.cfg.CommandAfterCreateAddOns != "" {
if err := ts.cfg.EvaluateCommandRefs(); err != nil {
return err
}
fmt.Fprint(ts.logWriter, ts.color("\n\n[yellow]*********************************\n"))
fmt.Fprintf(ts.logWriter, ts.color("[light_green]runCommand.CommandAfterCreateAddOns [default](%q)\n"), ts.cfg.CommandAfterCreateAddOns)
out, err := runCommand(ts.lg, ts.cfg.CommandAfterCreateAddOns, ts.cfg.CommandAfterCreateAddOnsTimeout)
if err != nil {
err = ioutil.WriteFile(ts.cfg.CommandAfterCreateAddOnsOutputPath, []byte(ts.cfg.CommandAfterCreateAddOns+"\n\n# output\n"+string(out)+"\n\n# error\n"+err.Error()), 0600)
if err != nil {
ts.lg.Warn("failed to write CommandAfterCreateAddOnsOutputPath", zap.Error(err))
}
} else {
err = ioutil.WriteFile(ts.cfg.CommandAfterCreateAddOnsOutputPath, []byte(ts.cfg.CommandAfterCreateAddOns+"\n\n# output\n"+string(out)), 0600)
if err != nil {
ts.lg.Warn("failed to write CommandAfterCreateAddOnsOutputPath", zap.Error(err))
}
}
fmt.Fprintf(ts.logWriter, "\nrunCommand output:\n\n%s\n", string(out))
}
// Generic installation of ordered addons. Add your addon to ts.addons
for _, order := range ts.addons {
if err := ts.runAsync(order, func(a eks_tester.Addon) error {
zap.S().Infof("Applying addon %s", reflect.TypeOf(a))
return a.Apply()
}); err != nil {
return fmt.Errorf("while applying addons, %w", err)
}
ts.cfg.Sync()
}
if serr := ts.cfg.Sync(); serr != nil {
fmt.Fprintf(ts.logWriter, ts.color("[light_magenta]cfg.Sync failed [default]%v\n"), serr)
}
return nil
}