Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/components/catalog/apis/artifactHub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ export const createArtifactHubTask = (
namespace: string,
version: string,
isDevConsoleProxyAvailable?: boolean,
customName?: string,
) => {
const fetchTask = async (): Promise<K8sResourceKind> => {
if (isDevConsoleProxyAvailable) {
Expand All @@ -122,6 +123,9 @@ export const createArtifactHubTask = (
return fetchTask()
.then((task: K8sResourceKind) => {
task.metadata.namespace = namespace;
if (customName) {
task.metadata.name = customName;
}
task.metadata.annotations = {
...task.metadata.annotations,
[TektonTaskAnnotation.installedFrom]: ARTIFACTHUB,
Expand Down Expand Up @@ -185,6 +189,7 @@ export const updateArtifactHubTask = async (

export const fetchArtifactHubTasks = async (
query: string,
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
limit: number = 20,
): Promise<ArtifactHubTask[]> => {
try {
Expand Down
29 changes: 15 additions & 14 deletions src/components/pipeline-builder/PipelineBuilderForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ const PipelineBuilderForm: React.FC<PipelineBuilderFormProps> = (props) => {
const updateTasks = (changes: CleanupResults): void => {
const { tasks, listTasks, finallyTasks, finallyListTasks, loadingTasks } =
changes;

setFieldValue('formData', {
...formData,
tasks,
Expand Down Expand Up @@ -179,6 +178,20 @@ const PipelineBuilderForm: React.FC<PipelineBuilderFormProps> = (props) => {
}
}, [selectedTask]);

const handleRemoveTask = React.useCallback(
async (taskName: string) => {
setSelectedTask(null);
updateTasks(
applyChange(
taskGroup,
{ type: UpdateOperationType.REMOVE_TASK, data: { taskName } },
namespace,
),
);
},
[namespace, taskGroup, updateTasks],
);

return (
<Drawer isExpanded={!!selectedTask} position="right">
<DrawerContent
Expand Down Expand Up @@ -206,19 +219,7 @@ const PipelineBuilderForm: React.FC<PipelineBuilderFormProps> = (props) => {
onRemoveTask={(taskName: string) => {
launchModal(RemoveTaskModal, {
taskName,
onRemove: () => {
setSelectedTask(null);
updateTasks(
applyChange(
taskGroup,
{
type: UpdateOperationType.REMOVE_TASK,
data: { taskName },
},
namespace,
),
);
},
onRemove: () => handleRemoveTask(taskName),
});
}}
selectedData={selectedTask}
Expand Down
2 changes: 1 addition & 1 deletion src/components/quick-search/utils/quick-search-utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export const handleCta = async (
closeModal();
await callback({
...callbackProps,
selectedVersion: item.data?.version,
selectedVersion: item.data?.version ?? item.data?.task?.version,
selectedItem: item,
});
removeQueryArgument('catalogSearch');
Expand Down
79 changes: 62 additions & 17 deletions src/components/task-quicksearch/PipelineQuickSearch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
TaskProviders,
updateTask,
} from './pipeline-quicksearch-utils';
import { safeName } from '../pipeline-builder/utils';
import PipelineQuickSearchDetails from './PipelineQuickSearchDetails';
import { CatalogServiceProvider } from '../catalog/service';
import { CatalogService } from '../catalog/types';
Expand Down Expand Up @@ -64,6 +65,51 @@ const Contents: React.FC<
useLoadingTaskCleanup(onUpdateTasks, taskGroup);
useCleanupOnFailure(failedTasks, onUpdateTasks, taskGroup);

// Get all existing task names from taskGroup and installed tasks
const getExistingTaskNames = (): string[] => {
const taskNames = new Set<string>();
[
...taskGroup.tasks,
...taskGroup.finallyTasks,
...taskGroup.listTasks,
...taskGroup.loadingTasks,
...taskGroup.finallyListTasks,
].forEach((t) => {
if (t?.name) taskNames.add(t.name);
});

// Add installed catalog items (avoid duplicates)
catalogService.items.forEach((catalogItem) => {
const name = catalogItem.data?.metadata?.name;
if (name) taskNames.add(name);
});
return Array.from(taskNames);
};

const handleTaskCreationWithNameConflict = (
taskName: string,
createTaskFn: (taskNameToUse?: string) => Promise<any>,
resolve: (value: any) => void,
) => {
// Checking if task with same name already exists, if yes then create with a different name to avoid conflict
const existingTaskNames = getExistingTaskNames();
if (existingTaskNames.includes(taskName)) {
const taskNameToUse = safeName(existingTaskNames, taskName);
createTaskFn(taskNameToUse)
.then(() =>
resolve(
savedCallback.current({
metadata: { name: taskNameToUse },
}),
),
)
.catch(() => setFailedTasks([...failedTasks, taskNameToUse]));
} else {
resolve(savedCallback.current({ metadata: { name: taskName } }));
createTaskFn().catch(() => setFailedTasks([...failedTasks, taskName]));
}
};

const catalogServiceItems = catalogService.items.reduce((acc, item) => {
const installedTask = findInstalledTask(catalogService.items, item);

Expand Down Expand Up @@ -102,11 +148,11 @@ const Contents: React.FC<
).catch(() => setFailedTasks([...failedTasks, item.data.name]));
}
} else {
resolve(
savedCallback.current({ metadata: { name: item.data.name } }),
);
createTask(selectedVersionUrl, namespace).catch(() =>
setFailedTasks([...failedTasks, item.data.name]),
handleTaskCreationWithNameConflict(
item.data.name,
(taskNameToUse) =>
createTask(selectedVersionUrl, namespace, taskNameToUse),
resolve,
);
}
} else {
Expand Down Expand Up @@ -143,18 +189,17 @@ const Contents: React.FC<
);
}
} else {
resolve(
savedCallback.current({
metadata: { name: item.data.task.name },
}),
);
createArtifactHubTask(
selectedVersionUrl,
namespace,
selectedVersion,
isDevConsoleProxyAvailable,
).catch(() =>
setFailedTasks([...failedTasks, item.data.task.name]),
handleTaskCreationWithNameConflict(
item.data.task.name,
(taskNameToUse) =>
createArtifactHubTask(
selectedVersionUrl,
namespace,
selectedVersion,
isDevConsoleProxyAvailable,
taskNameToUse,
),
resolve,
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,12 +174,19 @@ export const updateTask = async (
});
};

export const createTask = (url: string, namespace: string) => {
export const createTask = (
url: string,
namespace: string,
customName?: string,
) => {
return consoleFetch(url)
.then(async (res) => {
const yaml = await res.text();
const task = load(yaml) as TaskKind;
task.metadata.namespace = namespace;
if (customName) {
task.metadata.name = customName;
}
task.metadata.annotations = {
...task.metadata.annotations,
[TektonTaskAnnotation.installedFrom]: TEKTONHUB,
Expand Down