Added delete bucket lifecycle rule capability (#1547)

Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
This commit is contained in:
Alex
2022-02-10 17:25:59 -07:00
committed by GitHub
parent 829404b33c
commit 5fd82ca6e9
13 changed files with 793 additions and 97 deletions

View File

@@ -42,6 +42,7 @@ import SecureComponent, {
} from "../../../../common/SecureComponent/SecureComponent";
import { IAM_SCOPES } from "../../../../common/SecureComponent/permissions";
import RBIconButton from "./SummaryItems/RBIconButton";
import DeleteBucketLifecycleRule from "./DeleteBucketLifecycleRule";
const styles = (theme: Theme) =>
createStyles({
@@ -73,6 +74,9 @@ const BucketLifecyclePanel = ({
const [editLifecycleOpen, setEditLifecycleOpen] = useState<boolean>(false);
const [selectedLifecycleRule, setSelectedLifecycleRule] =
useState<LifeCycleItem | null>(null);
const [deleteLifecycleOpen, setDeleteLifecycleOpen] =
useState<boolean>(false);
const [selectedID, setSelectedID] = useState<string | null>(null);
const bucketName = match.params["bucketName"];
@@ -99,6 +103,7 @@ const BucketLifecyclePanel = ({
})
.catch((err: ErrorResponseHandler) => {
console.error(err);
setLifecycleRecords([]);
setLoadingLifecycle(false);
});
} else {
@@ -127,6 +132,15 @@ const BucketLifecyclePanel = ({
}
};
const closeDelLCRefresh = (refresh: boolean) => {
setDeleteLifecycleOpen(false);
setSelectedID(null);
if (refresh) {
setLoadingLifecycle(true);
}
};
const expirationRender = (expiration: any) => {
if (expiration.days) {
return `${expiration.days} day${expiration.days > 1 ? "s" : ""}`;
@@ -194,6 +208,14 @@ const BucketLifecyclePanel = ({
setEditLifecycleOpen(true);
},
},
{
type: "delete",
onClick(valueToDelete: string): any {
setSelectedID(valueToDelete);
setDeleteLifecycleOpen(true);
},
sendOnlyId: true,
},
];
return (
@@ -213,6 +235,14 @@ const BucketLifecyclePanel = ({
closeModalAndRefresh={closeAddLCAndRefresh}
/>
)}
{deleteLifecycleOpen && selectedID && (
<DeleteBucketLifecycleRule
id={selectedID}
bucket={bucketName}
deleteOpen={deleteLifecycleOpen}
onCloseAndRefresh={closeDelLCRefresh}
/>
)}
<Grid container>
<Grid item xs={12} className={classes.actionsTray}>
<PanelTitle>Lifecycle Rules</PanelTitle>

View File

@@ -0,0 +1,93 @@
// This file is part of MinIO Console Server
// Copyright (c) 2022 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import React, { useState, useEffect } from "react";
import { connect } from "react-redux";
import { DialogContentText } from "@mui/material";
import { Theme } from "@mui/material/styles";
import createStyles from "@mui/styles/createStyles";
import withStyles from "@mui/styles/withStyles";
import { modalBasic } from "../../Common/FormComponents/common/styleLibrary";
import { ErrorResponseHandler } from "../../../../common/types";
import { setErrorSnackMessage } from "../../../../actions";
import { ConfirmDeleteIcon } from "../../../../icons";
import ConfirmDialog from "../../Common/ModalWrapper/ConfirmDialog";
import api from "../../../../common/api";
interface IDeleteLifecycleRule {
deleteOpen: boolean;
onCloseAndRefresh: (refresh: boolean) => any;
bucket: string;
id: string;
setErrorSnackMessage: typeof setErrorSnackMessage;
}
const styles = (theme: Theme) =>
createStyles({
...modalBasic,
});
const DeleteBucketLifecycleRule = ({
onCloseAndRefresh,
deleteOpen,
bucket,
id,
setErrorSnackMessage,
}: IDeleteLifecycleRule) => {
const [deletingRule, setDeletingRule] = useState<boolean>(false);
useEffect(() => {
if (deletingRule) {
api
.invoke("DELETE", `/api/v1/buckets/${bucket}/lifecycle/${id}`)
.then((res) => {
setDeletingRule(false);
onCloseAndRefresh(true);
})
.catch((err: ErrorResponseHandler) => {
setDeletingRule(false);
setErrorSnackMessage(err);
});
}
}, [deletingRule, bucket, id, onCloseAndRefresh, setErrorSnackMessage]);
const onConfirmDelete = () => {
setDeletingRule(true);
};
return (
<ConfirmDialog
title={`Delete Lifecycle Rule`}
confirmText={"Delete"}
isOpen={deleteOpen}
isLoading={deletingRule}
onConfirm={onConfirmDelete}
titleIcon={<ConfirmDeleteIcon />}
onClose={() => onCloseAndRefresh(false)}
confirmationContent={
<DialogContentText>
Are you sure you want to delete the <strong>{id}</strong> rule?
</DialogContentText>
}
/>
);
};
const connector = connect(null, {
setErrorSnackMessage,
});
export default withStyles(styles)(connector(DeleteBucketLifecycleRule));

View File

@@ -141,7 +141,6 @@ const EditLifecycleConfiguration = ({
}, [ilmType, expiryDays, transitionDays, storageClass]);
useEffect(() => {
console.log("lifecycle::", lifecycle);
if (lifecycle.status === "Enabled") {
setEnabled(true);
}