@openshift-assisted/ui-lib
Version:
React component library for the Assisted Installer UI
174 lines • 11.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const react_1 = tslib_1.__importDefault(require("react"));
const react_redux_1 = require("react-redux");
const formik_1 = require("formik");
const react_core_1 = require("@patternfly/react-core");
const common_1 = require("../../../../common");
const ClusterDefaultConfigurationContext_1 = require("../ClusterDefaultConfigurationContext");
const ClusterWizardContext_1 = require("../../clusterWizard/ClusterWizardContext");
const ClusterWizardFooter_1 = tslib_1.__importDefault(require("../../clusterWizard/ClusterWizardFooter"));
const wizardTransition_1 = require("../../clusterWizard/wizardTransition");
const ClusterWizardNavigation_1 = tslib_1.__importDefault(require("../../clusterWizard/ClusterWizardNavigation"));
const NetworkConfigurationTable_1 = tslib_1.__importDefault(require("./NetworkConfigurationTable"));
const useInfraEnv_1 = tslib_1.__importDefault(require("../../../hooks/useInfraEnv"));
const selectors_1 = require("../../../store/slices/current-cluster/selectors");
const networkConfigurationValidation_1 = require("./networkConfigurationValidation");
const NetworkConfiguration_1 = tslib_1.__importDefault(require("./NetworkConfiguration"));
const sentry_1 = require("../../../sentry");
const services_1 = require("../../../services");
const slice_1 = require("../../../store/slices/current-cluster/slice");
const api_1 = require("../../../../common/api");
const hooks_1 = require("../../../hooks");
const newFeatureSupportLevels_1 = require("../../../../common/components/newFeatureSupportLevels");
const use_feature_1 = require("../../../hooks/use-feature");
const NetworkConfigurationForm = ({ cluster, hostSubnets, defaultNetworkSettings, infraEnv }) => {
const { alerts } = (0, common_1.useAlerts)();
const clusterWizardContext = (0, ClusterWizardContext_1.useClusterWizardContext)();
const { isViewerMode } = (0, react_redux_1.useSelector)(selectors_1.selectCurrentClusterPermissionsState);
const { errors, touched, isSubmitting, isValid, setFieldValue, values } = (0, formik_1.useFormikContext)();
const isAutoSaveRunning = (0, common_1.useFormikAutoSave)();
const errorFields = (0, common_1.getFormikErrorFields)(errors, touched);
const isSingleClusterFeatureEnabled = (0, use_feature_1.useFeature)('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE');
const { addAlert } = (0, common_1.useAlerts)();
const dispatch = (0, react_redux_1.useDispatch)();
// DHCP allocation is currently not supported for Nutanix hosts
// https://issues.redhat.com/browse/MGMT-12382
const isHostsPlatformTypeNutanix = react_1.default.useMemo(() => { var _a; return ((_a = cluster.platform) === null || _a === void 0 ? void 0 : _a.type) === 'nutanix'; }, [cluster.platform]);
react_1.default.useEffect(() => {
if (isHostsPlatformTypeNutanix && values.vipDhcpAllocation) {
setFieldValue('vipDhcpAllocation', false);
}
}, [isHostsPlatformTypeNutanix, setFieldValue, values.vipDhcpAllocation]);
const onNext = react_1.default.useCallback(() => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
if (isSingleClusterFeatureEnabled) {
try {
yield common_1.ClustersAPI.updateInstallConfig(cluster.id, JSON.stringify(JSON.stringify({
featureSet: 'CustomNoUpgrade',
featureGates: ['NoRegistryClusterOperations=true'],
})));
}
catch (e) {
(0, api_1.handleApiError)(e, () => addAlert({
title: 'Failed to update install-config',
message: (0, api_1.getApiErrorMessage)(e),
}));
if ((0, api_1.isUnknownServerError)(e)) {
dispatch((0, slice_1.setServerUpdateError)());
}
return;
}
}
clusterWizardContext.moveNext();
}), [addAlert, cluster.id, clusterWizardContext, dispatch, isSingleClusterFeatureEnabled]);
const footer = (react_1.default.createElement(ClusterWizardFooter_1.default, { cluster: cluster, errorFields: errorFields, isSubmitting: isSubmitting, isNextDisabled: isSubmitting ||
isAutoSaveRunning ||
!!alerts.length ||
!isValid ||
!(0, wizardTransition_1.canNextNetwork)({ cluster }), onNext: () => void onNext(), onBack: () => clusterWizardContext.moveBack(), isBackDisabled: isSubmitting || isAutoSaveRunning }));
return (react_1.default.createElement(common_1.ClusterWizardStep, { navigation: react_1.default.createElement(ClusterWizardNavigation_1.default, { cluster: cluster }), footer: footer },
react_1.default.createElement(react_core_1.Form, null,
react_1.default.createElement(react_core_1.Grid, { hasGutter: true },
react_1.default.createElement(react_core_1.GridItem, null,
react_1.default.createElement(common_1.ClusterWizardStepHeader, null, "Networking")),
react_1.default.createElement(react_core_1.GridItem, { span: 12, lg: 10, xl: 9, xl2: 7 },
react_1.default.createElement(react_core_1.Grid, { hasGutter: true },
react_1.default.createElement(NetworkConfiguration_1.default, { cluster: cluster, hostSubnets: hostSubnets, defaultNetworkSettings: defaultNetworkSettings, isVipDhcpAllocationDisabled: isHostsPlatformTypeNutanix }),
react_1.default.createElement(common_1.SecurityFields, { clusterSshKey: cluster.sshPublicKey, imageSshKey: infraEnv === null || infraEnv === void 0 ? void 0 : infraEnv.sshAuthorizedKey, isDisabled: isViewerMode }))),
react_1.default.createElement(react_core_1.GridItem, null,
react_1.default.createElement(react_core_1.TextContent, null,
react_1.default.createElement(react_core_1.Text, { component: "h2" }, "Host inventory")),
react_1.default.createElement(NetworkConfigurationTable_1.default, { cluster: cluster }))))));
};
const NetworkConfigurationPage = ({ cluster }) => {
const pullSecret = (0, hooks_1.usePullSecret)();
const { infraEnv, error: infraEnvError, isLoading, } = (0, useInfraEnv_1.default)(cluster.id, cluster.cpuArchitecture
? cluster.cpuArchitecture
: common_1.CpuArchitecture.USE_DAY1_ARCHITECTURE, cluster.name, pullSecret, cluster.openshiftVersion);
const defaultNetworkValues = (0, ClusterDefaultConfigurationContext_1.useDefaultConfiguration)([
'clusterNetworksDualstack',
'clusterNetworksIpv4',
'serviceNetworksDualstack',
'serviceNetworksIpv4',
]);
const { addAlert, clearAlerts, alerts } = (0, common_1.useAlerts)();
const dispatch = (0, react_redux_1.useDispatch)();
const { isViewerMode } = (0, react_redux_1.useSelector)(selectors_1.selectCurrentClusterPermissionsState);
const hostSubnets = react_1.default.useMemo(() => (0, common_1.getHostSubnets)(cluster, true), [cluster]);
const featureSupportLevelData = (0, newFeatureSupportLevels_1.useNewFeatureSupportLevel)();
const isClusterManagedNetworkingUnsupported = !featureSupportLevelData.isFeatureSupported('CLUSTER_MANAGED_NETWORKING');
const initialValues = react_1.default.useMemo(() => (0, networkConfigurationValidation_1.getNetworkInitialValues)(cluster, defaultNetworkValues, isClusterManagedNetworkingUnsupported),
// eslint-disable-next-line react-hooks/exhaustive-deps
[]);
const memoizedValidationSchema = react_1.default.useMemo(() => (0, networkConfigurationValidation_1.getNetworkConfigurationValidationSchema)(initialValues, hostSubnets), [hostSubnets, initialValues]);
react_1.default.useEffect(() => {
if (infraEnvError) {
const title = `Failed to retrieve infra env (clusterId: ${cluster.id})`;
//TODO(brotman) add handling of existing errors to alerts context
if (alerts.find((alert) => alert.title === title)) {
return;
}
(0, sentry_1.captureException)(infraEnvError, title);
addAlert({
title,
message: infraEnvError,
});
}
//shouldn't respond to cluster polling. shouldn't respond to alerts changes so remove alert wouldn't trigger adding it back
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [infraEnvError]);
const handleSubmit = (values) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
clearAlerts();
// update the cluster configuration
try {
const isMultiNodeCluster = !(0, common_1.isSNO)(cluster);
const isUserManagedNetworking = values.managedNetworkingType === 'userManaged';
const params = {
apiVips: values.apiVips,
ingressVips: values.ingressVips,
sshPublicKey: values.sshPublicKey,
vipDhcpAllocation: values.vipDhcpAllocation,
networkType: values.networkType,
machineNetworks: values.machineNetworks,
clusterNetworks: values.clusterNetworks,
serviceNetworks: values.serviceNetworks,
userManagedNetworking: isUserManagedNetworking,
};
if (params.userManagedNetworking) {
params.apiVips = [];
params.ingressVips = [];
if (isMultiNodeCluster) {
delete params.machineNetworks;
}
}
else {
// cluster-managed can't be chosen in SNO, so this must be a multi-node cluster
if (values.vipDhcpAllocation) {
delete params.apiVips;
delete params.ingressVips;
}
else if (values.stackType === common_1.IPV4_STACK) {
// The API will rebuild the default machineNetwork
params.machineNetworks = [];
}
}
const { data } = yield services_1.ClustersService.update(cluster.id, cluster.tags, params);
dispatch((0, slice_1.updateClusterBase)(data));
}
catch (e) {
(0, api_1.handleApiError)(e, () => addAlert({ title: 'Failed to update the cluster', message: (0, api_1.getApiErrorMessage)(e) }));
if ((0, api_1.isUnknownServerError)(e)) {
dispatch((0, slice_1.setServerUpdateError)());
}
}
});
if (isLoading) {
return react_1.default.createElement(common_1.LoadingState, null);
}
const onSubmit = isViewerMode ? () => Promise.resolve() : handleSubmit;
return (react_1.default.createElement(formik_1.Formik, { initialValues: initialValues, validationSchema: memoizedValidationSchema, onSubmit: onSubmit, validateOnMount: true },
react_1.default.createElement(NetworkConfigurationForm, { cluster: cluster, hostSubnets: hostSubnets, defaultNetworkSettings: defaultNetworkValues, infraEnv: infraEnv })));
};
exports.default = NetworkConfigurationPage;
//# sourceMappingURL=NetworkConfigurationForm.js.map