diff --git a/.gitignore b/.gitignore index a3b44ec..6e4c7d3 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,10 @@ bdd/swagger.yml /deploy-memory/terraform.tfstate.backup /deploy-memory/ip.txt /deploy-memory/.terraform + +**/.classpath +**/.project +**/.settings +.vscode + +__pycache__/ diff --git a/User Tests.ipynb b/User Tests.ipynb index 6f3552b..2b927d8 100644 --- a/User Tests.ipynb +++ b/User Tests.ipynb @@ -198,7 +198,7 @@ "%%bash\n", "rm -rf inventory_server/\n", "rm -rf temp\n", - "mkdir temp\n", + "mkdir temp\\\\\n", "cd temp\n", "swagger-codegen generate -l python -i ../meta/src/main/docs/swagger.yml\n", "swagger-codegen generate -l html -i ../meta/src/main/docs/swagger.yml\n", @@ -253,7 +253,6 @@ "source": [ "from inventory_server.configuration import Configuration\n", "from inventory_server.apis import DefaultApi\n", - "import os\n", "\n", "conf = Configuration()\n", "conf.host = \"http://%s:5555\" % open(\"deploy-memory/ip.txt\", \"r\").read().strip()\n", diff --git a/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/InventoryParser.java b/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/InventoryParser.java index a16cbda..de057fa 100644 --- a/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/InventoryParser.java +++ b/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/InventoryParser.java @@ -33,7 +33,7 @@ static Parser inventoryParser(Repository.FindBy c inventory.setCategory(categoryRepository.findBy(finderFactory.lookFor(categoryFullName))); - if (jo.has("id")) { + if (jo.has("id") && !jo.isNull("id")) { try { inventory.setId(inventoryIdExtractor.extract(new URL(jo.getString("id")).getPath())); } catch (MalformedURLException e) { @@ -41,7 +41,7 @@ static Parser inventoryParser(Repository.FindBy c } } - if (jo.has("parent")) { + if (jo.has("parent") && !jo.isNull("parent")) { long parent_id; try { parent_id = inventoryIdExtractor.extract(new URL(jo.getString("parent")).getPath()); diff --git a/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/UserParser.java b/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/UserParser.java index 0d18e8a..dae090e 100644 --- a/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/UserParser.java +++ b/core/src/main/java/com/tailoredshapes/inventoryserver/parsers/UserParser.java @@ -22,7 +22,7 @@ static Parser userParser(Repository.FindById findById, JSONObject jsonUser = new JSONObject(s); User user = new User(); - if (jsonUser.has("id")) { + if (jsonUser.has("id") && !jsonUser.isNull("id")) { String id = jsonUser.getString("id"); try { user = findById.findById(idExtractor.extract(new URL(id).getPath())); diff --git a/deploy-memory/memory.tf b/deploy-memory/memory.tf index 6739368..77ab0e0 100644 --- a/deploy-memory/memory.tf +++ b/deploy-memory/memory.tf @@ -1,8 +1,7 @@ # Specify the provider and access details provider "aws" { region = "${var.aws_region}" - access_key = "${var.aws_access_key}" - secret_key = "${var.aws_secret_key}" + profile = "inventoryserver" } # Create a VPC to launch our instances into diff --git a/locustfile_api.py b/locustfile_api.py new file mode 100644 index 0000000..d413aef --- /dev/null +++ b/locustfile_api.py @@ -0,0 +1,78 @@ +from locust import HttpLocust, TaskSet, task +from inventory_server.models import User, Inventory, Category, Metric +from faker import Faker +import random +import json + +fake = Faker() +known_inventories = [] +all_users = [] + +def none_or(): + if random.randint(0,1) and len(known_inventories) > 0: + random.choice(known_inventories) + return None + +def j(model): + return json.dumps(model.to_dict()) + +def gen_new_metric(): + m = Metric(value=fake.text(), type=fake.word()) + return m + +def gen_new_inv(): + inv = Inventory( + category=fake.domain_name(), + metrics=[gen_new_metric() for _ in range(0, random.randint(0,10))], + parent=none_or() + ) + return inv + +def gen_new_user(): + u = User(name = fake.name(), inventories= list(filter(None, [none_or() for _ in range(0, random.randint(0,10))]))) + return u + +class InventoryTasks(TaskSet): + @task + def inventory_register(self): + response = self.client.post("/inventories", j(gen_new_inv())) + + @task(10) + def all_inventory(self): + response = self.client.get("/inventories") + if(response.status_code < 400): + try: + global known_inventories + known_inventories = response.json() + except: + print(known_inventories) + + @task(100) + def read(self): + if len(known_inventories) > 0: + inv = random.choice(known_inventories) + if 'id' in inv: + self.client.get(inv['id'], name='/inventories/[id]') + + + @task + def user_register(self): + self.client.post("/users", j(gen_new_user())) + + @task(10) + def users_all(self): + response = self.client.get("/users") + global all_users + all_users = response.json() + + @task(100) + def users_read(self): + if len(all_users) > 0: + u = random.choice(all_users) + if 'id' in u: + self.client.get(u['id'], name="/users/[id]") + +class MyLocust(HttpLocust): + task_set = InventoryTasks + min_wait = 1000 + max_wait = 5000 \ No newline at end of file diff --git a/memory/src/main/java/com/tailoredshapes/inventoryserver/InMemoryRouter.java b/memory/src/main/java/com/tailoredshapes/inventoryserver/InMemoryRouter.java index aa72973..d2b0539 100644 --- a/memory/src/main/java/com/tailoredshapes/inventoryserver/InMemoryRouter.java +++ b/memory/src/main/java/com/tailoredshapes/inventoryserver/InMemoryRouter.java @@ -10,6 +10,7 @@ import com.tailoredshapes.inventoryserver.repositories.memory.InMemoryLookers; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,11 +53,16 @@ static void route() { log.debug("createInventory"); DAO dao = inventoryDAO; Parser parser = inventoryParser; - Inventory inventory = parser.parse(req.body()); - Inventory saved = Repository.save(dao).save(inventory); - - res.redirect(inventoryUrlBuilder.build(saved), 303); - return null; + try { + Inventory inventory = parser.parse(req.body()); + Inventory saved = Repository.save(dao).save(inventory); + + res.redirect(inventoryUrlBuilder.build(saved), 303); + return null; + }catch (JSONException e){ + log.error("Failed to parse: " + req.body()); + throw e; + } }); get("/inventories/:id", "application/json", (req, res) -> { @@ -80,11 +86,17 @@ static void route() { post("/users", "application/json", (req, res) -> { log.debug("createUser"); - User user = userParser.parse(req.body()); - User saved = Repository.save(userDAO).save(user); + try { + User user = userParser.parse(req.body()); + User saved = Repository.save(userDAO).save(user); + + res.redirect(userUrlBuilder.build(saved), 303); + return null; + } catch (JSONException e){ + log.error("Failed to parse: " + req.body()); + throw e; + } - res.redirect(userUrlBuilder.build(saved), 303); - return null; }); get("/users/:name/inventories", "application/json", (req, res) ->