Skip to content

Commit

Permalink
feat: [WD-18674] CMS Fields - ZFS.Poolname
Browse files Browse the repository at this point in the history
Signed-off-by: Nkeiruka <[email protected]>
  • Loading branch information
Kxiru committed Feb 5, 2025
1 parent 5b346e2 commit a2b4f7b
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 16 deletions.
5 changes: 5 additions & 0 deletions src/api/storage-pools.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ export const createClusteredPool = (
pool: LxdStoragePool,
clusterMembers: LxdClusterMember[],
sourcePerClusterMember?: ClusterSpecificValues,
zfsPoolNamePerClusterMember?: ClusterSpecificValues,
): Promise<void> => {
const { memberPoolPayload, clusterPoolPayload } =
getClusterAndMemberPoolPayload(pool);
Expand All @@ -112,6 +113,10 @@ export const createClusteredPool = (
config: {
...memberPoolPayload.config,
source: sourcePerClusterMember?.[item.server_name],

...(zfsPoolNamePerClusterMember?.[item.server_name] && {
"zfs.pool_name": zfsPoolNamePerClusterMember[item.server_name],
}),
},
};
return createPool(clusteredMemberPool, item.server_name);
Expand Down
19 changes: 14 additions & 5 deletions src/components/forms/ClusterSpecificInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ interface Props {
id: string;
isReadOnly: boolean;
onChange: (value: ClusterSpecificValues) => void;
toggleReadOnly: () => void;
toggleReadOnly?: () => void;
memberNames: string[];
values?: ClusterSpecificValues;
canToggleSpecific?: boolean;
isDefaultSpecific?: boolean;
clusterMemberLinkTarget?: (member: string) => string;
disabled?: boolean;
helpText?: string;
placeholder?: string;
classname?: string;
}

const ClusterSpecificInput: FC<Props> = ({
Expand All @@ -24,12 +26,14 @@ const ClusterSpecificInput: FC<Props> = ({
isReadOnly,
memberNames,
onChange,
toggleReadOnly,
toggleReadOnly = () => {},
canToggleSpecific = true,
isDefaultSpecific = null,
clusterMemberLinkTarget = () => "/ui/cluster",
disabled = false,
helpText,
placeholder,
classname = "u-sv3",
}) => {
const [isSpecific, setIsSpecific] = useState<boolean | null>(
isDefaultSpecific,
Expand Down Expand Up @@ -61,12 +65,13 @@ const ClusterSpecificInput: FC<Props> = ({
};

return (
<div className="u-sv3">
<div className={classname}>
{canToggleSpecific && !isReadOnly && (
<CheckboxInput
id={`${id}-same-for-all-toggle`}
label="Same for all cluster members"
checked={!isSpecific}
labelClassName="cluster-specific-toggle-label"
onChange={() => {
setIsSpecific((val) => !val);
}}
Expand All @@ -90,7 +95,9 @@ const ClusterSpecificInput: FC<Props> = ({
{isReadOnly ? (
<>
{activeValue}
<FormEditButton toggleReadOnly={toggleReadOnly} />
{!disabled && (
<FormEditButton toggleReadOnly={toggleReadOnly} />
)}
</>
) : (
<Input
Expand All @@ -102,6 +109,7 @@ const ClusterSpecificInput: FC<Props> = ({
value={activeValue}
onChange={(e) => setValueForMember(e.target.value, item)}
disabled={disabled}
placeholder={placeholder}
/>
)}
</div>
Expand All @@ -120,7 +128,7 @@ const ClusterSpecificInput: FC<Props> = ({
{isReadOnly ? (
<>
{firstValue}
<FormEditButton toggleReadOnly={toggleReadOnly} />
{!disabled && <FormEditButton toggleReadOnly={toggleReadOnly} />}
</>
) : (
<Input
Expand All @@ -130,6 +138,7 @@ const ClusterSpecificInput: FC<Props> = ({
onChange={(e) => setValueForAllMembers(e.target.value)}
disabled={disabled}
help={helpText}
placeholder={placeholder}
/>
)}
</div>
Expand Down
1 change: 1 addition & 0 deletions src/pages/storage/CreateStoragePool.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ const CreateStoragePool: FC = () => {
storagePool,
clusterMembers,
values.sourcePerClusterMember,
values.zfsPoolNamePerClusterMember,
)
: () => createPool(storagePool);

Expand Down
42 changes: 42 additions & 0 deletions src/pages/storage/forms/ClusteredZfsNameSelector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import ClusterSpecificInput from "components/forms/ClusterSpecificInput";
import { FormikProps } from "formik";
import { FC } from "react";
import { StoragePoolFormValues } from "./StoragePoolForm";
import { useClusterMembers } from "context/useClusterMembers";
import { ensureEditMode } from "util/instanceEdit";

interface Props {
formik: FormikProps<StoragePoolFormValues>;
helpText?: string;
disabled?: boolean;
placeholder?: string;
}

const ClusteredZfsNameSelector: FC<Props> = ({
formik,
helpText,
disabled = !formik.values.isCreating,
placeholder,
}) => {
const { data: clusterMembers = [] } = useClusterMembers();
const memberNames = clusterMembers.map((member) => member.server_name);

return (
<ClusterSpecificInput
values={formik.values.zfsPoolNamePerClusterMember}
id="zfsPoolNamePerClusterMember"
isReadOnly={!formik.values.isCreating}
onChange={(value) => {
void formik.setFieldValue("zfsPoolNamePerClusterMember", value);
}}
canToggleSpecific={formik.values.isCreating}
memberNames={memberNames}
disabled={disabled}
helpText={helpText}
placeholder={placeholder}
classname=""
/>
);
};

export default ClusteredZfsNameSelector;
1 change: 1 addition & 0 deletions src/pages/storage/forms/StoragePoolForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ export interface StoragePoolFormValues {
zfs_clone_copy?: string;
zfs_export?: string;
zfs_pool_name?: string;
zfsPoolNamePerClusterMember?: ClusterSpecificValues;
}

interface Props {
Expand Down
9 changes: 4 additions & 5 deletions src/pages/storage/forms/StoragePoolFormMain.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ const StoragePoolFormMain: FC<Props> = ({ formik }) => {
const sourceHelpText = formik.values.isCreating
? getSourceHelpForDriver(formik.values.driver)
: "Source can't be changed";
const nameHelpText = !formik.values.isCreating
? "Cannot rename storage pools"
: undefined;

return (
<ScrollableForm>
Expand All @@ -65,11 +68,7 @@ const StoragePoolFormMain: FC<Props> = ({ formik }) => {
label="Name"
required
disabled={!formik.values.isCreating}
help={
!formik.values.isCreating
? "Cannot rename storage pools"
: undefined
}
help={nameHelpText}
/>
<AutoExpandingTextArea
{...getFormProps("description")}
Expand Down
23 changes: 22 additions & 1 deletion src/pages/storage/forms/StoragePoolFormZFS.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@ import { getConfigurationRow } from "components/ConfigurationRow";
import { Input, Select } from "@canonical/react-components";
import { optionTrueFalse } from "util/instanceOptions";
import ScrollableConfigurationTable from "components/forms/ScrollableConfigurationTable";
import ClusteredZfsNameSelector from "./ClusteredZfsNameSelector";
import { isClusteredServer } from "util/settings";
import { useSettings } from "context/useSettings";

interface Props {
formik: FormikProps<StoragePoolFormValues>;
}

const StoragePoolFormZFS: FC<Props> = ({ formik }) => {
const { data: settings } = useSettings();

return (
<ScrollableConfigurationTable
rows={[
Expand All @@ -19,7 +24,23 @@ const StoragePoolFormZFS: FC<Props> = ({ formik }) => {
label: "ZFS pool name",
name: "zfs_pool_name",
defaultValue: "",
children: <Input type="text" placeholder="Enter ZFS pool name" />,
children: isClusteredServer(settings) ? (
<ClusteredZfsNameSelector
formik={formik}
placeholder="Enter ZFS pool name"
/>
) : (
<Input type="text" placeholder="Enter ZFS pool name" />
),
readOnlyRenderer: (value) =>
isClusteredServer(settings) && value !== "-" ? (
<ClusteredZfsNameSelector
formik={formik}
placeholder="Enter ZFS pool name"
/>
) : (
<>{value}</>
),
disabled: !formik.values.isCreating || formik.values.readOnly,
disabledReason: "ZFS pool name cannot be modified",
}),
Expand Down
8 changes: 7 additions & 1 deletion src/sass/_cluster_specific_input.scss
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
align-items: center;
display: grid;
gap: $sp-medium;
grid-template-columns: fit-content(20%) 1fr;
grid-template-columns: fit-content(50%) 1fr;
padding-bottom: $spv--large;

.cluster-specific-member {
Expand All @@ -13,3 +13,9 @@
grid-column-start: 2;
}
}

.configuration-table {
.cluster-specific-toggle-label {
margin-bottom: $spv--small !important;
}
}
12 changes: 8 additions & 4 deletions src/util/storagePoolForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ export const toStoragePoolFormValues = (
poolOnMembers?: LXDStoragePoolOnClusterMember[],
): StoragePoolFormValues => {
const sourcePerClusterMember: ClusterSpecificValues = {};
poolOnMembers?.forEach(
(item) =>
(sourcePerClusterMember[item.memberName] = item.config?.source ?? ""),
);
const zfsPoolNamePerClusterMember: ClusterSpecificValues = {};

poolOnMembers?.forEach((item) => {
sourcePerClusterMember[item.memberName] = item.config?.source ?? "";
zfsPoolNamePerClusterMember[item.memberName] =
item.config?.["zfs.pool_name"] ?? "";
});

return {
readOnly: true,
Expand Down Expand Up @@ -53,6 +56,7 @@ export const toStoragePoolFormValues = (
zfs_pool_name: pool.config?.["zfs.pool_name"],
sourcePerClusterMember,
barePool: pool,
zfsPoolNamePerClusterMember,
};
};

Expand Down

0 comments on commit a2b4f7b

Please sign in to comment.