diff --git a/adapter-http/src/main/resources/activities/baselines/http-rest-keyvalue.yaml b/adapter-http/src/main/resources/activities/baselines/http-rest-keyvalue.yaml index 80a5d127c..04310c8c8 100644 --- a/adapter-http/src/main/resources/activities/baselines/http-rest-keyvalue.yaml +++ b/adapter-http/src/main/resources/activities/baselines/http-rest-keyvalue.yaml @@ -21,7 +21,7 @@ bindings: weighted_hosts: WeightedStrings('<>') request_id: ToHashedUUID(); ToString(); - request_token: ToString(); TextOfFile("TEMPLATE(stargate_tokenfile,data/stargate_token.txt)") + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt'))); seq_key: Mod(<>); ToString() -> String seq_value: Hash(); Mod(<>); ToString() -> String @@ -93,23 +93,23 @@ blocks: Content-Type: "application/json" body: | { - "name": "<>", - "columnDefinitions": [ - { - "name": "key", - "typeDefinition": "text" - }, - { - "name": "value", - "typeDefinition": "text" - } - ], - "primaryKey": { - "partitionKey": [ - "key" - ] - }, - "ifNotExists": true + "name": "<>", + "columnDefinitions": [ + { + "name": "key", + "typeDefinition": "text" + }, + { + "name": "value", + "typeDefinition": "text" + } + ], + "primaryKey": { + "partitionKey": [ + "key" + ] + }, + "ifNotExists": true } rampup: diff --git a/adapter-http/src/main/resources/activities/baselines/http-rest-tabular.yaml b/adapter-http/src/main/resources/activities/baselines/http-rest-tabular.yaml index 2a9f278b2..8f9059076 100644 --- a/adapter-http/src/main/resources/activities/baselines/http-rest-tabular.yaml +++ b/adapter-http/src/main/resources/activities/baselines/http-rest-tabular.yaml @@ -10,8 +10,8 @@ description: | scenarios: default: schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF - rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,10000000) threads=auto - main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto + rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,10) threads=auto + main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10) threads=auto bindings: # To enable an optional weighted set of hosts in place of a load balancer @@ -21,7 +21,7 @@ bindings: # multiple weighted hosts: restapi_host=host1:3,host2:7 weighted_hosts: WeightedStrings('<>') request_id: ToHashedUUID(); ToString(); - request_token: ToString(); TextOfFile("TEMPLATE(stargate_tokenfile,data/stargate_token.txt)") + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt')); # for ramp-up and verify part_layout: Div(<>); ToString() -> String @@ -50,8 +50,8 @@ blocks: Content-Type: "application/json" body: | { - "name": "<>", - "replicas": <> + "name": "<>", + "replicas": <> } drop-table: @@ -72,30 +72,30 @@ blocks: Content-Type: "application/json" body: | { - "name": "<>", - "columnDefinitions": [ - { - "name": "part", - "typeDefinition": "text" - }, - { - "name": "clust", - "typeDefinition": "text" - }, - { - "name": "data", - "typeDefinition": "text" - } - ], - "primaryKey": { - "partitionKey": [ - "part" - ], - "clusteringKey": [ - "clust" - ] + "name": "<>", + "columnDefinitions": [ + { + "name": "part", + "typeDefinition": "text" }, - "ifNotExists": true + { + "name": "clust", + "typeDefinition": "text" + }, + { + "name": "data", + "typeDefinition": "text" + } + ], + "primaryKey": { + "partitionKey": [ + "part" + ], + "clusteringKey": [ + "clust" + ] + }, + "ifNotExists": true } rampup: diff --git a/adapter-http/src/main/resources/activities/baselines/http-rest-timeseries.yaml b/adapter-http/src/main/resources/activities/baselines/http-rest-timeseries.yaml index be6fedc24..491536657 100644 --- a/adapter-http/src/main/resources/activities/baselines/http-rest-timeseries.yaml +++ b/adapter-http/src/main/resources/activities/baselines/http-rest-timeseries.yaml @@ -12,10 +12,9 @@ description: | scenarios: default: - schema: run driver=cql tags==block:"schema.*" threads==1 cycles==UNDEF - schema-astra: run driver=cql tags==block:schema-astra threads==1 cycles==UNDEF - rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,10000000) threads=auto - main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10000000) threads=auto + schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF + rampup: run driver=http tags==block:"rampup.*" cycles===TEMPLATE(rampup-cycles,1) threads=auto + main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,10) threads=auto bindings: # To enable an optional weighted set of hosts in place of a load balancer @@ -27,10 +26,10 @@ bindings: # http request id request_id: ToHashedUUID(); ToString(); - request_token: ToString(); TextOfFile("TEMPLATE(stargate_tokenfile,data/stargate_token.txt)") + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt')); machine_id: Mod(<>); ToHashedUUID() -> java.util.UUID - sensor_name: HashedLineToString('data/variable_words.txt') + sensor_name: HashedLineToString('data/variable_words.txt'); time: Mul(<>L); Div(<>L); StringDateWrapper("yyyy-MM-dd'T'hh:mm:ss'Z"); sensor_value: Normal(0.0,5.0); Add(100.0) -> double station_id: Div(<>);Mod(<>); ToHashedUUID() -> java.util.UUID @@ -48,9 +47,9 @@ blocks: Content-Type: "application/json" body: | { - "name": "<>", - "replicas": <> - } + "name": "<>", + "replicas": <> + } drop-table: method: DELETE @@ -70,54 +69,56 @@ blocks: Content-Type: "application/json" body: | { - "name": "<>", - "columnDefinitions": [ - { - "name": "machine_id", - "typeDefinition": "uuid" - }, - { - "name": "sensor_name", - "typeDefinition": "text" - }, - { - "name": "time", - "typeDefinition": "timestamp" - }, - { - "name": "sensor_value", - "typeDefinition": "double" - }, - { - "name": "station_id", - "typeDefinition": "uuid" - }, - { - "name": "data", - "typeDefinition": "text" - } - ], - "primaryKey": { - "partitionKey": [ - "machine_id", - "sensor_name" - ], - "clusteringKey": [ - "time" - ] + "name": "<>", + "columnDefinitions": | + [ + { + "name": "machine_id", + "typeDefinition": "uuid" }, - "tableOptions": { - "clusteringExpression": [ - { - "column": "time", - "order": "DESC" - } - ] + { + "name": "sensor_name", + "typeDefinition": "text" }, - "ifNotExists": true + { + "name": "time", + "typeDefinition": "timestamp" + }, + { + "name": "sensor_value", + "typeDefinition": "double" + }, + { + "name": "station_id", + "typeDefinition": "uuid" + }, + { + "name": "data", + "typeDefinition": "text" + } + ], + "primaryKey": | + { + "partitionKey": [ + "machine_id", + "sensor_name" + ], + "clusteringKey": [ + "time" + ] + }, + "tableOptions": | + { + "clusteringExpression": | + [ + { + "column": "time", + "order": "DESC" + } + ] + }, + "ifNotExists": true } - - rampup: ops: rampup-insert: @@ -136,7 +137,6 @@ blocks: "station_id": "{station_id}", "data": "{data}" } - main-read: params: ratio: <> @@ -168,4 +168,4 @@ blocks: "sensor_value": "{sensor_value}", "station_id": "{station_id}", "data": "{data}" - } + } \ No newline at end of file diff --git a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-basic.yaml b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-basic.yaml index b644da7d2..9beca5f3e 100644 --- a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-basic.yaml +++ b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-basic.yaml @@ -7,11 +7,11 @@ description: | scenarios: default: - schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF - write: run driver=http tags==block:'write.*' cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn - read: run driver=http tags==block:'read.*' cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn - update: run driver=http tags==block:'update.*' cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn - delete: run driver=http tags==block:'delete.*' cycles===TEMPLATE(delete-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn + schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF + write: run driver=http tags==block:"write.*" cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + read: run driver=http tags==block:"read.*" cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + update: run driver=http tags==block:"update.*" cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + delete: run driver=http tags==block:"delete.*" cycles===TEMPLATE(delete-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn bindings: # To enable an optional weighted set of hosts in place of a load balancer @@ -22,6 +22,7 @@ bindings: weighted_hosts: WeightedStrings('<>') # http request id request_id: ToHashedUUID(); ToString(); + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt')); seq_key: Mod(<>); ToString() -> String random_key: Uniform(0,<>); ToString() -> String @@ -45,12 +46,12 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/schemas/namespaces Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>", - "replicas": <> + "name": "<>", + "replicas": <> } ok-status: ".*" @@ -67,11 +68,11 @@ blocks: method: POST Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>" + "name": "<>" } write: @@ -81,7 +82,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{seq_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { @@ -92,20 +93,20 @@ blocks: "married": {married}, "address": { "primary": { - "city": "{city}", - "cc": "{country_code}" + "city": "{city}", + "cc": "{country_code}" }, "secondary": {} }, "coordinates": [ - {lat}, - {lng} + {lat}, + {lng} ], - "children": [], + "children": [], "friends": [ - "{friend_id}" + "{friend_id}" ], - "debt": null + "debt": null } read: @@ -115,7 +116,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{random_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" ok-status: "[2-4][0-9][0-9]" update: @@ -125,7 +126,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{random_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { @@ -136,22 +137,21 @@ blocks: "married": {married}, "address": { "primary": { - "city": "{city}", - "cc": "{country_code}" + "city": "{city}", + "cc": "{country_code}" }, "secondary": {} }, "coordinates": [ - {lat}, - {lng} + {lat}, + {lng} ], - "children": [], + "children": [], "friends": [ - "{friend_id}" + "{friend_id}" ], - "debt": null + "debt": null } - delete: ops: delete-document: @@ -159,5 +159,5 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{seq_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" - ok-status: "[2-4][0-9][0-9]" + X-Cassandra-Token: "{request_token}" + ok-status: "[2-4][0-9][0-9]" \ No newline at end of file diff --git a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-dataset.yaml b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-dataset.yaml index 5a93c57ef..9857e2189 100644 --- a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-dataset.yaml +++ b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-crud-dataset.yaml @@ -7,11 +7,12 @@ description: | scenarios: default: - schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF - write: run driver=http tags==name:'write.*' cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn - read: run driver=http tags==name:'read.*' cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn - update: run driver=http tags==name:'update.*' cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn - delete: run driver=http tags==name:'delete.*' cycles===TEMPLATE(delete-cycles,TEMPLATE(docscount,10000000)) threads=auto errors=timer,warn + schema: run driver=http tags==block:"schema.*" threads==1 cycles==UNDEF + main: run driver=http tags==block:"main.*" cycles===TEMPLATE(main-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + # write: run driver=http tags==block:"write.*" cycles===TEMPLATE(write-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + # read: run driver=http tags==block:"read.*" cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + # update: run driver=http tags==block:"update.*" cycles===TEMPLATE(update-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn + # delete: run driver=http tags==block:"delete.*" cycles===TEMPLATE(delete-cycles,TEMPLATE(docscount,10)) threads=auto errors=timer,warn bindings: # To enable an optional weighted set of hosts in place of a load balancer @@ -22,9 +23,12 @@ bindings: weighted_hosts: WeightedStrings('<>') # http request id request_id: ToHashedUUID(); ToString(); + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt')); seq_key: Mod(<>); ToString() -> String random_key: Uniform(0,<>); ToString() -> String + # TODO - this needs a dataset_file to be used from data/* preferably + document_json: ModuloLineToString('<>'); blocks: schema: @@ -34,12 +38,12 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/schemas/namespaces Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>", - "replicas": <> + "name": "<>", + "replicas": <> } ok-status: ".*" @@ -48,7 +52,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" ok-status: "[2-4][0-9][0-9]" create-docs-collection: @@ -56,23 +60,21 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>" + "name": "<>" } main: - bindings: - document_json: ModuloLineToString('<>'); ops: write-document: method: PUT uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{seq_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: "{document_json}" @@ -81,7 +83,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{random_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" ok-status: "[2-4][0-9][0-9]" # TODO - what is the purpose of this? does it overwrite? is there a way to make sure it is actually overwriting existing documents? @@ -90,7 +92,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{random_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: "{document_json}" @@ -99,5 +101,5 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{seq_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" ok-status: "[2-4][0-9][0-9]" diff --git a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-advanced.yaml b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-advanced.yaml index 49cb31a4e..e07d45efb 100644 --- a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-advanced.yaml +++ b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-advanced.yaml @@ -15,19 +15,19 @@ description: | # complex2: (match1 LTE 0 OR match2 EQ "false") AND (match2 EQ "false" OR match3 EQ true) # complex3: (match1 LTE 0 AND match2 EQ "true") OR (match2 EQ "false" AND match3 EQ true) scenarios: - schema: run driver=http tags==block:"schema.*" threads==<> cycles==UNDEF + schema: run driver=http tags==block:"schema.*" threads==<> cycles==UNDEF rampup: - write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<> errors=timer,warn - read: run driver=http tags==block:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10000000) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + write: run driver=http tags==block:"rampup-put.*" cycles===TEMPLATE(docscount,10) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<> errors=timer,warn + read: run driver=http tags==block:"rampup-get.*" cycles===TEMPLATE(rampup-cycles, 10) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn main: - all: run driver=http tags==block:main cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-in: run driver=http tags==name:main-get-in,filter:in cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-not-in: run driver=http tags==name:main-get-not-in cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-mem-and: run driver=http tags==name:main-get-mem-and cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-mem-or: run driver=http tags==name:main-get-mem-or cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-complex1: run driver=http tags==name:main-get-complex1 cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-complex2: run driver=http tags==name:main-get-complex2 cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-complex3: run driver=http tags==name:main-get-complex3 cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + all: run driver=http tags==block:"main.*" cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-in: run driver=http tags==block:main-get-in,filter:in cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-not-in: run driver=http tags==block:main-get-not-in cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-mem-and: run driver=http tags==block:main-get-mem-and cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-mem-or: run driver=http tags==block:main-get-mem-or cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-complex1: run driver=http tags==block:main-get-complex1 cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-complex2: run driver=http tags==block:main-get-complex2 cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-complex3: run driver=http tags==block:main-get-complex3 cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn bindings: # To enable an optional weighted set of hosts in place of a load balancer @@ -57,21 +57,22 @@ bindings: match3: Identity(); CoinFunc(<>, FixedValue("true"), FixedValue("false")) additional_fields: ListSizedStepped(<>,Template("\"{}\":{}",Identity(),Identity())); ToString(); ReplaceAll('\[\"', ',\"'); ReplaceAll('\[', ''); ReplaceAll('\]', '') -> String + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt')); blocks: schema: - statements: + ops: create-namespace: method: POST uri: <>://{weighted_hosts}:<><>/v2/schemas/namespaces Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>", - "replicas": <> + "name": "<>", + "replicas": <> } ok-status: ".*" @@ -80,7 +81,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" ok-status: "[2-4][0-9][0-9]" create-docs-collection: @@ -88,11 +89,11 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>" + "name": "<>" } rampup: @@ -102,7 +103,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{seq_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { @@ -112,23 +113,23 @@ blocks: "married": {married}, "address": { "primary": { - "city": "{city}", - "cc": "{country_code}" + "city": "{city}", + "cc": "{country_code}" }, "secondary": {} }, "coordinates": [ - {lat}, - {lng} + {lat}, + {lng} ], "children": [], "friends": [ - "{friend_id}" + "{friend_id}" ], - "debt": null, - "match1": {match1}, - "match2": "{match2}", - "match3": {match3} + "debt": null, + "match1": {match1}, + "match2": "{match2}", + "match3": {match3} {additional_fields} } @@ -139,7 +140,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match1":{"$in":[0]}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match2":{"$nin":["false"]}} @@ -148,7 +149,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match2":{"$nin":["false"]}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match2":{"$eq":"true"},"match3":{"$ne": false}} @@ -157,16 +158,16 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match2":{"$eq":"true"},"match3":{"$ne":false}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" rampup-get-mem-or: - # where={"$or":[{"match1":{"$lt":1}},{"match3":{"$exists":true}}]} + # where={"$or":[{"match1":{"$lt":1}},{"match3":{"$exists":true}}]} method: GET uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"match1":{"$lt":1}},{"match3":{"$exists":true}}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$and":[{"match1":{"$eq":0}},{"$or":[{"match2":{"$eq":"true"}},{"match3":{"$eq":false}}]}]} @@ -175,16 +176,16 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$and":[{"match1":{"$eq":0}},{"$or":[{"match2":{"$eq":"true"}},{"match3":{"$eq":false}}]}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" rampup-get-complex2: - # where={"$and":[{"$or":[{"match1":{"$lte":0}},{"match2":{"$eq":"false"}}]},{"$or":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]} + # where={"$and":[{"$or":[{"match1":{"$lte":0}},{"match2":{"$eq":"false"}}]},{"$or":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]} method: GET uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$and":[{"$or":[{"match1":{"$lte":0}},{"match2":{"$eq":"false"}}]},{"$or":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"$and":[{"match1":{"$lte":0}},{"match2":{"$eq":"true"}}]},{"$and":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]} @@ -193,7 +194,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"$and":[{"match1":{"$lte":0}},{"match2":{"$eq":"true"}}]},{"$and":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" main: @@ -204,7 +205,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match1":{"$in":[0]}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match2":{"$nin":["false"]}} @@ -213,7 +214,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match2":{"$nin":["false"]}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match2":{"$eq":"true"},"match3":{"$ne": false}} @@ -222,7 +223,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match2":{"$eq":"true"},"match3":{"$ne":false}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"match1":{"$lt":1}},{"match3":{"$exists":true}}]} @@ -231,7 +232,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"match1":{"$lt":1}},{"match3":{"$exists":true}}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$and":[{"match1":{"$eq":0}},{"$or":[{"match2":{"$eq":"true"}},{"match3":{"$eq":false}}]}]} @@ -240,7 +241,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$and":[{"match1":{"$eq":0}},{"$or":[{"match2":{"$eq":"true"}},{"match3":{"$eq":false}}]}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$and":[{"$or":[{"match1":{"$lte":0}},{"match2":{"$eq":"false"}}]},{"$or":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]} @@ -249,7 +250,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$and":[{"$or":[{"match1":{"$lte":0}},{"match2":{"$eq":"false"}}]},{"$or":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"$and":[{"match1":{"$lte":0}},{"match2":{"$eq":"true"}}]},{"$and":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]} @@ -258,5 +259,5 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"$and":[{"match1":{"$lte":0}},{"match2":{"$eq":"true"}}]},{"$and":[{"match2":{"$eq":"false"}},{"match3":{"$eq":true}}]}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" diff --git a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-basic.yaml b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-basic.yaml index 1a6250677..02cb01660 100644 --- a/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-basic.yaml +++ b/adapter-http/src/main/resources/activities/documents-api/http-docsapi-search-basic.yaml @@ -7,17 +7,17 @@ description: | Note that docsapi_port should reflect the port where the Docs API is exposed (defaults to 8180). scenarios: - schema: run driver=http tags==block:"schema.*" threads==<> cycles==UNDEF + schema: run driver=http tags==block:"schema.*" threads==<> cycles==UNDEF rampup: - write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10000000) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<> errors=timer,warn - read: run driver=http tags==name:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10000000) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + write: run driver=http tags==name:'rampup-put.*' cycles===TEMPLATE(docscount,10) docpadding=TEMPLATE(docpadding,0) match-ratio=TEMPLATE(match-ratio,0.01) threads=<> errors=timer,warn + read: run driver=http tags==name:'rampup-get.*' cycles===TEMPLATE(rampup-cycles, 10) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn main: - all: run driver=http tags==block:main cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-eq: run driver=http tags==name:main-get-eq,filter:eq cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-lt: run driver=http tags==name:main-get-lt cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-and: run driver=http tags==name:main-get-and cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-or: run driver=http tags==name:main-get-or cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn - get-or-single-match: run driver=http tags==name:main-get-or-single-match cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10000000)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + all: run driver=http tags==block:main cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-eq: run driver=http tags==name:main-get-eq,filter:eq cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-lt: run driver=http tags==name:main-get-lt cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-and: run driver=http tags==name:main-get-and cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-or: run driver=http tags==name:main-get-or cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn + get-or-single-match: run driver=http tags==name:main-get-or-single-match cycles===TEMPLATE(read-cycles,TEMPLATE(docscount,10)) page-size=TEMPLATE(page-size,3) fields=TEMPLATE(fields,%5b%5d) threads=<> errors=timer,warn bindings: # To enable an optional weighted set of hosts in place of a load balancer @@ -28,6 +28,7 @@ bindings: weighted_hosts: WeightedStrings('<>') # http request id request_id: ToHashedUUID(); ToString(); + request_token: ToString(); TextOfFile(TEMPLATE(stargate_tokenfile,'data/stargate_token.txt')); seq_key: Mod(<>); ToString() -> String random_key: Uniform(0,<>); ToString() -> String @@ -54,12 +55,12 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/schemas/namespaces Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>", - "replicas": <> + "name": "<>", + "replicas": <> } ok-status: ".*" @@ -68,7 +69,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" ok-status: "[2-4][0-9][0-9]" create-docs-collection: @@ -76,11 +77,11 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "name": "<>" + "name": "<>" } rampup: @@ -90,33 +91,33 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>/{seq_key} Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" body: | { - "user_id": "{user_id}", - "created_on": {created_on}, - "full_name": "{full_name}", - "married": {married}, + "user_id": "{user_id}", + "created_on": {created_on}, + "full_name": "{full_name}", + "married": {married}, "address": { "primary": { - "city": "{city}", - "cc": "{country_code}" + "city": "{city}", + "cc": "{country_code}" }, - "secondary": {} + "secondary": {} }, "coordinates": [ - {lat}, - {lng} + {lat}, + {lng} ], - "children": [], + "children": [], "friends": [ - "{friend_id}" + "{friend_id}" ], - "debt": null, - "match1": {match1}, - "match2": "{match2}", - "match3": {match2} + "debt": null, + "match1": {match1}, + "match2": "{match2}", + "match3": {match2} {additional_fields} } @@ -126,7 +127,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match3":{"$eq":true}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match1":{"$lt":1}} @@ -135,7 +136,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match1":{"$lt":1}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match1":{"$lt":1},"match2":{"$eq":"true"}} @@ -144,7 +145,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match1":{"$lt":1},"match2":{"$eq":"true"}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"match1":{"$lt":1}},{"match3":{"$eq":true}}]} @@ -153,7 +154,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"match1":{"$lt":1}},{"match3":{"$eq":true}}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"match1":{"$lt":1}},{"match2":{"$eq":"notamatch"}}]} @@ -162,7 +163,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"match1":{"$lt":1}},{"match2":{"$eq":"notamatch"}}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match3":{"$eq":true}} @@ -173,7 +174,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match3":{"$eq":true}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match1":{"$lt":1}} @@ -182,7 +183,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match1":{"$lt":1}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"match1":{"$lt":1},"match2":{"$eq":"true"}} @@ -191,7 +192,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"match1":{"$lt":1},"match2":{"$eq":"true"}}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"match1":{"$lt":1}},{"match3":{"$eq":true}}]} @@ -200,7 +201,7 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"match1":{"$lt":1}},{"match3":{"$eq":true}}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" # where={"$or":[{"match1":{"$lt":1}},{"match2":{"$eq":"notamatch"}}]} @@ -209,5 +210,5 @@ blocks: uri: <>://{weighted_hosts}:<><>/v2/namespaces/<>/collections/<>?where=URLENCODE[[{"$or":[{"match1":{"$lt":1}},{"match2":{"$eq":"notamatch"}}]}]]&page-size=<>&fields=<> Accept: "application/json" X-Cassandra-Request-Id: "{request_id}" - X-Cassandra-Token: "<>" + X-Cassandra-Token: "{request_token}" Content-Type: "application/json" diff --git a/adapter-http/src/main/resources/data/stargate_token.txt b/adapter-http/src/main/resources/data/stargate_token.txt index 02e3bbb66..26e07e1ac 100644 --- a/adapter-http/src/main/resources/data/stargate_token.txt +++ b/adapter-http/src/main/resources/data/stargate_token.txt @@ -1 +1 @@ -# <> \ No newline at end of file +37f580cc-0015-4fa1-b4dd-32f5874f0330 \ No newline at end of file