From a97344e20bfc76c5dc4aeac4673902d535ab19aa Mon Sep 17 00:00:00 2001 From: "Cemal Y. Dalar" Date: Wed, 14 Aug 2024 08:53:45 +0200 Subject: [PATCH 1/2] #486 cloud-init timeout --- cmd/create.go | 2 +- internal/files/init/onctl.yaml | 2 ++ internal/tools/cloud-init.go | 44 +++++++++++++++++++--------------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index 0af4f334..478d2f18 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -170,7 +170,7 @@ var createCmd = &cobra.Command{ } } - remote.WaitForCloudInit() + remote.WaitForCloudInit(viper.GetString("vm.cloud-init.timeout")) s.Stop() fmt.Println("\033[32m\u2714\033[0m VM is Ready") log.Println("[DEBUG] cloud-init finished") diff --git a/internal/files/init/onctl.yaml b/internal/files/init/onctl.yaml index d52214ba..36b2e493 100644 --- a/internal/files/init/onctl.yaml +++ b/internal/files/init/onctl.yaml @@ -1,5 +1,7 @@ vm: name: onctl-vm + cloud-init: + timeout: 3m # ex. 3m or 180s ssh: # publicKey: ~/.ssh/id_ed25519.pub # privateKey: ~/.ssh/id_ed25519 diff --git a/internal/tools/cloud-init.go b/internal/tools/cloud-init.go index c4056b85..46c70dcf 100644 --- a/internal/tools/cloud-init.go +++ b/internal/tools/cloud-init.go @@ -30,28 +30,34 @@ func FileToBase64(filepath string) string { } // WaitForCloudInit waits for cloud-init to finish -func (r *Remote) WaitForCloudInit() { - var tries int - +func (r *Remote) WaitForCloudInit(timeout string) { + log.Println("[DEBUG] Waiting for cloud-init to finish timeout:", timeout) command := "[ -f /run/cloud-init/result.json ] && echo -n \"OK\"" - for { - isOK, err := r.RemoteRun(&RemoteRunConfig{ - Command: command, - }) - if err != nil { - log.Println("[DEBUG] RemoteRun:" + err.Error()) - } - if err == nil { - if isOK == "OK" { - break + // Parse the timeout string into a time.Duration + duration, err := time.ParseDuration(timeout) + if err != nil { + log.Fatalf("Invalid timeout value: %v", err) + } + + timer := time.After(duration) + + for { + select { + case <-timer: + log.Fatalln("Exiting.. Timeout reached while waiting for cloud-init to finish on IP " + r.IPAddress + " on port " + strconv.Itoa(r.SSHPort)) + return + default: + isOK, err := r.RemoteRun(&RemoteRunConfig{ + Command: command, + }) + if err != nil { + log.Println("[DEBUG] RemoteRun:" + err.Error()) } - } - time.Sleep(3 * time.Second) - tries++ - log.Println("[DEBUG] :" + strconv.Itoa(tries)) - if tries > 15 { - log.Fatalln("Exiting.. Could not connect to IP " + r.IPAddress + " on port " + strconv.Itoa(r.SSHPort)) + if err == nil && isOK == "OK" { + return + } + time.Sleep(3 * time.Second) } } } From a3e1b7cee94d44d311d4665ced80300a11999105 Mon Sep 17 00:00:00 2001 From: "Cemal Y. Dalar" Date: Wed, 14 Aug 2024 09:10:43 +0200 Subject: [PATCH 2/2] linter fixes --- internal/cloud/azure.go | 4 ++-- internal/tools/cicd.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/cloud/azure.go b/internal/cloud/azure.go index 8e1e61e8..a31a8bd2 100644 --- a/internal/cloud/azure.go +++ b/internal/cloud/azure.go @@ -76,8 +76,8 @@ func (p ProviderAzure) List() (VmList, error) { log.Fatalf("failed to finish the request: %v", err) } else { // Print the obtained query results - log.Printf("[DEBUG] Resources found: " + strconv.FormatInt(*resp.TotalRecords, 10) + "\n") - log.Printf("[DEBUG] Results: " + fmt.Sprint(resp.Data) + "\n") + log.Printf("[DEBUG] Resources found: %d\n", *resp.TotalRecords) + log.Printf("[DEBUG] Results: %v\n", resp.Data) } if len(strconv.FormatInt(*resp.TotalRecords, 10)) == 0 { return VmList{}, nil diff --git a/internal/tools/cicd.go b/internal/tools/cicd.go index 1bf3b2c4..1f1a7a8e 100644 --- a/internal/tools/cicd.go +++ b/internal/tools/cicd.go @@ -15,7 +15,7 @@ func GenerateMachineUniqueName() string { func GenerateUserName() string { userCurrent, err := user.Current() if err != nil { - log.Fatalf(err.Error()) + log.Fatalf("%s", err.Error()) } userName := strings.ReplaceAll(userCurrent.Username, "\\", "-") userName = strings.ReplaceAll(userName, " ", "-")