From cdd1d89a43d479839af44f82c6fd4010fee6b654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 28 May 2020 15:46:55 +0200 Subject: [PATCH] Rename DescriptorEnvelope to Entity --- .../src/catalog/DatabaseEntitiesCatalog.ts | 8 +++---- .../catalog/DatabaseLocationsCatalog.test.ts | 5 ++--- .../src/catalog/DatabaseLocationsCatalog.ts | 2 +- .../src/catalog/StaticEntitiesCatalog.ts | 12 +++++----- plugins/catalog-backend/src/catalog/types.ts | 8 +++---- .../src/database/Database.test.ts | 10 ++++----- .../catalog-backend/src/database/Database.ts | 22 ++++++++++--------- .../src/database/DatabaseManager.ts | 9 +++----- .../src/database/search.test.ts | 6 ++--- .../catalog-backend/src/database/search.ts | 4 ++-- plugins/catalog-backend/src/database/types.ts | 6 ++--- .../src/ingestion/DescriptorParsers.ts | 9 ++------ .../ComponentDescriptorV1beta1Parser.ts | 8 +++---- .../descriptors/DescriptorEnvelopeParser.ts | 8 +++---- .../catalog-backend/src/ingestion/types.ts | 8 +++---- .../src/service/router.test.ts | 12 +++++----- 16 files changed, 64 insertions(+), 73 deletions(-) diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts index 9d0d8fcaf7..d14b9df658 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts @@ -15,20 +15,20 @@ */ import { Database } from '../database'; -import { DescriptorEnvelope } from '../ingestion/types'; +import { Entity } from '../ingestion/types'; import { EntitiesCatalog, EntityFilters } from './types'; export class DatabaseEntitiesCatalog implements EntitiesCatalog { constructor(private readonly database: Database) {} - async entities(filters?: EntityFilters): Promise { + async entities(filters?: EntityFilters): Promise { const items = await this.database.transaction(tx => this.database.entities(tx, filters), ); return items.map(i => i.entity); } - async entityByUid(uid: string): Promise { + async entityByUid(uid: string): Promise { const matches = await this.database.transaction(tx => this.database.entities(tx, [{ key: 'uid', values: [uid] }]), ); @@ -40,7 +40,7 @@ export class DatabaseEntitiesCatalog implements EntitiesCatalog { kind: string, name: string, namespace: string | undefined, - ): Promise { + ): Promise { const matches = await this.database.transaction(tx => this.database.entities(tx, [ { key: 'kind', values: [kind] }, diff --git a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts index 0181b7fc28..a63dd7d497 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { DatabaseLocationsCatalog } from './DatabaseLocationsCatalog'; +import { getVoidLogger } from '@backstage/backend-common'; import knex from 'knex'; import path from 'path'; - import { Database } from '../database'; import { ReaderOutput } from '../ingestion/types'; -import { getVoidLogger } from '@backstage/backend-common'; +import { DatabaseLocationsCatalog } from './DatabaseLocationsCatalog'; describe('DatabaseLocationsCatalog', () => { const database = knex({ diff --git a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts index 6e3c9ae306..d82d8e2c26 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts @@ -15,8 +15,8 @@ */ import { Database } from '../database'; -import { AddLocation, Location, LocationsCatalog } from './types'; import { LocationReader } from '../ingestion'; +import { AddLocation, Location, LocationsCatalog } from './types'; export class DatabaseLocationsCatalog implements LocationsCatalog { constructor( diff --git a/plugins/catalog-backend/src/catalog/StaticEntitiesCatalog.ts b/plugins/catalog-backend/src/catalog/StaticEntitiesCatalog.ts index 371cdf1f76..64cee69dd7 100644 --- a/plugins/catalog-backend/src/catalog/StaticEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/catalog/StaticEntitiesCatalog.ts @@ -16,21 +16,21 @@ import { NotFoundError } from '@backstage/backend-common'; import lodash from 'lodash'; -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; import { EntitiesCatalog } from './types'; export class StaticEntitiesCatalog implements EntitiesCatalog { - private _entities: DescriptorEnvelope[]; + private _entities: Entity[]; - constructor(entities: DescriptorEnvelope[]) { + constructor(entities: Entity[]) { this._entities = entities; } - async entities(): Promise { + async entities(): Promise { return lodash.cloneDeep(this._entities); } - async entityByUid(uid: string): Promise { + async entityByUid(uid: string): Promise { const item = this._entities.find(e => uid === e.metadata?.uid); if (!item) { throw new NotFoundError('Entity cannot be found'); @@ -42,7 +42,7 @@ export class StaticEntitiesCatalog implements EntitiesCatalog { kind: string, name: string, namespace: string | undefined, - ): Promise { + ): Promise { const item = this._entities.find( e => kind === e.kind && diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index d5627ea86a..90bb6943b3 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -15,7 +15,7 @@ */ import * as yup from 'yup'; -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; // // Entities @@ -28,13 +28,13 @@ export type EntityFilter = { export type EntityFilters = EntityFilter[]; export type EntitiesCatalog = { - entities(filters?: EntityFilters): Promise; - entityByUid(uid: string): Promise; + entities(filters?: EntityFilters): Promise; + entityByUid(uid: string): Promise; entityByName( kind: string, namespace: string | undefined, name: string, - ): Promise; + ): Promise; }; // diff --git a/plugins/catalog-backend/src/database/Database.test.ts b/plugins/catalog-backend/src/database/Database.test.ts index a82385aae4..18481455ea 100644 --- a/plugins/catalog-backend/src/database/Database.test.ts +++ b/plugins/catalog-backend/src/database/Database.test.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-common'; import Knex from 'knex'; import path from 'path'; -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; import { Database } from './Database'; import { AddDatabaseLocation, @@ -247,8 +247,8 @@ describe('Database', () => { describe('entities', () => { it('can get all entities with empty filters list', async () => { const catalog = new Database(database, getVoidLogger()); - const e1: DescriptorEnvelope = { apiVersion: 'a', kind: 'b' }; - const e2: DescriptorEnvelope = { + const e1: Entity = { apiVersion: 'a', kind: 'b' }; + const e2: Entity = { apiVersion: 'a', kind: 'b', spec: { c: null }, @@ -271,7 +271,7 @@ describe('Database', () => { it('can get all specific entities for matching filters (naive case)', async () => { const catalog = new Database(database, getVoidLogger()); - const entities: DescriptorEnvelope[] = [ + const entities: Entity[] = [ { apiVersion: 'a', kind: 'b' }, { apiVersion: 'a', @@ -305,7 +305,7 @@ describe('Database', () => { it('can get all specific entities for matching filters with nulls (both missing and literal null value)', async () => { const catalog = new Database(database, getVoidLogger()); - const entities: DescriptorEnvelope[] = [ + const entities: Entity[] = [ { apiVersion: 'a', kind: 'b' }, { apiVersion: 'a', diff --git a/plugins/catalog-backend/src/database/Database.ts b/plugins/catalog-backend/src/database/Database.ts index 614f7d09bf..b7777d3ccb 100644 --- a/plugins/catalog-backend/src/database/Database.ts +++ b/plugins/catalog-backend/src/database/Database.ts @@ -24,7 +24,7 @@ import lodash from 'lodash'; import { v4 as uuidv4 } from 'uuid'; import { Logger } from 'winston'; import { EntityFilters } from '../catalog'; -import { DescriptorEnvelope, EntityMeta } from '../ingestion'; +import { Entity, EntityMeta } from '../ingestion'; import { buildEntitySearch } from './search'; import { AddDatabaseLocation, @@ -54,9 +54,7 @@ function serializeMetadata(metadata: EntityMeta | undefined): string | null { return JSON.stringify(getStrippedMetadata(metadata)); } -function serializeSpec( - spec: DescriptorEnvelope['spec'], -): DbEntitiesRow['spec'] { +function serializeSpec(spec: Entity['spec']): DbEntitiesRow['spec'] { if (!spec) { return null; } @@ -66,7 +64,7 @@ function serializeSpec( function toEntityRow( locationId: string | undefined, - entity: DescriptorEnvelope, + entity: Entity, ): DbEntitiesRow { return { id: entity.metadata!.uid!, @@ -83,7 +81,7 @@ function toEntityRow( } function toEntityResponse(row: DbEntitiesRow): DbEntityResponse { - const entity: DescriptorEnvelope = { + const entity: Entity = { apiVersion: row.api_version, kind: row.kind, metadata: { @@ -94,7 +92,7 @@ function toEntityResponse(row: DbEntitiesRow): DbEntityResponse { }; if (row.metadata) { - const metadata = JSON.parse(row.metadata) as DescriptorEnvelope['metadata']; + const metadata = JSON.parse(row.metadata) as Entity['metadata']; entity.metadata = { ...entity.metadata, ...metadata }; } @@ -127,7 +125,9 @@ function generateUid(): string { } function generateEtag(): string { - return Buffer.from(uuidv4(), 'utf8').toString('base64').replace(/[^\w]/g, ''); + return Buffer.from(uuidv4(), 'utf8') + .toString('base64') + .replace(/[^\w]/g, ''); } /** @@ -374,7 +374,9 @@ export class Database { target, }); - return (await tx('locations').where({ id }).select())![0]; + return (await tx('locations') + .where({ id }) + .select())![0]; }); } @@ -422,7 +424,7 @@ export class Database { private async updateEntitiesSearch( tx: Knex.Transaction, entityId: string, - data: DescriptorEnvelope, + data: Entity, ): Promise { try { const entries = buildEntitySearch(entityId, data); diff --git a/plugins/catalog-backend/src/database/DatabaseManager.ts b/plugins/catalog-backend/src/database/DatabaseManager.ts index 7f646971db..4b7fa38326 100644 --- a/plugins/catalog-backend/src/database/DatabaseManager.ts +++ b/plugins/catalog-backend/src/database/DatabaseManager.ts @@ -19,8 +19,8 @@ import lodash from 'lodash'; import path from 'path'; import { Logger } from 'winston'; import { - DescriptorEnvelope, DescriptorParser, + Entity, LocationReader, ParserError, } from '../ingestion'; @@ -129,7 +129,7 @@ export class DatabaseManager { private static async refreshSingleEntity( database: Database, locationId: string, - entity: DescriptorEnvelope, + entity: Entity, logger: Logger, ): Promise { const { kind } = entity; @@ -163,10 +163,7 @@ export class DatabaseManager { }); } - private static entitiesAreEqual( - first: DescriptorEnvelope, - second: DescriptorEnvelope, - ) { + private static entitiesAreEqual(first: Entity, second: Entity) { const firstClone = lodash.cloneDeep(first); const secondClone = lodash.cloneDeep(second); diff --git a/plugins/catalog-backend/src/database/search.test.ts b/plugins/catalog-backend/src/database/search.test.ts index 26b20d1846..4c1df3429e 100644 --- a/plugins/catalog-backend/src/database/search.test.ts +++ b/plugins/catalog-backend/src/database/search.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; import { buildEntitySearch, visitEntityPart } from './search'; import { DbEntitiesSearchRow } from './types'; @@ -99,7 +99,7 @@ describe('search', () => { describe('buildEntitySearch', () => { it('adds special keys even if missing', () => { - const input: DescriptorEnvelope = { + const input: Entity = { apiVersion: 'a', kind: 'b', }; @@ -116,7 +116,7 @@ describe('search', () => { }); it('adds prefix-stripped versions', () => { - const input: DescriptorEnvelope = { + const input: Entity = { apiVersion: 'a', kind: 'b', metadata: { diff --git a/plugins/catalog-backend/src/database/search.ts b/plugins/catalog-backend/src/database/search.ts index f54cfde7e6..e14ebd338f 100644 --- a/plugins/catalog-backend/src/database/search.ts +++ b/plugins/catalog-backend/src/database/search.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; import { DbEntitiesSearchRow } from './types'; // Search entries that start with these prefixes, also get a shorthand without @@ -119,7 +119,7 @@ export function visitEntityPart( */ export function buildEntitySearch( entityId: string, - entity: DescriptorEnvelope, + entity: Entity, ): DbEntitiesSearchRow[] { // Start with some special keys that are always present because you want to // be able to easily search for null specifically diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts index 06e234545f..9fe4a523cc 100644 --- a/plugins/catalog-backend/src/database/types.ts +++ b/plugins/catalog-backend/src/database/types.ts @@ -15,7 +15,7 @@ */ import * as yup from 'yup'; -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; export type DbEntitiesRow = { id: string; @@ -32,12 +32,12 @@ export type DbEntitiesRow = { export type DbEntityRequest = { locationId?: string; - entity: DescriptorEnvelope; + entity: Entity; }; export type DbEntityResponse = { locationId?: string; - entity: DescriptorEnvelope; + entity: Entity; }; export type DbEntitiesSearchRow = { diff --git a/plugins/catalog-backend/src/ingestion/DescriptorParsers.ts b/plugins/catalog-backend/src/ingestion/DescriptorParsers.ts index 86283df666..6375351ebd 100644 --- a/plugins/catalog-backend/src/ingestion/DescriptorParsers.ts +++ b/plugins/catalog-backend/src/ingestion/DescriptorParsers.ts @@ -17,12 +17,7 @@ import { makeValidator } from '../validation'; import { ComponentDescriptorV1beta1Parser } from './descriptors/ComponentDescriptorV1beta1Parser'; import { DescriptorEnvelopeParser } from './descriptors/DescriptorEnvelopeParser'; -import { - DescriptorEnvelope, - DescriptorParser, - KindParser, - ParserError, -} from './types'; +import { DescriptorParser, Entity, KindParser, ParserError } from './types'; export class DescriptorParsers implements DescriptorParser { static create(): DescriptorParser { @@ -37,7 +32,7 @@ export class DescriptorParsers implements DescriptorParser { private readonly kindParsers: KindParser[], ) {} - async parse(descriptor: object): Promise { + async parse(descriptor: object): Promise { const envelope = await this.envelopeParser.parse(descriptor); for (const parser of this.kindParsers) { const parsed = await parser.tryParse(envelope); diff --git a/plugins/catalog-backend/src/ingestion/descriptors/ComponentDescriptorV1beta1Parser.ts b/plugins/catalog-backend/src/ingestion/descriptors/ComponentDescriptorV1beta1Parser.ts index 974b34aa8e..0934231a0c 100644 --- a/plugins/catalog-backend/src/ingestion/descriptors/ComponentDescriptorV1beta1Parser.ts +++ b/plugins/catalog-backend/src/ingestion/descriptors/ComponentDescriptorV1beta1Parser.ts @@ -15,9 +15,9 @@ */ import * as yup from 'yup'; -import { DescriptorEnvelope, KindParser, ParserError } from '../types'; +import { Entity, KindParser, ParserError } from '../types'; -export interface ComponentDescriptorV1beta1 extends DescriptorEnvelope { +export interface ComponentDescriptorV1beta1 extends Entity { spec: { type: string; }; @@ -41,9 +41,7 @@ export class ComponentDescriptorV1beta1Parser implements KindParser { }); } - async tryParse( - envelope: DescriptorEnvelope, - ): Promise { + async tryParse(envelope: Entity): Promise { if ( envelope.apiVersion !== 'backstage.io/v1beta1' || envelope.kind !== 'Component' diff --git a/plugins/catalog-backend/src/ingestion/descriptors/DescriptorEnvelopeParser.ts b/plugins/catalog-backend/src/ingestion/descriptors/DescriptorEnvelopeParser.ts index 1f21e2df9e..3833d22e77 100644 --- a/plugins/catalog-backend/src/ingestion/descriptors/DescriptorEnvelopeParser.ts +++ b/plugins/catalog-backend/src/ingestion/descriptors/DescriptorEnvelopeParser.ts @@ -16,13 +16,13 @@ import * as yup from 'yup'; import { Validators } from '../../validation'; -import { DescriptorEnvelope } from '../types'; +import { Entity } from '../types'; /** * Parses some raw structured data as a descriptor envelope */ export class DescriptorEnvelopeParser { - private schema: yup.Schema; + private schema: yup.Schema; constructor(validators: Validators) { const apiVersionSchema = yup @@ -160,8 +160,8 @@ export class DescriptorEnvelopeParser { .noUnknown(); } - async parse(data: any): Promise { - let result: DescriptorEnvelope; + async parse(data: any): Promise { + let result: Entity; try { result = await this.schema.validate(data, { strict: true }); } catch (e) { diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/catalog-backend/src/ingestion/types.ts index e5083a65f1..45ee3bc638 100644 --- a/plugins/catalog-backend/src/ingestion/types.ts +++ b/plugins/catalog-backend/src/ingestion/types.ts @@ -87,7 +87,7 @@ export type EntityMeta = { * * @see https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/ */ -export type DescriptorEnvelope = { +export type Entity = { /** * The version of specification format for this particular entity that * this is written against. @@ -123,7 +123,7 @@ export type DescriptorParser = { * @returns A structure describing the parsed and validated descriptor * @throws An Error if the descriptor was malformed */ - parse(descriptor: object): Promise; + parse(descriptor: object): Promise; }; /** @@ -142,9 +142,7 @@ export type KindParser = { * @throws An Error if the type was handled and found to not be properly * formatted */ - tryParse( - envelope: DescriptorEnvelope, - ): Promise; + tryParse(envelope: Entity): Promise; }; export class ParserError extends Error { diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index 8c29362015..210ad98577 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -18,7 +18,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import express from 'express'; import request from 'supertest'; import { EntitiesCatalog, Location, LocationsCatalog } from '../catalog'; -import { DescriptorEnvelope } from '../ingestion'; +import { Entity } from '../ingestion'; import { createRouter } from './router'; class MockEntitiesCatalog implements EntitiesCatalog { @@ -37,7 +37,7 @@ class MockLocationsCatalog implements LocationsCatalog { describe('createRouter', () => { describe('entities', () => { it('happy path: lists entities', async () => { - const entities: DescriptorEnvelope[] = [{ apiVersion: 'a', kind: 'b' }]; + const entities: Entity[] = [{ apiVersion: 'a', kind: 'b' }]; const catalog = new MockEntitiesCatalog(); catalog.entities.mockResolvedValueOnce(entities); @@ -76,7 +76,7 @@ describe('createRouter', () => { describe('entityByUid', () => { it('can fetch entity by uid', async () => { - const entity: DescriptorEnvelope = { + const entity: Entity = { apiVersion: 'a', kind: 'b', metadata: { @@ -117,7 +117,7 @@ describe('createRouter', () => { describe('entityByName', () => { it('can fetch entity by name', async () => { - const entity: DescriptorEnvelope = { + const entity: Entity = { apiVersion: 'a', kind: 'b', metadata: { @@ -190,7 +190,9 @@ describe('createRouter', () => { }); const app = express().use(router); - const response = await request(app).post('/locations').send(location); + const response = await request(app) + .post('/locations') + .send(location); expect(response.status).toEqual(400); });