Cleanup, bug fixes, and improvements

This commit changes how projects are handled internally so that projects
can be renamed. This commit also fixes some bugs, and removes redundant
code.
This commit is contained in:
Zoe
2025-04-13 05:37:39 -05:00
parent 79322c4c5e
commit f4bf2ff5a1
17 changed files with 401 additions and 206 deletions

View File

@@ -98,7 +98,7 @@ func DeleteCommand(ctx models.CommandCtx, args []string) error {
return deleteAll(ctx, noConfirm)
}
projectName, err := GetProjectName("delete", args)
projectName, err := GetProjectId("delete", args, ctx.Config)
if err != nil {
return fmt.Errorf("\tfailed to get project name: %v.\n\tSee flux delete --help for more information", err)
}
@@ -136,6 +136,11 @@ func DeleteCommand(ctx models.CommandCtx, args []string) error {
return fmt.Errorf("delete failed: %s", responseBody)
}
if len(args) == 0 {
// remove the .fluxid file if it exists
os.Remove(".fluxid")
}
fmt.Printf("Successfully deleted %s\n", projectName)
return nil

View File

@@ -18,6 +18,7 @@ import (
"time"
"github.com/briandowns/spinner"
"github.com/google/uuid"
"github.com/juls0730/flux/cmd/flux/models"
"github.com/juls0730/flux/pkg"
)
@@ -188,7 +189,32 @@ func DeployCommand(ctx models.CommandCtx, args []string) error {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
configPart, err := writer.CreateFormFile("config", "flux.json")
if _, err := os.Stat(".fluxid"); err == nil {
idPart, err := writer.CreateFormField("id")
if err != nil {
return fmt.Errorf("failed to create id part: %v", err)
}
idFile, err := os.Open(".fluxid")
if err != nil {
return fmt.Errorf("failed to open .fluxid: %v", err)
}
defer idFile.Close()
var idBytes []byte
if idBytes, err = io.ReadAll(idFile); err != nil {
return fmt.Errorf("failed to read .fluxid: %v", err)
}
if _, err := uuid.Parse(string(idBytes)); err != nil {
return fmt.Errorf(".fluxid does not contain a valid uuid")
}
idPart.Write(idBytes)
}
configPart, err := writer.CreateFormField("config")
if err != nil {
return fmt.Errorf("failed to create config part: %v", err)
@@ -246,7 +272,19 @@ func DeployCommand(ctx models.CommandCtx, args []string) error {
switch event {
case "complete":
loadingSpinner.Stop()
fmt.Printf("App %s deployed successfully!\n", data.Message.(map[string]interface{})["name"])
fmt.Printf("App %s deployed successfully!\n", data.Message.(map[string]any)["name"])
if _, err := os.Stat(".fluxid"); os.IsNotExist(err) {
idFile, err := os.Create(".fluxid")
if err != nil {
return fmt.Errorf("failed to create .fluxid: %v", err)
}
defer idFile.Close()
id := data.Message.(map[string]any)["id"].(string)
if _, err := idFile.Write([]byte(id)); err != nil {
return fmt.Errorf("failed to write .fluxid: %v", err)
}
}
return nil
case "cmd_output":
customWriter.Printf("... %s\n", data.Message)

View File

@@ -3,14 +3,27 @@ package commands
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strings"
"github.com/juls0730/flux/cmd/flux/models"
"github.com/juls0730/flux/pkg"
)
func GetProjectName(command string, args []string) (string, error) {
func GetProjectId(command string, args []string, config models.Config) (string, error) {
var projectName string
if _, err := os.Stat(".fluxid"); err == nil {
id, err := os.ReadFile(".fluxid")
if err != nil {
return "", fmt.Errorf("failed to read .fluxid: %v", err)
}
return string(id), nil
}
if len(args) == 0 {
if _, err := os.Stat("flux.json"); err != nil {
return "", fmt.Errorf("the current directory is not a flux project, please run flux %[1]s in the project directory", command)
@@ -32,5 +45,28 @@ func GetProjectName(command string, args []string) (string, error) {
projectName = args[0]
}
return projectName, nil
// make an http get request to the daemon to get the project name
resp, err := http.Get(config.DeamonURL + "/apps/by-name/" + projectName)
if err != nil {
return "", fmt.Errorf("failed to get project name: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("error reading response body: %v", err)
}
responseBody = []byte(strings.TrimSuffix(string(responseBody), "\n"))
return "", fmt.Errorf("get project name failed: %s", responseBody)
}
var app pkg.App
if err := json.NewDecoder(resp.Body).Decode(&app); err != nil {
return "", fmt.Errorf("failed to decode app: %v", err)
}
return app.Id.String(), nil
}

View File

@@ -10,7 +10,7 @@ import (
)
func StartCommand(ctx models.CommandCtx, args []string) error {
projectName, err := GetProjectName("start", args)
projectName, err := GetProjectId("start", args, ctx.Config)
if err != nil {
return err
}

View File

@@ -10,7 +10,7 @@ import (
)
func StopCommand(ctx models.CommandCtx, args []string) error {
projectName, err := GetProjectName("stop", args)
projectName, err := GetProjectId("stop", args, ctx.Config)
if err != nil {
return err
}

View File

@@ -14,10 +14,11 @@ func main() {
http.HandleFunc("POST /deploy", fluxServer.DeployHandler)
http.HandleFunc("DELETE /deployments", fluxServer.DeleteAllDeploymentsHandler)
http.HandleFunc("DELETE /deployments/{name}", fluxServer.DeleteDeployHandler)
http.HandleFunc("POST /start/{name}", fluxServer.StartDeployHandler)
http.HandleFunc("POST /stop/{name}", fluxServer.StopDeployHandler)
http.HandleFunc("DELETE /deployments/{id}", fluxServer.DeleteDeployHandler)
http.HandleFunc("POST /start/{id}", fluxServer.StartDeployHandler)
http.HandleFunc("POST /stop/{id}", fluxServer.StopDeployHandler)
http.HandleFunc("GET /apps", fluxServer.ListAppsHandler)
http.HandleFunc("GET /apps/by-name/{name}", fluxServer.GetAppByNameHandler)
http.HandleFunc("GET /heartbeat", fluxServer.DaemonInfoHandler)
fluxServer.Logger.Info("Fluxd started on http://127.0.0.1:5647")