Add Terraform State API

This commit is contained in:
Zack Knight 2025-04-25 14:47:39 -04:00 committed by Justin Dalrymple
parent 30dbcfbc21
commit 4cc0fb9bca
4 changed files with 179 additions and 0 deletions

View File

@ -0,0 +1,89 @@
import { BaseResource } from '@gitbeaker/requester-utils';
import { GitlabAPIResponse, ShowExpanded, Sudo } from '@gitbeaker/core';
import { endpoint, RequestHelper } from '../infrastructure';
export interface TerraformStateSchema extends Record<string, unknown> {
version: number;
terraform_version: string;
serial: number;
lineage: string;
outputs?: Record<string, unknown>;
resources?: Record<string, unknown>[];
check_results: Record<string, unknown>[];
}
export class ProjectTerraformState<C extends boolean = false> extends BaseResource<C> {
show<E extends boolean = false>(
projectId: string | number,
name: string,
options?: Sudo & ShowExpanded<E>,
): Promise<GitlabAPIResponse<TerraformStateSchema, C, E, void>> {
return RequestHelper.get<TerraformStateSchema>()(
this,
endpoint`projects/${projectId}/terraform/state/${name}`,
options,
);
}
showVersion<E extends boolean = false>(
projectId: string | number,
name: string,
serial: number,
options?: Sudo & ShowExpanded<E>,
): Promise<GitlabAPIResponse<TerraformStateSchema, C, E, void>> {
return RequestHelper.get<TerraformStateSchema>()(
this,
endpoint`projects/${projectId}/terraform/state/${name}/versions/${serial}`,
options,
);
}
removeVersion<E extends boolean = false>(
projectId: string | number,
name: string,
serial: number,
options?: Sudo & ShowExpanded<E>,
): Promise<GitlabAPIResponse<void, C, E, void>> {
return RequestHelper.del()(
this,
endpoint`projects/${projectId}/terraform/state/${name}/versions/${serial}`,
options,
);
}
remove<E extends boolean = false>(
projectId: string | number,
name: string,
options?: Sudo & ShowExpanded<E>,
): Promise<GitlabAPIResponse<void, C, E, void>> {
return RequestHelper.del()(
this,
endpoint`projects/${projectId}/terraform/state/${name}`,
options,
);
}
removeTerraformStateLock<E extends boolean = false>(
projectId: string | number,
name: string,
options?: Sudo & ShowExpanded<E>,
): Promise<GitlabAPIResponse<void, C, E, void>> {
return RequestHelper.del()(
this,
endpoint`projects/${projectId}/terraform/state/${name}/lock`,
options,
);
}
createVersion<E extends boolean = false>(
projectId: string | number,
name: string,
options?: Sudo & ShowExpanded<E>,
): Promise<GitlabAPIResponse<TerraformStateSchema, C, E, void>> {
return RequestHelper.post<TerraformStateSchema>()(
this,
endpoint`projects/${projectId}/terraform/state/${name}`,
options,
);
}
}

View File

@ -131,6 +131,7 @@ export * from './ProjectSnippetNotes';
export * from './ProjectSnippets';
export * from './ProjectStatistics';
export * from './ProjectTemplates';
export * from './ProjectTerraformState'
export * from './ProjectVariables';
export * from './ProjectVulnerabilities';
export * from './ProjectWikis';

View File

@ -0,0 +1,88 @@
import { ProjectTerraformState } from '../../../src';
import { RequestHelper } from '../../../src/infrastructure';
jest.mock(
'../../../src/infrastructure/RequestHelper',
() => require('../../__mocks__/RequestHelper').default,
);
let service: ProjectTerraformState;
beforeEach(() => {
service = new ProjectTerraformState({
requesterFn: jest.fn(),
token: 'abcdefg',
});
});
describe('ProjectTerraformState.show', () => {
it('should request GET /projects/:id/terraform/state/:name', async () => {
await service.show(1, 'state-name');
expect(RequestHelper.get()).toHaveBeenCalledWith(
service,
'projects/1/terraform/state/state-name',
undefined,
);
});
});
describe('ProjectTerraformState.showVersion', () => {
it('should request GET /projects/:id/terraform/state/:name/versions/:serial', async () => {
await service.showVersion(1, 'state-name', 42);
expect(RequestHelper.get()).toHaveBeenCalledWith(
service,
'projects/1/terraform/state/state-name/versions/42',
undefined,
);
});
});
describe('ProjectTerraformState.removeVersion', () => {
it('should request DELETE /projects/:id/terraform/state/:name/versions/:serial', async () => {
await service.removeVersion(1, 'state-name', 42);
expect(RequestHelper.del()).toHaveBeenCalledWith(
service,
'projects/1/terraform/state/state-name/versions/42',
undefined,
);
});
});
describe('ProjectTerraformState.remove', () => {
it('should request DELETE /projects/:id/terraform/state/:name', async () => {
await service.remove(1, 'state-name');
expect(RequestHelper.del()).toHaveBeenCalledWith(
service,
'projects/1/terraform/state/state-name',
undefined,
);
});
});
describe('ProjectTerraformState.removeTerraformStateLock', () => {
it('should request DELETE /projects/:id/terraform/state/:name/lock', async () => {
await service.removeTerraformStateLock(1, 'state-name');
expect(RequestHelper.del()).toHaveBeenCalledWith(
service,
'projects/1/terraform/state/state-name/lock',
undefined,
);
});
});
describe('ProjectTerraformState.createVersion', () => {
it('should request POST /projects/:id/terraform/state/:name', async () => {
await service.createVersion(1, 'state-name');
expect(RequestHelper.post()).toHaveBeenCalledWith(
service,
'projects/1/terraform/state/state-name',
undefined,
);
});
});

View File

@ -149,6 +149,7 @@ export const {
ProjectSnippets,
ProjectStatistics,
ProjectTemplates,
ProjectTerraformState,
ProjectVariables,
ProjectVulnerabilities,
ProjectWikis,