Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as React from 'react';
import * as _ from 'lodash';
import { getInfrastructurePlatform } from '@console/shared';
import { DashboardCard } from '@console/internal/components/dashboard/dashboard-card/card';
import { DashboardCardBody } from '@console/internal/components/dashboard/dashboard-card/card-body';
import { DashboardCardHeader } from '@console/internal/components/dashboard/dashboard-card/card-header';
Expand All @@ -16,7 +17,6 @@ import { K8sResourceKind } from '@console/internal/module/k8s/index';
import { getName } from '@console/shared/src/selectors/common';
import { referenceForModel } from '@console/internal/module/k8s/k8s';
import { CephClusterModel } from '../../../models';
import { getInfrastructurePlatform } from '../../../selectors';

const infrastructureResource: FirehoseResource = {
kind: referenceForModel(InfrastructureModel),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ import {
} from '@console/internal/components/dashboards-page/with-dashboard-resources';
import { DashboardStorageExtension } from '@console/plugin-sdk';
import { connectToFlags, FlagsObject, WithFlagsProps } from '@console/internal/reducers/features';
import { getFlagsForExtensions } from '@console/internal/components/dashboards-page/utils';
import {
getFlagsForExtensions,
isDashboardExtensionInUse,
} from '@console/internal/components/dashboards-page/utils';
import { BY_REQUESTED, BY_USED, PODS, PROJECTS, STORAGE_CLASSES } from '../../../../constants';
import { TOP_CONSUMER_QUERIES } from '../../../../constants/queries';
import { TopConsumersBody } from './top-consumers-card-body';
Expand Down Expand Up @@ -49,7 +52,7 @@ const getTopConsumersQueriesMap = (
};

const getItems = (plugin: DashboardStorageExtension[], flags: FlagsObject) =>
plugin.filter((e) => flags[e.properties.required]);
plugin.filter((e) => isDashboardExtensionInUse(e, flags));

const getTopConsumersQueries = (flags: FlagsObject) => {
let topConsumers: TopConsumersQueries = { ...TOP_CONSUMER_QUERIES };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
TableVariant,
TableGridBreakpoint,
} from '@patternfly/react-table';
import { getInfrastructurePlatform } from '@console/shared';
import { tableFilters } from '@console/internal/components/factory/table-filters';
import { ActionGroup, Button } from '@patternfly/react-core';
import { ButtonBar } from '@console/internal/components/utils/button-bar';
Expand Down Expand Up @@ -263,7 +264,7 @@ const CustomNodeTable: React.FC<CustomNodeTableProps> = ({ data, loaded, ocsProp
k8sGet(InfrastructureModel, 'cluster')
.then((infra: K8sResourceKind) => {
// find infra supported provisioner
provisioner = infraProvisionerMap[_.lowerCase(_.get(infra, 'status.platform'))];
provisioner = infraProvisionerMap[_.lowerCase(getInfrastructurePlatform(infra))];
return k8sList(StorageClassModel);
})
.then((storageClasses: StorageClassResourceKind[]) => {
Expand Down
3 changes: 0 additions & 3 deletions frontend/packages/ceph-storage-plugin/src/selectors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,3 @@ export const getCephSC = (scData: K8sResourceKind[]): K8sResourceKind[] =>
_.get(sc, 'provisioner', '').includes(provisioner),
);
});

export const getInfrastructurePlatform = (infrastructure: K8sResourceKind): string =>
_.get(infrastructure, 'status.platform');
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { LazyLoader } from './types';
namespace ExtensionProperties {
interface DashboardExtension {
/** Name of feature flag for this item. */
required: string;
required: string | string[];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it would be better to just go with required: string[] IMO.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually, nevermind. For 4.3 we will have proper plugin gating and using string | string[] will result in smaller change

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer string | string[] here to minimize changes in specific plugins.

}

interface DashboardsOverviewHealthSubsystem extends DashboardExtension {
Expand Down
1 change: 1 addition & 0 deletions frontend/packages/console-shared/src/selectors/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './common';
export * from './machine';
export * from './infrastructure';
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import * as _ from 'lodash';
import { K8sResourceKind } from '@console/internal/module/k8s';

export const getInfrastructurePlatform = (infrastructure: K8sResourceKind): string =>
_.get(infrastructure, 'status.platform');
5 changes: 3 additions & 2 deletions frontend/packages/metal3-plugin/src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
} from '@console/plugin-sdk';
import { referenceForModel } from '@console/internal/module/k8s';
import { MachineModel, NodeModel } from '@console/internal/models';
import { FLAGS } from '@console/internal/const';
import { BaremetalHostModel, NodeMaintenanceModel } from './models';
import { getBMHStatusGroups } from './components/dashboard/utils';

Expand Down Expand Up @@ -46,7 +47,7 @@ const plugin: Plugin<ConsumedExtensions> = [
componentProps: {
name: 'Bare Metal Hosts',
resource: referenceForModel(BaremetalHostModel),
required: METAL3_FLAG,
required: [FLAGS.BAREMETAL, METAL3_FLAG],
},
},
},
Expand Down Expand Up @@ -107,7 +108,7 @@ const plugin: Plugin<ConsumedExtensions> = [
],
model: BaremetalHostModel,
mapper: getBMHStatusGroups,
required: METAL3_FLAG,
required: [FLAGS.BAREMETAL, METAL3_FLAG],
},
},
];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as React from 'react';
import * as _ from 'lodash';
import { getInfrastructurePlatform } from '@console/shared';
import {
DashboardCard,
DashboardCardBody,
Expand All @@ -14,7 +15,6 @@ import {
import { FirehoseResource, ExternalLink } from '@console/internal/components/utils';
import { InfrastructureModel, SubscriptionModel } from '@console/internal/models/index';
import { referenceForModel, K8sResourceKind } from '@console/internal/module/k8s';
import { getInfrastructurePlatform } from '@console/ceph-storage-plugin/src/selectors';
import { getMetric } from '../../utils';

const NOOBAA_SYSTEM_NAME_QUERY = 'NooBaa_system_info';
Expand Down
18 changes: 15 additions & 3 deletions frontend/public/actions/features.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { Dispatch } from 'react-redux';
import * as _ from 'lodash-es';
import { ActionType as Action, action } from 'typesafe-actions';

import { OperatorGroupModel, PackageManifestModel, SelfSubjectAccessReviewModel } from '../models';
import { k8sBasePath, ClusterVersionKind, k8sCreate } from '../module/k8s';
import { getInfrastructurePlatform } from '@console/shared/src/selectors';
import { OperatorGroupModel, PackageManifestModel, SelfSubjectAccessReviewModel, InfrastructureModel } from '../models';
import { k8sBasePath, ClusterVersionKind, k8sCreate, k8sGet, K8sResourceKind } from '../module/k8s';
import { receivedResources } from './k8s';
import { coFetchJSON } from '../co-fetch';
import { MonitoringRoutes } from '../reducers/monitoring';
Expand Down Expand Up @@ -49,6 +49,16 @@ const detectOpenShift = dispatch => coFetchJSON(openshiftPath)
: handleError(err, FLAGS.OPENSHIFT, dispatch, detectOpenShift)
);

const detectBaremetalPlatform = dispatch =>
k8sGet(InfrastructureModel, 'cluster')
.then(
(infra: K8sResourceKind) => dispatch(setFlag(FLAGS.BAREMETAL, getInfrastructurePlatform(infra) === 'BareMetal')),
err => {
_.get(err, 'response.status') === 404
? dispatch(setFlag(FLAGS.BAREMETAL, false))
: handleError(err, FLAGS.BAREMETAL, dispatch, detectBaremetalPlatform);
});

const clusterVersionPath = `${k8sBasePath}/apis/config.openshift.io/v1/clusterversions/version`;
const detectClusterVersion = dispatch => coFetchJSON(clusterVersionPath)
.then(
Expand Down Expand Up @@ -212,6 +222,8 @@ const ssarCheckActions = ssarChecks.map(({flag, resourceAttributes, after}) => {

export const detectFeatures = () => (dispatch: Dispatch) => [
detectOpenShift,
// TODO(vojtech): move this flag definition to metal3-plugin via ActionFeatureFlag extension
detectBaremetalPlatform,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a TODO comment above this line:

// TODO(vojtech): move this flag definition to metal3-plugin via ActionFeatureFlag extension

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

detectCanCreateProject,
detectMonitoringURLs,
detectClusterVersion,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
import { K8sResourceKind, K8sKind } from '../../../module/k8s';
import { InventoryStatusGroup } from './status-group';
import { connectToFlags, FlagsObject, WithFlagsProps } from '../../../reducers/features';
import { getFlagsForExtensions } from '../../dashboards-page/utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from '../../dashboards-page/utils';

const defaultStatusGroupIcons = {
[InventoryStatusGroup.OK]: (
Expand All @@ -36,7 +36,7 @@ const defaultStatusGroupIcons = {

const getStatusGroupIcons = (flags: FlagsObject) => {
const groupStatusIcons = {...defaultStatusGroupIcons};
plugins.registry.getDashboardsInventoryItemGroups().filter(e => flags[e.properties.required]).forEach(group => {
plugins.registry.getDashboardsInventoryItemGroups().filter(e => isDashboardExtensionInUse(e, flags)).forEach(group => {
if (!groupStatusIcons[group.properties.id]) {
groupStatusIcons[group.properties.id] = group.properties.icon;
}
Expand Down
6 changes: 3 additions & 3 deletions frontend/public/components/dashboards-page/dashboards.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { DashboardGrid, GridPosition, GridDashboardCard } from '../dashboard/gri
import { DashboardsCard } from '@console/plugin-sdk';
import { featureReducerName, connectToFlags, FlagsObject, WithFlagsProps } from '../../reducers/features';
import { RootState } from '../../redux';
import { getFlagsForExtensions } from './utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from './utils';

const getCardsOnPosition = (cards: DashboardsCard[], position: GridPosition): GridDashboardCard[] =>
cards.filter(c => c.properties.position === position).map(c => ({
Expand All @@ -20,8 +20,8 @@ const getCardsOnPosition = (cards: DashboardsCard[], position: GridPosition): Gr
}));

const getPluginTabPages = (flags: FlagsObject): Page[] => {
const cards = plugins.registry.getDashboardsCards().filter(e => flags[e.properties.required]);
return plugins.registry.getDashboardsTabs().filter(e => flags[e.properties.required]).map(tab => {
const cards = plugins.registry.getDashboardsCards().filter(e => isDashboardExtensionInUse(e, flags));
return plugins.registry.getDashboardsTabs().filter(e => isDashboardExtensionInUse(e, flags)).map(tab => {
const tabCards = cards.filter(c => c.properties.tab === tab.properties.id);
return {
href: tab.properties.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { humanizePercentage, humanizeDecimalBytesPerSec, humanizeBinaryBytesWith
import { getInstantVectorStats, getRangeVectorStats, GetStats } from '../../graphs/utils';
import { OverviewQuery, capacityQueries } from './queries';
import { connectToFlags, FlagsObject, WithFlagsProps } from '../../../reducers/features';
import { getFlagsForExtensions } from '../utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from '../utils';

const getLastStats = (response, getStats: GetStats): React.ReactText => {
const stats = getStats(response);
Expand All @@ -23,7 +23,7 @@ const getLastStats = (response, getStats: GetStats): React.ReactText => {

const getQueries = (flags: FlagsObject) => {
const pluginQueries = {};
plugins.registry.getDashboardsOverviewQueries().filter(e => flags[e.properties.required]).forEach(pluginQuery => {
plugins.registry.getDashboardsOverviewQueries().filter(e => isDashboardExtensionInUse(e, flags)).forEach(pluginQuery => {
const queryKey = pluginQuery.properties.queryKey;
if (!pluginQueries[queryKey]) {
pluginQueries[queryKey] = pluginQuery.properties.query;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react';
import * as _ from 'lodash-es';
import { connect } from 'react-redux';

import { getInfrastructurePlatform } from '@console/shared';
import {
DashboardCard,
DashboardCardBody,
Expand All @@ -17,8 +17,6 @@ import { flagPending, featureReducerName } from '../../../reducers/features';
import { FirehoseResource } from '../../utils';
import { RootState } from '../../../redux';

const getInfrastructurePlatform = (infrastructure: K8sResourceKind): string => _.get(infrastructure, 'status.platform');

const clusterVersionResource: FirehoseResource = {
kind: referenceForModel(ClusterVersionModel),
namespaced: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { DashboardItemProps, withDashboardResources } from '../with-dashboard-re
import { getBrandingDetails } from '../../masthead';
import { RootState } from '../../../redux';
import { connectToFlags, flagPending, featureReducerName, FlagsObject, WithFlagsProps } from '../../../reducers/features';
import { getFlagsForExtensions } from '../utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from '../utils';
import { uniqueResource } from './utils';
import { isDashboardsOverviewHealthURLSubsystem, isDashboardsOverviewHealthPrometheusSubsystem } from '@console/plugin-sdk';

Expand Down Expand Up @@ -70,7 +70,7 @@ const mapStateToProps = (state: RootState) => ({
});

const getSubsystems = (flags: FlagsObject) =>
plugins.registry.getDashboardsOverviewHealthSubsystems().filter(e => flags[e.properties.required]);
plugins.registry.getDashboardsOverviewHealthSubsystems().filter(e => isDashboardExtensionInUse(e, flags));

const HealthCard_ = connect(mapStateToProps)(({
watchURL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { K8sResourceKind, PodKind } from '../../../module/k8s';
import { getPodStatusGroups, getNodeStatusGroups, getPVCStatusGroups } from '../../dashboard/inventory-card/utils';
import { FirehoseResource } from '../../utils';
import { connectToFlags, FlagsObject, WithFlagsProps } from '../../../reducers/features';
import { getFlagsForExtensions } from '../utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from '../utils';
import { uniqueResource } from './utils';
import { InventoryBody } from '../../dashboard/inventory-card/inventory-body';

Expand All @@ -38,7 +38,7 @@ const k8sResources: FirehoseResource[] = [
];

const getItems = (flags: FlagsObject) =>
plugins.registry.getDashboardsOverviewInventoryItems().filter(e => flags[e.properties.required]);
plugins.registry.getDashboardsOverviewInventoryItems().filter(e => isDashboardExtensionInUse(e, flags));

const getResourcesToWatch = (flags: FlagsObject): FirehoseResource[] => {
const allResources = [...k8sResources];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { MonitoringRoutes, connectToURLs } from '../../../reducers/monitoring';
import { getPrometheusExpressionBrowserURL } from '../../graphs/prometheus-graph';
import { getName, getNamespace } from '@console/shared';
import { connectToFlags, FlagsObject, WithFlagsProps } from '../../../reducers/features';
import { getFlagsForExtensions } from '../utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from '../utils';

const topConsumersQueryMap: TopConsumersMap = {
[PODS]: {
Expand All @@ -53,7 +53,7 @@ const topConsumersQueryMap: TopConsumersMap = {

const getTopConsumersQueries = (flags: FlagsObject): TopConsumersMap => {
const topConsumers = {...topConsumersQueryMap};
plugins.registry.getDashboardsOverviewTopConsumerItems().filter(e => flags[e.properties.required]).forEach(pluginItem => {
plugins.registry.getDashboardsOverviewTopConsumerItems().filter(e => isDashboardExtensionInUse(e, flags)).forEach(pluginItem => {
if (!topConsumers[pluginItem.properties.name]) {
topConsumers[pluginItem.properties.name] = {
model: pluginItem.properties.model,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ import { getRangeVectorStats } from '../../graphs/utils';
import { humanizePercentage, humanizeBinaryBytesWithoutB } from '../../utils';
import { OverviewQuery, utilizationQueries } from './queries';
import { connectToFlags, FlagsObject, WithFlagsProps } from '../../../reducers/features';
import { getFlagsForExtensions } from '../utils';
import { getFlagsForExtensions, isDashboardExtensionInUse } from '../utils';

const getQueries = (flags: FlagsObject) => {
const pluginQueries = {};
plugins.registry.getDashboardsOverviewQueries().filter(e => flags[e.properties.required]).forEach(pluginQuery => {
plugins.registry.getDashboardsOverviewQueries().filter(e => isDashboardExtensionInUse(e, flags)).forEach(pluginQuery => {
const queryKey = pluginQuery.properties.queryKey;
if (!pluginQueries[queryKey]) {
pluginQueries[queryKey] = pluginQuery.properties.query;
Expand All @@ -28,7 +28,7 @@ const getQueries = (flags: FlagsObject) => {
};

const getItems = (flags: FlagsObject) =>
plugins.registry.getDashboardsOverviewUtilizationItems().filter(e => flags[e.properties.required]);
plugins.registry.getDashboardsOverviewUtilizationItems().filter(e => isDashboardExtensionInUse(e, flags));

const UtilizationCard_: React.FC<DashboardItemProps & WithFlagsProps> = ({
watchPrometheus,
Expand Down
16 changes: 14 additions & 2 deletions frontend/public/components/dashboards-page/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import * as _ from 'lodash';
import { Extension } from '@console/plugin-sdk';
import { FlagsObject } from '@console/internal/reducers/features';

export const getFlagsForExtensions = (extensions: Extension<{required: string}>[]): string[] =>
extensions.map(e => e.properties.required).filter((value, index, self) => self.indexOf(value) === index);
type DashboardExtension = Extension<{ required: string | string[] }>;

export const getFlagsForExtensions = (extensions: DashboardExtension[]): string[] =>
extensions.reduce(
(requiredFlags, e) => _.uniq([...requiredFlags, ..._.castArray(e.properties.required)]),
[] as string[],
);

export const isDashboardExtensionInUse = (e: DashboardExtension, flags: FlagsObject) => {
const requiredFlags = _.castArray(e.properties.required);
return _.every(requiredFlags, (f) => flags[f]);
};
1 change: 1 addition & 0 deletions frontend/public/const.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,5 @@ export enum FLAGS {
CONSOLE_CLI_DOWNLOAD = 'CONSOLE_CLI_DOWNLOAD',
CONSOLE_NOTIFICATION = 'CONSOLE_NOTIFICATION',
CONSOLE_EXTERNAL_LOG_LINK = 'CONSOLE_EXTERNAL_LOG_LINK',
BAREMETAL = 'BAREMETAL',
}