Skip to content

Commit 173ddfe

Browse files
authored
Merge pull request #278 from justinsb/register_builtin_types
mockkubeapiserver: register built-in types
2 parents 3c5b71b + a1c029c commit 173ddfe

File tree

8 files changed

+593
-12
lines changed

8 files changed

+593
-12
lines changed

mockkubeapiserver/kubernetes_builtin_schema.go

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,79 @@ import (
55
"sync"
66

77
"sigs.k8s.io/structured-merge-diff/v4/typed"
8+
"sigs.k8s.io/yaml"
89

910
_ "embed"
1011
)
1112

1213
//go:embed kubernetes_builtin_schema.yaml
1314
var kubernetesBuiltinSchemaYAML string
1415

16+
//go:embed kubernetes_builtin_schema.meta.yaml
17+
var kubernetesBuiltinSchemaMetaYAML string
18+
19+
const BuiltinKey = "kubernetes_builtin_schema"
20+
1521
type Schema struct {
1622
Parser *typed.Parser
23+
Meta *SchemaMeta
1724
}
1825

19-
var cacheKubernetesBuiltinSchema *Schema
26+
type SchemaMeta struct {
27+
Resources []SchemaMetaResource `json:"resources"`
28+
}
2029

21-
var mutexKubernetesBuiltinSchema sync.Mutex
30+
type SchemaMetaResource struct {
31+
Key string `json:"key"`
32+
Group string `json:"group"`
33+
Version string `json:"version"`
34+
Kind string `json:"kind"`
35+
Resource string `json:"resource"`
36+
Scope string `json:"scope"`
37+
}
38+
39+
type schemaCache struct {
40+
mutex sync.Mutex
41+
schemas map[string]*Schema
42+
}
43+
44+
var globalSchemaCache schemaCache
2245

2346
func KubernetesBuiltInSchema() (*Schema, error) {
24-
mutexKubernetesBuiltinSchema.Lock()
25-
defer mutexKubernetesBuiltinSchema.Unlock()
47+
return globalSchemaCache.Get(BuiltinKey)
48+
}
49+
50+
func (c *schemaCache) Get(key string) (*Schema, error) {
51+
c.mutex.Lock()
52+
defer c.mutex.Unlock()
2653

27-
if cacheKubernetesBuiltinSchema != nil {
28-
return cacheKubernetesBuiltinSchema, nil
54+
if schema := c.schemas[key]; schema != nil {
55+
return schema, nil
2956
}
3057

31-
schemaYAML := kubernetesBuiltinSchemaYAML
58+
if key != BuiltinKey {
59+
return nil, fmt.Errorf("schema %q not known", key)
60+
}
3261

62+
schemaYAML := kubernetesBuiltinSchemaYAML
3363
parser, err := typed.NewParser(typed.YAMLObject(schemaYAML))
3464
if err != nil {
3565
return nil, fmt.Errorf("error parsing schema: %w", err)
3666
}
37-
cacheKubernetesBuiltinSchema = &Schema{Parser: parser}
38-
return cacheKubernetesBuiltinSchema, nil
67+
68+
metaYAML := kubernetesBuiltinSchemaMetaYAML
69+
meta := &SchemaMeta{}
70+
if err := yaml.Unmarshal([]byte(metaYAML), meta); err != nil {
71+
return nil, fmt.Errorf("error parsing schema metadata: %w", err)
72+
}
73+
74+
schema := &Schema{
75+
Parser: parser,
76+
Meta: meta,
77+
}
78+
if c.schemas == nil {
79+
c.schemas = make(map[string]*Schema)
80+
}
81+
c.schemas[key] = schema
82+
return schema, nil
3983
}

0 commit comments

Comments
 (0)