Skip to content

Commit 531d8a2

Browse files
adfostAdam Staffordbexsoftdvaldivia
authored
Adding groups tab to Policy Details page (#837)
* parent 58efbbb author Adam Stafford <adam@minio.io> 1624473190 -0700 committer Adam Stafford <adam@minio.io> 1624569868 -0700 policy groups * restoring old commit files Co-authored-by: Adam Stafford <adam@minio.io> Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com> Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
1 parent 9ec7326 commit 531d8a2

File tree

9 files changed

+627
-0
lines changed

9 files changed

+627
-0
lines changed

portal-ui/src/screens/Console/Policies/PolicyDetails.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ const PolicyDetails = ({
166166
const [selectedTab, setSelectedTab] = useState<number>(0);
167167
const [policy, setPolicy] = useState<Policy | null>(null);
168168
const [userList, setUserList] = useState<string[]>([]);
169+
const [groupList, setGroupList] = useState<string[]>([]);
169170
const [addLoading, setAddLoading] = useState<boolean>(false);
170171
const [policyName, setPolicyName] = useState<string>(
171172
match.params["policyName"]
@@ -174,6 +175,8 @@ const PolicyDetails = ({
174175
const [loadingPolicy, setLoadingPolicy] = useState<boolean>(true);
175176
const [filterUsers, setFilterUsers] = useState<string>("");
176177
const [loadingUsers, setLoadingUsers] = useState<boolean>(true);
178+
const [filterGroups, setFilterGroups] = useState<string>("");
179+
const [loadingGroups, setLoadingGroups] = useState<boolean>(true);
177180

178181
const saveRecord = (event: React.FormEvent) => {
179182
event.preventDefault();
@@ -211,6 +214,20 @@ const PolicyDetails = ({
211214
});
212215
}
213216
};
217+
const loadGroupsForPolicy = () => {
218+
if (loadingGroups) {
219+
api
220+
.invoke("GET", `/api/v1/policies/${policyName}/groups`)
221+
.then((result: any) => {
222+
setGroupList(result);
223+
setLoadingGroups(false);
224+
})
225+
.catch((err) => {
226+
setErrorSnackMessage(err);
227+
setLoadingGroups(false);
228+
});
229+
}
230+
};
214231
const loadPolicyDetails = () => {
215232
if (loadingPolicy) {
216233
api
@@ -234,16 +251,20 @@ const PolicyDetails = ({
234251
if (loadingPolicy) {
235252
loadPolicyDetails();
236253
loadUsersForPolicy();
254+
loadGroupsForPolicy();
237255
}
238256
}, [
239257
policyName,
240258
loadingPolicy,
241259
loadingUsers,
260+
loadingGroups,
242261
setErrorSnackMessage,
243262
setUserList,
263+
setGroupList,
244264
setPolicyDefinition,
245265
setPolicy,
246266
setLoadingUsers,
267+
setLoadingGroups,
247268
]);
248269

249270
const resetForm = () => {
@@ -262,6 +283,10 @@ const PolicyDetails = ({
262283
elementItem.includes(filterUsers)
263284
);
264285

286+
const filteredGroups = groupList.filter((elementItem) =>
287+
elementItem.includes(filterGroups)
288+
);
289+
265290
return (
266291
<React.Fragment>
267292
<PageHeader
@@ -287,6 +312,7 @@ const PolicyDetails = ({
287312
>
288313
<Tab label="Details" />
289314
<Tab label="Users" />
315+
<Tab label="Groups" />
290316
</Tabs>
291317
</Grid>
292318
{selectedTab === 0 && (
@@ -374,6 +400,40 @@ const PolicyDetails = ({
374400
/>
375401
</Grid>
376402
)}
403+
{selectedTab === 2 && (
404+
<Grid container>
405+
<Grid item xs={12} className={classes.actionsTray}>
406+
<TextField
407+
placeholder="Search Groups"
408+
className={classes.searchField}
409+
id="search-resource"
410+
label=""
411+
onChange={(val) => {
412+
setFilterGroups(val.target.value);
413+
}}
414+
InputProps={{
415+
disableUnderline: true,
416+
startAdornment: (
417+
<InputAdornment position="start">
418+
<SearchIcon />
419+
</InputAdornment>
420+
),
421+
}}
422+
/>
423+
</Grid>
424+
<Grid item xs={12} className={classes.actionsTray}>
425+
<br />
426+
</Grid>
427+
<TableWrapper
428+
itemActions={[]}
429+
columns={[{ label: "Name", elementKey: "name" }]}
430+
isLoading={loadingGroups}
431+
records={filteredGroups}
432+
entityName="Groups"
433+
idField="name"
434+
/>
435+
</Grid>
436+
)}
377437
</Grid>
378438
</React.Fragment>
379439
);

restapi/admin_policies.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ func registersPoliciesHandler(api *operations.ConsoleAPI) {
8989
}
9090
return admin_api.NewListUsersForPolicyOK().WithPayload(policyUsersResponse)
9191
})
92+
api.AdminAPIListGroupsForPolicyHandler = admin_api.ListGroupsForPolicyHandlerFunc(func(params admin_api.ListGroupsForPolicyParams, session *models.Principal) middleware.Responder {
93+
policyGroupsResponse, err := getListGroupsForPolicyResponse(session, params.Policy)
94+
if err != nil {
95+
return admin_api.NewListGroupsForPolicyDefault(int(err.Code)).WithPayload(err)
96+
}
97+
return admin_api.NewListGroupsForPolicyOK().WithPayload(policyGroupsResponse)
98+
})
9299
}
93100

94101
func getListPoliciesWithBucketResponse(session *models.Principal, bucket string) (*models.ListPoliciesResponse, *models.Error) {
@@ -220,6 +227,35 @@ func getListUsersForPolicyResponse(session *models.Principal, policy string) ([]
220227
return filteredUsers, nil
221228
}
222229

230+
func getListGroupsForPolicyResponse(session *models.Principal, policy string) ([]string, *models.Error) {
231+
ctx := context.Background()
232+
mAdmin, err := newAdminClient(session)
233+
if err != nil {
234+
return nil, prepareError(err)
235+
}
236+
// create a minioClient interface implementation
237+
// defining the client to be used
238+
adminClient := adminClient{client: mAdmin}
239+
240+
groups, err := adminClient.listGroups(ctx)
241+
if err != nil {
242+
return nil, prepareError(err)
243+
}
244+
245+
var filteredGroups []string
246+
for _, group := range groups {
247+
info, err := groupInfo(ctx, adminClient, group)
248+
if err != nil {
249+
LogError("unable to fetch group info %s: %v", group, err)
250+
}
251+
if info.Policy == policy {
252+
filteredGroups = append(filteredGroups, group)
253+
}
254+
}
255+
sort.Strings(filteredGroups)
256+
return filteredGroups, nil
257+
}
258+
223259
// removePolicy() calls MinIO server to remove a policy based on name.
224260
func removePolicy(ctx context.Context, client MinioAdmin, name string) error {
225261
err := client.removePolicy(ctx, name)

restapi/embedded_spec.go

Lines changed: 68 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

restapi/operations/admin_api/list_groups_for_policy.go

Lines changed: 88 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)