@foss.global/forgefixtures 0.2.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/.smartconfig.json +49 -0
- package/changelog.md +17 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.certificateauthority.d.ts +22 -0
- package/dist_ts/classes.certificateauthority.js +93 -0
- package/dist_ts/classes.containerlifecycle.d.ts +88 -0
- package/dist_ts/classes.containerlifecycle.js +383 -0
- package/dist_ts/classes.giteafixture.d.ts +41 -0
- package/dist_ts/classes.giteafixture.js +182 -0
- package/dist_ts/classes.giteaseed.d.ts +13 -0
- package/dist_ts/classes.giteaseed.js +432 -0
- package/dist_ts/classes.gitlabfixture.d.ts +49 -0
- package/dist_ts/classes.gitlabfixture.js +237 -0
- package/dist_ts/classes.gitlabseed.d.ts +13 -0
- package/dist_ts/classes.gitlabseed.js +466 -0
- package/dist_ts/classes.httpclient.d.ts +53 -0
- package/dist_ts/classes.httpclient.js +116 -0
- package/dist_ts/classes.reaper.d.ts +25 -0
- package/dist_ts/classes.reaper.js +102 -0
- package/dist_ts/classes.tlsterminator.d.ts +21 -0
- package/dist_ts/classes.tlsterminator.js +131 -0
- package/dist_ts/constants.d.ts +22 -0
- package/dist_ts/constants.js +30 -0
- package/dist_ts/giteaseed.default.d.ts +10 -0
- package/dist_ts/giteaseed.default.js +87 -0
- package/dist_ts/gitlabseed.default.d.ts +12 -0
- package/dist_ts/gitlabseed.default.js +84 -0
- package/dist_ts/index.d.ts +17 -0
- package/dist_ts/index.js +17 -0
- package/dist_ts/interfaces.d.ts +92 -0
- package/dist_ts/interfaces.giteaseed.d.ts +182 -0
- package/dist_ts/interfaces.giteaseed.js +2 -0
- package/dist_ts/interfaces.gitlabseed.d.ts +183 -0
- package/dist_ts/interfaces.gitlabseed.js +2 -0
- package/dist_ts/interfaces.js +2 -0
- package/dist_ts/ownership.d.ts +29 -0
- package/dist_ts/ownership.js +140 -0
- package/dist_ts/plugins.d.ts +13 -0
- package/dist_ts/plugins.js +18 -0
- package/dist_ts/responses.d.ts +7 -0
- package/dist_ts/responses.js +30 -0
- package/license.md +21 -0
- package/package.json +65 -0
- package/readme.md +206 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.certificateauthority.ts +117 -0
- package/ts/classes.containerlifecycle.ts +432 -0
- package/ts/classes.giteafixture.ts +205 -0
- package/ts/classes.giteaseed.ts +486 -0
- package/ts/classes.gitlabfixture.ts +258 -0
- package/ts/classes.gitlabseed.ts +502 -0
- package/ts/classes.httpclient.ts +156 -0
- package/ts/classes.reaper.ts +126 -0
- package/ts/classes.tlsterminator.ts +136 -0
- package/ts/constants.ts +35 -0
- package/ts/giteaseed.default.ts +88 -0
- package/ts/gitlabseed.default.ts +86 -0
- package/ts/index.ts +17 -0
- package/ts/interfaces.giteaseed.ts +130 -0
- package/ts/interfaces.gitlabseed.ts +135 -0
- package/ts/interfaces.ts +94 -0
- package/ts/ownership.ts +160 -0
- package/ts/plugins.ts +23 -0
- package/ts/responses.ts +33 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/** Projects created in `bulk-group` so project listings span more than one default page (20). */
|
|
2
|
+
export const defaultGitlabBulkProjectCount = 22;
|
|
3
|
+
/**
|
|
4
|
+
* A compact seed covering the GitLab behaviours inventory readers must handle:
|
|
5
|
+
* nested groups with public, internal and private visibility, a personal
|
|
6
|
+
* project, confidential issues and incidents, separate issue and merge request
|
|
7
|
+
* IID sequences, closed items, labels, milestones, assignees, notes, tags,
|
|
8
|
+
* releases, a deleted author whose content GitLab moves to its ghost user, and
|
|
9
|
+
* more projects than one page of a project listing.
|
|
10
|
+
*/
|
|
11
|
+
export const createDefaultGitlabSeedSpec = () => ({
|
|
12
|
+
users: [
|
|
13
|
+
{ username: 'alice', name: 'Alice Example' },
|
|
14
|
+
{ username: 'bob', name: 'Bob Example' },
|
|
15
|
+
{ username: 'carol' },
|
|
16
|
+
{ username: 'dora' },
|
|
17
|
+
],
|
|
18
|
+
groups: [
|
|
19
|
+
{ path: 'parent-group', visibility: 'public' },
|
|
20
|
+
{ path: 'sub-group', parent: 'parent-group', visibility: 'internal' },
|
|
21
|
+
{ path: 'deep-group', parent: 'parent-group/sub-group', visibility: 'private', members: [{ username: 'alice', accessLevel: 'reporter' }] },
|
|
22
|
+
{ path: 'bulk-group', visibility: 'public' },
|
|
23
|
+
],
|
|
24
|
+
projects: [
|
|
25
|
+
{
|
|
26
|
+
namespace: 'parent-group/sub-group',
|
|
27
|
+
path: 'app',
|
|
28
|
+
visibility: 'internal',
|
|
29
|
+
description: 'Internal project in a subgroup',
|
|
30
|
+
members: [
|
|
31
|
+
{ username: 'alice', accessLevel: 'developer' },
|
|
32
|
+
{ username: 'bob', accessLevel: 'developer' },
|
|
33
|
+
],
|
|
34
|
+
files: [{ path: 'src/index.ts', content: 'export const seeded = true;\n' }],
|
|
35
|
+
branches: [{ name: 'feature-a', files: [{ path: 'src/feature.ts', content: 'export const feature = 1;\n' }] }],
|
|
36
|
+
labels: [
|
|
37
|
+
{ name: 'bug', color: '#d73a4a' },
|
|
38
|
+
{ name: 'enhancement', color: '#a2eeef' },
|
|
39
|
+
],
|
|
40
|
+
milestones: [
|
|
41
|
+
{ title: 'v1', state: 'active' },
|
|
42
|
+
{ title: 'v0', state: 'closed' },
|
|
43
|
+
],
|
|
44
|
+
tags: [{ name: 'v1.0.0', ref: 'main', message: 'First release' }],
|
|
45
|
+
issuesAndMergeRequests: [
|
|
46
|
+
{
|
|
47
|
+
kind: 'issue', key: 'open-labelled', title: 'Open labelled issue', description: 'See !1', author: 'alice',
|
|
48
|
+
state: 'opened', labels: ['bug'], milestone: 'v1', assignees: ['bob'], notes: [{ author: 'bob', body: 'Confirmed.' }],
|
|
49
|
+
},
|
|
50
|
+
{ kind: 'mergeRequest', key: 'feature-mr', title: 'Add feature', author: 'bob', sourceBranch: 'feature-a', targetBranch: 'main', state: 'opened', labels: ['enhancement'] },
|
|
51
|
+
{ kind: 'issue', key: 'confidential', title: 'Confidential issue', author: 'alice', state: 'opened', confidential: true },
|
|
52
|
+
{ kind: 'issue', key: 'incident', title: 'Production incident', author: 'bob', state: 'closed', issueType: 'incident' },
|
|
53
|
+
{
|
|
54
|
+
kind: 'issue', key: 'closed-by-deleted-user', title: 'Closed issue from a deleted user', author: 'dora', state: 'closed',
|
|
55
|
+
milestone: 'v0', notes: [{ author: 'dora', body: 'Note from a user who will be deleted.' }],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
releases: [{ tagName: 'v1.0.0', ref: 'main', name: 'v1.0.0', description: 'Release notes' }],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
namespace: 'parent-group/sub-group/deep-group',
|
|
62
|
+
path: 'secret',
|
|
63
|
+
visibility: 'private',
|
|
64
|
+
issuesAndMergeRequests: [{ kind: 'issue', key: 'private-issue', title: 'Issue in a private project', author: 'alice', state: 'opened' }],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
namespace: 'alice',
|
|
68
|
+
path: 'personal',
|
|
69
|
+
visibility: 'public',
|
|
70
|
+
branches: [{ name: 'topic', files: [{ path: 'notes.md', content: '# Notes\n' }] }],
|
|
71
|
+
issuesAndMergeRequests: [
|
|
72
|
+
{ kind: 'mergeRequest', key: 'closed-mr', title: 'Closed proposal', author: 'alice', sourceBranch: 'topic', targetBranch: 'main', state: 'closed' },
|
|
73
|
+
{ kind: 'issue', key: 'carol-issue', title: 'Issue from another user', author: 'carol', state: 'closed' },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
...Array.from({ length: defaultGitlabBulkProjectCount }, (_valueArg, indexArg) => ({
|
|
77
|
+
namespace: 'bulk-group',
|
|
78
|
+
path: `bulk-${String(indexArg + 1).padStart(2, '0')}`,
|
|
79
|
+
visibility: 'public',
|
|
80
|
+
})),
|
|
81
|
+
],
|
|
82
|
+
deleteUsers: ['dora'],
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFic2VlZC5kZWZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0bGFic2VlZC5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLGlHQUFpRztBQUNqRyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEdBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLEtBQUssRUFBRTtRQUNMLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFO1FBQzVDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1FBQ3hDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtRQUNyQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7S0FDckI7SUFDRCxNQUFNLEVBQUU7UUFDTixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRTtRQUM5QyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFO1FBQ3JFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7UUFDMUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUU7S0FDN0M7SUFDRCxRQUFRLEVBQUU7UUFDUjtZQUNFLFNBQVMsRUFBRSx3QkFBd0I7WUFDbkMsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVLEVBQUUsVUFBVTtZQUN0QixXQUFXLEVBQUUsZ0NBQWdDO1lBQzdDLE9BQU8sRUFBRTtnQkFDUCxF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
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from './00_commitinfo_data.js';
|
|
2
|
+
export * from './interfaces.js';
|
|
3
|
+
export * from './interfaces.giteaseed.js';
|
|
4
|
+
export * from './interfaces.gitlabseed.js';
|
|
5
|
+
export { giteaFixtureImage, gitlabFixtureImage, forgeFixtureLabelPrefix, forgeFixtureLabels } from './constants.js';
|
|
6
|
+
export * from './classes.certificateauthority.js';
|
|
7
|
+
export * from './classes.tlsterminator.js';
|
|
8
|
+
export * from './classes.httpclient.js';
|
|
9
|
+
export { ForgeFixtureReaper, listForgeFixtureResources } from './classes.reaper.js';
|
|
10
|
+
export type { IForgeFixtureReaperOptions, IForgeFixtureInventory } from './classes.reaper.js';
|
|
11
|
+
export { ForgeFixtureStoppedError } from './classes.containerlifecycle.js';
|
|
12
|
+
export * from './classes.giteafixture.js';
|
|
13
|
+
export * from './classes.gitlabfixture.js';
|
|
14
|
+
export * from './classes.giteaseed.js';
|
|
15
|
+
export * from './giteaseed.default.js';
|
|
16
|
+
export * from './classes.gitlabseed.js';
|
|
17
|
+
export * from './gitlabseed.default.js';
|
package/dist_ts/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from './00_commitinfo_data.js';
|
|
2
|
+
export * from './interfaces.js';
|
|
3
|
+
export * from './interfaces.giteaseed.js';
|
|
4
|
+
export * from './interfaces.gitlabseed.js';
|
|
5
|
+
export { giteaFixtureImage, gitlabFixtureImage, forgeFixtureLabelPrefix, forgeFixtureLabels } from './constants.js';
|
|
6
|
+
export * from './classes.certificateauthority.js';
|
|
7
|
+
export * from './classes.tlsterminator.js';
|
|
8
|
+
export * from './classes.httpclient.js';
|
|
9
|
+
export { ForgeFixtureReaper, listForgeFixtureResources } from './classes.reaper.js';
|
|
10
|
+
export { ForgeFixtureStoppedError } from './classes.containerlifecycle.js';
|
|
11
|
+
export * from './classes.giteafixture.js';
|
|
12
|
+
export * from './classes.gitlabfixture.js';
|
|
13
|
+
export * from './classes.giteaseed.js';
|
|
14
|
+
export * from './giteaseed.default.js';
|
|
15
|
+
export * from './classes.gitlabseed.js';
|
|
16
|
+
export * from './gitlabseed.default.js';
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BILGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDIn0=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export type TForgeFixtureKind = 'gitea' | 'gitlab';
|
|
2
|
+
/** A published forge image, pinned by its multi-architecture index digest. */
|
|
3
|
+
export interface IForgeFixtureImage {
|
|
4
|
+
/** Upstream release the image is expected to report through its version API. */
|
|
5
|
+
version: string;
|
|
6
|
+
/** Human-readable tag, retained as evidence only. The digest is what gets pulled. */
|
|
7
|
+
tag: string;
|
|
8
|
+
/** Complete `repository@sha256:<index digest>` reference, pulled and verified exactly. */
|
|
9
|
+
repoDigest: string;
|
|
10
|
+
}
|
|
11
|
+
/** Options shared by every fixture lifecycle. */
|
|
12
|
+
export interface IForgeFixtureLifecycleOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Docker Engine socket. Omit to use `@apiclient.xyz/docker` resolution
|
|
15
|
+
* (`DOCKER_HOST`, then `/var/run/docker.sock`).
|
|
16
|
+
*/
|
|
17
|
+
dockerSocketPath?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Upper bound for this lifecycle. Once exceeded, any later reaper run may
|
|
20
|
+
* remove its resources even if the owning process is still alive.
|
|
21
|
+
*/
|
|
22
|
+
maxLifetimeMs?: number;
|
|
23
|
+
/** Deadline for pulling the pinned image, including its digest verification. */
|
|
24
|
+
pullTimeoutMs?: number;
|
|
25
|
+
/** Deadline from container start until the forge answers as ready. */
|
|
26
|
+
startupTimeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/** Ownership evidence written into the labels of every Docker resource of one lifecycle. */
|
|
29
|
+
export interface IForgeFixtureOwner {
|
|
30
|
+
lifecycleId: string;
|
|
31
|
+
kind: TForgeFixtureKind;
|
|
32
|
+
/** systemd machine id (`/etc/machine-id`); distinguishes hosts that share a host name. */
|
|
33
|
+
machineId: string;
|
|
34
|
+
hostname: string;
|
|
35
|
+
bootId: string;
|
|
36
|
+
/** PID namespace of the owner (`pid:[<inode>]`); PIDs are only comparable inside it. */
|
|
37
|
+
pidNamespace: string;
|
|
38
|
+
pid: number;
|
|
39
|
+
/** Process start time in clock ticks since boot, guarding against PID reuse. */
|
|
40
|
+
processStartTicks: string;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
expiresAt: string;
|
|
43
|
+
}
|
|
44
|
+
export type TForgeFixtureReapReason = 'owner-exited' | 'owner-rebooted' | 'expired';
|
|
45
|
+
export interface IForgeFixtureReapReport {
|
|
46
|
+
removedContainers: string[];
|
|
47
|
+
removedNetworks: string[];
|
|
48
|
+
removedVolumes: string[];
|
|
49
|
+
/** Lifecycles removed, with the reason each was considered stale. */
|
|
50
|
+
reapedLifecycles: Array<{
|
|
51
|
+
lifecycleId: string;
|
|
52
|
+
reason: TForgeFixtureReapReason;
|
|
53
|
+
}>;
|
|
54
|
+
/** Managed resources whose ownership labels could not be interpreted. They are never removed. */
|
|
55
|
+
unrecognizedResources: Array<{
|
|
56
|
+
type: 'container' | 'network' | 'volume';
|
|
57
|
+
id: string;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
/** Material a test needs to talk to a started fixture over verified TLS. */
|
|
61
|
+
export interface IForgeFixtureEndpoint {
|
|
62
|
+
/** HTTPS instance root without trailing slash, for example `https://127.0.0.1:41234`. */
|
|
63
|
+
baseUrl: string;
|
|
64
|
+
/** PEM of the lifecycle-local certificate authority that issued the endpoint certificate. */
|
|
65
|
+
caCertificatePem: string;
|
|
66
|
+
}
|
|
67
|
+
export interface IGiteaFixtureRuntime extends IForgeFixtureEndpoint {
|
|
68
|
+
kind: 'gitea';
|
|
69
|
+
lifecycleId: string;
|
|
70
|
+
/** Version reported by `/api/v1/version`, verified against the image pin. */
|
|
71
|
+
version: string;
|
|
72
|
+
image: IForgeFixtureImage;
|
|
73
|
+
/** Site administrator created at bootstrap. Its password is random and never retained. */
|
|
74
|
+
admin: {
|
|
75
|
+
username: string;
|
|
76
|
+
/** Access token with scope `all`. */
|
|
77
|
+
token: string;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export interface IGitlabFixtureRuntime extends IForgeFixtureEndpoint {
|
|
81
|
+
kind: 'gitlab';
|
|
82
|
+
lifecycleId: string;
|
|
83
|
+
/** Version reported by `/api/v4/version`, verified against the image pin. */
|
|
84
|
+
version: string;
|
|
85
|
+
image: IForgeFixtureImage;
|
|
86
|
+
/** The built-in `root` administrator. Its password is generated by GitLab and never read. */
|
|
87
|
+
admin: {
|
|
88
|
+
username: string;
|
|
89
|
+
/** Personal access token with scopes `api` and `sudo`. */
|
|
90
|
+
token: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export type TGiteaVisibility = 'public' | 'limited' | 'private';
|
|
2
|
+
export interface IGiteaSeedFile {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IGiteaSeedUser {
|
|
7
|
+
username: string;
|
|
8
|
+
fullName?: string;
|
|
9
|
+
visibility?: TGiteaVisibility;
|
|
10
|
+
}
|
|
11
|
+
export interface IGiteaSeedOrganization {
|
|
12
|
+
/** Created by the fixture administrator, who becomes its owner. */
|
|
13
|
+
name: string;
|
|
14
|
+
visibility: TGiteaVisibility;
|
|
15
|
+
}
|
|
16
|
+
export interface IGiteaSeedIssue {
|
|
17
|
+
kind: 'issue';
|
|
18
|
+
/** Spec-local identifier used to find this issue in the manifest. */
|
|
19
|
+
key: string;
|
|
20
|
+
title: string;
|
|
21
|
+
body?: string;
|
|
22
|
+
/** Existing user who opens the issue (through the administrator's sudo). */
|
|
23
|
+
author: string;
|
|
24
|
+
state: 'open' | 'closed';
|
|
25
|
+
/** Applied by the administrator, so they are not dropped for authors without write access. */
|
|
26
|
+
labels?: string[];
|
|
27
|
+
milestone?: string;
|
|
28
|
+
assignees?: string[];
|
|
29
|
+
comments?: Array<{
|
|
30
|
+
author: string;
|
|
31
|
+
body: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export interface IGiteaSeedPullRequest {
|
|
35
|
+
kind: 'pullRequest';
|
|
36
|
+
key: string;
|
|
37
|
+
title: string;
|
|
38
|
+
body?: string;
|
|
39
|
+
author: string;
|
|
40
|
+
/** Branch in the same repository. */
|
|
41
|
+
head: string;
|
|
42
|
+
base: string;
|
|
43
|
+
state: 'open' | 'closed';
|
|
44
|
+
labels?: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface IGiteaSeedRepository {
|
|
47
|
+
/** A seeded user or organization. */
|
|
48
|
+
owner: string;
|
|
49
|
+
name: string;
|
|
50
|
+
private: boolean;
|
|
51
|
+
description?: string;
|
|
52
|
+
collaborators?: Array<{
|
|
53
|
+
username: string;
|
|
54
|
+
permission: 'read' | 'write' | 'admin';
|
|
55
|
+
}>;
|
|
56
|
+
/** Committed to the default branch (`main`) after auto-initialisation. */
|
|
57
|
+
files?: IGiteaSeedFile[];
|
|
58
|
+
/** Each branch is created by one commit of its files on top of `from` (default `main`). */
|
|
59
|
+
branches?: Array<{
|
|
60
|
+
name: string;
|
|
61
|
+
from?: string;
|
|
62
|
+
files: [IGiteaSeedFile, ...IGiteaSeedFile[]];
|
|
63
|
+
}>;
|
|
64
|
+
tags?: Array<{
|
|
65
|
+
name: string;
|
|
66
|
+
target: string;
|
|
67
|
+
message?: string;
|
|
68
|
+
}>;
|
|
69
|
+
labels?: Array<{
|
|
70
|
+
name: string;
|
|
71
|
+
color: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
}>;
|
|
74
|
+
milestones?: Array<{
|
|
75
|
+
title: string;
|
|
76
|
+
description?: string;
|
|
77
|
+
state?: 'open' | 'closed';
|
|
78
|
+
}>;
|
|
79
|
+
/** Created in order; Gitea numbers issues and pull requests from one shared sequence. */
|
|
80
|
+
issuesAndPullRequests?: Array<IGiteaSeedIssue | IGiteaSeedPullRequest>;
|
|
81
|
+
releases?: Array<{
|
|
82
|
+
tagName: string;
|
|
83
|
+
target: string;
|
|
84
|
+
name: string;
|
|
85
|
+
body?: string;
|
|
86
|
+
draft?: boolean;
|
|
87
|
+
prerelease?: boolean;
|
|
88
|
+
}>;
|
|
89
|
+
/** Uploaded through the Git LFS batch API; their pointers are committed to the default branch. */
|
|
90
|
+
lfsObjects?: IGiteaSeedFile[];
|
|
91
|
+
}
|
|
92
|
+
export interface IGiteaSeedSpec {
|
|
93
|
+
users: IGiteaSeedUser[];
|
|
94
|
+
organizations: IGiteaSeedOrganization[];
|
|
95
|
+
repositories: IGiteaSeedRepository[];
|
|
96
|
+
/** Deleted after everything else; content they authored is then attributed to Gitea's ghost user. */
|
|
97
|
+
deleteUsers?: string[];
|
|
98
|
+
}
|
|
99
|
+
/** What Gitea itself reported after seeding, read back once all mutations finished. */
|
|
100
|
+
export interface IGiteaSeedManifest {
|
|
101
|
+
baseUrl: string;
|
|
102
|
+
version: string;
|
|
103
|
+
users: Array<{
|
|
104
|
+
username: string;
|
|
105
|
+
id: number;
|
|
106
|
+
deleted: boolean;
|
|
107
|
+
}>;
|
|
108
|
+
organizations: Array<{
|
|
109
|
+
name: string;
|
|
110
|
+
id: number;
|
|
111
|
+
visibility: TGiteaVisibility;
|
|
112
|
+
}>;
|
|
113
|
+
repositories: IGiteaSeedManifestRepository[];
|
|
114
|
+
}
|
|
115
|
+
export interface IGiteaSeedManifestAuthor {
|
|
116
|
+
id: number;
|
|
117
|
+
login: string;
|
|
118
|
+
}
|
|
119
|
+
export interface IGiteaSeedManifestRepository {
|
|
120
|
+
owner: string;
|
|
121
|
+
name: string;
|
|
122
|
+
fullName: string;
|
|
123
|
+
id: number;
|
|
124
|
+
ownerId: number;
|
|
125
|
+
private: boolean;
|
|
126
|
+
internal: boolean;
|
|
127
|
+
defaultBranch: string;
|
|
128
|
+
htmlUrl: string;
|
|
129
|
+
cloneUrl: string;
|
|
130
|
+
branches: Array<{
|
|
131
|
+
name: string;
|
|
132
|
+
commitSha: string;
|
|
133
|
+
}>;
|
|
134
|
+
tags: Array<{
|
|
135
|
+
name: string;
|
|
136
|
+
commitSha: string;
|
|
137
|
+
}>;
|
|
138
|
+
labels: Array<{
|
|
139
|
+
name: string;
|
|
140
|
+
id: number;
|
|
141
|
+
}>;
|
|
142
|
+
milestones: Array<{
|
|
143
|
+
title: string;
|
|
144
|
+
id: number;
|
|
145
|
+
state: 'open' | 'closed';
|
|
146
|
+
}>;
|
|
147
|
+
issues: Array<{
|
|
148
|
+
key: string;
|
|
149
|
+
id: number;
|
|
150
|
+
number: number;
|
|
151
|
+
state: 'open' | 'closed';
|
|
152
|
+
author: IGiteaSeedManifestAuthor;
|
|
153
|
+
labels: string[];
|
|
154
|
+
milestone: string | null;
|
|
155
|
+
assignees: string[];
|
|
156
|
+
comments: Array<{
|
|
157
|
+
id: number;
|
|
158
|
+
author: IGiteaSeedManifestAuthor;
|
|
159
|
+
}>;
|
|
160
|
+
}>;
|
|
161
|
+
pullRequests: Array<{
|
|
162
|
+
key: string;
|
|
163
|
+
id: number;
|
|
164
|
+
number: number;
|
|
165
|
+
state: 'open' | 'closed';
|
|
166
|
+
author: IGiteaSeedManifestAuthor;
|
|
167
|
+
head: string;
|
|
168
|
+
base: string;
|
|
169
|
+
headSha: string;
|
|
170
|
+
}>;
|
|
171
|
+
releases: Array<{
|
|
172
|
+
tagName: string;
|
|
173
|
+
id: number;
|
|
174
|
+
draft: boolean;
|
|
175
|
+
prerelease: boolean;
|
|
176
|
+
}>;
|
|
177
|
+
lfsObjects: Array<{
|
|
178
|
+
path: string;
|
|
179
|
+
oid: string;
|
|
180
|
+
size: number;
|
|
181
|
+
}>;
|
|
182
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
export type TGitlabVisibility = 'public' | 'internal' | 'private';
|
|
2
|
+
export interface IGitlabSeedFile {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IGitlabSeedUser {
|
|
7
|
+
username: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface IGitlabSeedGroup {
|
|
11
|
+
/** Group path segment. The full path is `<parent>/<path>`. */
|
|
12
|
+
path: string;
|
|
13
|
+
/** Full path of an earlier group in the spec, making this a subgroup. */
|
|
14
|
+
parent?: string;
|
|
15
|
+
visibility: TGitlabVisibility;
|
|
16
|
+
members?: Array<{
|
|
17
|
+
username: string;
|
|
18
|
+
accessLevel: TGitlabAccessLevel;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/** GitLab access levels by name: guest 10, reporter 20, developer 30, maintainer 40, owner 50. */
|
|
22
|
+
export type TGitlabAccessLevel = 'guest' | 'reporter' | 'developer' | 'maintainer' | 'owner';
|
|
23
|
+
export interface IGitlabSeedIssue {
|
|
24
|
+
kind: 'issue';
|
|
25
|
+
/** Spec-local identifier used to find this issue in the manifest. */
|
|
26
|
+
key: string;
|
|
27
|
+
title: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
/** Existing user who opens the issue (through the administrator's sudo). */
|
|
30
|
+
author: string;
|
|
31
|
+
issueType?: 'issue' | 'incident';
|
|
32
|
+
confidential?: boolean;
|
|
33
|
+
state: 'opened' | 'closed';
|
|
34
|
+
/** Applied by the administrator, so they are not dropped for authors without planning rights. */
|
|
35
|
+
labels?: string[];
|
|
36
|
+
milestone?: string;
|
|
37
|
+
assignees?: string[];
|
|
38
|
+
notes?: Array<{
|
|
39
|
+
author: string;
|
|
40
|
+
body: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface IGitlabSeedMergeRequest {
|
|
44
|
+
kind: 'mergeRequest';
|
|
45
|
+
key: string;
|
|
46
|
+
title: string;
|
|
47
|
+
description?: string;
|
|
48
|
+
author: string;
|
|
49
|
+
/** Branch in the same project. */
|
|
50
|
+
sourceBranch: string;
|
|
51
|
+
targetBranch: string;
|
|
52
|
+
state: 'opened' | 'closed';
|
|
53
|
+
labels?: string[];
|
|
54
|
+
}
|
|
55
|
+
export interface IGitlabSeedProject {
|
|
56
|
+
/** Full path of a seeded group, or a seeded username for a personal project. */
|
|
57
|
+
namespace: string;
|
|
58
|
+
path: string;
|
|
59
|
+
visibility: TGitlabVisibility;
|
|
60
|
+
description?: string;
|
|
61
|
+
members?: Array<{
|
|
62
|
+
username: string;
|
|
63
|
+
accessLevel: TGitlabAccessLevel;
|
|
64
|
+
}>;
|
|
65
|
+
/** Committed to `main` after initialisation with a README. */
|
|
66
|
+
files?: IGitlabSeedFile[];
|
|
67
|
+
/** Each branch is created by one commit of its files on top of `from` (default `main`). */
|
|
68
|
+
branches?: Array<{
|
|
69
|
+
name: string;
|
|
70
|
+
from?: string;
|
|
71
|
+
files: [IGitlabSeedFile, ...IGitlabSeedFile[]];
|
|
72
|
+
}>;
|
|
73
|
+
tags?: Array<{
|
|
74
|
+
name: string;
|
|
75
|
+
ref: string;
|
|
76
|
+
message?: string;
|
|
77
|
+
}>;
|
|
78
|
+
labels?: Array<{
|
|
79
|
+
name: string;
|
|
80
|
+
color: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
}>;
|
|
83
|
+
/** Closed milestones are closed after the items: GitLab ignores a closed milestone assigned through the API. */
|
|
84
|
+
milestones?: Array<{
|
|
85
|
+
title: string;
|
|
86
|
+
description?: string;
|
|
87
|
+
state?: 'active' | 'closed';
|
|
88
|
+
}>;
|
|
89
|
+
/** Issues and merge requests have separate IID sequences; within each kind they are created in order. */
|
|
90
|
+
issuesAndMergeRequests?: Array<IGitlabSeedIssue | IGitlabSeedMergeRequest>;
|
|
91
|
+
releases?: Array<{
|
|
92
|
+
tagName: string;
|
|
93
|
+
ref: string;
|
|
94
|
+
name: string;
|
|
95
|
+
description?: string;
|
|
96
|
+
}>;
|
|
97
|
+
}
|
|
98
|
+
export interface IGitlabSeedSpec {
|
|
99
|
+
users: IGitlabSeedUser[];
|
|
100
|
+
groups: IGitlabSeedGroup[];
|
|
101
|
+
projects: IGitlabSeedProject[];
|
|
102
|
+
/** Deleted after everything else (without hard delete); GitLab moves their contributions to its ghost user. */
|
|
103
|
+
deleteUsers?: string[];
|
|
104
|
+
}
|
|
105
|
+
export interface IGitlabSeedManifestAuthor {
|
|
106
|
+
id: number;
|
|
107
|
+
username: string;
|
|
108
|
+
}
|
|
109
|
+
/** What GitLab itself reported after seeding, read back once all mutations finished. */
|
|
110
|
+
export interface IGitlabSeedManifest {
|
|
111
|
+
baseUrl: string;
|
|
112
|
+
version: string;
|
|
113
|
+
users: Array<{
|
|
114
|
+
username: string;
|
|
115
|
+
id: number;
|
|
116
|
+
deleted: boolean;
|
|
117
|
+
}>;
|
|
118
|
+
groups: Array<{
|
|
119
|
+
fullPath: string;
|
|
120
|
+
id: number;
|
|
121
|
+
parentId: number | null;
|
|
122
|
+
visibility: TGitlabVisibility;
|
|
123
|
+
}>;
|
|
124
|
+
projects: IGitlabSeedManifestProject[];
|
|
125
|
+
}
|
|
126
|
+
export interface IGitlabSeedManifestProject {
|
|
127
|
+
pathWithNamespace: string;
|
|
128
|
+
id: number;
|
|
129
|
+
namespaceId: number;
|
|
130
|
+
namespaceKind: 'group' | 'user';
|
|
131
|
+
visibility: TGitlabVisibility;
|
|
132
|
+
defaultBranch: string;
|
|
133
|
+
webUrl: string;
|
|
134
|
+
httpUrlToRepo: string;
|
|
135
|
+
branches: Array<{
|
|
136
|
+
name: string;
|
|
137
|
+
commitSha: string;
|
|
138
|
+
}>;
|
|
139
|
+
tags: Array<{
|
|
140
|
+
name: string;
|
|
141
|
+
commitSha: string;
|
|
142
|
+
}>;
|
|
143
|
+
labels: Array<{
|
|
144
|
+
name: string;
|
|
145
|
+
id: number;
|
|
146
|
+
}>;
|
|
147
|
+
milestones: Array<{
|
|
148
|
+
title: string;
|
|
149
|
+
id: number;
|
|
150
|
+
iid: number;
|
|
151
|
+
state: 'active' | 'closed';
|
|
152
|
+
}>;
|
|
153
|
+
issues: Array<{
|
|
154
|
+
key: string;
|
|
155
|
+
id: number;
|
|
156
|
+
iid: number;
|
|
157
|
+
state: 'opened' | 'closed';
|
|
158
|
+
issueType: string;
|
|
159
|
+
confidential: boolean;
|
|
160
|
+
author: IGitlabSeedManifestAuthor;
|
|
161
|
+
labels: string[];
|
|
162
|
+
milestone: string | null;
|
|
163
|
+
assignees: string[];
|
|
164
|
+
notes: Array<{
|
|
165
|
+
id: number;
|
|
166
|
+
author: IGitlabSeedManifestAuthor;
|
|
167
|
+
}>;
|
|
168
|
+
}>;
|
|
169
|
+
mergeRequests: Array<{
|
|
170
|
+
key: string;
|
|
171
|
+
id: number;
|
|
172
|
+
iid: number;
|
|
173
|
+
state: 'opened' | 'closed';
|
|
174
|
+
author: IGitlabSeedManifestAuthor;
|
|
175
|
+
sourceBranch: string;
|
|
176
|
+
targetBranch: string;
|
|
177
|
+
sha: string;
|
|
178
|
+
}>;
|
|
179
|
+
releases: Array<{
|
|
180
|
+
tagName: string;
|
|
181
|
+
name: string;
|
|
182
|
+
}>;
|
|
183
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IForgeFixtureOwner, TForgeFixtureKind, TForgeFixtureReapReason } from './interfaces.js';
|
|
2
|
+
export interface IForgeFixtureProcessIdentity {
|
|
3
|
+
machineId: string;
|
|
4
|
+
hostname: string;
|
|
5
|
+
bootId: string;
|
|
6
|
+
pidNamespace: string;
|
|
7
|
+
pid: number;
|
|
8
|
+
processStartTicks: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Reads field 22 (`starttime`) of `/proc/<pid>/stat`. Returns `undefined` when
|
|
12
|
+
* the process does not exist. The command name may contain spaces and
|
|
13
|
+
* parentheses, so fields are counted after its closing parenthesis.
|
|
14
|
+
*/
|
|
15
|
+
export declare const readProcessStartTicks: (pidArg: number) => Promise<string | undefined>;
|
|
16
|
+
export declare const readCurrentProcessIdentity: () => Promise<IForgeFixtureProcessIdentity>;
|
|
17
|
+
export declare const createForgeFixtureOwner: (kindArg: TForgeFixtureKind, maxLifetimeMsArg: number) => Promise<IForgeFixtureOwner>;
|
|
18
|
+
/** Labels carried by every Docker resource of one lifecycle. */
|
|
19
|
+
export declare const forgeFixtureOwnerLabels: (ownerArg: IForgeFixtureOwner) => Record<string, string>;
|
|
20
|
+
/** Parses ownership labels; returns `undefined` for anything this package did not write. */
|
|
21
|
+
export declare const parseForgeFixtureOwnerLabels: (labelsArg: Record<string, string> | undefined) => IForgeFixtureOwner | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Decides whether a lifecycle is stale. A PID identifies a process only inside
|
|
24
|
+
* its PID namespace: host-network containers sharing the Docker socket share
|
|
25
|
+
* hostname and boot id but not PIDs, and machines sharing a remote daemon can
|
|
26
|
+
* share a host name. Owners on another machine (machine id or host name) or in
|
|
27
|
+
* another PID namespace are therefore judged by expiry only.
|
|
28
|
+
*/
|
|
29
|
+
export declare const classifyForgeFixtureOwner: (ownerArg: IForgeFixtureOwner, currentArg: IForgeFixtureProcessIdentity, nowArg: Date) => Promise<TForgeFixtureReapReason | "alive">;
|