Skip to content

Commit e5db9c9

Browse files
committed
fixed optional default values for dimensions, fixed error message when capabilities parsing fails
1 parent 656f226 commit e5db9c9

File tree

1 file changed

+42
-22
lines changed

1 file changed

+42
-22
lines changed

locustfile.py

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env python3
2-
from locust import HttpLocust, TaskSet, task
2+
from typing import Optional
3+
from locust import HttpLocust, TaskSet, task, between
34
from locust import clients as locustclients
45
import urllib.parse
56

@@ -235,24 +236,29 @@ def getRandomTime(start:datetime, end:datetime, step:relativedelta):
235236
return end - radomdelta
236237

237238

238-
def parseDimension(dimension:xmltodict.OrderedDict):
239-
"""
240-
Parse the dimension/extent defintions (WMS Version 1.1.1/1.3.0)
239+
def parseDimension(dimension:xmltodict.OrderedDict) -> dict:
240+
"""Parse the dimension/extent defintions (WMS Version 1.1.1/1.3.0)
241+
242+
:param dimension: the WMS GetCapabilities 'Dimension'
243+
:type dimension: xmltodict.OrderedDict
244+
:raises ValueError: If dimension could not be parsed
245+
:return: a dictionary {"name": X, "values": Y, "default": Z}, could contain 'None' values
246+
:rtype: dict
241247
"""
248+
242249
try:
243-
#possible values defined
250+
#use defined values defined or try to fallback to @default
251+
name = dimension["@name"] if "@name" in dimension.keys() else None
252+
default = dimension["@default"] if "@default" in dimension.keys() else None
253+
values = dimension["#text"] if "#text" in dimension.keys() else default
244254
dim = {
245-
"name" : dimension["@name"],
246-
"values" : dimension["#text"], #possible values
247-
"default" : dimension["@default"] #default value
255+
"name" : name,
256+
"values" : values, #possible values
257+
"default" : default #optional default value
248258
}
249259
except:
250-
# no values defined
251-
dim = {
252-
"name" : dimension["@name"],
253-
"values" : dimension["@default"], #fall back to default
254-
"default" : dimension["@default"] #default value
255-
}
260+
# some required attribute was missing
261+
raise ValueError(f"Could not parse dimension '{dimension}'.")
256262

257263
if dim["name"] == "time":
258264
times = enumerateAvailableTimes(dim["values"])
@@ -375,7 +381,12 @@ def getRandomLegendUrlRequest(allLayers:dict, wmsversion:str):
375381
randomStyleName = random.choice(list(randomLayer["styles"].keys()))
376382

377383
url = randomLayer["styles"][randomStyleName]["LegendURL"]
384+
if url is None:
385+
return None
378386
url = urllib.parse.unquote(url)
387+
if "?" not in url:
388+
return { "url": url, "params":[]} # static legend graphic url
389+
379390
getLegendGraphicRequest = {
380391
"url" : url.split("?")[0]
381392
}
@@ -459,10 +470,20 @@ def sendGetCapabilitiesRequest(client:locustclients.HttpSession, wmsversion:str)
459470
try:
460471
capabilities = xmltodict.parse(response.content)
461472
#vprint("Request successful: {}".format(url))
462-
return capabilities
473+
#return capabilities
463474
except:
464475
response.failure("Failed to parse GetCapabilities XML")
465476
return
477+
478+
try:
479+
# parse the capabilities document once
480+
# for each WMS version
481+
parsed_layers = getAllLayers(capabilities=capabilities, wmsversion=wmsversion)
482+
return parsed_layers
483+
except Exception as ex:
484+
response.failure("Failed to extract layers from GetCapabilities XML version '{0}'. Error: {1}".format(wmsversion,ex))
485+
return
486+
466487

467488
def sendGetMapRequest(client:locustclients.HttpSession, params:dict, wmsversion:str):
468489
with client.request("GET", "", params=params, name="WMS-{}-GetMap".format(wmsversion), catch_response=True ) as response:
@@ -516,15 +537,15 @@ class WebsiteTasks(TaskSet):
516537
@task(WEIGHT_GET_CAPABILITIES)
517538
def get_capa(self):
518539
wmsversion = random.choice(WMS_SUPPORTED_VERSIONS)
519-
capabilities = sendGetCapabilitiesRequest(client=self.client, wmsversion=wmsversion)
540+
all_layers = sendGetCapabilitiesRequest(client=self.client, wmsversion=wmsversion)
520541

521-
if capabilities is None:
542+
if all_layers is None:
522543
return
523544

524-
if not wmsversion in self.allLayers:
545+
if not wmsversion in self.allLayers.keys():
525546
# parse the capabilities document once
526547
# for each WMS version
527-
self.allLayers[wmsversion] = getAllLayers(capabilities=capabilities, wmsversion=wmsversion)
548+
self.allLayers[wmsversion] = all_layers
528549

529550
@task(WEIGHT_GET_LEGEND_GRAPHIC)
530551
def get_legend_graphic(self):
@@ -542,7 +563,7 @@ def get_legend_graphic(self):
542563
@task(WEIGHT_GET_MAP)
543564
def get_map(self):
544565
wmsversion = random.choice(WMS_SUPPORTED_VERSIONS)
545-
if not wmsversion in self.allLayers:
566+
if not wmsversion in self.allLayers.keys():
546567
# Get Capabilities document not (yet) processed
547568
return
548569
getMapRequest = getRandomGetMapRequest(self.allLayers[wmsversion], wmsversion=wmsversion)
@@ -552,8 +573,7 @@ def get_map(self):
552573

553574
class WebsiteUser(HttpLocust):
554575
task_set = WebsiteTasks
555-
min_wait = 5000
556-
max_wait = 15000
576+
wait_time = between(5, 15)
557577

558578

559579
if __name__ == "__main__":

0 commit comments

Comments
 (0)