diff --git a/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/details-card.tsx b/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/details-card.tsx index 3e2db0996fe..816873d90a5 100644 --- a/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/details-card.tsx +++ b/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/details-card.tsx @@ -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'; @@ -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), diff --git a/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/top-consumers-card/top-consumers-card.tsx b/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/top-consumers-card/top-consumers-card.tsx index c70c7c1a617..f2b853c00e7 100644 --- a/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/top-consumers-card/top-consumers-card.tsx +++ b/frontend/packages/ceph-storage-plugin/src/components/dashboard-page/storage-dashboard/top-consumers-card/top-consumers-card.tsx @@ -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'; @@ -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 }; diff --git a/frontend/packages/ceph-storage-plugin/src/components/ocs-install/node-list.tsx b/frontend/packages/ceph-storage-plugin/src/components/ocs-install/node-list.tsx index 11d9886cff4..9c0447c762e 100644 --- a/frontend/packages/ceph-storage-plugin/src/components/ocs-install/node-list.tsx +++ b/frontend/packages/ceph-storage-plugin/src/components/ocs-install/node-list.tsx @@ -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'; @@ -263,7 +264,7 @@ const CustomNodeTable: React.FC = ({ 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[]) => { diff --git a/frontend/packages/ceph-storage-plugin/src/selectors/index.ts b/frontend/packages/ceph-storage-plugin/src/selectors/index.ts index de5bb88b022..e24a1014bb4 100644 --- a/frontend/packages/ceph-storage-plugin/src/selectors/index.ts +++ b/frontend/packages/ceph-storage-plugin/src/selectors/index.ts @@ -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'); diff --git a/frontend/packages/console-plugin-sdk/src/typings/dashboards.ts b/frontend/packages/console-plugin-sdk/src/typings/dashboards.ts index 1133bab6f02..4aeae255359 100644 --- a/frontend/packages/console-plugin-sdk/src/typings/dashboards.ts +++ b/frontend/packages/console-plugin-sdk/src/typings/dashboards.ts @@ -13,7 +13,7 @@ import { LazyLoader } from './types'; namespace ExtensionProperties { interface DashboardExtension { /** Name of feature flag for this item. */ - required: string; + required: string | string[]; } interface DashboardsOverviewHealthSubsystem extends DashboardExtension { diff --git a/frontend/packages/console-shared/src/selectors/index.ts b/frontend/packages/console-shared/src/selectors/index.ts index 01e75f3d7c1..72780fd6e11 100644 --- a/frontend/packages/console-shared/src/selectors/index.ts +++ b/frontend/packages/console-shared/src/selectors/index.ts @@ -1,2 +1,3 @@ export * from './common'; export * from './machine'; +export * from './infrastructure'; diff --git a/frontend/packages/console-shared/src/selectors/infrastructure.ts b/frontend/packages/console-shared/src/selectors/infrastructure.ts new file mode 100644 index 00000000000..5a1caef21a2 --- /dev/null +++ b/frontend/packages/console-shared/src/selectors/infrastructure.ts @@ -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'); diff --git a/frontend/packages/metal3-plugin/src/plugin.ts b/frontend/packages/metal3-plugin/src/plugin.ts index 3a69ff0fcdd..297b70606cc 100644 --- a/frontend/packages/metal3-plugin/src/plugin.ts +++ b/frontend/packages/metal3-plugin/src/plugin.ts @@ -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'; @@ -46,7 +47,7 @@ const plugin: Plugin = [ componentProps: { name: 'Bare Metal Hosts', resource: referenceForModel(BaremetalHostModel), - required: METAL3_FLAG, + required: [FLAGS.BAREMETAL, METAL3_FLAG], }, }, }, @@ -107,7 +108,7 @@ const plugin: Plugin = [ ], model: BaremetalHostModel, mapper: getBMHStatusGroups, - required: METAL3_FLAG, + required: [FLAGS.BAREMETAL, METAL3_FLAG], }, }, ]; diff --git a/frontend/packages/noobaa-storage-plugin/src/components/details-card/details-card.tsx b/frontend/packages/noobaa-storage-plugin/src/components/details-card/details-card.tsx index 5cd5e683478..65bed644be3 100644 --- a/frontend/packages/noobaa-storage-plugin/src/components/details-card/details-card.tsx +++ b/frontend/packages/noobaa-storage-plugin/src/components/details-card/details-card.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import * as _ from 'lodash'; +import { getInfrastructurePlatform } from '@console/shared'; import { DashboardCard, DashboardCardBody, @@ -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'; diff --git a/frontend/public/actions/features.ts b/frontend/public/actions/features.ts index bb7b81519f7..5b093eb4be3 100644 --- a/frontend/public/actions/features.ts +++ b/frontend/public/actions/features.ts @@ -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'; @@ -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( @@ -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, detectCanCreateProject, detectMonitoringURLs, detectClusterVersion, diff --git a/frontend/public/components/dashboard/inventory-card/inventory-item.tsx b/frontend/public/components/dashboard/inventory-card/inventory-item.tsx index cb6ed3843d9..bb766e91b56 100644 --- a/frontend/public/components/dashboard/inventory-card/inventory-item.tsx +++ b/frontend/public/components/dashboard/inventory-card/inventory-item.tsx @@ -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]: ( @@ -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; } diff --git a/frontend/public/components/dashboards-page/dashboards.tsx b/frontend/public/components/dashboards-page/dashboards.tsx index 72e52d4a827..b0190a080d6 100644 --- a/frontend/public/components/dashboards-page/dashboards.tsx +++ b/frontend/public/components/dashboards-page/dashboards.tsx @@ -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 => ({ @@ -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, diff --git a/frontend/public/components/dashboards-page/overview-dashboard/capacity-card.tsx b/frontend/public/components/dashboards-page/overview-dashboard/capacity-card.tsx index f422a216e31..72900d31a5f 100644 --- a/frontend/public/components/dashboards-page/overview-dashboard/capacity-card.tsx +++ b/frontend/public/components/dashboards-page/overview-dashboard/capacity-card.tsx @@ -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); @@ -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; diff --git a/frontend/public/components/dashboards-page/overview-dashboard/details-card.tsx b/frontend/public/components/dashboards-page/overview-dashboard/details-card.tsx index ba005005ded..4c25b1d8c23 100644 --- a/frontend/public/components/dashboards-page/overview-dashboard/details-card.tsx +++ b/frontend/public/components/dashboards-page/overview-dashboard/details-card.tsx @@ -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, @@ -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, diff --git a/frontend/public/components/dashboards-page/overview-dashboard/health-card.tsx b/frontend/public/components/dashboards-page/overview-dashboard/health-card.tsx index b6953c17cd5..f9a2fb3cf98 100644 --- a/frontend/public/components/dashboards-page/overview-dashboard/health-card.tsx +++ b/frontend/public/components/dashboards-page/overview-dashboard/health-card.tsx @@ -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'; @@ -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, diff --git a/frontend/public/components/dashboards-page/overview-dashboard/inventory-card.tsx b/frontend/public/components/dashboards-page/overview-dashboard/inventory-card.tsx index 2aed3d64110..6294251979b 100644 --- a/frontend/public/components/dashboards-page/overview-dashboard/inventory-card.tsx +++ b/frontend/public/components/dashboards-page/overview-dashboard/inventory-card.tsx @@ -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'; @@ -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]; diff --git a/frontend/public/components/dashboards-page/overview-dashboard/top-consumers-card.tsx b/frontend/public/components/dashboards-page/overview-dashboard/top-consumers-card.tsx index f413e2c4c7c..7fac21be2c1 100644 --- a/frontend/public/components/dashboards-page/overview-dashboard/top-consumers-card.tsx +++ b/frontend/public/components/dashboards-page/overview-dashboard/top-consumers-card.tsx @@ -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]: { @@ -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, diff --git a/frontend/public/components/dashboards-page/overview-dashboard/utilization-card.tsx b/frontend/public/components/dashboards-page/overview-dashboard/utilization-card.tsx index e868fddf7e2..b6872a18f19 100644 --- a/frontend/public/components/dashboards-page/overview-dashboard/utilization-card.tsx +++ b/frontend/public/components/dashboards-page/overview-dashboard/utilization-card.tsx @@ -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; @@ -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 = ({ watchPrometheus, diff --git a/frontend/public/components/dashboards-page/utils.ts b/frontend/public/components/dashboards-page/utils.ts index fa12152591e..8da666f4cee 100644 --- a/frontend/public/components/dashboards-page/utils.ts +++ b/frontend/public/components/dashboards-page/utils.ts @@ -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]); +}; diff --git a/frontend/public/const.ts b/frontend/public/const.ts index b91ccecafe8..05e3ad4ef6c 100644 --- a/frontend/public/const.ts +++ b/frontend/public/const.ts @@ -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', }