Skip to content

Commit

Permalink
feat: allow blueprints to be deployed to any deployment repository (#76)
Browse files Browse the repository at this point in the history
This change allows blueprints to deployed to any deployment repository.
  • Loading branch information
ChristopherFry committed Jul 25, 2022
1 parent fb8c217 commit 1560c6d
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 51 deletions.
105 changes: 67 additions & 38 deletions plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,12 @@ import {
getCloneTask,
getInitTask,
getPackageRevisionResource,
sortByPackageNameAndRevisionComparison,
} from '../../utils/packageRevision';
import { getPackageDescriptor } from '../../utils/repository';
import {
getPackageDescriptor,
isBlueprintRepository,
isDeploymentRepository,
} from '../../utils/repository';
import { getRepositorySummary } from '../../utils/repositorySummary';
import { sortByLabel } from '../../utils/selectItem';
import { toLowerCase } from '../../utils/string';
Expand Down Expand Up @@ -73,8 +76,11 @@ export const AddPackagePage = () => {
const [baseRepository, setBaseRepository] = useState<Repository>();
const [repositorySummary, setRepositorySummary] =
useState<RepositorySummary>();
const [allRepositories, setAllRepositories] = useState<Repository[]>([]);

const [basePackageName, setBasePackageName] = useState<string>(packageName);
const [basePackageName, setBasePackageName] = useState<string>(
packageName ?? '',
);
const [basePackageRevision, setBasePackageRevision] =
useState<PackageRevision>();

Expand Down Expand Up @@ -104,10 +110,13 @@ export const AddPackagePage = () => {
);

const { loading, error } = useAsync(async (): Promise<void> => {
const thisRepositorySummary = await getRepositorySummary(
api,
repositoryName,
);
const [{ items: thisRepositories }, thisRepositorySummary] =
await Promise.all([
api.listRepositories(),
getRepositorySummary(api, repositoryName),
]);

setAllRepositories(thisRepositories);
setRepositorySummary(thisRepositorySummary);
});

Expand All @@ -116,24 +125,31 @@ export const AddPackagePage = () => {

const loadRequired = async () => {
const setBasePackages = async (): Promise<void> => {
let upstreamBlueprints: SelectItem[] = [];

if (repositorySummary.upstreamRepository) {
const upstreamRepoName =
repositorySummary.upstreamRepository.metadata.name;

const upstreamPackages = await api.listPackageRevisions(
upstreamRepoName,
);

upstreamBlueprints = upstreamPackages
.filter(canCloneOrDeploy)
.sort(sortByPackageNameAndRevisionComparison)
.map(p => ({
label: `${p.spec.packageName}:${p.spec.revision}`,
value: p.metadata.name,
}));
}
const allPackages = await api.listPackageRevisions();

const getUpstreamPackages = (): PackageRevision[] => {
if (!isDeploymentRepository(repositorySummary.repository)) return [];

const blueprintRepositories = allRepositories
.filter(isBlueprintRepository)
.map(repostiory => repostiory.metadata.name);

const upstreamBlueprintPackages = allPackages
.filter(thisPackage =>
blueprintRepositories.includes(thisPackage.spec.repository),
)
.filter(canCloneOrDeploy);

return upstreamBlueprintPackages;
};

const blueprintPackages = getUpstreamPackages();
const upstreamBlueprints = sortByLabel(
blueprintPackages.map(blueprintPackage => ({
label: `${blueprintPackage.spec.packageName}:${blueprintPackage.spec.revision}`,
value: blueprintPackage.metadata.name,
})),
);

upstreamBlueprints.unshift({ label: 'none', value: 'none' });

Expand All @@ -145,23 +161,25 @@ export const AddPackagePage = () => {
};

const setDownstreamRepositories = (): void => {
if (repositorySummary.downstreamRepositories) {
const downstream: SelectItem[] = sortByLabel(
repositorySummary.downstreamRepositories.map(repository => ({
if (allRepositories && allRepositories.length > 0) {
const deploymentRepositorySelectItems: SelectItem[] = sortByLabel(
allRepositories.filter(isDeploymentRepository).map(repository => ({
label: repository.metadata.name,
value: repository.metadata.name,
})),
);
setSelectDownstreamRepositoryItems(downstream);

if (downstream.length > 0) {
setTargetRepositoryPackageDescriptor(
getPackageDescriptor(repositorySummary.downstreamRepositories[0]),
setSelectDownstreamRepositoryItems(deploymentRepositorySelectItems);

setTargetRepositoryPackageDescriptor(
getPackageDescriptor(allRepositories[0]),
);

if (deploymentRepositorySelectItems.length === 1) {
setTargetRepositoryName(
deploymentRepositorySelectItems[0].value as string,
);
}
if (downstream.length === 1) {
setTargetRepositoryName(downstream[0].value as string);
}
}
};

Expand All @@ -177,7 +195,13 @@ export const AddPackagePage = () => {
};

loadRequired();
}, [api, repositorySummary, packageName, deployToDownstreamRepository]);
}, [
api,
allRepositories,
repositorySummary,
packageName,
deployToDownstreamRepository,
]);

const getNewPackageRevisionResource = (): PackageRevision => {
const baseTask =
Expand All @@ -202,7 +226,7 @@ export const AddPackagePage = () => {
if (targetRepositoryName && repositorySummary) {
const findRepository = (): Repository | undefined => {
if (deployToDownstreamRepository) {
const thisRepository = repositorySummary.downstreamRepositories.find(
const thisRepository = allRepositories.find(
repository => repository.metadata.name === targetRepositoryName,
);
return thisRepository;
Expand All @@ -220,7 +244,12 @@ export const AddPackagePage = () => {
);
}
}
}, [targetRepositoryName, repositorySummary, deployToDownstreamRepository]);
}, [
allRepositories,
targetRepositoryName,
repositorySummary,
deployToDownstreamRepository,
]);

useEffect(() => {
if (!basePackageName || basePackageName === 'none') return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ import {
findLatestPublishedRevision,
isLatestPublishedRevision,
} from '../../../utils/packageRevision';
import { isDeploymentRepository } from '../../../utils/repository';
import {
isBlueprintRepository,
isDeploymentRepository,
} from '../../../utils/repository';
import { PackageRevisionPageMode } from '../PackageRevisionPage';

export enum RevisionOption {
Expand Down Expand Up @@ -200,7 +203,7 @@ const PublishedPackageRevisionOptions = ({
}

const showDeploy =
repositorySummary.downstreamRepositories.length > 0 &&
isBlueprintRepository(repositorySummary.repository) &&
canCloneOrDeploy(packageRevision);

if (latestRevision !== latestPublishedRevision) {
Expand Down
15 changes: 4 additions & 11 deletions plugins/cad/src/utils/packageSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export type PackageSummary = {

export const getPackageSummariesForRepository = (
packageRevisions: PackageRevision[],
upstreamRevisions: PackageRevision[],
allPackageRevisions: PackageRevision[],
repository: Repository,
): PackageSummary[] => {
const latestPackageRevisions = packageRevisions.filter(
Expand Down Expand Up @@ -90,14 +90,14 @@ export const getPackageSummariesForRepository = (
thisPackageSummary.upstreamPackageRevision = upstream.revision;

thisPackageSummary.upstreamRevision = findPackageRevision(
upstreamRevisions,
allPackageRevisions,
upstream.packageName,
upstream.revision,
);

thisPackageSummary.upstreamLatestPublishedRevision =
findLatestPublishedRevision(
filterPackageRevisions(upstreamRevisions, upstream.packageName),
filterPackageRevisions(allPackageRevisions, upstream.packageName),
);

thisPackageSummary.isUpgradeAvailable =
Expand All @@ -124,16 +124,9 @@ export const getPackageSummaries = (
revision.spec.repository === repositorySummary.repository.metadata.name,
);

const upstreamPackageRevisions = packageRevisions.filter(
revision =>
repositorySummary.upstreamRepository &&
revision.spec.repository ===
repositorySummary.upstreamRepository.metadata.name,
);

const repositoryPackageSummaries = getPackageSummariesForRepository(
repositoryPackageRevisions,
upstreamPackageRevisions,
packageRevisions,
repositorySummary.repository,
);

Expand Down

0 comments on commit 1560c6d

Please sign in to comment.