Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ node_modules
cache
/packages/k6-tests/artifacts
.env
env/*/result
scenarios/*/result
40 changes: 40 additions & 0 deletions environments/nextcloud/31_0_8-apache/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
services:
db:
image: mariadb:lts
restart: always
command: --transaction-isolation=READ-COMMITTED
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=INSECURE
- MYSQL_PASSWORD=INSECURE
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
redis:
image: redis:alpine
restart: always

app:
# php occ config:system:set ratelimit.protection.enabled --type bool --value=false
# php occ config:system:set auth.bruteforce.protection.enabled --type bool --value=false
image: nextcloud:31.0.8-apache
restart: always
ports:
- 8080:80
depends_on:
- redis
- db
volumes:
- nextcloud:/var/www/html
environment:
- MYSQL_PASSWORD=INSECURE
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
- NEXTCLOUD_ADMIN_USER=admin
- NEXTCLOUD_ADMIN_PASSWORD=admin
- NEXTCLOUD_TRUSTED_DOMAINS=oc.home.arpa

volumes:
nextcloud:
db:
20 changes: 20 additions & 0 deletions environments/opencloud/3_4_0/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
services:
opencloud:
image: quay.io/opencloudeu/opencloud-rolling:3.4.0
restart: always
ports:
- 9200:9200
entrypoint:
- /bin/sh
command: ["-c", "opencloud init || true; opencloud server"]
environment:
- OC_URL=https://oc.home.arpa:9200
- IDM_CREATE_DEMO_USERS=false
- IDM_ADMIN_PASSWORD=admin
- OC_INSECURE=true
volumes:
- opencloud_config:/etc/opencloud
- opencloud_data:/var/lib/opencloud
volumes:
opencloud_config:
opencloud_data:
38 changes: 24 additions & 14 deletions packages/k6-tdk/src/client/group.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { RefinedResponse } from 'k6/http'
import {RefinedResponse} from 'k6/http'

import { endpoints } from '@/endpoints'
import { check } from '@/utils'
import { Platform } from '@/values'
import {endpoints} from '@/endpoints'
import {check} from '@/utils'
import {Platform} from '@/values'

import { EndpointClient } from './client'
import {EndpointClient} from './client'

export class Group extends EndpointClient {
getGroups(): RefinedResponse<'text'> | undefined {
Expand All @@ -18,7 +18,7 @@ export class Group extends EndpointClient {
response = endpoints.graph.v1.groups.GET_get_groups(this.httpClient, {})
}

check({ skip: !response, val: response }, {
check({skip: !response, val: response}, {
'client -> group.getGroups - status': (r) => {
return r?.status === 200
}
Expand All @@ -28,20 +28,24 @@ export class Group extends EndpointClient {
}

createGroup(p: { groupName: string }): RefinedResponse<'text'> {
let expectedStatus = 201
let response: RefinedResponse<'text'>

switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
expectedStatus = 200
// noinspection FallThroughInSwitchStatementJS
case Platform.ownCloudServer:
response = endpoints.ocs.v2.apps.cloud.groups.POST__create_group(this.httpClient, p)
break
case Platform.openCloud:
default:
response = endpoints.graph.v1.groups.POST__create_group(this.httpClient, p)
}

check({ val: response }, {
'client -> group.createGroup - status': ({ status }) => {
return status === 201
check({val: response}, {
'client -> group.createGroup - status': ({status}) => {
return status === expectedStatus
}
})

Expand All @@ -54,21 +58,27 @@ export class Group extends EndpointClient {
switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
response = endpoints.ocs.v2.apps.cloud.groups.DELETE__delete_group(this.httpClient, { groupName: p.groupIdOrName })
response = endpoints.ocs.v2.apps.cloud.groups.DELETE__delete_group(this.httpClient, {groupName: p.groupIdOrName})
expectedStatus = 200
break
case Platform.openCloud:
default:
response = endpoints.graph.v1.groups.DELETE__delete_group(this.httpClient, { groupId: p.groupIdOrName })
response = endpoints.graph.v1.groups.DELETE__delete_group(this.httpClient, {groupId: p.groupIdOrName})
expectedStatus = 204
}

check({ val: response }, {
'client -> group.deleteGroup - status': ({ status }) => {
check({val: response}, {
'client -> group.deleteGroup - status': ({status}) => {
return status === expectedStatus
}
})

return response
}

addGroupMember(p: { groupIdOrName: string, memberId: string }): RefinedResponse<'text' | 'none'> {
const response = endpoints.graph.v1.groups.POST__add_group_member(this.httpClient, {groupId: p.groupIdOrName, memberId: p.memberId})
console.log(response)
return response
}
}
58 changes: 30 additions & 28 deletions packages/k6-tdk/src/client/resource.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import { RefinedResponse, RequestBody } from 'k6/http'
import {RefinedResponse, RequestBody} from 'k6/http'

import { endpoints } from '@/endpoints'
import { check } from '@/utils'
import { Platform } from '@/values'
import {endpoints} from '@/endpoints'
import {check} from '@/utils'
import {Platform} from '@/values'

import { EndpointClient } from './client'
import { RESOURCE__get_resource_properties } from './xml'
import {EndpointClient} from './client'
import {RESOURCE__get_resource_properties} from './xml'

export class Resource extends EndpointClient {
createResource(p: { root: string, resourcePath: string }): RefinedResponse<'none'> {
let response: RefinedResponse<'none'>
switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
case Platform.ownCloudServer:
response = endpoints.dav.files.MKCOL__create_resource(this.httpClient, p)
break
case Platform.openCloud:
default:
response = endpoints.dav.spaces.MKCOL__create_resource(this.httpClient, { ...p, driveId: p.root })
response = endpoints.dav.spaces.MKCOL__create_resource(this.httpClient, {...p, driveId: p.root})
}

check({ val: response }, {
'client -> resource.createResource - status': ({ status }) => {
check({val: response}, {
'client -> resource.createResource - status': ({status}) => {
return status === 201
}
})
Expand All @@ -38,11 +38,11 @@ export class Resource extends EndpointClient {
break
case Platform.openCloud:
default:
response = endpoints.dav.spaces.DELETE__delete_resource(this.httpClient, { ...p, driveId: p.root })
response = endpoints.dav.spaces.DELETE__delete_resource(this.httpClient, {...p, driveId: p.root})
}

check({ val: response }, {
'client -> resource.deleteResource - status': ({ status }) => {
check({val: response}, {
'client -> resource.deleteResource - status': ({status}) => {
return status === 204
}
})
Expand All @@ -52,18 +52,19 @@ export class Resource extends EndpointClient {

moveResource(p: { root: string, fromResourcePath: string, toResourcePath: string }): RefinedResponse<'none'> {
let response: RefinedResponse<'none'>

switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
case Platform.ownCloudServer:
response = endpoints.dav.files.MOVE__move_resource(this.httpClient, p)
break
case Platform.openCloud:
default:
response = endpoints.dav.spaces.MOVE__move_resource(this.httpClient, { ...p, driveId: p.root })
response = endpoints.dav.spaces.MOVE__move_resource(this.httpClient, {...p, driveId: p.root})
}

check({ val: response }, {
'client -> resource.moveResource - status': ({ status }) => {
check({val: response}, {
'client -> resource.moveResource - status': ({status}) => {
return status === 201
}
})
Expand All @@ -79,16 +80,16 @@ export class Resource extends EndpointClient {
case Platform.ownCloudServer:
case Platform.nextcloud:
response = endpoints.dav.files.PROPFIND__get_properties_for_resource(this.httpClient,
{ ...p, propfindXml })
{...p, propfindXml})
break
case Platform.openCloud:
default:
response = endpoints.dav.spaces.PROPFIND__get_properties_for_resource(this.httpClient,
{ ...p, driveId: p.root, propfindXml })
{...p, driveId: p.root, propfindXml})
}

check({ val: response }, {
'client -> resource.getResourceProperties - status': ({ status }) => {
check({val: response}, {
'client -> resource.getResourceProperties - status': ({status}) => {
return status === 207
}
})
Expand All @@ -98,18 +99,19 @@ export class Resource extends EndpointClient {

uploadResource(p: { resourcePath: string, root: string, resourceBytes: RequestBody }): RefinedResponse<'none'> {
let response: RefinedResponse<'none'>

switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
case Platform.ownCloudServer:
response = endpoints.dav.files.PUT__upload_resource(this.httpClient, p)
break
case Platform.openCloud:
default:
response = endpoints.dav.spaces.PUT__upload_resource(this.httpClient, { ...p, driveId: p.root })
response = endpoints.dav.spaces.PUT__upload_resource(this.httpClient, {...p, driveId: p.root})
}

check({ val: response }, {
'client -> resource.uploadResource - status': ({ status }) => {
check({val: response}, {
'client -> resource.uploadResource - status': ({status}) => {
return status === 201
}
})
Expand All @@ -127,11 +129,11 @@ export class Resource extends EndpointClient {
case Platform.openCloud:
default:
response = endpoints.dav.spaces.GET__download_resource(this.httpClient,
{ ...p, driveId: p.root })
{...p, driveId: p.root})
}

check({ val: response }, {
'client -> resource.downloadResource - status': ({ status }) => {
check({val: response}, {
'client -> resource.downloadResource - status': ({status}) => {
return status === 200
}
})
Expand Down
3 changes: 2 additions & 1 deletion packages/k6-tdk/src/client/tag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ export class Tag extends EndpointClient {
} = p

let response: RefinedResponse<'none'> | undefined

switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
case Platform.ownCloudServer:
response = endpoints.dav.systemtags.POST__create_tag(this.httpClient, {
tagName,
userAssignableTag,
Expand Down
12 changes: 9 additions & 3 deletions packages/k6-tdk/src/client/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ import { EndpointClient } from './client'

export class User extends EndpointClient {
createUser(p: { userLogin: string, userPassword: string }): RefinedResponse<'text'> {
let expectedStatus = 201
let response: RefinedResponse<'text'>
switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
expectedStatus = 200
// noinspection FallThroughInSwitchStatementJS
case Platform.ownCloudServer:
response = endpoints.ocs.v2.apps.cloud.users.POST__create_user(this.httpClient, p)
break
case Platform.openCloud:
Expand All @@ -21,7 +24,7 @@ export class User extends EndpointClient {

check({ val: response }, {
'client -> user.createUser - status': ({ status }) => {
return status === 201
return status === expectedStatus
}
})

Expand Down Expand Up @@ -53,11 +56,14 @@ export class User extends EndpointClient {
}

enableUser(p: { userLogin: string }): RefinedResponse<'text'> | undefined {
let expectedStatus = 200
let response: RefinedResponse<'text'> | undefined

switch (this.platform) {
case Platform.ownCloudServer:
case Platform.nextcloud:
expectedStatus = 200
// noinspection FallThroughInSwitchStatementJS
case Platform.ownCloudServer:
response = endpoints.ocs.v2.apps.cloud.users.PUT__enable_user(this.httpClient, p)
break
case Platform.openCloud:
Expand Down
8 changes: 8 additions & 0 deletions packages/k6-tdk/src/endpoints/graph-v1-groups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,11 @@ export const POST__create_group: Endpoint<{ groupName: string }, 'text'> = (http
export const DELETE__delete_group: Endpoint<{ groupId: string }, 'none'> = (httpClient, { groupId }) => {
return httpClient('DELETE', `/graph/v1.0/groups/${groupId}`)
}

export const POST__add_group_member: Endpoint<{ groupId: string, memberId: string }, 'none'> = (httpClient, { memberId, groupId }) => {
return httpClient('POST', `/graph/v1.0/groups/${groupId}/members/$ref`, JSON.stringify({
// currently the url is not relevant, any url will do,
// the important part is the memberId, and the users slug
'@odata.id': `https://any.url/graph/v1.0/users/${memberId}`
}))
}
3 changes: 2 additions & 1 deletion packages/k6-tests/build.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ const outdir = 'artifacts'
const buildToFromMap = (glob, stripExtension = false) => {
return fg.sync(glob).reduce((acc, from) => {
const fromInfo = path.parse(from)
const [src, ...namespace] = fromInfo.dir.split('/');
const [_, src, ...namespace] = fromInfo.dir.split('/');

let to = [...namespace, fromInfo.name].join('-').replace(/[._]/g, '-')

if (!stripExtension) {
to = to + fromInfo.ext
}

if (src === 'src'){
to = '_' + to
}
Expand Down
Loading
Loading