Skip to content

Commit

Permalink
feat: added the new annotation instance
Browse files Browse the repository at this point in the history
  • Loading branch information
antoniomuso committed Jan 20, 2023
1 parent ebaad6e commit 22f80e6
Show file tree
Hide file tree
Showing 10 changed files with 102 additions and 50 deletions.
3 changes: 3 additions & 0 deletions packages/gitlab-backend/src/annotations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const GITLAB_PROJECT_SLUG = 'gitlab.com/project-slug';
export const GITLAB_PROJECT_ID = 'gitlab.com/project-id';
export const GITLAB_INSTANCE = 'gitlab.com/instance';
33 changes: 21 additions & 12 deletions packages/gitlab-backend/src/processor/processor.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { GitlabFillerProcessor } from './processor';
import { ConfigReader } from '@backstage/config';
import { Entity } from '@backstage/catalog-model';
import {
GITLAB_PROJECT_SLUG,
GITLAB_PROJECT_ID,
GITLAB_INSTANCE,
} from '../annotations';

// To write tests
describe('Processor', () => {
Expand Down Expand Up @@ -42,9 +47,10 @@ describe('Processor', () => {
() => undefined
);

expect(
entity.metadata?.annotations?.['gitlab.com/project-slug']
).toEqual('0@backstage/backstage');
expect(entity.metadata?.annotations?.[GITLAB_PROJECT_SLUG]).toEqual(
'backstage/backstage'
);
expect(entity.metadata?.annotations?.[GITLAB_INSTANCE]).toEqual('0');
});

it('Processor creates the right annotation for second instance', async () => {
Expand All @@ -65,9 +71,10 @@ describe('Processor', () => {
() => undefined
);

expect(
entity.metadata?.annotations?.['gitlab.com/project-slug']
).toEqual('1@backstage/backstage');
expect(entity.metadata?.annotations?.[GITLAB_PROJECT_SLUG]).toEqual(
'backstage/backstage'
);
expect(entity.metadata?.annotations?.[GITLAB_INSTANCE]).toEqual('1');
});

it('Processor creates the right annotation for old gitlab instance', async () => {
Expand All @@ -88,9 +95,10 @@ describe('Processor', () => {
() => undefined
);

expect(
entity.metadata?.annotations?.['gitlab.com/project-slug']
).toEqual('0@backstage/backstage');
expect(entity.metadata?.annotations?.[GITLAB_PROJECT_SLUG]).toEqual(
'backstage/backstage'
);
expect(entity.metadata?.annotations?.[GITLAB_INSTANCE]).toEqual('0');
});

it('The processor does not update annotation if the annotations exist', async () => {
Expand All @@ -102,7 +110,7 @@ describe('Processor', () => {
metadata: {
name: 'backstage',
annotations: {
'gitlab.com/project-id': projectId,
[GITLAB_PROJECT_ID]: projectId,
},
},
};
Expand All @@ -116,10 +124,11 @@ describe('Processor', () => {
);

expect(
entity.metadata?.annotations?.['gitlab.com/project-slug']
entity.metadata?.annotations?.[GITLAB_PROJECT_SLUG]
).toBeUndefined();
expect(entity.metadata?.annotations?.[GITLAB_INSTANCE]).toBeUndefined();

expect(entity.metadata?.annotations?.['gitlab.com/project-id']).toEqual(
expect(entity.metadata?.annotations?.[GITLAB_PROJECT_ID]).toEqual(
projectId
);
});
Expand Down
24 changes: 16 additions & 8 deletions packages/gitlab-backend/src/processor/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ import type {
CatalogProcessor,
CatalogProcessorEmit,
} from '@backstage/plugin-catalog-backend';
import {
GITLAB_INSTANCE,
GITLAB_PROJECT_ID,
GITLAB_PROJECT_SLUG,
} from './../annotations';
import type { LocationSpec } from '@backstage/plugin-catalog-common';
import type { GitLabIntegrationConfig } from '@backstage/integration';

Expand Down Expand Up @@ -39,31 +44,34 @@ export class GitlabFillerProcessor implements CatalogProcessor {
if (
location.type === 'url' &&
// TODO: make annotation constants
!entity.metadata.annotations?.['gitlab.com/project-id'] &&
!entity.metadata.annotations?.['gitlab.com/project-slug'] &&
!entity.metadata.annotations?.[GITLAB_PROJECT_ID] &&
!entity.metadata.annotations?.[GITLAB_PROJECT_SLUG] &&
!entity.metadata.annotations?.[GITLAB_INSTANCE] &&
this.allowedKinds.has(entity.kind.toLowerCase()) &&
this.isValidGitlabHost(location.target)
) {
if (!entity.metadata.annotations) entity.metadata.annotations = {};
entity.metadata.annotations['gitlab.com/project-slug'] =
this.generateAnnotation(location.target);
entity.metadata.annotations[GITLAB_PROJECT_SLUG] = getProjectPath(
location.target
);
entity.metadata.annotations[GITLAB_INSTANCE] =
this.getGitlabInstance(location.target);
}

return entity;
}

private generateAnnotation(target: string): string {
private getGitlabInstance(target: string): string {
const url = new URL(target);

// TODO: handle the possibility to have a baseUrl with a path
const index = this.gitLabIntegrationsConfig.findIndex(
({ baseUrl }) => baseUrl === url.origin
);

const projectPath = getProjectPath(target);
if (index < 0) return projectPath;
if (index < 0) return '0';

return `${index}@${projectPath}`;
return index.toString(10);
}

private isValidGitlabHost(target: string) {
Expand Down
25 changes: 15 additions & 10 deletions packages/gitlab/src/components/gitlabAppData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {

export const GITLAB_ANNOTATION_PROJECT_ID = 'gitlab.com/project-id';
export const GITLAB_ANNOTATION_PROJECT_SLUG = 'gitlab.com/project-slug';
export const GITLAB_ANNOTATION_INSTANCE = 'gitlab.com/instance';
export const GITLAB_ANNOTATION_CODEOWNERS_PATH = 'gitlab.com/codeowners-path';
const defaultGitlabIntegration = {
hostname: 'gitlab.com',
Expand Down Expand Up @@ -56,27 +57,31 @@ export const useEntityGitlabScmIntegration = () => {
return defaultGitlabIntegration;
};

export const gitlabAppData = () => {
export const gitlabProjectId = () => {
const { entity } = useEntity();

const project_id =
entity.metadata.annotations?.[GITLAB_ANNOTATION_PROJECT_ID] ?? '';

return { project_id };
return project_id;
};

export const gitlabAppSlug = () => {
export const gitlabProjectSlug = () => {
const { entity } = useEntity();

const data =
const project_slug =
entity.metadata.annotations?.[GITLAB_ANNOTATION_PROJECT_SLUG] ?? '';

const [projectSlug, gitlabInstance] = data.split('@').reverse();
return project_slug;
};

export const gitlabInstance = () => {
const { entity } = useEntity();

const instance =
entity.metadata.annotations?.[GITLAB_ANNOTATION_INSTANCE] ?? '';

return {
project_slug: projectSlug || '',
gitlab_instance: gitlabInstance || '',
};
return instance;
};

export const gitlabCodeOwnerPath = () => {
Expand All @@ -85,5 +90,5 @@ export const gitlabCodeOwnerPath = () => {
const codeowners_path =
entity.metadata.annotations?.[GITLAB_ANNOTATION_CODEOWNERS_PATH] ?? '';

return { codeowners_path };
return codeowners_path;
};
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import Alert from '@material-ui/lab/Alert';
import React from 'react';
import { useAsync } from 'react-use';
import { GitlabCIApiRef } from '../../../api';
import { gitlabAppData, gitlabAppSlug } from '../../gitlabAppData';
import {
gitlabInstance,
gitlabProjectId,
gitlabProjectSlug,
} from '../../gitlabAppData';
import { IssueObject } from '../../types';
import { getElapsedTime } from '../../utils';
import { AuthorColumn, IssueStateIndicator, IssueTitle } from './columns';
Expand Down Expand Up @@ -55,8 +59,9 @@ export const DenseTable = ({
};

export const IssuesTable = ({}) => {
const { project_id } = gitlabAppData();
const { project_slug, gitlab_instance } = gitlabAppSlug();
const project_id = gitlabProjectId();
const project_slug = gitlabProjectSlug();
const gitlab_instance = gitlabInstance();

const GitlabCIAPI = useApi(GitlabCIApiRef).build(gitlab_instance || '0');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import { InfoCard, Progress } from '@backstage/core-components';
import { GitlabCIApiRef } from '../../../api';
import { useApi } from '@backstage/core-plugin-api';
import { useAsync } from 'react-use';
import { gitlabAppData, gitlabAppSlug } from '../../gitlabAppData';
import {
gitlabInstance,
gitlabProjectId,
gitlabProjectSlug,
} from '../../gitlabAppData';
import { Chip, Tooltip } from '@material-ui/core';
import { colors } from './colors';

Expand Down Expand Up @@ -47,8 +51,9 @@ export const LanguagesCard = ({}) => {
const classes = useStyles();
let barWidth = 0;
let languageTitle = new String();
const { project_id } = gitlabAppData();
const { project_slug, gitlab_instance } = gitlabAppSlug();
const project_id = gitlabProjectId();
const project_slug = gitlabProjectSlug();
const gitlab_instance = gitlabInstance();

const GitlabCIAPI = useApi(GitlabCIApiRef).build(gitlab_instance || '0');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import {
} from '@material-ui/core';
import Alert from '@material-ui/lab/Alert';
import { useAsync } from 'react-use';
import { gitlabAppData, gitlabAppSlug } from '../../gitlabAppData';
import {
gitlabInstance,
gitlabProjectId,
gitlabProjectSlug,
} from '../../gitlabAppData';
import { GitlabCIApiRef } from '../../../api';
import { useApi } from '@backstage/core-plugin-api';
import {
Expand Down Expand Up @@ -56,8 +60,9 @@ type Props = {
const MergeRequestStats = (props: Props) => {
const [count, setCount] = useState<number>(20);
const classes = useStyles();
const { project_id } = gitlabAppData();
const { project_slug, gitlab_instance } = gitlabAppSlug();
const project_id = gitlabProjectId();
const project_slug = gitlabProjectSlug();
const gitlab_instance = gitlabInstance();

const GitlabCIAPI = useApi(GitlabCIApiRef).build(gitlab_instance || '0');
const mergeStat: MergeRequestStatsCount = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import React from 'react';
import { Table, TableColumn, Progress } from '@backstage/core-components';
import Alert from '@material-ui/lab/Alert';
import { useAsync } from 'react-use';
import { gitlabAppData, gitlabAppSlug } from '../../gitlabAppData';
import {
gitlabInstance,
gitlabProjectId,
gitlabProjectSlug,
} from '../../gitlabAppData';
import { GitlabCIApiRef } from '../../../api';
import { useApi } from '@backstage/core-plugin-api';
import { MergeRequest } from '../../types';
Expand Down Expand Up @@ -45,8 +49,9 @@ export const DenseTable = ({ mergeRequests }: any) => {
};

export const MergeRequestsTable = ({}) => {
const { project_id } = gitlabAppData();
const { project_slug, gitlab_instance } = gitlabAppSlug();
const project_id = gitlabProjectId();
const project_slug = gitlabProjectSlug();
const gitlab_instance = gitlabInstance();

const GitlabCIAPI = useApi(GitlabCIApiRef).build(gitlab_instance || '0');

Expand Down
12 changes: 7 additions & 5 deletions packages/gitlab/src/components/widgets/PeopleCard/PeopleCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import { GitlabCIApiRef } from '../../../api';
import { useApi } from '@backstage/core-plugin-api';
import { useAsync } from 'react-use';
import {
gitlabAppData,
gitlabAppSlug,
gitlabProjectId,
gitlabProjectSlug,
gitlabCodeOwnerPath,
gitlabInstance,
} from '../../gitlabAppData';
import { PeopleList } from './components/PeopleList';
import { PersonData, ProjectDetail } from '../../types';
Expand All @@ -32,11 +33,12 @@ const useStyles = makeStyles((theme) => ({

export const PeopleCard = ({}) => {
const classes = useStyles();
const { project_id } = gitlabAppData();
const { project_slug, gitlab_instance } = gitlabAppSlug();
const project_id = gitlabProjectId();
const project_slug = gitlabProjectSlug();
const gitlab_instance = gitlabInstance();
const codeowners_path = gitlabCodeOwnerPath();

const GitlabCIAPI = useApi(GitlabCIApiRef).build(gitlab_instance || '0');
const { codeowners_path } = gitlabCodeOwnerPath();
/* TODO: to change the below logic to get contributors data*/
const { value, loading, error } = useAsync(async (): Promise<{
contributors: PersonData[] | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import React from 'react';
import { Table, TableColumn, Progress } from '@backstage/core-components';
import Alert from '@material-ui/lab/Alert';
import { useAsync } from 'react-use';
import { gitlabAppData, gitlabAppSlug } from '../../gitlabAppData';
import {
gitlabInstance,
gitlabProjectId,
gitlabProjectSlug,
} from '../../gitlabAppData';
import { GitlabCIApiRef } from '../../../api';
import { useApi } from '@backstage/core-plugin-api';
import { createStatusColumn, createWebURLColumn } from './columns';
Expand Down Expand Up @@ -45,8 +49,9 @@ export const DenseTable = ({ pipelineObjects }: any) => {
};

export const PipelinesTable = ({}) => {
const { project_id } = gitlabAppData();
const { project_slug, gitlab_instance } = gitlabAppSlug();
const project_id = gitlabProjectId();
const project_slug = gitlabProjectSlug();
const gitlab_instance = gitlabInstance();

const GitlabCIAPI = useApi(GitlabCIApiRef).build(gitlab_instance || '0');

Expand Down

0 comments on commit 22f80e6

Please sign in to comment.