Skip to content
This repository has been archived by the owner on Jun 20, 2024. It is now read-only.

Commit

Permalink
feat: delete objects tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fczuardi committed Jan 11, 2024
1 parent 6b39465 commit a5dc98a
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 3 deletions.
133 changes: 133 additions & 0 deletions src/k6/delete-objects.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import { check } from 'k6'
import { parse as yamlParse } from "k6/x/yaml";
import { aws, rclone } from "./utils/clis.js"
import {bucketSetup, bucketTeardown} from "./utils/test-bucket.js"
import tags from "./utils/tags.js"

// init stage
const bucketName = __ENV.TEST_BUCKET
const testFileName = "LICENSE"
const profileName = __ENV.AWS_CLI_PROFILE
const profile = __ENV.AWS_CLI_PROFILE
const config = yamlParse(open('../../config.yaml'));
const s3Config = config.remotes[profile].s3

export function setup(){
// a list of key names will be used to create and delete 7 objects
const objectKeys = Array.from(
{ length: 7 },
(_, index) => `obj-${(index + 1).toString().padStart(3, '0')}`
);
const localFile = `./${testFileName}`
const data = bucketSetup(s3Config, bucketName);
return Object.assign({}, data, {objectKeys: objectKeys, localFile})
}
export function teardown(data){
return bucketTeardown(data, bucketName)
}
export default function scenarios(data) {
createObjects(data)
deleteObjects(data)
}

// create small objects using different tools
function createObjects(data) {
let checkTags = { feature: tags.features.PUT_OBJECT, }
data.objectKeys.forEach((keyName, index) => {
let out;
if (index < 2) {
// copy some files using s3 cp
out = aws(s3Config, "s3", ["cp", data.localFile, `s3://${data.bucketName}/${keyName}`])
checkTags.tool = tags.tools.CLI_AWS
checkTags.command = tags.commands.CLI_AWS_S3_CP
check(out, { [`${checkTags.command}` ]: out => out.includes("Completed") }, checkTags)
} else if (index >= 2 && index < 4) {
// copy some files using s3api put-object
out = aws(s3Config, "s3api", [
"put-object",
"--body", data.localFile,
"--key", keyName,
"--bucket", data.bucketName
])
checkTags.tool = tags.tools.CLI_AWS
checkTags.command = tags.commands.CLI_AWS_S3API_PUT_OBJECT
check(out, { [`${checkTags.command}` ]: out => out.includes("ETag") }, checkTags)
} else {
// copy some files using rclone copyto
out = rclone("copyto", [ data.localFile, `${profileName}-s3:${data.bucketName}/${keyName}` ])
checkTags.tool = tags.tools.CLI_RCLONE
checkTags.command = tags.commands.CLI_RCLONE_COPYTO
check(out, { [`${checkTags.command}` ]: out => !out.includes("exit status") }, checkTags)
}
})
}

//delete small objects using different tools
function deleteObjects(data) {
let checkTags = { feature: tags.features.DELETE_OBJECT, }
data.objectKeys.every((keyName, index) => {
let out;
if (index == 0) {
// delete a single object using aws s3
out = aws(s3Config, "s3", ["rm", `s3://${data.bucketName}/${keyName}`])
checkTags.tool = tags.tools.CLI_AWS
checkTags.command = tags.commands.CLI_AWS_S3_RM
check(out, { [`${checkTags.command}` ]: out => out.includes("delete:") }, checkTags)
return true
} else if (index == 1) {
// delete a single object using aws s3api
out = aws(s3Config, "s3api", ["delete-object", "--bucket", data.bucketName, "--key", keyName])
checkTags.tool = tags.tools.CLI_AWS
checkTags.command = tags.commands.CLI_AWS_S3API_DELETE_OBJECT
check(out, { [`${checkTags.command}` ]: out => !out.includes("exit status") }, checkTags)
return true
} else if (index == 2) {
// delete a single object using rclone
out = rclone("delete", [ "-v", `${profileName}-s3:${data.bucketName}/${keyName}` ])
checkTags.tool = tags.tools.CLI_RCLONE
checkTags.command = tags.commands.CLI_RCLONE_DELETE
check(out, { [`${checkTags.command}` ]: out => !out.includes("exit status") }, checkTags)
return true
} else if (index == 3) {
// delete two objects using aws s3api
const objectsToDelete = data.objectKeys.slice(index, index + 2).map(k => ({"Key": k}))
out = aws(s3Config, "s3api", [
"delete-objects",
"--bucket", data.bucketName,
"--delete", `{"Objects": ${JSON.stringify(objectsToDelete)} }`
])
console.log({out})
checkTags.feature = tags.features.DELETE_OBJECTS
checkTags.tool = tags.tools.CLI_AWS
checkTags.command = tags.commands.CLI_AWS_S3API_DELETE_OBJECTS
check(out, { [`${checkTags.command}` ]: out => out.includes("Deleted") }, checkTags)
check(out, { [`${checkTags.command}` ]: out => out.includes(keyName) }, checkTags)
return true
} else if (index == 4) {
// skiped because previous deleted 2
return true
} else {
// check size before deletion
out = rclone("size", [ `${profileName}-s3:${data.bucketName}` ])
console.log({out})
let match = out.match(/Total objects: (\d+)/);
const totalObjectsBefore = match ? parseInt(match[1], 10) : null;
// delete remaining objects using rclone
out = rclone("delete", [ "--min-size", "10B", "-v", `${profileName}-s3:${data.bucketName}` ])
checkTags.feature = tags.features.DELETE_OBJECTS
checkTags.tool = tags.tools.CLI_RCLONE
checkTags.command = tags.commands.CLI_RCLONE_DELETE
console.log({out})
check(out, { [`${checkTags.command}` ]: out => !out.includes("exit status") }, checkTags)
// check size after deletion
out = rclone("size", [ `${profileName}-s3:${data.bucketName}` ])
console.log({out})
match = out.match(/Total objects: (\d+)/);
const totalObjectsAfter = match ? parseInt(match[1], 10) : null;
const objectsDelta = totalObjectsAfter - totalObjectsBefore
console.log({objectsDelta})
check(objectsDelta, { [`${checkTags.command} multiple objects` ]: d => d <= -2 }, checkTags)
return false
}
})
}
15 changes: 15 additions & 0 deletions src/k6/index-s3.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ import {
setup as awsCliCreateBucketSetup,
teardown as awsCliCreateBucketTeardown,
} from "./aws-cli-create-bucket.js";
import {
default as deleteObjectsTest,
setup as deleteObjectsSetup,
teardown as deleteObjectsTeardown,
} from "./delete-objects.js";

// init stage
// XXX: due to k6 this is the aggregated copy/paste of each init stage
Expand All @@ -49,6 +54,7 @@ const s3Config = config.remotes[__ENV.AWS_CLI_PROFILE].s3
const swiftConfig = config.remotes[__ENV.AWS_CLI_PROFILE].swift
const mgcConfig = config.remotes[__ENV.AWS_CLI_PROFILE].mgc
const s3 = makeS3Client(s3Config);
const bucketName = __ENV.TEST_BUCKET
const testFileName = "LICENSE"
const testFile = open(`../../${testFileName}`, "r");

Expand Down Expand Up @@ -79,6 +85,9 @@ export function setup() {
describe("Setup create bucket duplicate test", (_t) => {
setupData.awsCliCreateBucketData = awsCliCreateBucketSetup();
});
describe("Setup delete objects test", (_t) => {
setupData.awsCliDeleteObjectsData = deleteObjectsSetup();
});
return setupData;
}
export default function ({
Expand Down Expand Up @@ -115,6 +124,9 @@ export default function ({
describe("Run create bucket duplicate test", (_t) => {
awsCliCreateBucketTest(awsCliCreateBucketData);
});
describe("Run delete objects test", (_t) => {
deleteObjectsTest(awsCliDeleteObjectsData);
});
}

export function teardown({
Expand Down Expand Up @@ -148,4 +160,7 @@ export function teardown({
describe("Teardown aws-cli create bucket duplicate test", (_t) => {
awsCliCreateBucketTeardown(awsCliCreateBucketData);
});
describe("Teardown aws-cli delete objects test", (_t) => {
deleteObjectsTeardown(awsCliDeleteObjectsData);
});
}
8 changes: 7 additions & 1 deletion src/k6/utils/tags.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const tags = {
features: {
// buckets
CREATE_BUCKET: "create bucket",
LIST_BUCKETS: "list buckets",
DELETE_BUCKET: "delete bucket",
BUCKET_INFO_CREATION_DATE: "bucket creation date",
Expand All @@ -15,6 +14,7 @@ const tags = {

// new list

CREATE_BUCKET: "Create Bucket",
// Transfer Bucket Between Regions
// Set Bucket Permission to a Public Bucket
// Set Bucket Permission to a Private Bucket
Expand All @@ -27,6 +27,7 @@ const tags = {
// Last Modification
// Object Metadata
DELETE_OBJECT: "Delete Object from a Bucket",
DELETE_OBJECTS: "Delete Multiple Objects from a Bucket",
PUT_OBJECT_MULTIPART: "Put Object Multipart",
ABORT_MULTIPART_UPLOAD: "Abort Object Multipart",
// Pause Object Multipart
Expand Down Expand Up @@ -75,11 +76,14 @@ const tags = {
commands: {
CLI_AWS_S3_MB: "aws s3 mb",
CLI_AWS_S3_RB: "aws s3 rb",
CLI_AWS_S3_RM: "aws s3 rm",
CLI_AWS_S3_LS: "aws s3 ls",
CLI_AWS_S3_CP: "aws s3 cp",
CLI_AWS_S3_PRESIGN: "aws s3 presign",
CLI_AWS_S3API_CREATE_BUCKET: "aws s3api create-bucket",
CLI_AWS_S3API_PUT_OBJECT: "aws s3api put-object",
CLI_AWS_S3API_DELETE_OBJECT: "aws s3api delete-object",
CLI_AWS_S3API_DELETE_OBJECTS: "aws s3api delete-objects",
CLI_AWS_S3API_CREATE_MULTIPART: "aws s3api create-multipart-upload",
CLI_AWS_S3API_LIST_MULTIPART: "aws s3api list-multipart-uploads",
CLI_AWS_S3API_ABORT_MULTIPART: "aws s3api abort-multipart-upload",
Expand All @@ -95,7 +99,9 @@ const tags = {
CLI_MGC_OBJECTS_DELETE: "mgc object-storage objects delete",
CLI_MGC_BUCKETS_DELETE: "mgc object-storage buckets delete",
CLI_RCLONE_LIST: "rclone lsd",
CLI_RCLONE_COPYTO: "rclone copyto",
CLI_RCLONE_COPY: "rclone copy",
CLI_RCLONE_DELETE: "rclone delete",
CLI_RCLONE_PURGE: "rclone purge",
CLI_RCLONE_CAT: "rclone cat",
HTTP_PUT: "http put",
Expand Down
12 changes: 10 additions & 2 deletions src/k6/utils/test-bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ import { crypto } from "k6/experimental/webcrypto"
import { aws } from "./clis.js"
import tags from "./tags.js"

export function bucketSetup(s3Config) {
export function bucketSetup(s3Config, testBucketName) {
if (testBucketName) {
console.log("a test bucker was passed, skip bucket creation")
return {bucketName: testBucketName, s3Config}
}
const bucketName = `test-${crypto.randomUUID()}`
const locationConstraint = s3Config.region === 'us-east-1' ? [] :
["--create-bucket-configuration", `LocationConstraint=${s3Config.region}`]
Expand All @@ -28,7 +32,11 @@ export function bucketSetup(s3Config) {
return {bucketName, s3Config}
}

export function bucketTeardown({s3Config, bucketName}) {
export function bucketTeardown({s3Config, bucketName}, testBucketName) {
if (testBucketName) {
console.log("a test bucker was passed, skip bucket purge")
return
}
// delete bucket used by the tests
const purgeBucketResult = aws(
s3Config,
Expand Down

0 comments on commit a5dc98a

Please sign in to comment.