From 312ff5b7f32a64656e31ebb9a1d208c2f9437bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 22 May 2020 15:30:42 +0200 Subject: [PATCH 1/2] Store and retrieve etag and generation --- plugins/catalog-backend/src/database/Database.ts | 14 +++++++++----- .../src/database/migrations/20200511113813_init.ts | 13 +++++++++++++ plugins/catalog-backend/src/database/types.ts | 2 ++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-backend/src/database/Database.ts b/plugins/catalog-backend/src/database/Database.ts index 71530c3965..855bb4bcba 100644 --- a/plugins/catalog-backend/src/database/Database.ts +++ b/plugins/catalog-backend/src/database/Database.ts @@ -36,8 +36,9 @@ function serializeMetadata( } const output = { ...metadata }; - // TODO: delete output.uid; - // TODO: delete output.generation; + delete output.uid; + delete output.etag; + delete output.generation; return JSON.stringify(output); } @@ -56,6 +57,8 @@ function entityRequestToDb(request: DbEntityRequest): DbEntitiesRow { return { id: '', location_id: request.locationId || null, + etag: uuidv4(), // TODO(freben): Atomicity isn't checked using these yet + generation: 1, // TODO(freben): These aren't updated yet api_version: request.entity.apiVersion, kind: request.entity.kind, name: request.entity.metadata?.name || null, @@ -70,8 +73,9 @@ function entityDbToResponse(row: DbEntitiesRow): DbEntityResponse { apiVersion: row.api_version, kind: row.kind, metadata: { - // TODO: uid: row.id, - // TODO: generation: row.generation, + uid: row.id, + etag: row.etag, + generation: row.generation, }, }; @@ -121,7 +125,7 @@ export class Database { async entities(): Promise { const items = await this.database('entities') - .orderBy('name') + .orderBy('namespace', 'name') .select(); return items.map(entityDbToResponse); } diff --git a/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts b/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts index e31834d791..945f636ea4 100644 --- a/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts +++ b/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts @@ -45,6 +45,19 @@ export async function up(knex: Knex): Promise { .inTable('locations') .nullable() .comment('The location that originated the entity'); + table + .string('etag') + .notNullable() + .comment( + 'An opaque string that changes for each update operation to any part of the entity, including metadata.', + ); + table + .string('generation') + .notNullable() + .unsigned() + .comment( + 'A positive nonzero number that indicates the current generation of data for this entity; the value is incremented each time the spec changes.', + ); table .string('api_version') .notNullable() diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts index 0a199fa7d6..478606a79c 100644 --- a/plugins/catalog-backend/src/database/types.ts +++ b/plugins/catalog-backend/src/database/types.ts @@ -24,6 +24,8 @@ export type DbEntitiesRow = { kind: string; name: string | null; namespace: string | null; + etag: string; + generation: number; metadata: string | null; spec: string | null; }; From c4d358f7a5307cfc28338f4eba931a3959e792b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 23 May 2020 19:41:50 +0200 Subject: [PATCH 2/2] Human readable etag --- plugins/catalog-backend/src/database/Database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/database/Database.ts b/plugins/catalog-backend/src/database/Database.ts index 855bb4bcba..e90bc408f9 100644 --- a/plugins/catalog-backend/src/database/Database.ts +++ b/plugins/catalog-backend/src/database/Database.ts @@ -57,7 +57,7 @@ function entityRequestToDb(request: DbEntityRequest): DbEntitiesRow { return { id: '', location_id: request.locationId || null, - etag: uuidv4(), // TODO(freben): Atomicity isn't checked using these yet + etag: new Buffer(uuidv4()).toString('base64').replace(/[^\w]/g, ''), // TODO(freben): Atomicity isn't checked using these yet generation: 1, // TODO(freben): These aren't updated yet api_version: request.entity.apiVersion, kind: request.entity.kind,