Add option for json validation

This commit is contained in:
Jan Eitzinger 2022-09-13 15:22:20 +02:00
parent 732801548f
commit 777f225e91
6 changed files with 26 additions and 7 deletions

View File

@ -20,6 +20,7 @@ var Keys schema.ProgramConfig = schema.ProgramConfig{
DB: "./var/job.db",
Archive: json.RawMessage(`{\"kind\":\"file\",\"path\":\"./var/job-archive\"}`),
DisableArchive: false,
Validate: false,
LdapConfig: nil,
SessionMaxAge: "168h",
UiDefaults: map[string]interface{}{

View File

@ -6,6 +6,7 @@ package archive
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"os"
@ -14,6 +15,7 @@ import (
"strconv"
"time"
"github.com/ClusterCockpit/cc-backend/internal/config"
"github.com/ClusterCockpit/cc-backend/pkg/log"
"github.com/ClusterCockpit/cc-backend/pkg/schema"
)
@ -100,14 +102,17 @@ func (fsa *FsArchive) LoadJobMeta(job *schema.Job) (*schema.JobMeta, error) {
func (fsa *FsArchive) LoadClusterCfg(name string) (*schema.Cluster, error) {
f, err := os.Open(filepath.Join(fsa.path, name, "cluster.json"))
b, err := os.ReadFile(filepath.Join(fsa.path, name, "cluster.json"))
if err != nil {
log.Errorf("fsBackend LoadClusterCfg()- %v", err)
return &schema.Cluster{}, err
}
defer f.Close()
return DecodeCluster(bufio.NewReader(f))
if config.Keys.Validate {
if err := schema.Validate(schema.ClusterCfg, bytes.NewReader(b)); err != nil {
return &schema.Cluster{}, err
}
}
return DecodeCluster(bytes.NewReader(b))
}
func (fsa *FsArchive) Iter() <-chan *schema.JobMeta {

View File

@ -11,6 +11,7 @@ import (
"time"
"github.com/ClusterCockpit/cc-backend/pkg/schema"
_ "github.com/santhosh-tekuri/jsonschema/v5/httploader"
)
func TestInitEmptyPath(t *testing.T) {

View File

@ -78,6 +78,9 @@ type ProgramConfig struct {
// do not write to the job-archive.
DisableArchive bool `json:"disable-archive"`
// Validate json input against schema
Validate bool `json:"validate"`
// For LDAP Authentication and user synchronisation.
LdapConfig *LdapConfig `json:"ldap"`
JwtConfig *JWTAuthConfig `json:"jwts"`

View File

@ -5,10 +5,12 @@
package schema
import (
"encoding/json"
"fmt"
"io"
"github.com/santhosh-tekuri/jsonschema"
"github.com/ClusterCockpit/cc-backend/pkg/log"
"github.com/santhosh-tekuri/jsonschema/v5"
)
type Kind int
@ -19,7 +21,7 @@ const (
ClusterCfg
)
func Validate(k Kind, v io.Reader) (err error) {
func Validate(k Kind, r io.Reader) (err error) {
var s *jsonschema.Schema
switch k {
@ -37,9 +39,15 @@ func Validate(k Kind, v io.Reader) (err error) {
return err
}
if err = s.Validate(v); err != nil {
var v interface{}
if err := json.NewDecoder(r).Decode(&v); err != nil {
log.Error("schema.Validate() - Failed to decode %v", err)
return err
}
if err = s.Validate(v); err != nil {
return fmt.Errorf("%#v", err)
}
return nil
}

View File

@ -24,6 +24,7 @@ import (
"github.com/gorilla/mux"
_ "github.com/mattn/go-sqlite3"
_ "github.com/santhosh-tekuri/jsonschema/v5/httploader"
)
func setup(t *testing.T) *api.RestApi {