Skip to content

Commit bf67cf2

Browse files
authored
Merge pull request #3816 from dlabrecq/unleash
Unleash toggles
2 parents 7f13df7 + a16e934 commit bf67cf2

File tree

9 files changed

+79
-70
lines changed

9 files changed

+79
-70
lines changed

src/components/featureToggle/featureToggle.tsx

+24-24
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,28 @@ import { FeatureToggleActions } from 'store/featureToggle';
66

77
// eslint-disable-next-line no-shadow
88
export const enum FeatureToggle {
9-
clusterInfo = 'cost-management.ui.cluster.info', // https://issues.redhat.com/browse/COST-4559
9+
awsEc2Instances = 'cost-management.ui.aws-ec2-instances', // https://issues.redhat.com/browse/COST-4855
1010
debug = 'cost-management.ui.debug',
1111
exports = 'cost-management.ui.exports', // Async exports https://issues.redhat.com/browse/COST-2223
1212
finsights = 'cost-management.ui.finsights', // RHEL support for FINsights https://issues.redhat.com/browse/COST-3306
1313
ibm = 'cost-management.ui.ibm', // IBM https://issues.redhat.com/browse/COST-935
14+
ocpCloudNetworking = 'cost-management.ui.ocp-cloud-networking', // https://issues.redhat.com/browse/COST-4781
15+
ocpProjectStorage = 'cost-management.ui.ocp-project-storage', // https://issues.redhat.com/browse/COST-4856
1416
ros = 'cost-management.ui.ros', // ROS support https://issues.redhat.com/browse/COST-3477
1517
rosBeta = 'cost-management.ui.ros-beta', // ROS support https://issues.redhat.com/browse/COST-3477
16-
settingsPlatform = 'cost-management.ui.settings.platform', // Platform projects https://issues.redhat.com/browse/COST-3818
17-
tagMapping = 'cost-management.ui.tag.mapping', // https://issues.redhat.com/browse/COST-3824
1818
}
1919

2020
const useIsToggleEnabled = (toggle: FeatureToggle) => {
2121
const client = useUnleashClient();
2222
return client.isEnabled(toggle);
2323
};
2424

25-
export const useIsDebugToggleEnabled = () => {
26-
return useIsToggleEnabled(FeatureToggle.debug);
25+
export const useIsAwsEc2InstancesToggleEnabled = () => {
26+
return useIsToggleEnabled(FeatureToggle.awsEc2Instances);
2727
};
2828

29-
export const useIsClusterInfoToggleEnabled = () => {
30-
return useIsToggleEnabled(FeatureToggle.clusterInfo);
29+
export const useIsDebugToggleEnabled = () => {
30+
return useIsToggleEnabled(FeatureToggle.debug);
3131
};
3232

3333
export const useIsExportsToggleEnabled = () => {
@@ -42,34 +42,34 @@ export const useIsIbmToggleEnabled = () => {
4242
return useIsToggleEnabled(FeatureToggle.ibm);
4343
};
4444

45+
export const useIsOcpCloudNetworkingToggleEnabled = () => {
46+
return useIsToggleEnabled(FeatureToggle.ocpCloudNetworking);
47+
};
48+
49+
export const useIsOcpProjectStorageToggleEnabled = () => {
50+
return useIsToggleEnabled(FeatureToggle.ocpProjectStorage);
51+
};
52+
4553
export const useIsRosToggleEnabled = () => {
4654
const { isBeta } = useChrome();
4755
const isRosToggleEnabled = useIsToggleEnabled(FeatureToggle.ros);
4856
const isRosFeatureBetaEnabled = useIsToggleEnabled(FeatureToggle.rosBeta) && isBeta(); // Enabled for prod-beta
4957
return isRosToggleEnabled || isRosFeatureBetaEnabled;
5058
};
5159

52-
export const useIsSettingsPlatformToggleEnabled = () => {
53-
return useIsToggleEnabled(FeatureToggle.settingsPlatform);
54-
};
55-
56-
export const useIsTagMappingToggleEnabled = () => {
57-
return useIsToggleEnabled(FeatureToggle.tagMapping);
58-
};
59-
6060
// The FeatureToggle component saves feature toggles in store for places where Unleash hooks not available
6161
export const useFeatureToggle = () => {
6262
const dispatch = useDispatch();
6363
const { auth } = useChrome();
6464

65-
const isClusterInfoToggleEnabled = useIsClusterInfoToggleEnabled();
65+
const isAwsEc2InstancesToggleEnabled = useIsAwsEc2InstancesToggleEnabled();
6666
const isDebugToggleEnabled = useIsDebugToggleEnabled();
6767
const isExportsToggleEnabled = useIsExportsToggleEnabled();
6868
const isFinsightsToggleEnabled = useIsFinsightsToggleEnabled();
6969
const isIbmToggleEnabled = useIsIbmToggleEnabled();
70+
const isOcpCloudNetworkingToggleEnabled = useIsOcpCloudNetworkingToggleEnabled();
71+
const isOcpProjectStorageToggleEnabled = useIsOcpProjectStorageToggleEnabled();
7072
const isRosToggleEnabled = useIsRosToggleEnabled();
71-
const isSettingsPlatformToggleEnabled = useIsSettingsPlatformToggleEnabled();
72-
const isTagMappingToggleEnabled = useIsTagMappingToggleEnabled();
7373

7474
const fetchUser = callback => {
7575
auth.getUser().then(user => {
@@ -81,29 +81,29 @@ export const useFeatureToggle = () => {
8181
// Workaround for code that doesn't use hooks
8282
dispatch(
8383
FeatureToggleActions.setFeatureToggle({
84-
isClusterInfoToggleEnabled,
84+
isAwsEc2InstancesToggleEnabled,
8585
isDebugToggleEnabled,
8686
isExportsToggleEnabled,
8787
isFinsightsToggleEnabled,
8888
isIbmToggleEnabled,
89+
isOcpCloudNetworkingToggleEnabled,
90+
isOcpProjectStorageToggleEnabled,
8991
isRosToggleEnabled,
90-
isSettingsPlatformToggleEnabled,
91-
isTagMappingToggleEnabled,
9292
})
9393
);
9494
if (isDebugToggleEnabled) {
9595
// eslint-disable-next-line no-console
9696
fetchUser(identity => console.log('User identity:', identity));
9797
}
9898
}, [
99-
isClusterInfoToggleEnabled,
99+
isAwsEc2InstancesToggleEnabled,
100100
isDebugToggleEnabled,
101101
isExportsToggleEnabled,
102102
isFinsightsToggleEnabled,
103103
isIbmToggleEnabled,
104+
isOcpCloudNetworkingToggleEnabled,
105+
isOcpProjectStorageToggleEnabled,
104106
isRosToggleEnabled,
105-
isSettingsPlatformToggleEnabled,
106-
isTagMappingToggleEnabled,
107107
]);
108108
};
109109

src/routes/details/components/breakdown/breakdownHeader.tsx

+5-7
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { Currency } from 'routes/components/currency';
1818
import { TagLink } from 'routes/details/components/tag';
1919
import { getGroupByCostCategory, getGroupByOrgValue, getGroupByTagKey } from 'routes/utils/groupBy';
2020
import { createMapStateToProps } from 'store/common';
21-
import { FeatureToggleSelectors } from 'store/featureToggle';
2221
import { getTotalCostDateRangeString } from 'utils/dates';
2322
import { formatCurrency } from 'utils/format';
2423
import { awsCategoryKey, orgUnitIdKey, tagKey } from 'utils/props';
@@ -51,7 +50,7 @@ interface BreakdownHeaderOwnProps extends RouterComponentProps {
5150
}
5251

5352
interface BreakdownHeaderStateProps {
54-
isClusterInfoToggleEnabled?: boolean;
53+
// TBD...
5554
}
5655

5756
interface BreakdownHeaderDispatchProps {
@@ -100,7 +99,6 @@ class BreakdownHeader extends React.Component<BreakdownHeaderProps, any> {
10099
description,
101100
groupBy,
102101
intl,
103-
isClusterInfoToggleEnabled,
104102
onCostDistributionSelect,
105103
onCostTypeSelect,
106104
onCurrencySelect,
@@ -136,7 +134,7 @@ class BreakdownHeader extends React.Component<BreakdownHeaderProps, any> {
136134
? orgUnitIdKey
137135
: groupBy;
138136

139-
const showClusterInfo = clusterInfoComponent && isClusterInfoToggleEnabled;
137+
const showClusterInfo = clusterInfoComponent;
140138

141139
return (
142140
<header style={styles.header}>
@@ -176,7 +174,7 @@ class BreakdownHeader extends React.Component<BreakdownHeaderProps, any> {
176174
) : null}
177175
</FlexItem>
178176
)}
179-
{dataDetailsComponent && isClusterInfoToggleEnabled ? <FlexItem>{dataDetailsComponent}</FlexItem> : null}
177+
{dataDetailsComponent ? <FlexItem>{dataDetailsComponent}</FlexItem> : null}
180178
{showCostDistribution && (
181179
<FlexItem style={styles.costDistribution}>
182180
<CostDistribution costDistribution={costDistribution} onSelect={onCostDistributionSelect} />
@@ -213,9 +211,9 @@ class BreakdownHeader extends React.Component<BreakdownHeaderProps, any> {
213211
}
214212
}
215213

216-
const mapStateToProps = createMapStateToProps<BreakdownHeaderOwnProps, BreakdownHeaderStateProps>(state => {
214+
const mapStateToProps = createMapStateToProps<BreakdownHeaderOwnProps, BreakdownHeaderStateProps>(() => {
217215
return {
218-
isClusterInfoToggleEnabled: FeatureToggleSelectors.selectIsClusterInfoToggleEnabled(state),
216+
// TBD...
219217
};
220218
});
221219

src/routes/settings/settings.tsx

+4-11
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { PlatformProjects } from 'routes/settings/platformProjects';
1919
import { TagLabels } from 'routes/settings/tagLabels';
2020
import type { RootState } from 'store';
2121
import { FetchStatus } from 'store/common';
22-
import { FeatureToggleSelectors } from 'store/featureToggle';
2322
import { userAccessQuery, userAccessSelectors } from 'store/userAccess';
2423
import type { ChromeComponentProps } from 'utils/chrome';
2524
import { withChrome } from 'utils/chrome';
@@ -67,7 +66,6 @@ export interface SettingsMapProps {
6766
}
6867

6968
export interface SettingsStateProps {
70-
isSettingsPlatformEnabled?: boolean;
7169
userAccess: UserAccess;
7270
userAccessError: AxiosError;
7371
userAccessFetchStatus: FetchStatus;
@@ -78,7 +76,7 @@ type SettingsProps = SettingsOwnProps;
7876

7977
const Settings: React.FC<SettingsProps> = () => {
8078
const [activeTabKey, setActiveTabKey] = useState(0);
81-
const { isSettingsPlatformEnabled, userAccess, userAccessFetchStatus } = useMapToProps();
79+
const { userAccess, userAccessFetchStatus } = useMapToProps();
8280
const intl = useIntl();
8381

8482
const canWrite = () => {
@@ -108,13 +106,11 @@ const Settings: React.FC<SettingsProps> = () => {
108106
contentRef: React.createRef(),
109107
tab: SettingsTab.costCategory,
110108
},
111-
];
112-
if (isSettingsPlatformEnabled) {
113-
availableTabs.push({
109+
{
114110
contentRef: React.createRef(),
115111
tab: SettingsTab.platformProjects,
116-
});
117-
}
112+
},
113+
];
118114
return availableTabs;
119115
};
120116

@@ -236,9 +232,6 @@ const useMapToProps = (): SettingsStateProps => {
236232
);
237233

238234
return {
239-
isSettingsPlatformEnabled: useSelector((state: RootState) =>
240-
FeatureToggleSelectors.selectIsSettingsPlatformToggleEnabled(state)
241-
),
242235
userAccess,
243236
userAccessError,
244237
userAccessFetchStatus,

src/routes/settings/tagLabels/tagLabels.tsx

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { Accordion, AccordionContent, AccordionItem, AccordionToggle, PageSection } from '@patternfly/react-core';
2-
import { useIsTagMappingToggleEnabled } from 'components/featureToggle';
32
import messages from 'locales/messages';
43
import React, { useState } from 'react';
54
import { useIntl } from 'react-intl';
@@ -36,7 +35,6 @@ type TagLabelsProps = TagLabelsOwnProps;
3635

3736
const TagLabels: React.FC<TagLabelsProps> = ({ canWrite }) => {
3837
const [activeKey, setActiveKey] = useState(0);
39-
const isTagMappingToggleEnabled = useIsTagMappingToggleEnabled();
4038
const intl = useIntl();
4139

4240
const getAvailableItems = () => {
@@ -104,11 +102,7 @@ const TagLabels: React.FC<TagLabelsProps> = ({ canWrite }) => {
104102
return (
105103
<PageSection isFilled>
106104
<div style={styles.container}>
107-
{isTagMappingToggleEnabled ? (
108-
<Accordion asDefinitionList>{getAccordionItem(availableItems)}</Accordion>
109-
) : (
110-
<Tags canWrite={canWrite} />
111-
)}
105+
<Accordion asDefinitionList>{getAccordionItem(availableItems)}</Accordion>
112106
</div>
113107
</PageSection>
114108
);

src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
exports[`default state 1`] = `
44
{
55
"hasFeatureToggle": false,
6-
"isClusterInfoToggleEnabled": false,
6+
"isAwsEc2InstancesToggleEnabled": false,
77
"isDebugToggleEnabled": false,
88
"isExportsToggleEnabled": false,
99
"isFinsightsToggleEnabled": false,
1010
"isIbmToggleEnabled": false,
11+
"isOcpCloudNetworkingToggleEnabled": false,
12+
"isOcpProjectStorageToggleEnabled": false,
1113
"isRosToggleEnabled": false,
12-
"isSettingsPlatformToggleEnabled": false,
13-
"isTagMappingToggleEnabled": false,
1414
}
1515
`;

src/store/featureToggle/featureToggle.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ test('default state', async () => {
1414
expect(selectors.selectFeatureToggleState(store.getState())).toMatchSnapshot();
1515
});
1616

17+
test('AWS EC2 instances feature is enabled', async () => {
18+
const store = createUIStore();
19+
store.dispatch(actions.setFeatureToggle({ isAwsEc2InstancesToggleEnabled: true }));
20+
expect(FeatureToggleSelectors.selectIsAwsEc2InstancesToggleEnabled(store.getState())).toBe(true);
21+
});
22+
23+
test('Debug feature is enabled', async () => {
24+
const store = createUIStore();
25+
store.dispatch(actions.setFeatureToggle({ isDebugToggleEnabled: true }));
26+
expect(FeatureToggleSelectors.selectIsDebugToggleEnabled(store.getState())).toBe(true);
27+
});
28+
1729
test('Exports feature is enabled', async () => {
1830
const store = createUIStore();
1931
store.dispatch(actions.setFeatureToggle({ isExportsToggleEnabled: true }));
@@ -32,6 +44,18 @@ test('IBM feature is enabled', async () => {
3244
expect(FeatureToggleSelectors.selectIsIbmToggleEnabled(store.getState())).toBe(true);
3345
});
3446

47+
test('OCP on cloud networking feature is enabled', async () => {
48+
const store = createUIStore();
49+
store.dispatch(actions.setFeatureToggle({ isOcpCloudNetworkingToggleEnabled: true }));
50+
expect(FeatureToggleSelectors.selectIsOcpCloudNetworkingToggleEnabled(store.getState())).toBe(true);
51+
});
52+
53+
test('OCP project storage feature is enabled', async () => {
54+
const store = createUIStore();
55+
store.dispatch(actions.setFeatureToggle({ isOcpProjectStorageToggleEnabled: true }));
56+
expect(FeatureToggleSelectors.selectIsOcpProjectStorageToggleEnabled(store.getState())).toBe(true);
57+
});
58+
3559
test('ROS feature is enabled', async () => {
3660
const store = createUIStore();
3761
store.dispatch(actions.setFeatureToggle({ isRosToggleEnabled: true }));

src/store/featureToggle/featureToggleActions.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { createAction } from 'typesafe-actions';
22

33
export interface FeatureToggleActionMeta {
4-
isClusterInfoToggleEnabled?: boolean;
4+
isAwsEc2InstancesToggleEnabled?: boolean;
55
isDebugToggleEnabled?: boolean;
66
isExportsToggleEnabled?: boolean;
77
isFinsightsToggleEnabled?: boolean;
88
isIbmToggleEnabled?: boolean;
9+
isOcpCloudNetworkingToggleEnabled?: boolean;
10+
isOcpProjectStorageToggleEnabled?: boolean;
911
isRosToggleEnabled?: boolean;
10-
isSettingsPlatformToggleEnabled?: boolean;
11-
isTagMappingToggleEnabled?: boolean;
1212
}
1313

1414
export const setFeatureToggle = createAction('feature/init_feature_toggle')<FeatureToggleActionMeta>();

src/store/featureToggle/featureToggleReducer.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,26 @@ export type FeatureToggleAction = ActionType<typeof setFeatureToggle | typeof re
88

99
export type FeatureToggleState = Readonly<{
1010
hasFeatureToggle: boolean;
11-
isClusterInfoToggleEnabled: boolean;
11+
isAwsEc2InstancesToggleEnabled;
1212
isDebugToggleEnabled: boolean;
1313
isExportsToggleEnabled: boolean;
1414
isFinsightsToggleEnabled: boolean;
1515
isIbmToggleEnabled: boolean;
16+
isOcpCloudNetworkingToggleEnabled: boolean;
17+
isOcpProjectStorageToggleEnabled: boolean;
1618
isRosToggleEnabled: boolean;
17-
isSettingsPlatformToggleEnabled: boolean;
18-
isTagMappingToggleEnabled: boolean;
1919
}>;
2020

2121
export const defaultState: FeatureToggleState = {
2222
hasFeatureToggle: false,
23-
isClusterInfoToggleEnabled: false,
23+
isAwsEc2InstancesToggleEnabled: false,
2424
isDebugToggleEnabled: false,
2525
isExportsToggleEnabled: false,
2626
isFinsightsToggleEnabled: false,
2727
isIbmToggleEnabled: false,
28+
isOcpCloudNetworkingToggleEnabled: false,
29+
isOcpProjectStorageToggleEnabled: false,
2830
isRosToggleEnabled: false,
29-
isSettingsPlatformToggleEnabled: false,
30-
isTagMappingToggleEnabled: false,
3131
};
3232

3333
export const stateKey = 'FeatureToggle';
@@ -38,14 +38,14 @@ export function FeatureToggleReducer(state = defaultState, action: FeatureToggle
3838
return {
3939
...state,
4040
hasFeatureToggle: true,
41-
isClusterInfoToggleEnabled: action.payload.isClusterInfoToggleEnabled,
41+
isAwsEc2InstancesToggleEnabled: action.payload.isAwsEc2InstancesToggleEnabled,
4242
isDebugToggleEnabled: action.payload.isDebugToggleEnabled,
4343
isExportsToggleEnabled: action.payload.isExportsToggleEnabled,
4444
isFinsightsToggleEnabled: action.payload.isFinsightsToggleEnabled,
4545
isIbmToggleEnabled: action.payload.isIbmToggleEnabled,
46+
isOcpCloudNetworkingToggleEnabled: action.payload.isOcpCloudNetworkingToggleEnabled,
47+
isOcpProjectStorageToggleEnabled: action.payload.isOcpProjectStorageToggleEnabled,
4648
isRosToggleEnabled: action.payload.isRosToggleEnabled,
47-
isSettingsPlatformToggleEnabled: action.payload.isSettingsPlatformToggleEnabled,
48-
isTagMappingToggleEnabled: action.payload.isTagMappingToggleEnabled,
4949
};
5050

5151
default:

src/store/featureToggle/featureToggleSelectors.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ export const selectFeatureToggleState = (state: RootState) => state[stateKey];
66

77
export const selectHasFeatureToggle = (state: RootState) => selectFeatureToggleState(state).hasFeatureToggle;
88

9-
export const selectIsClusterInfoToggleEnabled = (state: RootState) =>
10-
selectFeatureToggleState(state).isClusterInfoToggleEnabled;
9+
export const selectIsAwsEc2InstancesToggleEnabled = (state: RootState) =>
10+
selectFeatureToggleState(state).isAwsEc2InstancesToggleEnabled;
1111
export const selectIsDebugToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isDebugToggleEnabled;
1212
export const selectIsExportsToggleEnabled = (state: RootState) =>
1313
selectFeatureToggleState(state).isExportsToggleEnabled;
1414
export const selectIsFinsightsToggleEnabled = (state: RootState) =>
1515
selectFeatureToggleState(state).isFinsightsToggleEnabled;
1616
export const selectIsIbmToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isIbmToggleEnabled;
17+
export const selectIsOcpCloudNetworkingToggleEnabled = (state: RootState) =>
18+
selectFeatureToggleState(state).isOcpCloudNetworkingToggleEnabled;
19+
export const selectIsOcpProjectStorageToggleEnabled = (state: RootState) =>
20+
selectFeatureToggleState(state).isOcpProjectStorageToggleEnabled;
1721
export const selectIsRosToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isRosToggleEnabled;
18-
export const selectIsSettingsPlatformToggleEnabled = (state: RootState) =>
19-
selectFeatureToggleState(state).isSettingsPlatformToggleEnabled;
20-
export const selectIsTagMappingToggleEnabled = (state: RootState) =>
21-
selectFeatureToggleState(state).isTagMappingToggleEnabled;

0 commit comments

Comments
 (0)