Skip to content

Commit

Permalink
Implment netgroups members
Browse files Browse the repository at this point in the history
Fixes: #546

Signed-off-by: Mark Reynolds <mreynolds@redhat.com>
  • Loading branch information
mreynolds389 committed Sep 11, 2024
1 parent e8ed5e4 commit 6428635
Show file tree
Hide file tree
Showing 20 changed files with 1,159 additions and 88 deletions.
4 changes: 2 additions & 2 deletions src/components/MemberOf/MemberOfToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ const MemberOfToolbar = (props: MemberOfToolbarProps) => {
Add
</Button>
</ToolbarItem>
{/* Membership will show only if `membershipDirectionEnabled` is defined */}
{props.membershipDirectionEnabled !== undefined && (
{/* Membership direction will show only if `membershipDirectionEnabled` is true */}
{props.membershipDirectionEnabled && (
<>
<ToolbarItem
id="separator-membership"
Expand Down
7 changes: 3 additions & 4 deletions src/components/Members/MembersExternal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@ import { UserGroup } from "src/utils/datatypes/globalDataTypes";
import useAlerts from "src/hooks/useAlerts";
import useListPageSearchParams from "src/hooks/useListPageSearchParams";
// RPC
import { ErrorResult } from "src/services/rpc";
import { ErrorResult, MemberPayload } from "src/services/rpc";

import {
MemberPayload,
useAddAsMemberMutation,
useRemoveAsMemberMutation,
} from "src/services/rpcUserGroups";
Expand Down Expand Up @@ -139,7 +138,7 @@ const MembersExternal = (props: PropsToMembersExternal) => {
}

const payload = {
userGroup: props.id,
entryName: props.id,
entityType: "ipaexternalmember",
idsToAdd: newExternalNames,
} as MemberPayload;
Expand Down Expand Up @@ -171,7 +170,7 @@ const MembersExternal = (props: PropsToMembersExternal) => {
// Delete
const onDeleteExternal = () => {
const payload = {
userGroup: props.id,
entryName: props.id,
entityType: "ipaexternalmember",
idsToAdd: externalsSelected,
} as MemberPayload;
Expand Down
49 changes: 36 additions & 13 deletions src/components/Members/MembersHostGroups.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,17 @@ import useListPageSearchParams from "src/hooks/useListPageSearchParams";
// Utils
import { API_VERSION_BACKUP, paginate } from "src/utils/utils";
// RPC
import { ErrorResult } from "src/services/rpc";
import { ErrorResult, MemberPayload } from "src/services/rpc";
import {
MemberPayload,
useAddAsMemberHGMutation,
useGetHostGroupInfoByNameQuery,
useGettingHostGroupsQuery,
useRemoveAsMemberHGMutation,
} from "src/services/rpcHostGroups";
import {
useAddAsMemberNGMutation,
useRemoveAsMemberNGMutation,
} from "src/services/rpcNetgroups";
import { apiToHostGroup } from "src/utils/hostGroupUtils";

interface PropsToMembersHostGroups {
Expand Down Expand Up @@ -128,11 +131,25 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {
}
}, [fullHostGroupsQuery.data, fullHostGroupsQuery.isFetching]);

// Get type of the entity to show as text
const getEntityType = () => {
if (props.from === "host-groups") {
return "host group";
} else if (props.from === "netgroup") {
return "netgroup";
} else {
// Return 'group' as default
return "host group";
}
};

// Computed "states"
const someItemSelected = hostGroupsSelected.length > 0;
const showTableRows = hostGroups.length > 0;
const entityType = getEntityType();
const hostGroupColumnNames = ["Host group name", "Description"];
const hostGroupProperties = ["cn", "description"];
const directionEnabled = props.from !== "netgroup" ? true : false;

// Dialogs and actions
const [showAddModal, setShowAddModal] = React.useState(false);
Expand All @@ -147,8 +164,14 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {

// Add new member to 'HostGroup'
// API calls
const [addMemberToHostGroups] = useAddAsMemberHGMutation();
const [removeMembersFromHostGroups] = useRemoveAsMemberHGMutation();
let [addMembers] = useAddAsMemberHGMutation();
if (props.from === "netgroup") {
[addMembers] = useAddAsMemberNGMutation();
}
let [removeMembers] = useRemoveAsMemberHGMutation();
if (props.from === "netgroup") {
[removeMembers] = useRemoveAsMemberNGMutation();
}
const [adderSearchValue, setAdderSearchValue] = React.useState("");
const [availableHostGroups, setAvailableHostGroups] = React.useState<
HostGroup[]
Expand Down Expand Up @@ -209,19 +232,19 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {
}

const payload = {
hostGroup: props.id,
entryName: props.id,
entityType: "hostgroup",
idsToAdd: newHostGroupNames,
} as MemberPayload;

setSpinning(true);
addMemberToHostGroups(payload).then((response) => {
addMembers(payload).then((response) => {
if ("data" in response) {
if (response.data.result) {
// Set alert: success
alerts.addAlert(
"add-member-success",
"Assigned new host groups to host group '" + props.id + "'",
"Assigned new host groups to " + entityType + " '" + props.id + "'",
"success"
);
// Refresh data
Expand All @@ -241,19 +264,19 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {
// Delete
const onDeleteHostGroups = () => {
const payload = {
hostGroup: props.id,
entryName: props.id,
entityType: "hostgroup",
idsToAdd: hostGroupsSelected,
} as MemberPayload;

setSpinning(true);
removeMembersFromHostGroups(payload).then((response) => {
removeMembers(payload).then((response) => {
if ("data" in response) {
if (response.data.result) {
// Set alert: success
alerts.addAlert(
"remove-hostgroups-success",
"Removed host groups from host group '" + props.id + "'",
"Removed host groups from " + entityType + " '" + props.id + "'",
"success"
);
// Refresh
Expand Down Expand Up @@ -324,7 +347,7 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {
onDeleteButtonClick={() => setShowDeleteModal(true)}
addButtonEnabled={isAddButtonEnabled}
onAddButtonClick={() => setShowAddModal(true)}
membershipDirectionEnabled={true}
membershipDirectionEnabled={directionEnabled}
membershipDirection={membershipDirection}
onMembershipDirectionChange={setMembershipDirection}
helpIconEnabled={true}
Expand Down Expand Up @@ -370,7 +393,7 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {
availableItems={availableItems}
onAdd={onAddHostGroup}
onSearchTextChange={setAdderSearchValue}
title={"Assign host groups to host group: " + props.id}
title={"Assign host groups to " + entityType + ": " + props.id}
ariaLabel={"Add host groups modal"}
spinning={spinning}
/>
Expand All @@ -379,7 +402,7 @@ const MembersHostGroups = (props: PropsToMembersHostGroups) => {
<MemberOfDeleteModal
showModal={showDeleteModal}
onCloseModal={() => setShowDeleteModal(false)}
title={"Delete host groups from host group: " + props.id}
title={"Delete host groups from " + entityType + ": " + props.id}
onDelete={onDeleteHostGroups}
spinning={spinning}
>
Expand Down
49 changes: 36 additions & 13 deletions src/components/Members/MembersHosts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,19 @@ import useListPageSearchParams from "src/hooks/useListPageSearchParams";
// Utils
import { API_VERSION_BACKUP, paginate } from "src/utils/utils";
// RPC
import { ErrorResult } from "src/services/rpc";
import { ErrorResult, MemberPayload } from "src/services/rpc";
import {
useGetHostInfoByNameQuery,
useGettingHostQuery,
} from "src/services/rpcHosts";
import {
MemberPayload,
useAddAsMemberHGMutation,
useRemoveAsMemberHGMutation,
} from "src/services/rpcHostGroups";
import {
useAddAsMemberNGMutation,
useRemoveAsMemberNGMutation,
} from "src/services/rpcNetgroups";
import { apiToHost } from "src/utils/hostUtils";

interface PropsToMembersHosts {
Expand Down Expand Up @@ -126,11 +129,25 @@ const MembersHosts = (props: PropsToMembersHosts) => {
}
}, [fullHostsQuery.data, fullHostsQuery.isFetching]);

// Get type of the entity to show as text
const getEntityType = () => {
if (props.from === "hostgroups") {
return "host group";
} else if (props.from === "netgroup") {
return "netgroup";
} else {
// Return 'group' as default
return "host group";
}
};

// Computed "states"
const someItemSelected = hostsSelected.length > 0;
const showTableRows = hosts.length > 0;
const entityType = getEntityType();
const hostColumnNames = ["Host name", "Description"];
const hostProperties = ["fqdn", "description"];
const directionEnabled = props.from !== "netgroup" ? true : false;

// Dialogs and actions
const [showAddModal, setShowAddModal] = React.useState(false);
Expand All @@ -145,8 +162,14 @@ const MembersHosts = (props: PropsToMembersHosts) => {

// Add new member to 'Host'
// API calls
const [addMemberToHostGroups] = useAddAsMemberHGMutation();
const [removeMembersFromHostGroups] = useRemoveAsMemberHGMutation();
let [addMembers] = useAddAsMemberHGMutation();
if (props.from === "netgroup") {
[addMembers] = useAddAsMemberNGMutation();
}
let [removeMembers] = useRemoveAsMemberHGMutation();
if (props.from === "netgroup") {
[removeMembers] = useRemoveAsMemberNGMutation();
}
const [adderSearchValue, setAdderSearchValue] = React.useState("");
const [availableHosts, setAvailableHosts] = React.useState<Host[]>([]);
const [availableItems, setAvailableItems] = React.useState<AvailableItems[]>(
Expand Down Expand Up @@ -205,19 +228,19 @@ const MembersHosts = (props: PropsToMembersHosts) => {
}

const payload = {
hostGroup: props.id,
entryName: props.id,
entityType: "host",
idsToAdd: newHostNames,
} as MemberPayload;

setSpinning(true);
addMemberToHostGroups(payload).then((response) => {
addMembers(payload).then((response) => {
if ("data" in response) {
if (response.data.result) {
// Set alert: success
alerts.addAlert(
"add-member-success",
"Assigned new hosts to host group '" + props.id + "'",
"Assigned new hosts to " + entityType + " '" + props.id + "'",
"success"
);
// Refresh data
Expand All @@ -237,19 +260,19 @@ const MembersHosts = (props: PropsToMembersHosts) => {
// Delete
const onDeleteHosts = () => {
const payload = {
hostGroup: props.id,
entryName: props.id,
entityType: "host",
idsToAdd: hostsSelected,
} as MemberPayload;

setSpinning(true);
removeMembersFromHostGroups(payload).then((response) => {
removeMembers(payload).then((response) => {
if ("data" in response) {
if (response.data.result) {
// Set alert: success
alerts.addAlert(
"remove-host-success",
"Removed hosts from host group '" + props.id + "'",
"Removed hosts from " + entityType + " '" + props.id + "'",
"success"
);
// Refresh
Expand Down Expand Up @@ -316,7 +339,7 @@ const MembersHosts = (props: PropsToMembersHosts) => {
onDeleteButtonClick={() => setShowDeleteModal(true)}
addButtonEnabled={isAddButtonEnabled}
onAddButtonClick={() => setShowAddModal(true)}
membershipDirectionEnabled={true}
membershipDirectionEnabled={directionEnabled}
membershipDirection={membershipDirection}
onMembershipDirectionChange={setMembershipDirection}
helpIconEnabled={true}
Expand Down Expand Up @@ -362,7 +385,7 @@ const MembersHosts = (props: PropsToMembersHosts) => {
availableItems={availableItems}
onAdd={onAddHost}
onSearchTextChange={setAdderSearchValue}
title={"Assign hosts to host group: " + props.id}
title={"Assign hosts to " + entityType + ": " + props.id}
ariaLabel={"Add hosts modal"}
spinning={spinning}
/>
Expand All @@ -371,7 +394,7 @@ const MembersHosts = (props: PropsToMembersHosts) => {
<MemberOfDeleteModal
showModal={showDeleteModal}
onCloseModal={() => setShowDeleteModal(false)}
title={"Delete hosts from host group: " + props.id}
title={"Delete hosts from " + entityType + ": " + props.id}
onDelete={onDeleteHosts}
spinning={spinning}
>
Expand Down
Loading

0 comments on commit 6428635

Please sign in to comment.