From 0f316e81494a4d23085a6522a0d9f041338f4d05 Mon Sep 17 00:00:00 2001 From: rony5394 <143897221+rony5394@users.noreply.github.com> Date: Mon, 25 May 2026 15:39:14 +0200 Subject: [PATCH] Some cleanup. --- config/config.go | 4 ++++ docker/cleanup.go | 36 ++++++++++++++++-------------------- docker/keys.go | 31 +++++++++++++++++++++++-------- docker/prepare.go | 7 ++++--- docker/scale.go | 7 ++++++- main.go | 2 ++ shared/ssh.go | 13 +++++++++---- 7 files changed, 64 insertions(+), 36 deletions(-) diff --git a/config/config.go b/config/config.go index d9ef92d..48a3ca2 100644 --- a/config/config.go +++ b/config/config.go @@ -26,6 +26,8 @@ type Config struct { StorageContainerName string PrepullImageServiceName string ServiceScaleTimeout time.Duration + SSHClientPKConfigName string + SSHHostSKSecretName string } } @@ -48,6 +50,8 @@ func GetConfig()(Config, error){ cfg.Constants.StorageContainerName = "blazenaStorage"; cfg.Constants.PrepullImageServiceName = "blazenaPrepull"; cfg.Constants.ServiceScaleTimeout = time.Second * 15; + cfg.Constants.SSHClientPKConfigName = "blazenaSSHClientPublicKey"; + cfg.Constants.SSHHostSKSecretName = "blazenaSSHHostPrivateKey"; err = json.Unmarshal(rawConfig, &cfg); diff --git a/docker/cleanup.go b/docker/cleanup.go index 7ebb6de..46443c7 100644 --- a/docker/cleanup.go +++ b/docker/cleanup.go @@ -2,10 +2,10 @@ package docker import ( "context" - "encoding/json" "fmt" - "io" + "log/slog" "net/http" + "os" "time" "github.com/docker/docker/api/types/swarm" @@ -20,44 +20,40 @@ func cleanup(w http.ResponseWriter, r *http.Request){ if !bearerAuth(w, r) {return;} - rawBody, err := io.ReadAll(r.Body); - if err != nil { - panic("Failed to read body!"); - } - - var bodyDecoded struct{ - ServiceId string `json:"serviceId"` - }; - - err = json.Unmarshal(rawBody, &bodyDecoded); - if err != nil { - panic("Failed to unmarshal json."+ err.Error()); - } - listResoult, err := ApiClient.ServiceList(context.Background(), swarm.ServiceListOptions{}); if err != nil { - panic("Failed to list services."+ err.Error()); + slog.Error("Failed to list services", slog.Any("propagatedError", err)); + os.Exit(1); } var helperServiceId string; + var helperServices int; for _, service := range listResoult{ if service.Spec.Labels["blazena.helper"] != "true" { continue; } helperServiceId = service.ID; - break; + helperServices ++; } if helperServiceId == ""{ - panic("Helper service not found!"); + slog.Warn("Helper service wasn't found"); + http.Error(w, "Internal Server Error", http.StatusInternalServerError); + return; + } + + if helperServices > 1{ + slog.Error("There are more than 1 helper service."); + os.Exit(1); } err = ApiClient.ServiceRemove(context.Background(), helperServiceId); if err != nil { panic("Failed to remove helper service."+ err.Error()); } + //TODO: add proper wait system time.Sleep(7*time.Second); - fmt.Fprint(w, bodyDecoded.ServiceId); + fmt.Fprint(w, helperServiceId); } diff --git a/docker/keys.go b/docker/keys.go index d436666..4adb5f5 100644 --- a/docker/keys.go +++ b/docker/keys.go @@ -1,11 +1,14 @@ package docker import ( + "context" "encoding/json" "fmt" "io" + "log/slog" "net/http" - "context" + "os" + "github.com/docker/docker/api/types/swarm" "github.com/rony5394/blazena/shared" @@ -32,23 +35,35 @@ func exchangeKeys(w http.ResponseWriter, r *http.Request){ if err != nil { panic("Failed to unmarshal json."+ err.Error()); } - sshPkPem := bodyDecoded.SshPkPem; + sshClientPkPem := bodyDecoded.SshPkPem; hostKeypair := shared.GenerateSSHKeypair(); + encoded, err := json.Marshal(struct{HostPkPem string `json:"hostPkPem"`}{HostPkPem: hostKeypair.Public}); if err != nil { - panic("I wonder how. I wonder why?"+err.Error()); + slog.Error("Failed to marshal host pk into response.", slog.Any("propagatedError", err)); + os.Exit(42); } - ApiClient.ConfigCreate(context.Background(), swarm.ConfigSpec{ - Data: []byte(sshPkPem), - Annotations: swarm.Annotations{Name: "blazenaSSHPublicKey"}, + _, err = ApiClient.ConfigCreate(context.Background(), swarm.ConfigSpec{ + Data: []byte(sshClientPkPem), + Annotations: swarm.Annotations{Name: theConfig.Constants.SSHClientPKConfigName}, }); - ApiClient.SecretCreate(context.Background(), swarm.SecretSpec{ + if err != nil { + slog.Error("Failed to create a config.", slog.Any("propagatedError", err)); + os.Exit(1); + } + + _, err = ApiClient.SecretCreate(context.Background(), swarm.SecretSpec{ Data: []byte(hostKeypair.Private), - Annotations: swarm.Annotations{Name: "blazenaSSHHostPrivateKey"}, + Annotations: swarm.Annotations{Name: theConfig.Constants.SSHHostSKSecretName}, }); + if err != nil { + slog.Error("Failed to create a secret.", slog.Any("propagatedError", err)); + os.Exit(1); + } + fmt.Fprint(w, string(encoded)); } diff --git a/docker/prepare.go b/docker/prepare.go index 9eb7939..42c4262 100644 --- a/docker/prepare.go +++ b/docker/prepare.go @@ -53,6 +53,7 @@ func prepare(w http.ResponseWriter, r *http.Request){ pullBlazenaImage(); createHelper(theConfig, labels["blazena.node"], bodyDecoded.VolumeId); + //TODO: add proper waiting system. time.Sleep(7*time.Second); fmt.Fprint(w, bodyDecoded.ServiceId); @@ -129,7 +130,7 @@ func createHelper(Config cfg.Config, targetNode string, targetVolume string){ stopGracePeriod := time.Second * 5; helperCommand := `/usr/sbin/sshd -h /host-key -p 2222 -D`; - sshKeyConfigId, err := getConfigIDByName(ApiClient, "blazenaSSHPublicKey"); + sshKeyConfigId, err := getConfigIDByName(ApiClient, theConfig.Constants.SSHClientPKConfigName); if err != nil { panic("Docker needs both id and name to mount config for some reason and getting id of it failed!"+err.Error()); @@ -163,7 +164,7 @@ func createHelper(Config cfg.Config, targetNode string, targetVolume string){ Configs: []*swarm.ConfigReference{ &swarm.ConfigReference{ ConfigID: sshKeyConfigId, - ConfigName: "blazenaSSHPublicKey", + ConfigName: theConfig.Constants.SSHClientPKConfigName, File: &swarm.ConfigReferenceFileTarget{ Name: "/root/.ssh/authorized_keys", Mode: 0600, @@ -175,7 +176,7 @@ func createHelper(Config cfg.Config, targetNode string, targetVolume string){ Secrets: []*swarm.SecretReference{ &swarm.SecretReference{ SecretID: sshHostKeySecretId, - SecretName: "blazenaSSHHostPrivateKey", + SecretName: theConfig.Constants.SSHHostSKSecretName, File: &swarm.SecretReferenceFileTarget{ Name: "/host-key", Mode: 0600, diff --git a/docker/scale.go b/docker/scale.go index 208f9b7..460b986 100644 --- a/docker/scale.go +++ b/docker/scale.go @@ -118,7 +118,12 @@ func scaleUp(w http.ResponseWriter, r *http.Request){ delete(updatedSpec.Labels, "blazena.scaledDown"); delete(updatedSpec.Labels, "blazena.originalScale"); - ApiClient.ServiceUpdate(context.Background(), serviceId, inspectresoult.Version, updatedSpec, swarm.ServiceUpdateOptions{}); + _, err = ApiClient.ServiceUpdate(context.Background(), serviceId, inspectresoult.Version, updatedSpec, swarm.ServiceUpdateOptions{}); + + if err != nil { + slog.Error("Failed to update/scale a service.", slog.Any("propagatedError", err), slog.String("serviceId", serviceId)); + os.Exit(1); + } ctx, cancel := context.WithTimeout(context.Background(), theConfig.Constants.ServiceScaleTimeout); defer cancel(); diff --git a/main.go b/main.go index e22ed9f..60de616 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,8 @@ import ( "github.com/rony5394/blazena/host" ) +//TODO: consider adding blazena.doNotTouch + /* If the exit code is X then it means Y: diff --git a/shared/ssh.go b/shared/ssh.go index 568f186..a9dc0d5 100644 --- a/shared/ssh.go +++ b/shared/ssh.go @@ -1,9 +1,11 @@ -package shared +package shared import ( "crypto/ed25519" "crypto/rand" "encoding/pem" + "log/slog" + "os" "golang.org/x/crypto/ssh" ) @@ -16,19 +18,22 @@ type Keypair struct { func GenerateSSHKeypair() Keypair { publicKey, privateKey, err := ed25519.GenerateKey(rand.Reader) if err != nil { - panic(err) + slog.Error("Failed to generate an ssh keypair.", slog.Any("propagatedError", err)); + os.Exit(42); } privBlock, err := ssh.MarshalPrivateKey(privateKey, "") if err != nil { - panic(err) + slog.Error("Failed to marshal private key", slog.Any("propagatedError", err)); + os.Exit(42); } privPem := pem.EncodeToMemory(privBlock) sshPubKey, err := ssh.NewPublicKey(publicKey) if err != nil { - panic(err) + slog.Error("Failed deriving public ssh key from a private one.", slog.Any("propagatedError", err)); + os.Exit(42); } pubBytes := ssh.MarshalAuthorizedKey(sshPubKey)