cc-backend/pkg/schema/validate.go

69 lines
1.5 KiB
Go
Raw Normal View History

2024-04-11 23:04:30 +02:00
// Copyright (C) NHR@FAU, University Erlangen-Nuremberg.
// All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package schema
import (
2022-09-20 07:05:01 +02:00
"embed"
2022-09-13 15:22:20 +02:00
"encoding/json"
"fmt"
"io"
2022-09-20 10:27:23 +02:00
"path/filepath"
"strings"
2022-09-13 15:22:20 +02:00
"github.com/ClusterCockpit/cc-backend/pkg/log"
"github.com/santhosh-tekuri/jsonschema/v5"
)
type Kind int
const (
Meta Kind = iota + 1
Data
Config
ClusterCfg
)
2022-09-20 07:05:01 +02:00
//go:embed schemas/*
var schemaFiles embed.FS
2023-09-28 10:20:35 +02:00
func Validate(k Kind, r io.Reader) error {
2022-09-20 10:27:23 +02:00
jsonschema.Loaders["embedfs"] = func(s string) (io.ReadCloser, error) {
f := filepath.Join("schemas", strings.Split(s, "//")[1])
return schemaFiles.Open(f)
}
var s *jsonschema.Schema
2023-09-28 10:20:35 +02:00
var err error
switch k {
case Meta:
2022-09-20 10:27:23 +02:00
s, err = jsonschema.Compile("embedfs://job-meta.schema.json")
case Data:
2022-09-20 10:27:23 +02:00
s, err = jsonschema.Compile("embedfs://job-data.schema.json")
case ClusterCfg:
2022-09-20 10:27:23 +02:00
s, err = jsonschema.Compile("embedfs://cluster.schema.json")
case Config:
2022-09-20 10:27:23 +02:00
s, err = jsonschema.Compile("embedfs://config.schema.json")
default:
return fmt.Errorf("SCHEMA/VALIDATE > unkown schema kind: %#v", k)
}
if err != nil {
log.Errorf("Error while compiling json schema for kind '%#v'", k)
return err
}
2022-09-13 15:22:20 +02:00
var v interface{}
2023-09-28 10:20:35 +02:00
if err = json.NewDecoder(r).Decode(&v); err != nil {
log.Warnf("Error while decoding raw json schema: %#v", err)
return err
}
2022-09-13 15:22:20 +02:00
if err = s.Validate(v); err != nil {
return fmt.Errorf("SCHEMA/VALIDATE > %#v", err)
2022-09-13 15:22:20 +02:00
}
return nil
}