@@ -3,24 +3,26 @@ package internalstorage
3
3
import (
4
4
"database/sql"
5
5
"database/sql/driver"
6
+ "encoding/json"
6
7
"errors"
7
8
"reflect"
8
9
"time"
9
10
10
11
"gorm.io/datatypes"
11
12
"gorm.io/gorm"
13
+ corev1 "k8s.io/api/core/v1"
12
14
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
15
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
14
16
"k8s.io/apimachinery/pkg/runtime"
15
17
"k8s.io/apimachinery/pkg/runtime/schema"
16
18
"k8s.io/apimachinery/pkg/types"
17
- "k8s.io/apimachinery/pkg/util/json"
18
19
)
19
20
20
21
type Object interface {
21
22
GetResourceType () ResourceType
22
23
ConvertToUnstructured () (* unstructured.Unstructured , error )
23
24
ConvertTo (codec runtime.Codec , object runtime.Object ) (runtime.Object , error )
25
+ GetEvents () []* corev1.Event
24
26
}
25
27
26
28
type ObjectList interface {
@@ -102,6 +104,10 @@ func (res Resource) ConvertTo(codec runtime.Codec, object runtime.Object) (runti
102
104
return obj , err
103
105
}
104
106
107
+ func (res Resource ) GetEvents () []* corev1.Event {
108
+ panic ("no implemented" )
109
+ }
110
+
105
111
type ResourceMetadata struct {
106
112
ResourceType `gorm:"embedded"`
107
113
@@ -159,6 +165,10 @@ func (data ResourceMetadata) GetResourceType() ResourceType {
159
165
return data .ResourceType
160
166
}
161
167
168
+ func (data ResourceMetadata ) GetEvents () []* corev1.Event {
169
+ return nil
170
+ }
171
+
162
172
type Bytes datatypes.JSON
163
173
164
174
func (bytes * Bytes ) Scan (data any ) error {
@@ -186,6 +196,10 @@ func (bytes Bytes) GetResourceType() ResourceType {
186
196
return ResourceType {}
187
197
}
188
198
199
+ func (bytes Bytes ) GetEvents () []* corev1.Event {
200
+ return nil
201
+ }
202
+
189
203
type ResourceList []Resource
190
204
191
205
func (list * ResourceList ) From (db * gorm.DB ) error {
@@ -248,3 +262,120 @@ func (list BytesList) Items() []Object {
248
262
}
249
263
return objects
250
264
}
265
+
266
+ type EventsBytes Bytes
267
+
268
+ func (bytes * EventsBytes ) Scan (data any ) error {
269
+ return (* datatypes .JSON )(bytes ).Scan (data )
270
+ }
271
+
272
+ func (bytes EventsBytes ) Value () (driver.Value , error ) {
273
+ return (datatypes .JSON )(bytes ).Value ()
274
+ }
275
+
276
+ func (bytes EventsBytes ) Decode () ([]* corev1.Event , error ) {
277
+ var objects map [string ]json.RawMessage
278
+ if err := json .Unmarshal (bytes , & objects ); err != nil {
279
+ return nil , err
280
+ }
281
+
282
+ events := make ([]* corev1.Event , 0 , len (objects ))
283
+ for _ , obj := range objects {
284
+ event := & corev1.Event {}
285
+ if _ , _ , err := codec .Decode ([]byte (obj ), nil , event ); err != nil {
286
+ return nil , err
287
+ }
288
+ events = append (events , event )
289
+ }
290
+ return events , nil
291
+ }
292
+
293
+ type ResourceMetadataWithEvents struct {
294
+ ResourceMetadata `gorm:"embedded"`
295
+
296
+ Events EventsBytes
297
+ }
298
+
299
+ func (bytes ResourceMetadataWithEvents ) ConvertToUnstructured () (* unstructured.Unstructured , error ) {
300
+ return bytes .ResourceMetadata .ConvertToUnstructured ()
301
+ }
302
+
303
+ func (bytes ResourceMetadataWithEvents ) ConvertTo (codec runtime.Codec , object runtime.Object ) (runtime.Object , error ) {
304
+ return bytes .ResourceMetadata .ConvertTo (codec , object )
305
+ }
306
+
307
+ func (bytes ResourceMetadataWithEvents ) GetResourceType () ResourceType {
308
+ return bytes .ResourceMetadata .GetResourceType ()
309
+ }
310
+
311
+ func (bytes ResourceMetadataWithEvents ) GetEvents () []* corev1.Event {
312
+ events , _ := bytes .Events .Decode ()
313
+ return events
314
+ }
315
+
316
+ type ResourceMetadataWithEventsList []ResourceMetadata
317
+
318
+ func (list * ResourceMetadataWithEventsList ) From (db * gorm.DB ) error {
319
+ switch db .Dialector .Name () {
320
+ case "sqlite" , "sqlite3" , "mysql" :
321
+ db = db .Select ("`group`, version, resource, kind, object->>'$.metadata' as metadata, events" )
322
+ case "postgres" :
323
+ db = db .Select (`"group", version, resource, kind, object->>'metadata' as metadata, events` )
324
+ default :
325
+ panic ("storage: only support sqlite3, mysql or postgres" )
326
+ }
327
+ metadatas := []ResourceMetadata {}
328
+ if result := db .Find (& metadatas ); result .Error != nil {
329
+ return result .Error
330
+ }
331
+ * list = metadatas
332
+ return nil
333
+ }
334
+
335
+ func (list ResourceMetadataWithEventsList ) Items () []Object {
336
+ objects := make ([]Object , 0 , len (list ))
337
+ for _ , object := range list {
338
+ objects = append (objects , object )
339
+ }
340
+ return objects
341
+ }
342
+
343
+ type BytesWithEvents struct {
344
+ Object Bytes
345
+ Events EventsBytes
346
+ }
347
+
348
+ func (bytes BytesWithEvents ) ConvertToUnstructured () (* unstructured.Unstructured , error ) {
349
+ return bytes .Object .ConvertToUnstructured ()
350
+ }
351
+
352
+ func (bytes BytesWithEvents ) ConvertTo (codec runtime.Codec , object runtime.Object ) (runtime.Object , error ) {
353
+ obj , _ , err := codec .Decode (bytes .Object , nil , object )
354
+ return obj , err
355
+ }
356
+
357
+ func (bytes BytesWithEvents ) GetResourceType () ResourceType {
358
+ return bytes .Object .GetResourceType ()
359
+ }
360
+
361
+ func (bytes BytesWithEvents ) GetEvents () []* corev1.Event {
362
+ events , _ := bytes .Events .Decode ()
363
+ return events
364
+ }
365
+
366
+ type BytesWithEventsList []BytesWithEvents
367
+
368
+ func (list * BytesWithEventsList ) From (db * gorm.DB ) error {
369
+ if result := db .Select ("object" , "events" ).Find (list ); result .Error != nil {
370
+ return result .Error
371
+ }
372
+ return nil
373
+ }
374
+
375
+ func (list BytesWithEventsList ) Items () []Object {
376
+ objects := make ([]Object , 0 , len (list ))
377
+ for _ , object := range list {
378
+ objects = append (objects , object )
379
+ }
380
+ return objects
381
+ }
0 commit comments