package schema import ( "fmt" "io" "net/http" "os" "strings" ) // JSONSchema builds a JSON Schema based on the Root Schema and the given version // this is helpful when mapping a validation error. func JSONSchema(version string) (string, error) { url := fmt.Sprintf("https://kairos.io/%s/cloud-config.json", version) schema, err := GenerateSchema(RootSchema{}, url) if err != nil { return "", err } return schema, nil } // Validate ensures that a given schema is Valid according to the Root Schema from the agent. func Validate(source string) error { var yaml string if strings.HasPrefix(source, "http") { resp, err := http.Get(source) if err != nil { return err } body, err := io.ReadAll(resp.Body) if err != nil { return err } //Convert the body to type string yaml = string(body) } else { // Maybe we should just try to read the string for the normal headers? That would identify a full yaml vs a file dat, err := os.ReadFile(source) if err != nil { if strings.Contains(err.Error(), "no such file or directory") || strings.Contains(err.Error(), "file name too long") { yaml = source } else { return err } } else { yaml = string(dat) } } config, err := NewConfigFromYAML(yaml, RootSchema{}) if err != nil { return err } if !config.HasHeader() { return fmt.Errorf("missing #cloud-config header") } if config.IsValid() { return nil } err = config.ValidationError if err != nil { return err } return nil }