feat/catalog-backend-module-gitlab: create url location only if file exists (fixes #1)

Signed-off-by: Ruslan.Nasyrov <goququ@ya.ru>
This commit is contained in:
Ruslan.Nasyrov
2022-05-13 14:55:05 +05:00
parent 3ac4522537
commit ba95c81bff
4 changed files with 30 additions and 19 deletions
@@ -29,6 +29,7 @@ const SERVER_URL = `https://${DOMAIN}`;
const API_URL = `${SERVER_URL}/api/v4`;
const PROJECTS_URL = `${API_URL}/projects`;
const GROUP_PROJECTS_URL = `${API_URL}/groups/group%2Fsubgroup/projects`;
const EXISTING_PROJECT_PATH = 'exist';
const PROJECT_LOCATION: LocationSpec = {
type: 'gitlab-discovery',
@@ -50,7 +51,7 @@ const GROUP_LOCATION_CUSTOM_BRANCH: LocationSpec = {
function setupFakeServer(
url: string,
list_projects_callback: (request: {
listProjectsCallback: (request: {
page: number;
include_subgroups: boolean;
}) => {
@@ -65,7 +66,7 @@ function setupFakeServer(
}
const page = req.url.searchParams.get('page');
const include_subgroups = req.url.searchParams.get('include_subgroups');
const response = list_projects_callback({
const response = listProjectsCallback({
page: parseInt(page!, 10),
include_subgroups: include_subgroups === 'true',
});
@@ -96,6 +97,11 @@ function setupFakeServer(
if (ref === 'main' || ref === 'master') {
return res(ctx.status(200));
}
if (EXISTING_PROJECT_PATH === req.params.project_path) {
return res(ctx.status(200));
}
return res(ctx.status(404));
},
),
@@ -345,7 +351,9 @@ describe('GitlabDiscoveryProcessor', () => {
});
it('can filter based on file existing', async () => {
const processor = getProcessor({ options: { checkFileExistence: true } });
const processor = getProcessor({
options: { skipReposWithoutExactFileMatch: true },
});
setupFakeServer(GROUP_PROJECTS_URL, request => {
if (!request.include_subgroups) {
throw new Error('include_subgroups should be set');
@@ -367,8 +375,8 @@ describe('GitlabDiscoveryProcessor', () => {
archived: false,
default_branch: 'main',
last_activity_at: '2021-08-05T11:03:05.774Z',
web_url: 'https://gitlab.fake/g/2',
path_with_namespace: 'g/2',
web_url: `https://gitlab.fake/${EXISTING_PROJECT_PATH}`,
path_with_namespace: EXISTING_PROJECT_PATH,
},
],
};
@@ -382,7 +390,7 @@ describe('GitlabDiscoveryProcessor', () => {
result.push(e);
});
// If everything was set up correctly, we should have received the fake repo specified above
expect(result).toHaveLength(0);
expect(result).toHaveLength(1);
});
it('uses the previous scan timestamp to filter', async () => {
@@ -41,11 +41,11 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor {
private readonly integrations: ScmIntegrationRegistry;
private readonly logger: Logger;
private readonly cache: CacheClient;
private readonly checkFileExistence: boolean;
private readonly skipReposWithoutExactFileMatch: boolean;
static fromConfig(
config: Config,
options: { logger: Logger; checkFileExistence?: boolean },
options: { logger: Logger; skipReposWithoutExactFileMatch?: boolean },
): GitLabDiscoveryProcessor {
const integrations = ScmIntegrations.fromConfig(config);
const pluginCache =
@@ -62,12 +62,13 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor {
integrations: ScmIntegrationRegistry;
pluginCache: PluginCacheManager;
logger: Logger;
checkFileExistence?: boolean;
skipReposWithoutExactFileMatch?: boolean;
}) {
this.integrations = options.integrations;
this.cache = options.pluginCache.getClient();
this.logger = options.logger;
this.checkFileExistence = options.checkFileExistence || false;
this.skipReposWithoutExactFileMatch =
options.skipReposWithoutExactFileMatch || false;
}
getProcessorName(): string {
@@ -120,7 +121,7 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor {
continue;
}
if (this.checkFileExistence) {
if (this.skipReposWithoutExactFileMatch) {
const project_branch = branch === '*' ? project.default_branch : branch;
const projectHasFile: boolean = await client.hasFile(
@@ -74,19 +74,12 @@ export class GitLabClient {
const request = new URL(`${this.config.apiBaseUrl}${endpoint}`);
request.searchParams.append('ref', branch);
this.logger.debug(`Fetching: ${request.toString()}`);
const response = await fetch(request.toString(), {
headers: getGitLabRequestOptions(this.config).headers,
method: 'HEAD',
});
if (!response.ok) {
this.logger.debug(
`Unexpected response when fetching ${request.toString()}. Expected 200 but got ${
response.status
} - ${response.statusText}`,
);
return false;
}