diff --git a/internal/agent/validate.go b/internal/agent/validate.go index d168147a4..ae6a7388c 100644 --- a/internal/agent/validate.go +++ b/internal/agent/validate.go @@ -23,11 +23,11 @@ func JSONSchema(version string) (string, error) { } // Validate ensures that a given schema is Valid according to the Root Schema from the agent. -func Validate(file string) error { +func Validate(source string) error { var yaml string - if strings.HasPrefix(file, "http") { - resp, err := http.Get(file) + if strings.HasPrefix(source, "http") { + resp, err := http.Get(source) if err != nil { return err } @@ -38,11 +38,16 @@ func Validate(file string) error { //Convert the body to type string yaml = string(body) } else { - dat, err := os.ReadFile(file) + dat, err := os.ReadFile(source) if err != nil { - return err + if strings.Contains(err.Error(), "no such file or directory") { + yaml = source + } else { + return err + } + } else { + yaml = string(dat) } - yaml = string(dat) } config, err := schema.NewConfigFromYAML(yaml, schema.RootSchema{}) diff --git a/internal/webui/public/index.html b/internal/webui/public/index.html index be7659f9f..9bb4676e4 100644 --- a/internal/webui/public/index.html +++ b/internal/webui/public/index.html @@ -69,7 +69,22 @@

Welcome to the Installer!

try { // Parse the YAML const yaml = YAML.parse(this.content); - this.valid=true + const formData = new FormData() + formData.append('cloud-config', this.content) + const settings = { + method: 'POST', + body: formData, + }; + fetch(`/validate`, settings) + .then((response) => response.text()) + .then((text) => { + if (text === '') { + this.valid = true + } else { + this.error = text + this.valid = false + } + }) } catch(error) { this.error = error this.valid = false diff --git a/internal/webui/webui.go b/internal/webui/webui.go index c9cc53705..ee5fb7b43 100644 --- a/internal/webui/webui.go +++ b/internal/webui/webui.go @@ -161,6 +161,21 @@ func Start(ctx context.Context) error { ec.GET("/*", echo.WrapHandler(http.StripPrefix("/", assetHandler))) + ec.POST("/validate", func(c echo.Context) error { + formData := new(FormData) + if err := c.Bind(formData); err != nil { + return err + } + cloudConfig := formData.CloudConfig + + err := agent.Validate(cloudConfig) + if err != nil { + return c.String(http.StatusOK, err.Error()) + } + + return c.String(http.StatusOK, "") + }) + ec.POST("/install", func(c echo.Context) error { s.Lock()