@superblocksteam/shared 0.9603.2 → 0.9604.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/database-lifecycle/capacityPolicy.d.ts +51 -0
- package/dist/database-lifecycle/capacityPolicy.d.ts.map +1 -0
- package/dist/database-lifecycle/capacityPolicy.js +159 -0
- package/dist/database-lifecycle/capacityPolicy.js.map +1 -0
- package/dist/database-lifecycle/capacityPolicy.test.d.ts +2 -0
- package/dist/database-lifecycle/capacityPolicy.test.d.ts.map +1 -0
- package/dist/database-lifecycle/capacityPolicy.test.js +159 -0
- package/dist/database-lifecycle/capacityPolicy.test.js.map +1 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.d.ts +18 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.d.ts.map +1 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.js +32 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.js.map +1 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.test.d.ts +2 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.test.d.ts.map +1 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.test.js +91 -0
- package/dist/database-lifecycle/edit-lifecycle-capability.test.js.map +1 -0
- package/dist/database-lifecycle/index.d.ts +50 -27
- package/dist/database-lifecycle/index.d.ts.map +1 -1
- package/dist/database-lifecycle/index.js +78 -54
- package/dist/database-lifecycle/index.js.map +1 -1
- package/dist/database-lifecycle/index.test.js +120 -77
- package/dist/database-lifecycle/index.test.js.map +1 -1
- package/dist/database-lifecycle/physicalPoolIdentity.d.ts +29 -0
- package/dist/database-lifecycle/physicalPoolIdentity.d.ts.map +1 -0
- package/dist/database-lifecycle/physicalPoolIdentity.js +64 -0
- package/dist/database-lifecycle/physicalPoolIdentity.js.map +1 -0
- package/dist/database-lifecycle/physicalPoolIdentity.test.d.ts +2 -0
- package/dist/database-lifecycle/physicalPoolIdentity.test.d.ts.map +1 -0
- package/dist/database-lifecycle/physicalPoolIdentity.test.js +51 -0
- package/dist/database-lifecycle/physicalPoolIdentity.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types/audit/ocsf.d.ts +60 -6
- package/dist/types/audit/ocsf.d.ts.map +1 -1
- package/dist/types/audit/ocsf.js +12 -1
- package/dist/types/audit/ocsf.js.map +1 -1
- package/dist/types/deployment/deployQueueStatus.d.ts +13 -0
- package/dist/types/deployment/deployQueueStatus.d.ts.map +1 -1
- package/dist/types/deployment/index.d.ts +1 -1
- package/dist/types/deployment/index.d.ts.map +1 -1
- package/dist/types/deployment/index.js.map +1 -1
- package/dist/types/policyGate/index.d.ts +5 -0
- package/dist/types/policyGate/index.d.ts.map +1 -1
- package/dist/types/policyGate/index.js +5 -1
- package/dist/types/policyGate/index.js.map +1 -1
- package/dist/types/publishPipeline/plan.js +1 -1
- package/dist/types/publishPipeline/plan.js.map +1 -1
- package/dist/types/publishPipeline/plan.test.js +3 -3
- package/dist/types/publishPipeline/plan.test.js.map +1 -1
- package/dist/types/rbac/index.d.ts +2 -0
- package/dist/types/rbac/index.d.ts.map +1 -1
- package/dist/types/rbac/index.js +3 -1
- package/dist/types/rbac/index.js.map +1 -1
- package/dist/types/reviewPolicy/index.d.ts +30 -4
- package/dist/types/reviewPolicy/index.d.ts.map +1 -1
- package/dist/types/reviewPolicy/index.js +8 -1
- package/dist/types/reviewPolicy/index.js.map +1 -1
- package/dist-esm/database-lifecycle/capacityPolicy.d.ts +51 -0
- package/dist-esm/database-lifecycle/capacityPolicy.d.ts.map +1 -0
- package/dist-esm/database-lifecycle/capacityPolicy.js +150 -0
- package/dist-esm/database-lifecycle/capacityPolicy.js.map +1 -0
- package/dist-esm/database-lifecycle/capacityPolicy.test.d.ts +2 -0
- package/dist-esm/database-lifecycle/capacityPolicy.test.d.ts.map +1 -0
- package/dist-esm/database-lifecycle/capacityPolicy.test.js +157 -0
- package/dist-esm/database-lifecycle/capacityPolicy.test.js.map +1 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.d.ts +18 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.d.ts.map +1 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.js +29 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.js.map +1 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.test.d.ts +2 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.test.d.ts.map +1 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.test.js +89 -0
- package/dist-esm/database-lifecycle/edit-lifecycle-capability.test.js.map +1 -0
- package/dist-esm/database-lifecycle/index.d.ts +50 -27
- package/dist-esm/database-lifecycle/index.d.ts.map +1 -1
- package/dist-esm/database-lifecycle/index.js +62 -51
- package/dist-esm/database-lifecycle/index.js.map +1 -1
- package/dist-esm/database-lifecycle/index.test.js +90 -47
- package/dist-esm/database-lifecycle/index.test.js.map +1 -1
- package/dist-esm/database-lifecycle/physicalPoolIdentity.d.ts +29 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.d.ts.map +1 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.js +59 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.js.map +1 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.test.d.ts +2 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.test.d.ts.map +1 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.test.js +49 -0
- package/dist-esm/database-lifecycle/physicalPoolIdentity.test.js.map +1 -0
- package/dist-esm/index.d.ts +1 -0
- package/dist-esm/index.d.ts.map +1 -1
- package/dist-esm/index.js +1 -0
- package/dist-esm/index.js.map +1 -1
- package/dist-esm/types/audit/ocsf.d.ts +60 -6
- package/dist-esm/types/audit/ocsf.d.ts.map +1 -1
- package/dist-esm/types/audit/ocsf.js +12 -1
- package/dist-esm/types/audit/ocsf.js.map +1 -1
- package/dist-esm/types/deployment/deployQueueStatus.d.ts +13 -0
- package/dist-esm/types/deployment/deployQueueStatus.d.ts.map +1 -1
- package/dist-esm/types/deployment/index.d.ts +1 -1
- package/dist-esm/types/deployment/index.d.ts.map +1 -1
- package/dist-esm/types/deployment/index.js.map +1 -1
- package/dist-esm/types/policyGate/index.d.ts +5 -0
- package/dist-esm/types/policyGate/index.d.ts.map +1 -1
- package/dist-esm/types/policyGate/index.js +5 -1
- package/dist-esm/types/policyGate/index.js.map +1 -1
- package/dist-esm/types/publishPipeline/plan.js +1 -1
- package/dist-esm/types/publishPipeline/plan.js.map +1 -1
- package/dist-esm/types/publishPipeline/plan.test.js +3 -3
- package/dist-esm/types/publishPipeline/plan.test.js.map +1 -1
- package/dist-esm/types/rbac/index.d.ts +2 -0
- package/dist-esm/types/rbac/index.d.ts.map +1 -1
- package/dist-esm/types/rbac/index.js +3 -1
- package/dist-esm/types/rbac/index.js.map +1 -1
- package/dist-esm/types/reviewPolicy/index.d.ts +30 -4
- package/dist-esm/types/reviewPolicy/index.d.ts.map +1 -1
- package/dist-esm/types/reviewPolicy/index.js +7 -0
- package/dist-esm/types/reviewPolicy/index.js.map +1 -1
- package/package.json +1 -1
- package/src/database-lifecycle/capacityPolicy.test.ts +209 -0
- package/src/database-lifecycle/capacityPolicy.ts +197 -0
- package/src/database-lifecycle/edit-lifecycle-capability.test.ts +116 -0
- package/src/database-lifecycle/edit-lifecycle-capability.ts +34 -0
- package/src/database-lifecycle/index.test.ts +105 -48
- package/src/database-lifecycle/index.ts +157 -90
- package/src/database-lifecycle/physicalPoolIdentity.test.ts +64 -0
- package/src/database-lifecycle/physicalPoolIdentity.ts +75 -0
- package/src/index.ts +1 -0
- package/src/types/audit/ocsf.ts +73 -7
- package/src/types/deployment/deployQueueStatus.ts +14 -0
- package/src/types/deployment/index.ts +2 -1
- package/src/types/policyGate/index.ts +5 -1
- package/src/types/publishPipeline/plan.test.ts +3 -3
- package/src/types/publishPipeline/plan.ts +1 -1
- package/src/types/rbac/index.ts +3 -1
- package/src/types/reviewPolicy/index.ts +44 -5
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const vitest_1 = require("vitest");
|
|
4
|
-
const index_js_1 = require("
|
|
4
|
+
const index_js_1 = require("../types/api/index.js");
|
|
5
|
+
const index_js_2 = require("./index.js");
|
|
5
6
|
(0, vitest_1.describe)('database lifecycle contracts', () => {
|
|
7
|
+
// Postgres `ALTER TYPE ... ADD VALUE` appends. TypeORM's entity-vs-schema
|
|
8
|
+
// check treats enum label order as part of the contract, so this array must
|
|
9
|
+
// match the live `lifecycle_operation_enum` order rather than alphabetical
|
|
10
|
+
// or semantic grouping.
|
|
11
|
+
(0, vitest_1.test)('lists lifecycle operations in Postgres enum order', () => {
|
|
12
|
+
(0, vitest_1.expect)(index_js_2.LIFECYCLE_OPERATIONS).toEqual(['ensure_database', 'migrate_schema', 'retire_database', 'ensure_physical_database_instance']);
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.test)('allows lifecycle-managed integrations only in application APIs', () => {
|
|
15
|
+
(0, vitest_1.expect)((0, index_js_2.isLifecycleManagedIntegrationAllowedForApiTrigger)(index_js_1.ApiTriggerType.UI, index_js_2.DATABASE_LIFECYCLE_MANAGED_BY)).toBe(true);
|
|
16
|
+
(0, vitest_1.expect)((0, index_js_2.isLifecycleManagedIntegrationAllowedForApiTrigger)(index_js_1.ApiTriggerType.WORKFLOW, index_js_2.DATABASE_LIFECYCLE_MANAGED_BY)).toBe(false);
|
|
17
|
+
(0, vitest_1.expect)((0, index_js_2.isLifecycleManagedIntegrationAllowedForApiTrigger)(index_js_1.ApiTriggerType.SCHEDULE, index_js_2.DATABASE_LIFECYCLE_MANAGED_BY)).toBe(false);
|
|
18
|
+
(0, vitest_1.expect)((0, index_js_2.isLifecycleManagedIntegrationAllowedForApiTrigger)(index_js_1.ApiTriggerType.WORKFLOW, null)).toBe(true);
|
|
19
|
+
});
|
|
6
20
|
(0, vitest_1.test)('computes stable requirement, binding, and desired spec identifiers', async () => {
|
|
7
21
|
const requirement = {
|
|
8
22
|
logicalName: 'Orders DB',
|
|
@@ -14,26 +28,27 @@ const index_js_1 = require("./index.js");
|
|
|
14
28
|
},
|
|
15
29
|
extensions: ['pgcrypto', 'uuid-ossp']
|
|
16
30
|
};
|
|
17
|
-
(0, vitest_1.expect)((0,
|
|
18
|
-
(0, vitest_1.expect)((0,
|
|
19
|
-
(0, vitest_1.expect)((0,
|
|
31
|
+
(0, vitest_1.expect)((0, index_js_2.computeRequirementKey)(requirement)).toBe('orders-db~Orders%20DB:postgres');
|
|
32
|
+
(0, vitest_1.expect)((0, index_js_2.computeRequirementKey)({ logicalName: 'orders/db', engine: 'postgres' })).toBe('orders-db~orders%2Fdb:postgres');
|
|
33
|
+
(0, vitest_1.expect)((0, index_js_2.computeRequirementKey)({ logicalName: 'orders-db', engine: 'postgres' })).toBe('orders-db~orders-db:postgres');
|
|
20
34
|
// binding_key excludes the logical name on purpose: one database per
|
|
21
|
-
// (organization, application,
|
|
22
|
-
//
|
|
23
|
-
(0, vitest_1.expect)((0,
|
|
35
|
+
// (organization, application, profile). Two different logical names under
|
|
36
|
+
// the same profile resolve to the same binding_key.
|
|
37
|
+
(0, vitest_1.expect)((0, index_js_2.computeBindingKey)({
|
|
24
38
|
organizationId: 'org-1',
|
|
25
39
|
applicationId: 'app-1',
|
|
26
|
-
environment: 'edit',
|
|
27
40
|
profile: 'Staging EU'
|
|
28
|
-
})).toBe('org-1:app-1:
|
|
29
|
-
(0, vitest_1.expect)((0,
|
|
41
|
+
})).toBe('org-1:app-1:staging-eu~Staging%20EU');
|
|
42
|
+
(0, vitest_1.expect)((0, index_js_2.computeBindingKey)({
|
|
30
43
|
organizationId: 'org-1',
|
|
31
44
|
applicationId: 'app-1',
|
|
32
|
-
environment: 'edit',
|
|
33
45
|
profile: 'staging'
|
|
34
|
-
})).toBe('org-1:app-1:
|
|
35
|
-
await (0, vitest_1.expect)((0,
|
|
36
|
-
|
|
46
|
+
})).toBe('org-1:app-1:staging~staging');
|
|
47
|
+
await (0, vitest_1.expect)((0, index_js_2.computeDesiredSpecHash)(requirement)).resolves.toBe(await (0, index_js_2.computeDesiredSpecHash)({
|
|
48
|
+
...requirement,
|
|
49
|
+
extensions: ['uuid-ossp', 'pgcrypto']
|
|
50
|
+
}));
|
|
51
|
+
await (0, vitest_1.expect)((0, index_js_2.computeDesiredSpecHash)(requirement)).resolves.toBe('QsCl6RVzJVEwf4Nuk0D27rRtycYe2vQZMxcXLt9WUkQ=');
|
|
37
52
|
});
|
|
38
53
|
(0, vitest_1.test)('ignores migrationDirectory when hashing the desired spec', async () => {
|
|
39
54
|
const infrastructureSpec = {
|
|
@@ -43,29 +58,35 @@ const index_js_1 = require("./index.js");
|
|
|
43
58
|
sizing: { storageGb: 20, tier: 'shared' },
|
|
44
59
|
extensions: ['pgcrypto', 'uuid-ossp']
|
|
45
60
|
};
|
|
46
|
-
const withoutDirectory = await (0,
|
|
47
|
-
const withDirectory = await (0,
|
|
48
|
-
|
|
61
|
+
const withoutDirectory = await (0, index_js_2.computeDesiredSpecHash)(infrastructureSpec);
|
|
62
|
+
const withDirectory = await (0, index_js_2.computeDesiredSpecHash)({
|
|
63
|
+
...infrastructureSpec,
|
|
64
|
+
migrationDirectory: 'db/migrations'
|
|
65
|
+
});
|
|
66
|
+
const withOtherDirectory = await (0, index_js_2.computeDesiredSpecHash)({
|
|
67
|
+
...infrastructureSpec,
|
|
68
|
+
migrationDirectory: 'db/other-migrations'
|
|
69
|
+
});
|
|
49
70
|
// migrationDirectory only says where the SQL files live, not what
|
|
50
71
|
// infrastructure to provision, so changing it must not look like drift.
|
|
51
72
|
(0, vitest_1.expect)(withDirectory).toBe(withoutDirectory);
|
|
52
73
|
(0, vitest_1.expect)(withOtherDirectory).toBe(withoutDirectory);
|
|
53
74
|
});
|
|
54
75
|
(0, vitest_1.test)('hashes desired specs with locale-invariant ordering', async () => {
|
|
55
|
-
const first = await (0,
|
|
76
|
+
const first = await (0, index_js_2.computeDesiredSpecHash)({
|
|
56
77
|
logicalName: 'Éclair DB',
|
|
57
78
|
engine: 'postgres',
|
|
58
79
|
extensions: ['ä', 'z', 'a']
|
|
59
80
|
});
|
|
60
|
-
const second = await (0,
|
|
81
|
+
const second = await (0, index_js_2.computeDesiredSpecHash)({
|
|
61
82
|
logicalName: 'Éclair DB',
|
|
62
83
|
engine: 'postgres',
|
|
63
84
|
extensions: ['z', 'a', 'ä']
|
|
64
85
|
});
|
|
65
86
|
(0, vitest_1.expect)(first).toBe(second);
|
|
66
87
|
});
|
|
67
|
-
(0, vitest_1.test)('redacts raw credential material while preserving
|
|
68
|
-
const redacted = (0,
|
|
88
|
+
(0, vitest_1.test)('redacts raw credential material and generic credential refs while preserving physical masterCredentialRef', () => {
|
|
89
|
+
const redacted = (0, index_js_2.redactLifecycleSecrets)({
|
|
69
90
|
host: 'db.internal',
|
|
70
91
|
password: 'raw-password',
|
|
71
92
|
nested: {
|
|
@@ -81,6 +102,11 @@ const index_js_1 = require("./index.js");
|
|
|
81
102
|
ref: 'database/orders',
|
|
82
103
|
field: 'password'
|
|
83
104
|
}
|
|
105
|
+
},
|
|
106
|
+
masterCredentialRef: {
|
|
107
|
+
resolver: 'aws_secrets_manager',
|
|
108
|
+
ref: 'physical-instance/master',
|
|
109
|
+
field: 'password'
|
|
84
110
|
}
|
|
85
111
|
});
|
|
86
112
|
(0, vitest_1.expect)(redacted).toEqual({
|
|
@@ -94,149 +120,166 @@ const index_js_1 = require("./index.js");
|
|
|
94
120
|
}
|
|
95
121
|
},
|
|
96
122
|
credential_refs: {
|
|
97
|
-
password:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
123
|
+
password: '[REDACTED]'
|
|
124
|
+
},
|
|
125
|
+
masterCredentialRef: {
|
|
126
|
+
resolver: 'aws_secrets_manager',
|
|
127
|
+
ref: 'physical-instance/master',
|
|
128
|
+
field: 'password'
|
|
102
129
|
}
|
|
103
130
|
});
|
|
104
131
|
});
|
|
105
132
|
(0, vitest_1.test)('recognizes terminal lifecycle states', () => {
|
|
106
|
-
(0, vitest_1.expect)((0,
|
|
107
|
-
(0, vitest_1.expect)((0,
|
|
108
|
-
(0, vitest_1.expect)((0,
|
|
133
|
+
(0, vitest_1.expect)((0, index_js_2.isTerminalLifecycleState)('ready')).toBe(true);
|
|
134
|
+
(0, vitest_1.expect)((0, index_js_2.isTerminalLifecycleState)('failed')).toBe(true);
|
|
135
|
+
(0, vitest_1.expect)((0, index_js_2.isTerminalLifecycleState)('provisioning')).toBe(false);
|
|
109
136
|
});
|
|
110
137
|
(0, vitest_1.test)('flags secret-shaped keys', () => {
|
|
111
138
|
for (const key of ['password', 'PASSWORD', 'api_token', 'private_key', 'private-key', 'dsn']) {
|
|
112
|
-
(0, vitest_1.expect)((0,
|
|
139
|
+
(0, vitest_1.expect)((0, index_js_2.isSecretKey)(key)).toBe(true);
|
|
113
140
|
}
|
|
114
141
|
for (const key of ['host', 'port', 'database', 'username']) {
|
|
115
|
-
(0, vitest_1.expect)((0,
|
|
142
|
+
(0, vitest_1.expect)((0, index_js_2.isSecretKey)(key)).toBe(false);
|
|
116
143
|
}
|
|
117
144
|
});
|
|
118
145
|
(0, vitest_1.test)('flags secret-shaped value content', () => {
|
|
119
|
-
(0, vitest_1.expect)((0,
|
|
120
|
-
(0, vitest_1.expect)((0,
|
|
121
|
-
(0, vitest_1.expect)((0,
|
|
122
|
-
(0, vitest_1.expect)((0,
|
|
123
|
-
(0, vitest_1.expect)((0,
|
|
124
|
-
(0, vitest_1.expect)((0,
|
|
146
|
+
(0, vitest_1.expect)((0, index_js_2.containsCredentialMaterial)('postgres://user:pass@db.internal:5432/orders')).toBe(true);
|
|
147
|
+
(0, vitest_1.expect)((0, index_js_2.containsCredentialMaterial)('mongodb+srv://app:secret@cluster0.example.net/db')).toBe(true);
|
|
148
|
+
(0, vitest_1.expect)((0, index_js_2.containsCredentialMaterial)('password=hunter2;host=db.internal')).toBe(true);
|
|
149
|
+
(0, vitest_1.expect)((0, index_js_2.containsCredentialMaterial)('{"password":"hunter2"}')).toBe(true);
|
|
150
|
+
(0, vitest_1.expect)((0, index_js_2.containsCredentialMaterial)('host=db.internal port=5432')).toBe(false);
|
|
151
|
+
(0, vitest_1.expect)((0, index_js_2.containsCredentialMaterial)('arn:aws:secretsmanager:us-east-1:123:secret:orders')).toBe(false);
|
|
125
152
|
});
|
|
126
153
|
(0, vitest_1.test)('builds a canonical session policy from a valid managed Postgres IAM descriptor', () => {
|
|
127
|
-
const descriptor = (0,
|
|
154
|
+
const descriptor = (0, index_js_2.parseNativeDbIamDescriptor)({
|
|
128
155
|
application_id: 'application-id',
|
|
129
|
-
auth_descriptor_version:
|
|
156
|
+
auth_descriptor_version: 3,
|
|
130
157
|
auth_mode: 'aws_iam_role',
|
|
131
158
|
aws_account_id: '123456789012',
|
|
132
159
|
binding_id: 'binding-id',
|
|
133
160
|
cluster_resource_id: 'cluster-ABC123DEF456EXAMPLE',
|
|
134
161
|
connector_role_arn: 'arn:aws:iam::123456789012:role/superblocks-native-db-connector-prod',
|
|
135
|
-
database: '
|
|
162
|
+
database: 'sbndb_abcdef1234567890_0123456789abcdef01234567',
|
|
136
163
|
host: 'native-db.cluster-example.us-west-2.rds.amazonaws.com',
|
|
137
164
|
port: 5432,
|
|
138
165
|
region: 'us-west-2',
|
|
139
|
-
username: '
|
|
166
|
+
username: 'sbndb_abcdef1234567890_0123456789abcdef01234567_runtime'
|
|
140
167
|
});
|
|
141
168
|
(0, vitest_1.expect)(descriptor).toBeDefined();
|
|
142
169
|
if (!descriptor) {
|
|
143
170
|
throw new Error('Expected a valid IAM descriptor');
|
|
144
171
|
}
|
|
145
|
-
(0, vitest_1.expect)((0,
|
|
172
|
+
(0, vitest_1.expect)((0, index_js_2.nativeDbIamSessionPolicy)(descriptor)).toBe('{"Version":"2012-10-17","Statement":[{"Sid":"ConnectToThisNativeDatabaseUser","Effect":"Allow","Action":"rds-db:connect","Resource":"arn:aws:rds-db:us-west-2:123456789012:dbuser:cluster-ABC123DEF456EXAMPLE/sbndb_abcdef1234567890_0123456789abcdef01234567_runtime"}]}');
|
|
146
173
|
});
|
|
147
|
-
(0, vitest_1.test)('reads
|
|
148
|
-
(0, vitest_1.expect)((0,
|
|
174
|
+
(0, vitest_1.test)('reads managed Postgres IAM descriptors with auth_descriptor_version 3', () => {
|
|
175
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
149
176
|
application_id: 'application-id',
|
|
150
|
-
auth_descriptor_version:
|
|
177
|
+
auth_descriptor_version: 3,
|
|
151
178
|
auth_mode: 'aws_iam_role',
|
|
152
179
|
aws_account_id: '123456789012',
|
|
153
180
|
binding_id: 'binding-id',
|
|
154
181
|
cluster_resource_id: 'cluster-ABC123DEF456EXAMPLE',
|
|
155
182
|
connector_role_arn: 'arn:aws:iam::123456789012:role/superblocks-native-db-connector-prod',
|
|
156
|
-
database: '
|
|
183
|
+
database: 'sbndb_abcdef1234567890_0123456789abcdef01234567',
|
|
157
184
|
host: 'native-db.cluster-example.us-west-2.rds.amazonaws.com',
|
|
158
185
|
port: 5432,
|
|
159
186
|
region: 'us-west-2',
|
|
160
|
-
username: '
|
|
187
|
+
username: 'sbndb_abcdef1234567890_0123456789abcdef01234567_runtime'
|
|
161
188
|
})).toEqual({
|
|
162
189
|
application_id: 'application-id',
|
|
163
|
-
auth_descriptor_version:
|
|
190
|
+
auth_descriptor_version: 3,
|
|
164
191
|
auth_mode: 'aws_iam_role',
|
|
165
192
|
aws_account_id: '123456789012',
|
|
166
193
|
binding_id: 'binding-id',
|
|
167
194
|
cluster_resource_id: 'cluster-ABC123DEF456EXAMPLE',
|
|
168
195
|
connector_role_arn: 'arn:aws:iam::123456789012:role/superblocks-native-db-connector-prod',
|
|
169
|
-
database: '
|
|
196
|
+
database: 'sbndb_abcdef1234567890_0123456789abcdef01234567',
|
|
170
197
|
host: 'native-db.cluster-example.us-west-2.rds.amazonaws.com',
|
|
171
198
|
port: 5432,
|
|
172
199
|
region: 'us-west-2',
|
|
173
|
-
username: '
|
|
200
|
+
username: 'sbndb_abcdef1234567890_0123456789abcdef01234567_runtime'
|
|
174
201
|
});
|
|
175
202
|
});
|
|
176
|
-
(0, vitest_1.test)('rejects
|
|
177
|
-
(0, vitest_1.expect)((0,
|
|
203
|
+
(0, vitest_1.test)('rejects descriptors when database and runtime username do not match', () => {
|
|
204
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
178
205
|
application_id: 'application-id',
|
|
179
|
-
auth_descriptor_version:
|
|
206
|
+
auth_descriptor_version: 3,
|
|
180
207
|
auth_mode: 'aws_iam_role',
|
|
181
208
|
aws_account_id: '123456789012',
|
|
182
209
|
binding_id: 'binding-id',
|
|
183
210
|
cluster_resource_id: 'cluster-ABC123DEF456EXAMPLE',
|
|
184
211
|
connector_role_arn: 'arn:aws:iam::123456789012:role/superblocks-native-db-connector-prod',
|
|
185
|
-
database: '
|
|
212
|
+
database: 'sbndb_abcdef1234567890_0123456789abcdef01234567',
|
|
186
213
|
host: 'native-db.cluster-example.us-west-2.rds.amazonaws.com',
|
|
187
214
|
port: 5432,
|
|
188
215
|
region: 'us-west-2',
|
|
189
|
-
username: '
|
|
216
|
+
username: 'sbndb_abcdef1234567890_fedcba9876543210fedcba98_runtime'
|
|
190
217
|
})).toBeUndefined();
|
|
191
218
|
});
|
|
192
219
|
(0, vitest_1.test)('rejects malformed or non-commercial managed Postgres IAM descriptors', () => {
|
|
193
220
|
const descriptor = {
|
|
194
221
|
application_id: 'application-id',
|
|
195
|
-
auth_descriptor_version:
|
|
222
|
+
auth_descriptor_version: 3,
|
|
196
223
|
auth_mode: 'aws_iam_role',
|
|
197
224
|
aws_account_id: '123456789012',
|
|
198
225
|
binding_id: 'binding-id',
|
|
199
226
|
cluster_resource_id: 'cluster-ABC123DEF456EXAMPLE',
|
|
200
227
|
connector_role_arn: 'arn:aws:iam::123456789012:role/superblocks-native-db-connector-prod',
|
|
201
|
-
database: '
|
|
228
|
+
database: 'sbndb_abcdef1234567890_0123456789abcdef01234567',
|
|
202
229
|
host: 'native-db.cluster-example.us-west-2.rds.amazonaws.com',
|
|
203
230
|
port: 5432,
|
|
204
231
|
region: 'us-west-2',
|
|
205
|
-
username: '
|
|
232
|
+
username: 'sbndb_abcdef1234567890_0123456789abcdef01234567_runtime'
|
|
206
233
|
};
|
|
207
|
-
(0, vitest_1.expect)((0,
|
|
208
|
-
(0, vitest_1.expect)((0,
|
|
209
|
-
(0, vitest_1.expect)((0,
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
(0, vitest_1.expect)((0,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
234
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({ ...descriptor, auth_descriptor_version: 1 })).toBeUndefined();
|
|
235
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({ ...descriptor, auth_descriptor_version: 2 })).toBeUndefined();
|
|
236
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
237
|
+
...descriptor,
|
|
238
|
+
cluster_resource_id: 'not-an-rds-resource'
|
|
239
|
+
})).toBeUndefined();
|
|
240
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
241
|
+
...descriptor,
|
|
242
|
+
connector_role_arn: 'arn:aws:iam::210987654321:role/other'
|
|
243
|
+
})).toBeUndefined();
|
|
244
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({ ...descriptor, database: 'orders' })).toBeUndefined();
|
|
245
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
246
|
+
...descriptor,
|
|
247
|
+
host: descriptor.host.toUpperCase()
|
|
248
|
+
})).toBeUndefined();
|
|
249
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
250
|
+
...descriptor,
|
|
251
|
+
host: 'native-db.cluster-example.us-east-1.rds.amazonaws.com'
|
|
252
|
+
})).toBeUndefined();
|
|
253
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({ ...descriptor, port: 0 })).toBeUndefined();
|
|
254
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({ ...descriptor, region: 'cn-north-1' })).toBeUndefined();
|
|
255
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({ ...descriptor, region: 'us-gov-west-1' })).toBeUndefined();
|
|
256
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
257
|
+
...descriptor,
|
|
258
|
+
username: 'sbndb_0000000000000000_7bfeae1170db923274f1943f_runtime'
|
|
259
|
+
})).toBeUndefined();
|
|
217
260
|
});
|
|
218
261
|
(0, vitest_1.test)('accepts standalone RDS IAM resource IDs', () => {
|
|
219
|
-
(0, vitest_1.expect)((0,
|
|
262
|
+
(0, vitest_1.expect)((0, index_js_2.parseNativeDbIamDescriptor)({
|
|
220
263
|
application_id: 'application-id',
|
|
221
|
-
auth_descriptor_version:
|
|
264
|
+
auth_descriptor_version: 3,
|
|
222
265
|
auth_mode: 'aws_iam_role',
|
|
223
266
|
aws_account_id: '123456789012',
|
|
224
267
|
binding_id: 'binding-id',
|
|
225
268
|
cluster_resource_id: 'db-ABCDEF0123456789-1',
|
|
226
269
|
connector_role_arn: 'arn:aws:iam::123456789012:role/superblocks-native-db-connector-prod',
|
|
227
|
-
database: '
|
|
270
|
+
database: 'sbndb_abcdef1234567890_0123456789abcdef01234567',
|
|
228
271
|
host: 'native-db.example.us-west-2.rds.amazonaws.com',
|
|
229
272
|
port: 5432,
|
|
230
273
|
region: 'us-west-2',
|
|
231
|
-
username: '
|
|
274
|
+
username: 'sbndb_abcdef1234567890_0123456789abcdef01234567_runtime'
|
|
232
275
|
})).toBeDefined();
|
|
233
276
|
});
|
|
234
|
-
(0, vitest_1.test)('derives canonical IAM
|
|
235
|
-
await (0, vitest_1.expect)((0,
|
|
236
|
-
await (0, vitest_1.expect)((0, index_js_1.computeNativeDbDatabaseName)('abcdef123456', 'database-id')).resolves.toBe('sbndb_abcdef123456_dad72612f7a80580b028178f');
|
|
277
|
+
(0, vitest_1.test)('derives canonical IAM application token', async () => {
|
|
278
|
+
await (0, vitest_1.expect)((0, index_js_2.computeNativeDbApplicationToken)('application-id')).resolves.toBe('7bfeae1170db923274f1943f');
|
|
237
279
|
});
|
|
238
|
-
(0, vitest_1.test)('derives
|
|
239
|
-
await (0, vitest_1.expect)((0,
|
|
280
|
+
(0, vitest_1.test)('derives canonical IAM profile token', async () => {
|
|
281
|
+
await (0, vitest_1.expect)((0, index_js_2.computeNativeDbProfileToken)('production')).resolves.toHaveLength(16);
|
|
282
|
+
await (0, vitest_1.expect)((0, index_js_2.computeNativeDbProfileToken)('Production')).resolves.toBe(await (0, index_js_2.computeNativeDbProfileToken)('production'));
|
|
240
283
|
});
|
|
241
284
|
});
|
|
242
285
|
//# sourceMappingURL=index.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/database-lifecycle/index.test.ts"],"names":[],"mappings":";;AAAA,mCAAgD;AAEhD,
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/database-lifecycle/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PhysicalDatabaseCapacityPolicy } from './capacityPolicy.js';
|
|
2
|
+
/**
|
|
3
|
+
* Agent tag key for the customer-managed deployment name that identifies a
|
|
4
|
+
* worker's physical database pool, `(organizationId, agentName, engine)`.
|
|
5
|
+
*
|
|
6
|
+
* Published on its own rather than read out of
|
|
7
|
+
* `databaseLifecycle:capacityPolicies`, so a customer who wants no proactive
|
|
8
|
+
* scaling still gets a resolvable pool. One value, e.g. `customer-opa`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DATABASE_LIFECYCLE_TAG_AGENT_NAME = "databaseLifecycle:agentName";
|
|
11
|
+
export declare class PhysicalPoolIdentityError extends Error {
|
|
12
|
+
readonly code = "physical_pool_identity_invalid";
|
|
13
|
+
constructor(message: string);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The single physical pool a worker's registration names, or undefined when it
|
|
17
|
+
* published none.
|
|
18
|
+
*
|
|
19
|
+
* Throws {@link PhysicalPoolIdentityError} when the registration names more
|
|
20
|
+
* than one pool. Guessing between them would provision infrastructure under
|
|
21
|
+
* one deployment's Terraform state and hand it to another, so callers must
|
|
22
|
+
* either refuse the registration or withhold the identity.
|
|
23
|
+
*
|
|
24
|
+
* Falls back to the capacity policy's name when the tag is absent, for a
|
|
25
|
+
* worker predating {@link DATABASE_LIFECYCLE_TAG_AGENT_NAME} that is still
|
|
26
|
+
* rolling: the policy names the same pool, so identity stays unambiguous.
|
|
27
|
+
*/
|
|
28
|
+
export declare function parsePhysicalPoolAgentNameTag(published: string[] | undefined, capacityPolicies?: readonly PhysicalDatabaseCapacityPolicy[]): string | undefined;
|
|
29
|
+
//# sourceMappingURL=physicalPoolIdentity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalPoolIdentity.d.ts","sourceRoot":"","sources":["../../src/database-lifecycle/physicalPoolIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAE/E,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,oCAAoC;gBAErC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,gBAAgB,GAAE,SAAS,8BAA8B,EAAO,GAC/D,MAAM,GAAG,SAAS,CAqCpB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PhysicalPoolIdentityError = exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME = void 0;
|
|
4
|
+
exports.parsePhysicalPoolAgentNameTag = parsePhysicalPoolAgentNameTag;
|
|
5
|
+
/**
|
|
6
|
+
* Agent tag key for the customer-managed deployment name that identifies a
|
|
7
|
+
* worker's physical database pool, `(organizationId, agentName, engine)`.
|
|
8
|
+
*
|
|
9
|
+
* Published on its own rather than read out of
|
|
10
|
+
* `databaseLifecycle:capacityPolicies`, so a customer who wants no proactive
|
|
11
|
+
* scaling still gets a resolvable pool. One value, e.g. `customer-opa`.
|
|
12
|
+
*/
|
|
13
|
+
exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME = 'databaseLifecycle:agentName';
|
|
14
|
+
class PhysicalPoolIdentityError extends Error {
|
|
15
|
+
code = 'physical_pool_identity_invalid';
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = 'PhysicalPoolIdentityError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.PhysicalPoolIdentityError = PhysicalPoolIdentityError;
|
|
22
|
+
/**
|
|
23
|
+
* The single physical pool a worker's registration names, or undefined when it
|
|
24
|
+
* published none.
|
|
25
|
+
*
|
|
26
|
+
* Throws {@link PhysicalPoolIdentityError} when the registration names more
|
|
27
|
+
* than one pool. Guessing between them would provision infrastructure under
|
|
28
|
+
* one deployment's Terraform state and hand it to another, so callers must
|
|
29
|
+
* either refuse the registration or withhold the identity.
|
|
30
|
+
*
|
|
31
|
+
* Falls back to the capacity policy's name when the tag is absent, for a
|
|
32
|
+
* worker predating {@link DATABASE_LIFECYCLE_TAG_AGENT_NAME} that is still
|
|
33
|
+
* rolling: the policy names the same pool, so identity stays unambiguous.
|
|
34
|
+
*/
|
|
35
|
+
function parsePhysicalPoolAgentNameTag(published, capacityPolicies = []) {
|
|
36
|
+
if (published !== undefined && !Array.isArray(published)) {
|
|
37
|
+
throw new PhysicalPoolIdentityError(`${exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME} must be an array holding one deployment name.`);
|
|
38
|
+
}
|
|
39
|
+
const values = published ?? [];
|
|
40
|
+
if (values.some((value) => typeof value !== 'string' || value.trim() === '')) {
|
|
41
|
+
throw new PhysicalPoolIdentityError(`${exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME} must be a non-empty string when provided.`);
|
|
42
|
+
}
|
|
43
|
+
const declared = new Set(values.map((value) => value.trim()));
|
|
44
|
+
if (declared.size > 1) {
|
|
45
|
+
throw new PhysicalPoolIdentityError(`${exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME} names ${declared.size} pools (${[...declared].sort().join(', ')}); it must name exactly one.`);
|
|
46
|
+
}
|
|
47
|
+
const policyNames = new Set(capacityPolicies.map((policy) => policy.agentName));
|
|
48
|
+
const [declaredName] = declared;
|
|
49
|
+
if (declaredName !== undefined) {
|
|
50
|
+
// Every policy has to be for the pool this deployment owns. A policy for
|
|
51
|
+
// another pool would have proactive evaluation scaling something the
|
|
52
|
+
// deployment cannot provision into.
|
|
53
|
+
if ([...policyNames].some((policyName) => policyName !== declaredName)) {
|
|
54
|
+
throw new PhysicalPoolIdentityError(`${exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME} is ${declaredName} but databaseLifecycle:capacityPolicies names ${[...policyNames].sort().join(', ')}; they must name the same pool.`);
|
|
55
|
+
}
|
|
56
|
+
return declaredName;
|
|
57
|
+
}
|
|
58
|
+
if (policyNames.size > 1) {
|
|
59
|
+
throw new PhysicalPoolIdentityError(`databaseLifecycle:capacityPolicies names ${policyNames.size} pools; publish ${exports.DATABASE_LIFECYCLE_TAG_AGENT_NAME} to say which one this deployment owns.`);
|
|
60
|
+
}
|
|
61
|
+
const [policyName] = policyNames;
|
|
62
|
+
return policyName;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=physicalPoolIdentity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalPoolIdentity.js","sourceRoot":"","sources":["../../src/database-lifecycle/physicalPoolIdentity.ts"],"names":[],"mappings":";;;AAkCA,sEAwCC;AAxED;;;;;;;GAOG;AACU,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAE/E,MAAa,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,gCAAgC,CAAC;IAEjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAPD,8DAOC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,6BAA6B,CAC3C,SAA+B,EAC/B,mBAA8D,EAAE;IAEhE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,yBAAyB,CAAC,GAAG,yCAAiC,gDAAgD,CAAC,CAAC;IAC5H,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,IAAI,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,yBAAyB,CAAC,GAAG,yCAAiC,4CAA4C,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,yBAAyB,CACjC,GAAG,yCAAiC,UAAU,QAAQ,CAAC,IAAI,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CACpI,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;IAChC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,yEAAyE;QACzE,qEAAqE;QACrE,oCAAoC;QACpC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,YAAY,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,yBAAyB,CACjC,GAAG,yCAAiC,OAAO,YAAY,iDAAiD,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAC5K,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,yBAAyB,CACjC,4CAA4C,WAAW,CAAC,IAAI,mBAAmB,yCAAiC,yCAAyC,CAC1J,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalPoolIdentity.test.d.ts","sourceRoot":"","sources":["../../src/database-lifecycle/physicalPoolIdentity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const physicalPoolIdentity_js_1 = require("./physicalPoolIdentity.js");
|
|
5
|
+
const policy = (agentName) => ({
|
|
6
|
+
agentName,
|
|
7
|
+
engine: 'postgres',
|
|
8
|
+
thresholdType: 'minAvailableCapacityPercent',
|
|
9
|
+
thresholdValue: 20
|
|
10
|
+
});
|
|
11
|
+
(0, vitest_1.describe)('parsePhysicalPoolAgentNameTag', () => {
|
|
12
|
+
(0, vitest_1.test)('reads the pool a deployment named', () => {
|
|
13
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(['customer-opa'])).toBe('customer-opa');
|
|
14
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)([' customer-opa '])).toBe('customer-opa');
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.test)('reports no identity for a deployment that named no pool', () => {
|
|
17
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(undefined)).toBeUndefined();
|
|
18
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)([])).toBeUndefined();
|
|
19
|
+
});
|
|
20
|
+
(0, vitest_1.test)('rejects a tag that is not one non-empty name', () => {
|
|
21
|
+
(0, vitest_1.expect)(() => (0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)([''])).toThrow(physicalPoolIdentity_js_1.PhysicalPoolIdentityError);
|
|
22
|
+
(0, vitest_1.expect)(() => (0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)([' '])).toThrow(physicalPoolIdentity_js_1.PhysicalPoolIdentityError);
|
|
23
|
+
(0, vitest_1.expect)(() => (0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(['customer-opa', 'other-opa'])).toThrow(/must name exactly one/);
|
|
24
|
+
});
|
|
25
|
+
// Replicas of one deployment publish the same registration.
|
|
26
|
+
(0, vitest_1.test)('accepts a name repeated across replicas', () => {
|
|
27
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(['customer-opa', 'customer-opa'])).toBe('customer-opa');
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.describe)('agreement with capacity policies', () => {
|
|
30
|
+
(0, vitest_1.test)('accepts a policy for the pool the deployment named', () => {
|
|
31
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(['customer-opa'], [policy('customer-opa')])).toBe('customer-opa');
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.test)('rejects a policy for a pool the deployment does not own', () => {
|
|
34
|
+
(0, vitest_1.expect)(() => (0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(['customer-opa'], [policy('other-opa')])).toThrow(/must name the same pool/);
|
|
35
|
+
});
|
|
36
|
+
// A deployment scales the pool it owns and nothing else. Accepting a
|
|
37
|
+
// foreign policy alongside a matching one would let proactive evaluation
|
|
38
|
+
// key off a pool the wizard would never resolve to.
|
|
39
|
+
(0, vitest_1.test)('rejects a foreign policy published alongside the deployments own', () => {
|
|
40
|
+
(0, vitest_1.expect)(() => (0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(['customer-opa'], [policy('customer-opa'), policy('other-opa')])).toThrow(/must name the same pool/);
|
|
41
|
+
});
|
|
42
|
+
// Older workers publish identity only inside the policy.
|
|
43
|
+
(0, vitest_1.test)('falls back to the policy name when the deployment published no tag', () => {
|
|
44
|
+
(0, vitest_1.expect)((0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(undefined, [policy('customer-opa')])).toBe('customer-opa');
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.test)('refuses to guess when policies alone name two pools', () => {
|
|
47
|
+
(0, vitest_1.expect)(() => (0, physicalPoolIdentity_js_1.parsePhysicalPoolAgentNameTag)(undefined, [policy('customer-opa'), policy('other-opa')])).toThrow(/publish databaseLifecycle:agentName/);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=physicalPoolIdentity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalPoolIdentity.test.js","sourceRoot":"","sources":["../../src/database-lifecycle/physicalPoolIdentity.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -27,4 +27,5 @@ export * from './tracing/errorSanitizer.js';
|
|
|
27
27
|
export * from './jwt/index.js';
|
|
28
28
|
export * from './org-features/index.js';
|
|
29
29
|
export * from './database-lifecycle/index.js';
|
|
30
|
+
export * from './database-lifecycle/edit-lifecycle-capability.js';
|
|
30
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mDAAmD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -43,4 +43,5 @@ __exportStar(require("./tracing/errorSanitizer.js"), exports);
|
|
|
43
43
|
__exportStar(require("./jwt/index.js"), exports);
|
|
44
44
|
__exportStar(require("./org-features/index.js"), exports);
|
|
45
45
|
__exportStar(require("./database-lifecycle/index.js"), exports);
|
|
46
|
+
__exportStar(require("./database-lifecycle/edit-lifecycle-capability.js"), exports);
|
|
46
47
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,mDAAiC;AACjC,mDAAiC;AACjC,mDAAiC;AACjC,qDAAmC;AACnC,iDAA+B;AAC/B,2DAAyC;AACzC,iDAA+B;AAC/B,4DAA0C;AAC1C,oDAAkC;AAClC,mEAAiD;AACjD,gEAA8C;AAC9C,6DAA2C;AAC3C,6DAA2C;AAC3C,mDAAiC;AACjC,kDAAgC;AAChC,0DAAwC;AACxC,oDAAkC;AAClC,qDAAmC;AACnC,sDAAoC;AACpC,yDAAuC;AACvC,kDAAgC;AAChC,gEAA8C;AAC9C,yDAAuC;AACvC,6DAA2C;AAC3C,8DAA4C;AAC5C,iDAA+B;AAC/B,0DAAwC;AACxC,gEAA8C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,mDAAiC;AACjC,mDAAiC;AACjC,mDAAiC;AACjC,qDAAmC;AACnC,iDAA+B;AAC/B,2DAAyC;AACzC,iDAA+B;AAC/B,4DAA0C;AAC1C,oDAAkC;AAClC,mEAAiD;AACjD,gEAA8C;AAC9C,6DAA2C;AAC3C,6DAA2C;AAC3C,mDAAiC;AACjC,kDAAgC;AAChC,0DAAwC;AACxC,oDAAkC;AAClC,qDAAmC;AACnC,sDAAoC;AACpC,yDAAuC;AACvC,kDAAgC;AAChC,gEAA8C;AAC9C,yDAAuC;AACvC,6DAA2C;AAC3C,8DAA4C;AAC5C,iDAA+B;AAC/B,0DAAwC;AACxC,gEAA8C;AAC9C,oFAAkE"}
|