Skip to content

Commit

Permalink
Customization of developer catalog and sub-catalogs
Browse files Browse the repository at this point in the history
  • Loading branch information
lokanandaprabhu committed Sep 27, 2022
1 parent 2aaaa39 commit 349f008
Show file tree
Hide file tree
Showing 34 changed files with 675 additions and 146 deletions.
Expand Up @@ -3,6 +3,7 @@ import { VerticalTabs } from '@patternfly/react-catalog-view-extension';
import { Title } from '@patternfly/react-core';
import { useTranslation } from 'react-i18next';
import { Link, useLocation } from 'react-router-dom';
import { useGetAllDisabledSubCatalogs } from '@console/dev-console/src/utils/useAddActionExtensions';
import { SyncMarkdownView } from '@console/internal/components/markdown-view';
import { FieldLevelHelp } from '@console/internal/components/utils';
import { CatalogQueryParams, CatalogType, CatalogTypeCounts } from '../utils/types';
Expand All @@ -18,7 +19,7 @@ const CatalogTypeSelector: React.FC<CatalogTypeSelectorProps> = ({
}) => {
const { t } = useTranslation();
const { pathname, search } = useLocation();

const [disabledSubCatalogs] = useGetAllDisabledSubCatalogs();
const typeDescriptions = React.useMemo(
() =>
catalogTypes.map(
Expand Down Expand Up @@ -49,7 +50,7 @@ const CatalogTypeSelector: React.FC<CatalogTypeSelectorProps> = ({
search: `?${queryParams.toString()}`,
};

return typeCount > 0 ? (
return typeCount > 0 && !disabledSubCatalogs?.includes(value) ? (
<li key={value} className="vertical-tabs-pf-tab" data-test={`tab ${value}`}>
<Link to={to}>{`${label} (${typeCount})`}</Link>
</li>
Expand Down
@@ -1,5 +1,6 @@
import * as React from 'react';
import * as _ from 'lodash';
import { useGetAllDisabledSubCatalogs } from '@console/dev-console/src/utils/useAddActionExtensions';
import {
CatalogExtensionHookOptions,
CatalogItem,
Expand Down Expand Up @@ -47,7 +48,7 @@ const CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({
catalogBadgeProviderExtensions,
extensionsResolved,
] = useCatalogExtensions(catalogId, catalogType);

const [disabledSubCatalogs] = useGetAllDisabledSubCatalogs();
const [extItemsMap, setExtItemsMap] = React.useState<{ [uid: string]: CatalogItem[] }>({});
const [extItemsErrorMap, setItemsErrorMap] = React.useState<{ [uid: string]: Error }>({});
const [metadataProviderMap, setMetadataProviderMap] = React.useState<{
Expand All @@ -63,13 +64,16 @@ const CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({
? catalogProviderExtensions.some(({ uid }) => extItemsMap[uid] || extItemsErrorMap[uid])
: catalogProviderExtensions.every(({ uid }) => extItemsMap[uid] || extItemsErrorMap[uid])));

const enabledCatalogProviderExtensions = catalogProviderExtensions.filter((item) => {
return !disabledSubCatalogs?.includes(item?.properties?.type);
});
const preCatalogItems = React.useMemo(() => {
if (!loaded) {
return [];
}

const itemMap = _.flatten(
catalogProviderExtensions.map((e) =>
enabledCatalogProviderExtensions.map((e) =>
catalogFilterExtensions
.filter((fe) => fe.properties.type === e.properties.type)
.reduce((acc, ext) => acc.filter(ext.properties.filter), extItemsMap[e.uid]),
Expand All @@ -81,7 +85,7 @@ const CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({
}, {} as { [uid: string]: CatalogItem });

return _.sortBy(Object.values(itemMap), 'name');
}, [extItemsMap, loaded, catalogProviderExtensions, catalogFilterExtensions]);
}, [extItemsMap, loaded, enabledCatalogProviderExtensions, catalogFilterExtensions]);

const catalogItems = React.useMemo(() => {
if (!loaded) {
Expand Down
21 changes: 21 additions & 0 deletions frontend/packages/dev-console/console-extensions.json
Expand Up @@ -22,12 +22,21 @@
"usePerspectiveDetection": { "$codeRef": "perspective.usePerspectiveDetection" }
}
},
{
"type": "console.flag/hookProvider",
"properties": {
"handler": { "$codeRef": "actions.useDeveloperCatalogProvider" }
}
},
{
"type": "dev-console.add/action-group",
"properties": {
"id": "developer-catalog",
"name": "%devconsole~Developer Catalog%",
"insertBefore": "git-repository"
},
"flags": {
"required": ["DEVELOPER_CATALOG"]
}
},
{
Expand Down Expand Up @@ -90,6 +99,9 @@
{ "group": "route.openshift.io", "resource": "routes", "verb": "create" },
{ "group": "", "resource": "services", "verb": "create" }
]
},
"flags": {
"required": ["DEVELOPER_CATALOG", "SAMPLE_CATALOG_TYPE"]
}
},
{
Expand Down Expand Up @@ -151,6 +163,9 @@
"label": "%devconsole~All services%",
"description": "%devconsole~Browse the catalog to discover, deploy and connect to services%",
"icon": { "$codeRef": "icons.devCatalogIconElement" }
},
"flags": {
"required": ["DEVELOPER_CATALOG"]
}
},
{
Expand All @@ -162,6 +177,9 @@
"label": "%devconsole~Database%",
"description": "%devconsole~Browse the catalog to discover database services to add to your application%",
"icon": { "$codeRef": "icons.databaseCatalogIconElement" }
},
"flags": {
"required": ["DEVELOPER_CATALOG"]
}
},
{
Expand All @@ -173,6 +191,9 @@
"label": "%devconsole~Operator Backed%",
"description": "%devconsole~Browse the catalog to discover and deploy operator managed services%",
"icon": { "$codeRef": "icons.operatorCatalogIconElement" }
},
"flags": {
"required": ["DEVELOPER_CATALOG", "OPERATOR_BACKED_SERVICE_CATALOG_TYPE"]
}
},
{
Expand Down
5 changes: 4 additions & 1 deletion frontend/packages/dev-console/src/actions/add-resources.tsx
Expand Up @@ -29,6 +29,7 @@ type ActionFactory = (
path?: string,
accessReviewDisabled?: boolean,
isServiceBindingAllowed?: boolean,
isSubCatalogTypeEnabled?: boolean,
) => Action;

export const resolvedURLWithParams = (
Expand Down Expand Up @@ -161,4 +162,6 @@ export const AddActions: { [name: string]: ActionFactory } = {
};

const disabledAddActions = getDisabledAddActions();
export const disabledActionsFilter = (item: Action) => !disabledAddActions?.includes(item.id);
export const disabledActionsFilter = (item: Action) => {
return !disabledAddActions?.includes(item.id);
};
198 changes: 138 additions & 60 deletions frontend/packages/dev-console/src/actions/providers.ts
@@ -1,7 +1,7 @@
import * as React from 'react';
import { GraphElement, Node, isGraph } from '@patternfly/react-topology';
import { getCommonResourceActions } from '@console/app/src/actions/creators/common-factory';
import { K8sModel, Action } from '@console/dynamic-plugin-sdk';
import { K8sModel, Action, SetFeatureFlag } from '@console/dynamic-plugin-sdk';
import { TopologyApplicationObject } from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
import { useAccessReview } from '@console/internal/components/utils';
import {
Expand All @@ -22,6 +22,15 @@ import { ServiceBindingModel } from '@console/service-binding-plugin/src/models'
import { useActiveNamespace } from '@console/shared';
import { useK8sModel } from '@console/shared/src/hooks/useK8sModel';
import { TYPE_APPLICATION_GROUP } from '@console/topology/src/const';
import {
FLAG_DEVELOPER_CATALOG,
FLAG_OPERATOR_BACKED_SERVICE_CATALOG_TYPE,
FLAG_SAMPLE_CATALOG_TYPE,
} from '../const';
import {
isCatalogTypeEnabled,
useIsDeveloperCatalogEnabled,
} from '../utils/useAddActionExtensions';
import { AddActions, disabledActionsFilter } from './add-resources';
import { DeleteApplicationAction } from './context-menu';
import { EditImportApplication } from './creators';
Expand Down Expand Up @@ -63,6 +72,15 @@ const resourceAttributes = (model: K8sModel, namespace: string): AccessReviewRes
};
};

export const useDeveloperCatalogProvider = (setFeatureFlag: SetFeatureFlag) => {
setFeatureFlag(FLAG_DEVELOPER_CATALOG, useIsDeveloperCatalogEnabled());
setFeatureFlag(
FLAG_OPERATOR_BACKED_SERVICE_CATALOG_TYPE,
isCatalogTypeEnabled('OperatorBackedService'),
);
setFeatureFlag(FLAG_SAMPLE_CATALOG_TYPE, isCatalogTypeEnabled('sample'));
};

export const useTopologyGraphActionProvider: TopologyActionProvider = ({
element,
connectorSource,
Expand All @@ -88,82 +106,142 @@ export const useTopologyGraphActionProvider: TopologyActionProvider = ({
routeAccess &&
serviceAccess;
const isCatalogImageResourceAccess = isImportResourceAccess && imageStreamImportAccess;
const isDevCatalogEnabled = useIsDeveloperCatalogEnabled();
const isOperatorBackedServiceEnabled = isCatalogTypeEnabled('OperatorBackedService');

return React.useMemo(() => {
const sourceObj = connectorSource?.getData()?.resource;
const sourceReference = sourceObj
? `${referenceFor(sourceObj)}/${sourceObj?.metadata?.name}`
: undefined;

const actionsWithSourceRef: Action[] = [];
actionsWithSourceRef.push(
AddActions.FromGit(namespace, undefined, sourceReference, '', !isImportResourceAccess),
);
actionsWithSourceRef.push(
AddActions.ContainerImage(
namespace,
undefined,
sourceReference,
'',
!isCatalogImageResourceAccess,
),
);
if (isOperatorBackedServiceEnabled) {
actionsWithSourceRef.push(
AddActions.OperatorBacked(
namespace,
undefined,
sourceReference,
'',
null,
serviceBindingAccess,
isOperatorBackedServiceEnabled,
),
);
}
actionsWithSourceRef.push(
AddActions.UploadJarFile(
namespace,
undefined,
sourceReference,
'',
!isCatalogImageResourceAccess,
),
);

const actionsWithoutSourceRef: Action[] = [];
actionsWithoutSourceRef.push(
AddActions.Samples(
namespace,
undefined,
undefined,
'add-to-project',
!isImportResourceAccess,
),
);
actionsWithoutSourceRef.push(
AddActions.FromGit(
namespace,
undefined,
undefined,
'add-to-project',
!isImportResourceAccess,
),
);
actionsWithoutSourceRef.push(
AddActions.ContainerImage(
namespace,
undefined,
undefined,
'add-to-project',
!isCatalogImageResourceAccess,
),
);
if (isDevCatalogEnabled) {
actionsWithoutSourceRef.push(
AddActions.DevCatalog(
namespace,
undefined,
undefined,
'add-to-project',
undefined,
isDevCatalogEnabled,
),
);
}
if (isDevCatalogEnabled) {
actionsWithoutSourceRef.push(
AddActions.DatabaseCatalog(
namespace,
undefined,
undefined,
'add-to-project',
undefined,
isDevCatalogEnabled,
),
);
}
if (isOperatorBackedServiceEnabled) {
actionsWithoutSourceRef.push(
AddActions.OperatorBacked(
namespace,
undefined,
undefined,
'add-to-project',
undefined,
undefined,
isOperatorBackedServiceEnabled,
),
);
}
actionsWithoutSourceRef.push(
AddActions.UploadJarFile(
namespace,
undefined,
undefined,
'add-to-project',
!isCatalogImageResourceAccess,
),
);

if (isGraph(element)) {
const actions = sourceReference
? [
AddActions.FromGit(namespace, undefined, sourceReference, '', !isImportResourceAccess),
AddActions.ContainerImage(
namespace,
undefined,
sourceReference,
'',
!isCatalogImageResourceAccess,
),
AddActions.OperatorBacked(
namespace,
undefined,
sourceReference,
'',
null,
serviceBindingAccess,
),
AddActions.UploadJarFile(
namespace,
undefined,
sourceReference,
'',
!isCatalogImageResourceAccess,
),
].filter(disabledActionsFilter)
: [
AddActions.Samples(
namespace,
undefined,
undefined,
'add-to-project',
!isImportResourceAccess,
),
AddActions.FromGit(
namespace,
undefined,
undefined,
'add-to-project',
!isImportResourceAccess,
),
AddActions.ContainerImage(
namespace,
undefined,
undefined,
'add-to-project',
!isCatalogImageResourceAccess,
),
AddActions.DevCatalog(namespace, undefined, undefined, 'add-to-project'),
AddActions.DatabaseCatalog(namespace, undefined, undefined, 'add-to-project'),
AddActions.OperatorBacked(namespace, undefined, undefined, 'add-to-project'),
AddActions.UploadJarFile(
namespace,
undefined,
undefined,
'add-to-project',
!isCatalogImageResourceAccess,
),
].filter(disabledActionsFilter);
? actionsWithSourceRef.filter(disabledActionsFilter)
: actionsWithoutSourceRef.filter(disabledActionsFilter);
return [actions, true, undefined];
}
return [[], true, undefined];
}, [
element,
connectorSource,
element,
namespace,
isImportResourceAccess,
isCatalogImageResourceAccess,
serviceBindingAccess,
isOperatorBackedServiceEnabled,
isDevCatalogEnabled,
]);
};

Expand Down

0 comments on commit 349f008

Please sign in to comment.