-
Notifications
You must be signed in to change notification settings - Fork 75
/
table_types.go
100 lines (81 loc) · 3.36 KB
/
table_types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
Copyright 2019 The SchemaHero Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha4
import (
"crypto/sha256"
"encoding/json"
"fmt"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type TableSchema struct {
Postgres *PostgresqlTableSchema `json:"postgres,omitempty" yaml:"postgres,omitempty"`
Mysql *MysqlTableSchema `json:"mysql,omitempty" yaml:"mysql,omitempty"`
CockroachDB *PostgresqlTableSchema `json:"cockroachdb,omitempty" yaml:"cockroachdb,omitempty"`
Cassandra *CassandraTableSchema `json:"cassandra,omitempty" yaml:"cassandra,omitempty"`
SQLite *SqliteTableSchema `json:"sqlite,omitempty" yaml:"sqlite,omitempty"`
}
// TableSpec defines the desired state of Table
type TableSpec struct {
Database string `json:"database" yaml:"database"`
Name string `json:"name" yaml:"name"`
Requires []string `json:"requires,omitempty" yaml:"requires,omitempty"`
Schema *TableSchema `json:"schema,omitempty" yaml:"schema,omitempty"`
SeedData *SeedData `json:"seedData,omitempty" yaml:"seedData,omitempty"`
}
// TableStatus defines the observed state of Table
type TableStatus struct {
// We store the SHA of the table spec from the last time we executed a plan to
// make startup less noisy by skipping re-planning objects that have been planned
// we cannot use the resourceVersion or generation fields because updating them
// would cause the object to be modified again
LastPlannedTableSpecSHA string `json:"lastPlannedTableSpecSHA,omitempty" yaml:"lastPlannedTableSpecSHA,omitempty"`
}
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// Table is the Schema for the tables API
// +kubebuilder:printcolumn:name="Namespace",type=string,JSONPath=`.metadata.namespace`,priority=1
// +kubebuilder:printcolumn:name="Table",type=string,JSONPath=`.spec.name`
// +kubebuilder:printcolumn:name="Database",type=string,JSONPath=`.spec.database`
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
// +k8s:openapi-gen=true
type Table struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec TableSpec `json:"spec,omitempty"`
Status TableStatus `json:"status,omitempty"`
}
func (t Table) GetSHA() (string, error) {
// ignoring the status, json marshal the spec and the metadata
o := struct {
Spec TableSpec `json:"spec,omitempty"`
}{
Spec: t.Spec,
}
b, err := json.Marshal(o)
if err != nil {
return "", errors.Wrap(err, "failed to marshal")
}
sum := sha256.Sum256(b)
return fmt.Sprintf("%x", sum), nil
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// TableList contains a list of Table
type TableList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Table `json:"items"`
}
func init() {
SchemeBuilder.Register(&Table{}, &TableList{})
}