Show Warnings when running speed test or diagnostics (#1487)

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
This commit is contained in:
Daniel Valdivia
2022-01-31 20:41:02 -08:00
committed by GitHub
parent 780cf7240b
commit 27d1627c8f
11 changed files with 408 additions and 414 deletions

View File

@@ -22,15 +22,15 @@ import {
} from "../utils";
test("A variety of formatting results", () => {
expect(niceBytes("1024")).toBe("1.0 KB");
expect(niceBytes("1048576")).toBe("1.0 MB");
expect(niceBytes("1073741824")).toBe("1.0 GB");
expect(niceBytes("1024")).toBe("1.0 KiB");
expect(niceBytes("1048576")).toBe("1.0 MiB");
expect(niceBytes("1073741824")).toBe("1.0 GiB");
});
test("From value and unit to a number of bytes", () => {
expect(getBytes("1", "KB")).toBe("1024");
expect(getBytes("1", "MB")).toBe("1048576");
expect(getBytes("1", "GB")).toBe("1073741824");
expect(getBytes("1", "KiB")).toBe("1024");
expect(getBytes("1", "MiB")).toBe("1048576");
expect(getBytes("1", "GiB")).toBe("1073741824");
});
test("From value and unit to a number of bytes for kubernetes", () => {

View File

@@ -26,7 +26,17 @@ import { IPool } from "../screens/Console/Tenants/ListTenants/types";
const minStReq = 1073741824; // Minimal Space required for MinIO
const minMemReq = 2147483648; // Minimal Memory required for MinIO in bytes
export const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
export const units = [
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB",
"EiB",
"ZiB",
"YiB",
];
export const k8sUnits = ["Ki", "Mi", "Gi", "Ti", "Pi", "Ei"];
export const k8sCalcUnits = ["B", ...k8sUnits];
export const timeUnits = ["ms", "s", "m", "h", "d", "w", "M", "Q", "y"];

View File

@@ -27,6 +27,7 @@ interface IProgressBarWrapper {
ready: boolean;
indeterminate?: boolean;
withLabel?: boolean;
size?: string;
}
const BorderLinearProgress = styled(LinearProgress)(() => ({
@@ -39,6 +40,13 @@ const BorderLinearProgress = styled(LinearProgress)(() => ({
borderRadius: 5,
},
}));
const SmallBorderLinearProgress = styled(BorderLinearProgress)(() => ({
height: 6,
borderRadius: 3,
[`& .${linearProgressClasses.bar}`]: {
borderRadius: 3,
},
}));
function LinearProgressWithLabel(props: LinearProgressProps) {
return (
@@ -58,6 +66,7 @@ const ProgressBarWrapper = ({
ready,
indeterminate,
withLabel,
size = "regular",
}: IProgressBarWrapper) => {
const propsComponent: LinearProgressProps = {
variant: indeterminate && !ready ? "indeterminate" : "determinate",
@@ -67,6 +76,9 @@ const ProgressBarWrapper = ({
if (withLabel) {
return <LinearProgressWithLabel {...propsComponent} />;
}
if (size === "small") {
return <SmallBorderLinearProgress {...propsComponent} />;
}
return <BorderLinearProgress {...propsComponent} />;
};

View File

@@ -47,6 +47,8 @@ import { setServerDiagStat, setSnackBarMessage } from "../../../actions";
import CircularProgress from "@mui/material/CircularProgress";
import TestWrapper from "../Common/TestWrapper/TestWrapper";
import PageLayout from "../Common/Layout/PageLayout";
import HelpBox from "../../../common/HelpBox";
import WarnIcon from "../../../icons/WarnIcon";
const styles = (theme: Theme) =>
createStyles({
@@ -303,6 +305,18 @@ const HealthInfo = ({
</Grid>
</TestWrapper>
</Grid>
{!diagStarted && (
<Fragment>
<br />
<HelpBox
title={
"During the health diagnostics run all production traffic will be suspended."
}
iconComponent={<WarnIcon />}
help={<Fragment />}
/>
</Fragment>
)}
</PageLayout>
</Fragment>
);

View File

@@ -35,39 +35,10 @@ import BoxIconButton from "../Common/BoxIconButton/BoxIconButton";
import CodeMirrorWrapper from "../Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper";
import { Area, AreaChart, CartesianGrid, ResponsiveContainer } from "recharts";
import { cleanMetrics } from "./utils";
interface ISTResults {
classes: any;
results: SpeedTestResponse[];
start: boolean;
autotune: boolean;
}
import SpeedTestUnit from "./SpeedTestUnit";
const styles = (theme: Theme) =>
createStyles({
objectGeneralTitle: {
fontWeight: "bold",
color: "#000",
display: "flex",
alignItems: "center",
"& svg": {
width: 14,
},
},
generalUnit: {
color: "#000",
marginTop: 6,
fontSize: 12,
fontWeight: "bold",
},
testUnitRes: {
fontSize: 120,
color: "#081C42",
fontWeight: "bold",
},
metricValContainer: {
lineHeight: 1,
},
actionButtons: {
textAlign: "right",
},
@@ -153,17 +124,27 @@ const styles = (theme: Theme) =>
},
download: {
"& .min-icon": {
width: 35,
height: 35,
color: "rgb(113,200,150)",
},
},
upload: {
"& .min-icon": {
width: 35,
height: 35,
color: "rgb(66,127,172)",
},
},
});
const STResults = ({ classes, results, start, autotune }: ISTResults) => {
interface ISTResults {
classes: any;
results: SpeedTestResponse[];
start: boolean;
}
const STResults = ({ classes, results, start }: ISTResults) => {
const [jsonView, setJsonView] = useState<boolean>(false);
const finalRes = results[results.length - 1] || [];
@@ -177,38 +158,6 @@ const STResults = ({ classes, results, start, autotune }: ISTResults) => {
const putThroughput = get(finalRes, "PUTStats.throughputPerSec", 0);
const putObjects = get(finalRes, "PUTStats.objectsPerSec", 0);
const ObjectGeneral = ({
title,
throughput,
objects,
}: {
title: any;
throughput: string;
objects: number;
}) => {
const avg = calculateBytes(throughput);
let total = "--";
let unit = "";
if (avg.total !== 0) {
total = avg.total.toString();
unit = `${avg.unit}/S`;
}
return (
<Grid container>
<Grid item xs={12} className={classes.objectGeneralTitle}>
{title}
</Grid>
<Grid item xs={12} md={6} className={classes.metricValContainer}>
<span className={classes.testUnitRes}>{total}</span>
<span className={classes.generalUnit}>{unit}</span>
</Grid>
</Grid>
);
};
let statJoin: IndvServerMetric[] = [];
getServers.forEach((item) => {
@@ -280,31 +229,35 @@ const STResults = ({ classes, results, start, autotune }: ISTResults) => {
return (
<Fragment>
<Grid container className={classes.objectGeneral}>
<Grid item xs={12} md={6} lg={4}>
<ObjectGeneral
title={
<div className={classes.download}>
<DownloadStatIcon />
&nbsp; GET
</div>
}
throughput={getThroughput}
objects={getObjects}
/>
<Grid item xs={12} md={6} lg={6}>
<Grid container className={classes.objectGeneral}>
<Grid item xs={12} md={6} lg={6}>
<SpeedTestUnit
icon={
<div className={classes.download}>
<DownloadStatIcon />
</div>
}
title={"GET"}
throughput={getThroughput}
objects={getObjects}
/>
</Grid>
<Grid item xs={12} md={6} lg={6}>
<SpeedTestUnit
icon={
<div className={classes.upload}>
<UploadStatIcon />
</div>
}
title={"PUT"}
throughput={putThroughput}
objects={putObjects}
/>
</Grid>
</Grid>
</Grid>
<Grid item xs={12} md={6} lg={4}>
<ObjectGeneral
title={
<div className={classes.upload}>
<UploadStatIcon />
&nbsp; PUT
</div>
}
throughput={putThroughput}
objects={putObjects}
/>
</Grid>
<Grid item xs={12} md={12} lg={4}>
<Grid item xs={12} md={6} lg={6}>
<ResponsiveContainer width="99%">
<AreaChart data={clnMetrics}>
<defs>

View File

@@ -0,0 +1,113 @@
// 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 { calculateBytes } from "../../../common/utils";
import React from "react";
import withStyles from "@mui/styles/withStyles";
import { Theme } from "@mui/material/styles";
import createStyles from "@mui/styles/createStyles";
import clsx from "clsx";
const styles = (theme: Theme) =>
createStyles({
objectGeneralTitle: {
lineHeight: 1,
fontSize: 50,
color: "#696969",
},
generalUnit: {
color: "#000",
fontSize: 12,
fontWeight: "bold",
},
testUnitRes: {
fontSize: 60,
color: "#081C42",
fontWeight: "bold",
textAlign: "right",
},
metricValContainer: {
lineHeight: 1,
verticalAlign: "bottom",
},
objectsUnitRes: {
fontSize: 22,
marginTop: 6,
color: "#696969",
fontWeight: "bold",
textAlign: "right",
},
objectsUnit: {
color: "#696969",
fontSize: 16,
fontWeight: "bold",
},
iconTd: {
verticalAlign: "bottom",
},
});
const SpeedTestUnit = ({
classes,
title,
icon,
throughput,
objects,
}: {
classes: any;
title: any;
icon: any;
throughput: string;
objects: number;
}) => {
const avg = calculateBytes(throughput);
let total = "0";
let unit = "";
if (avg.total !== 0) {
total = avg.total.toString();
unit = `${avg.unit}/s`;
}
return (
<table>
<tr>
<td className={classes.objectGeneralTitle}>{title}</td>
<td className={classes.iconTd}>{icon}</td>
</tr>
<tr>
<td className={clsx(classes.metricValContainer, classes.testUnitRes)}>
{total}
</td>
<td className={clsx(classes.metricValContainer, classes.generalUnit)}>
{unit}
</td>
</tr>
<tr>
<td
className={clsx(classes.metricValContainer, classes.objectsUnitRes)}
>
{objects}
</td>
<td className={clsx(classes.metricValContainer, classes.objectsUnit)}>
{objects !== 0 && "Objs/S"}
</td>
</tr>
</table>
);
};
export default withStyles(styles)(SpeedTestUnit);

View File

@@ -21,7 +21,6 @@ import { Button, CircularProgress, Grid } from "@mui/material";
import { Theme } from "@mui/material/styles";
import createStyles from "@mui/styles/createStyles";
import withStyles from "@mui/styles/withStyles";
import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos";
import moment from "moment/moment";
import PageHeader from "../Common/PageHeader/PageHeader";
import {
@@ -43,10 +42,11 @@ import STResults from "./STResults";
import InputBoxWrapper from "../Common/FormComponents/InputBoxWrapper/InputBoxWrapper";
import ProgressBarWrapper from "../Common/ProgressBarWrapper/ProgressBarWrapper";
import InputUnitMenu from "../Common/FormComponents/InputUnitMenu/InputUnitMenu";
import CheckboxWrapper from "../Common/FormComponents/CheckboxWrapper/CheckboxWrapper";
import PageLayout from "../Common/Layout/PageLayout";
import SecureComponent from "../../../common/SecureComponent/SecureComponent";
import DistributedOnly from "../Common/DistributedOnly/DistributedOnly";
import HelpBox from "../../../common/HelpBox";
import WarnIcon from "../../../icons/WarnIcon";
interface ISpeedtest {
classes: any;
@@ -68,9 +68,7 @@ const styles = (theme: Theme) =>
paddingBottom: 15,
},
},
progressContainer: {
padding: "0 15px",
},
stepProgressText: {
fontSize: 13,
marginBottom: 8,
@@ -94,17 +92,14 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
const [currStatus, setCurrStatus] = useState<SpeedTestResponse[] | null>(
null
);
const [duration, setDuration] = useState<string>("10");
const [durationUnit, setDurationUnit] = useState<string>("s");
const [size, setSize] = useState<string>("64");
const [sizeUnit, setSizeUnit] = useState<string>("MB");
const [concurrent, setConcurrent] = useState<string>("32");
const [topDate, setTopDate] = useState<number>(0);
const [currentValue, setCurrentValue] = useState<number>(0);
const [totalSeconds, setTotalSeconds] = useState<number>(0);
const [speedometerValue, setSpeedometerValue] = useState<number>(0);
const [advancedOpen, setAdvancedOpen] = useState<boolean>(false);
const [autotune, setAutotune] = useState<boolean>(true);
useEffect(() => {
// begin watch if bucketName in bucketList and start pressed
@@ -115,11 +110,7 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
const wsProt = wsProtocol(url.protocol);
const c = new W3CWebSocket(
`${wsProt}://${url.hostname}:${port}/ws/speedtest?${
autotune ? "autotune=true" : ""
}&duration=${duration}${durationUnit}&size=${size}${sizeUnit}${
concurrent.trim() !== "" ? `&concurrent=${concurrent}` : ""
}`
`${wsProt}://${url.hostname}:${port}/ws/speedtest?&size=${size}${sizeUnit}`
);
const baseDate = moment();
@@ -128,10 +119,7 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
const incrementDate =
baseDate
.add(
parseInt(duration) * 2,
durationUnit as moment.unitOfTime.DurationConstructor
)
.add(parseInt("10") * 2, "s" as moment.unitOfTime.DurationConstructor)
.unix() / 1000;
const totalSeconds = (incrementDate - currentTime) / 1000;
@@ -182,7 +170,7 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
// reset start status
setStart(false);
}
}, [concurrent, duration, durationUnit, size, sizeUnit, start, autotune]);
}, [size, sizeUnit, start]);
useEffect(() => {
const actualSeconds = (topDate - currentValue) / 1000;
@@ -212,7 +200,61 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
>
<Grid item xs={12} className={classes.boxy}>
<Grid container>
<Grid item>
<Grid item md={6} sm={12}>
<div className={classes.stepProgressText}>
{start ? (
<Fragment>
Speedtest in progress...
<CircularProgress size={15} />
</Fragment>
) : (
<Fragment>
{currStatus && !start ? (
<b>Speed Test results:</b>
) : (
<b>Performance test</b>
)}
</Fragment>
)}
</div>
<div>
<ProgressBarWrapper
value={speedometerValue}
ready={currStatus !== null && !start}
indeterminate={start}
size={"small"}
/>
</div>
</Grid>
<Grid item xs={4}>
<div style={{ marginLeft: 10, width: 300 }}>
<InputBoxWrapper
id={"size"}
name={"size"}
label={"Object Size"}
onChange={(e) => {
setSize(e.target.value);
}}
noLabelMinWidth={true}
value={size}
disabled={start}
overlayObject={
<InputUnitMenu
id={"size-unit"}
onUnitChange={setSizeUnit}
unitSelected={sizeUnit}
unitsList={[
{ label: "KiB", value: "KiB" },
{ label: "MiB", value: "MiB" },
{ label: "GiB", value: "GiB" },
]}
disabled={start}
/>
}
/>
</div>
</Grid>
<Grid item xs={2} textAlign={"right"}>
<Button
onClick={() => {
setCurrStatus(null);
@@ -220,13 +262,12 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
}}
color="primary"
type="button"
id={"start-speed-test"}
variant={
currStatus !== null && !start ? "contained" : "outlined"
}
className={`${classes.buttonBackground} ${classes.speedStart}`}
disabled={
duration.trim() === "" || size.trim() === "" || start
}
disabled={"10".trim() === "" || size.trim() === "" || start}
>
{!start && (
<Fragment>
@@ -236,168 +277,6 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
{start ? "Start" : ""}
</Button>
</Grid>
<Grid item md={9} sm={12} className={classes.progressContainer}>
<div className={classes.stepProgressText}>
{start ? (
"Speedtest in progress..."
) : (
<Fragment>
{currStatus && !start
? "Done!"
: "Start a new speed test"}
</Fragment>
)}
&nbsp;&nbsp;&nbsp;{start && <CircularProgress size={15} />}
</div>
<div>
<ProgressBarWrapper
value={speedometerValue}
ready={currStatus !== null && !start}
indeterminate={autotune && start}
/>
</div>
</Grid>
<Grid item className={classes.advancedButton}>
<button
onClick={() => {
setAdvancedOpen(!advancedOpen);
}}
className={classes.advancedConfiguration}
>
{advancedOpen ? "Hide" : "Show"} advanced options{" "}
<span
className={
advancedOpen
? classes.advancedOpen
: classes.advancedClosed
}
>
<ArrowForwardIosIcon />
</span>
</button>
</Grid>
</Grid>
<Grid
container
className={`${classes.advancedContent} ${
advancedOpen ? "open" : ""
}`}
>
<Grid item xs={12}>
<Grid
container
direction="row"
justifyContent="space-around"
alignItems="center"
>
<Grid
item
xs={12}
md={4}
className={classes.advancedOption}
>
<InputBoxWrapper
id={"size"}
name={"size"}
label={"Object Size"}
onChange={(e) => {
setSize(e.target.value);
}}
value={size}
disabled={start}
overlayObject={
<InputUnitMenu
id={"size-unit"}
onUnitChange={setSizeUnit}
unitSelected={sizeUnit}
unitsList={[
{ label: "KB", value: "KB" },
{ label: "MB", value: "MB" },
{ label: "GB", value: "GB" },
]}
disabled={start}
/>
}
/>
</Grid>
<Grid
item
xs={12}
md={4}
className={classes.advancedAutotune}
>
<CheckboxWrapper
checked={autotune}
onChange={(e) => setAutotune(e.target.checked)}
id={"autotune"}
name={"autotune"}
label={"Enable Autotune"}
tooltip={
"Autotune gets the maximum stats for the system by testing multiple configurations at once. This configuration is enabled by default and overrides duration & concurrent requests options"
}
value="true"
disabled={start}
/>
</Grid>
</Grid>
</Grid>
<Grid item xs={12}>
<Grid
container
direction="row"
justifyContent="space-around"
alignItems="center"
>
<Grid
item
xs={12}
md={4}
className={classes.advancedOption}
>
<InputBoxWrapper
id={"duration"}
name={"duration"}
label={"Duration"}
onChange={(e) => {
setDuration(e.target.value);
}}
value={duration}
disabled={start || autotune}
overlayObject={
<InputUnitMenu
id={"duration-unit"}
onUnitChange={setDurationUnit}
unitSelected={durationUnit}
unitsList={[
{ label: "miliseconds", value: "ms" },
{ label: "seconds", value: "s" },
]}
disabled={start || autotune}
/>
}
/>
</Grid>
<Grid
item
xs={12}
md={4}
className={classes.advancedOption}
>
<InputBoxWrapper
type="number"
min="0"
id={"concurrent"}
name={"concurrent"}
label={"Concurrent Requests"}
onChange={(e) => {
setConcurrent(e.target.value);
}}
value={concurrent}
disabled={start || autotune}
/>
</Grid>
</Grid>
</Grid>
</Grid>
<Grid container className={classes.multiModule}>
<Grid item xs={12}>
@@ -405,11 +284,7 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
<Grid item xs={12}>
{currStatus !== null && (
<Fragment>
<STResults
results={currStatus}
start={start}
autotune={autotune}
/>
<STResults results={currStatus} start={start} />
</Fragment>
)}
</Grid>
@@ -417,6 +292,19 @@ const Speedtest = ({ classes, distributedSetup }: ISpeedtest) => {
</Grid>
</Grid>
</Grid>
{!start && !currStatus && (
<Fragment>
<br />
<HelpBox
title={
"During the speed test all your production traffic will be temporarily suspended."
}
iconComponent={<WarnIcon />}
help={<Fragment />}
/>
</Fragment>
)}
</SecureComponent>
)}
</PageLayout>

View File

@@ -0,0 +1,84 @@
# 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/>.
add_alias() {
for i in $(seq 1 4); do
echo "... attempting to add alias $i"
until (mc alias set minio http://127.0.0.1:9000 minioadmin minioadmin); do
echo "...waiting... for 5secs" && sleep 5
done
done
}
create_policies() {
mc admin policy add minio bucketassignpolicy-$TIMESTAMP portal-ui/tests/policies/bucketAssignPolicy.json
mc admin policy add minio bucketread-$TIMESTAMP portal-ui/tests/policies/bucketRead.json
mc admin policy add minio bucketwrite-$TIMESTAMP portal-ui/tests/policies/bucketWrite.json
mc admin policy add minio dashboard-$TIMESTAMP portal-ui/tests/policies/dashboard.json
mc admin policy add minio diagnostics-$TIMESTAMP portal-ui/tests/policies/diagnostics.json
mc admin policy add minio groups-$TIMESTAMP portal-ui/tests/policies/groups.json
mc admin policy add minio heal-$TIMESTAMP portal-ui/tests/policies/heal.json
mc admin policy add minio iampolicies-$TIMESTAMP portal-ui/tests/policies/iamPolicies.json
mc admin policy add minio logs-$TIMESTAMP portal-ui/tests/policies/logs.json
mc admin policy add minio notificationendpoints-$TIMESTAMP portal-ui/tests/policies/notificationEndpoints.json
mc admin policy add minio settings-$TIMESTAMP portal-ui/tests/policies/settings.json
mc admin policy add minio tiers-$TIMESTAMP portal-ui/tests/policies/tiers.json
mc admin policy add minio trace-$TIMESTAMP portal-ui/tests/policies/trace.json
mc admin policy add minio users-$TIMESTAMP portal-ui/tests/policies/users.json
mc admin policy add minio watch-$TIMESTAMP portal-ui/tests/policies/watch.json
mc admin policy add minio bucketwriteprefixonlypolicy-$TIMESTAMP portal-ui/tests/policies/bucketWritePrefixOnlyPolicy.json
}
create_users() {
mc admin user add minio bucketassignpolicy-$TIMESTAMP bucketassignpolicy
mc admin user add minio bucketread-$TIMESTAMP bucketread
mc admin user add minio bucketwrite-$TIMESTAMP bucketwrite
mc admin user add minio dashboard-$TIMESTAMP dashboard
mc admin user add minio diagnostics-$TIMESTAMP diagnostics
mc admin user add minio groups-$TIMESTAMP groups1234
mc admin user add minio heal-$TIMESTAMP heal1234
mc admin user add minio iampolicies-$TIMESTAMP iampolicies
mc admin user add minio logs-$TIMESTAMP logs1234
mc admin user add minio notificationendpoints-$TIMESTAMP notificationendpoints
mc admin user add minio settings-$TIMESTAMP settings
mc admin user add minio tiers-$TIMESTAMP tiers1234
mc admin user add minio trace-$TIMESTAMP trace1234
mc admin user add minio users-$TIMESTAMP users1234
mc admin user add minio watch-$TIMESTAMP watch1234
mc admin user add minio bucketwriteprefixonlypolicy-$TIMESTAMP bucketwriteprefixonlypolicy
}
create_buckets() {
mc mb minio/testcafe && mc cp ./portal-ui/tests/uploads/test.txt minio/testcafe/write/test.txt
}
assign_policies() {
mc admin policy set minio bucketassignpolicy-$TIMESTAMP user=bucketassignpolicy-$TIMESTAMP
mc admin policy set minio bucketread-$TIMESTAMP user=bucketread-$TIMESTAMP
mc admin policy set minio bucketwrite-$TIMESTAMP user=bucketwrite-$TIMESTAMP
mc admin policy set minio dashboard-$TIMESTAMP user=dashboard-$TIMESTAMP
mc admin policy set minio diagnostics-$TIMESTAMP user=diagnostics-$TIMESTAMP
mc admin policy set minio groups-$TIMESTAMP user=groups-$TIMESTAMP
mc admin policy set minio heal-$TIMESTAMP user=heal-$TIMESTAMP
mc admin policy set minio iampolicies-$TIMESTAMP user=iampolicies-$TIMESTAMP
mc admin policy set minio logs-$TIMESTAMP user=logs-$TIMESTAMP
mc admin policy set minio notificationendpoints-$TIMESTAMP user=notificationendpoints-$TIMESTAMP
mc admin policy set minio settings-$TIMESTAMP user=settings-$TIMESTAMP
mc admin policy set minio tiers-$TIMESTAMP user=tiers-$TIMESTAMP
mc admin policy set minio trace-$TIMESTAMP user=trace-$TIMESTAMP
mc admin policy set minio users-$TIMESTAMP user=users-$TIMESTAMP
mc admin policy set minio watch-$TIMESTAMP user=watch-$TIMESTAMP
mc admin policy set minio bucketwriteprefixonlypolicy-$TIMESTAMP user=bucketwriteprefixonlypolicy-$TIMESTAMP
}

View File

@@ -1,65 +1,19 @@
add_alias() {
for i in $(seq 1 4); do
echo "... attempting to add alias $i"
until (mc alias set minio http://127.0.0.1:9000 minioadmin minioadmin); do
echo "...waiting... for 5secs" && sleep 5
done
done
}
# 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/>.
create_policies() {
mc admin policy add minio bucketassignpolicy-$TIMESTAMP portal-ui/tests/policies/bucketAssignPolicy.json
mc admin policy add minio bucketread-$TIMESTAMP portal-ui/tests/policies/bucketRead.json
mc admin policy add minio bucketwrite-$TIMESTAMP portal-ui/tests/policies/bucketWrite.json
mc admin policy add minio dashboard-$TIMESTAMP portal-ui/tests/policies/dashboard.json
mc admin policy add minio diagnostics-$TIMESTAMP portal-ui/tests/policies/diagnostics.json
mc admin policy add minio groups-$TIMESTAMP portal-ui/tests/policies/groups.json
mc admin policy add minio heal-$TIMESTAMP portal-ui/tests/policies/heal.json
mc admin policy add minio iampolicies-$TIMESTAMP portal-ui/tests/policies/iamPolicies.json
mc admin policy add minio logs-$TIMESTAMP portal-ui/tests/policies/logs.json
mc admin policy add minio notificationendpoints-$TIMESTAMP portal-ui/tests/policies/notificationEndpoints.json
mc admin policy add minio settings-$TIMESTAMP portal-ui/tests/policies/settings.json
mc admin policy add minio tiers-$TIMESTAMP portal-ui/tests/policies/tiers.json
mc admin policy add minio trace-$TIMESTAMP portal-ui/tests/policies/trace.json
mc admin policy add minio users-$TIMESTAMP portal-ui/tests/policies/users.json
mc admin policy add minio watch-$TIMESTAMP portal-ui/tests/policies/watch.json
}
create_users() {
mc admin user add minio bucketassignpolicy-$TIMESTAMP bucketassignpolicy
mc admin user add minio bucketread-$TIMESTAMP bucketread
mc admin user add minio bucketwrite-$TIMESTAMP bucketwrite
mc admin user add minio dashboard-$TIMESTAMP dashboard
mc admin user add minio diagnostics-$TIMESTAMP diagnostics
mc admin user add minio groups-$TIMESTAMP groups1234
mc admin user add minio heal-$TIMESTAMP heal1234
mc admin user add minio iampolicies-$TIMESTAMP iampolicies
mc admin user add minio logs-$TIMESTAMP logs1234
mc admin user add minio notificationendpoints-$TIMESTAMP notificationendpoints
mc admin user add minio settings-$TIMESTAMP settings
mc admin user add minio tiers-$TIMESTAMP tiers1234
mc admin user add minio trace-$TIMESTAMP trace1234
mc admin user add minio users-$TIMESTAMP users1234
mc admin user add minio watch-$TIMESTAMP watch1234
}
assign_policies() {
mc admin policy set minio bucketassignpolicy-$TIMESTAMP user=bucketassignpolicy-$TIMESTAMP
mc admin policy set minio bucketread-$TIMESTAMP user=bucketread-$TIMESTAMP
mc admin policy set minio bucketwrite-$TIMESTAMP user=bucketwrite-$TIMESTAMP
mc admin policy set minio dashboard-$TIMESTAMP user=dashboard-$TIMESTAMP
mc admin policy set minio diagnostics-$TIMESTAMP user=diagnostics-$TIMESTAMP
mc admin policy set minio groups-$TIMESTAMP user=groups-$TIMESTAMP
mc admin policy set minio heal-$TIMESTAMP user=heal-$TIMESTAMP
mc admin policy set minio iampolicies-$TIMESTAMP user=iampolicies-$TIMESTAMP
mc admin policy set minio logs-$TIMESTAMP user=logs-$TIMESTAMP
mc admin policy set minio notificationendpoints-$TIMESTAMP user=notificationendpoints-$TIMESTAMP
mc admin policy set minio settings-$TIMESTAMP user=settings-$TIMESTAMP
mc admin policy set minio tiers-$TIMESTAMP user=tiers-$TIMESTAMP
mc admin policy set minio trace-$TIMESTAMP user=trace-$TIMESTAMP
mc admin policy set minio users-$TIMESTAMP user=users-$TIMESTAMP
mc admin policy set minio watch-$TIMESTAMP user=watch-$TIMESTAMP
}
SCRIPT_DIR=$(dirname "$0")
export SCRIPT_DIR
source "${SCRIPT_DIR}/common.sh"
__init__() {
export TIMESTAMP=$(date "+%s")

View File

@@ -1,72 +1,19 @@
add_alias() {
for i in $(seq 1 4); do
echo "... attempting to add alias $i"
until (mc alias set minio http://127.0.0.1:9000 minioadmin minioadmin); do
echo "...waiting... for 5secs" && sleep 5
done
done
}
# 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/>.
create_policies() {
mc admin policy add minio bucketassignpolicy-$TIMESTAMP portal-ui/tests/policies/bucketAssignPolicy.json
mc admin policy add minio bucketread-$TIMESTAMP portal-ui/tests/policies/bucketRead.json
mc admin policy add minio bucketwrite-$TIMESTAMP portal-ui/tests/policies/bucketWrite.json
mc admin policy add minio dashboard-$TIMESTAMP portal-ui/tests/policies/dashboard.json
mc admin policy add minio diagnostics-$TIMESTAMP portal-ui/tests/policies/diagnostics.json
mc admin policy add minio groups-$TIMESTAMP portal-ui/tests/policies/groups.json
mc admin policy add minio heal-$TIMESTAMP portal-ui/tests/policies/heal.json
mc admin policy add minio iampolicies-$TIMESTAMP portal-ui/tests/policies/iamPolicies.json
mc admin policy add minio logs-$TIMESTAMP portal-ui/tests/policies/logs.json
mc admin policy add minio notificationendpoints-$TIMESTAMP portal-ui/tests/policies/notificationEndpoints.json
mc admin policy add minio settings-$TIMESTAMP portal-ui/tests/policies/settings.json
mc admin policy add minio tiers-$TIMESTAMP portal-ui/tests/policies/tiers.json
mc admin policy add minio trace-$TIMESTAMP portal-ui/tests/policies/trace.json
mc admin policy add minio users-$TIMESTAMP portal-ui/tests/policies/users.json
mc admin policy add minio watch-$TIMESTAMP portal-ui/tests/policies/watch.json
mc admin policy add minio bucketwriteprefixonlypolicy-$TIMESTAMP portal-ui/tests/policies/bucketWritePrefixOnlyPolicy.json
}
create_users() {
mc admin user add minio bucketassignpolicy-$TIMESTAMP bucketassignpolicy
mc admin user add minio bucketread-$TIMESTAMP bucketread
mc admin user add minio bucketwrite-$TIMESTAMP bucketwrite
mc admin user add minio dashboard-$TIMESTAMP dashboard
mc admin user add minio diagnostics-$TIMESTAMP diagnostics
mc admin user add minio groups-$TIMESTAMP groups1234
mc admin user add minio heal-$TIMESTAMP heal1234
mc admin user add minio iampolicies-$TIMESTAMP iampolicies
mc admin user add minio logs-$TIMESTAMP logs1234
mc admin user add minio notificationendpoints-$TIMESTAMP notificationendpoints
mc admin user add minio settings-$TIMESTAMP settings
mc admin user add minio tiers-$TIMESTAMP tiers1234
mc admin user add minio trace-$TIMESTAMP trace1234
mc admin user add minio users-$TIMESTAMP users1234
mc admin user add minio watch-$TIMESTAMP watch1234
mc admin user add minio bucketwriteprefixonlypolicy-$TIMESTAMP bucketwriteprefixonlypolicy
}
create_buckets() {
mc mb minio/testcafe && mc cp ./portal-ui/tests/uploads/test.txt minio/testcafe/write/test.txt
}
assign_policies() {
mc admin policy set minio bucketassignpolicy-$TIMESTAMP user=bucketassignpolicy-$TIMESTAMP
mc admin policy set minio bucketread-$TIMESTAMP user=bucketread-$TIMESTAMP
mc admin policy set minio bucketwrite-$TIMESTAMP user=bucketwrite-$TIMESTAMP
mc admin policy set minio dashboard-$TIMESTAMP user=dashboard-$TIMESTAMP
mc admin policy set minio diagnostics-$TIMESTAMP user=diagnostics-$TIMESTAMP
mc admin policy set minio groups-$TIMESTAMP user=groups-$TIMESTAMP
mc admin policy set minio heal-$TIMESTAMP user=heal-$TIMESTAMP
mc admin policy set minio iampolicies-$TIMESTAMP user=iampolicies-$TIMESTAMP
mc admin policy set minio logs-$TIMESTAMP user=logs-$TIMESTAMP
mc admin policy set minio notificationendpoints-$TIMESTAMP user=notificationendpoints-$TIMESTAMP
mc admin policy set minio settings-$TIMESTAMP user=settings-$TIMESTAMP
mc admin policy set minio tiers-$TIMESTAMP user=tiers-$TIMESTAMP
mc admin policy set minio trace-$TIMESTAMP user=trace-$TIMESTAMP
mc admin policy set minio users-$TIMESTAMP user=users-$TIMESTAMP
mc admin policy set minio watch-$TIMESTAMP user=watch-$TIMESTAMP
mc admin policy set minio bucketwriteprefixonlypolicy-$TIMESTAMP user=bucketwriteprefixonlypolicy-$TIMESTAMP
}
SCRIPT_DIR=$(dirname "$0")
export SCRIPT_DIR
source "${SCRIPT_DIR}/common.sh"
remove_users() {
mc admin user remove minio bucketassignpolicy-$TIMESTAMP

View File

@@ -766,6 +766,25 @@ func Test_GetBucketRetentionConfig(t *testing.T) {
},
expectedError: nil,
},
{
name: "Get Bucket Retention Config Compliance",
args: args{
ctx: ctx,
client: minClient,
bucketName: "test",
getRetentionFunc: func(ctx context.Context, bucketName string) (mode *minio.RetentionMode, validity *uint, unit *minio.ValidityUnit, err error) {
m := minio.Compliance
u := minio.Days
return &m, swag.Uint(2), &u, nil
},
},
expectedResponse: &models.GetBucketRetentionConfig{
Mode: models.ObjectRetentionModeCompliance,
Unit: models.ObjectRetentionUnitDays,
Validity: int32(2),
},
expectedError: nil,
},
{
name: "Handle Error on minio func",
args: args{