diff --git a/packages/core/src/resources/ProjectTerraformState.ts b/packages/core/src/resources/ProjectTerraformState.ts new file mode 100644 index 00000000..9be4d655 --- /dev/null +++ b/packages/core/src/resources/ProjectTerraformState.ts @@ -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 { + version: number; + terraform_version: string; + serial: number; + lineage: string; + outputs?: Record; + resources?: Record[]; + check_results: Record[]; +} + +export class ProjectTerraformState extends BaseResource { + show( + projectId: string | number, + name: string, + options?: Sudo & ShowExpanded, + ): Promise> { + return RequestHelper.get()( + this, + endpoint`projects/${projectId}/terraform/state/${name}`, + options, + ); + } + + showVersion( + projectId: string | number, + name: string, + serial: number, + options?: Sudo & ShowExpanded, + ): Promise> { + return RequestHelper.get()( + this, + endpoint`projects/${projectId}/terraform/state/${name}/versions/${serial}`, + options, + ); + } + + removeVersion( + projectId: string | number, + name: string, + serial: number, + options?: Sudo & ShowExpanded, + ): Promise> { + return RequestHelper.del()( + this, + endpoint`projects/${projectId}/terraform/state/${name}/versions/${serial}`, + options, + ); + } + + remove( + projectId: string | number, + name: string, + options?: Sudo & ShowExpanded, + ): Promise> { + return RequestHelper.del()( + this, + endpoint`projects/${projectId}/terraform/state/${name}`, + options, + ); + } + + removeTerraformStateLock( + projectId: string | number, + name: string, + options?: Sudo & ShowExpanded, + ): Promise> { + return RequestHelper.del()( + this, + endpoint`projects/${projectId}/terraform/state/${name}/lock`, + options, + ); + } + + createVersion( + projectId: string | number, + name: string, + options?: Sudo & ShowExpanded, + ): Promise> { + return RequestHelper.post()( + this, + endpoint`projects/${projectId}/terraform/state/${name}`, + options, + ); + } +} diff --git a/packages/core/src/resources/index.ts b/packages/core/src/resources/index.ts index f4e07ec3..9fbadce3 100644 --- a/packages/core/src/resources/index.ts +++ b/packages/core/src/resources/index.ts @@ -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'; diff --git a/packages/core/test/unit/resources/ProjectTerraform.ts b/packages/core/test/unit/resources/ProjectTerraform.ts new file mode 100644 index 00000000..ff7b775e --- /dev/null +++ b/packages/core/test/unit/resources/ProjectTerraform.ts @@ -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, + ); + }); +}); diff --git a/packages/rest/src/index.ts b/packages/rest/src/index.ts index 62aa6576..5b312e6f 100644 --- a/packages/rest/src/index.ts +++ b/packages/rest/src/index.ts @@ -149,6 +149,7 @@ export const { ProjectSnippets, ProjectStatistics, ProjectTemplates, + ProjectTerraformState, ProjectVariables, ProjectVulnerabilities, ProjectWikis,