Compare commits

...

157 Commits
v0.0.2 ... dev

Author SHA1 Message Date
reynisson
cf1ac181cc Added pdf of presentation 2021-12-23 20:44:34 +00:00
reynisson
c0ca49d4f2 Merge remote-tracking branch 'origin/dev' into dev 2021-12-23 15:53:12 +00:00
reynisson
0f642482b2 Doc fixes 2021-12-23 15:53:04 +00:00
9b0507fce6 bugfixes 2021-12-23 16:51:35 +01:00
02b3e429fc bugfixes 2021-12-23 16:30:46 +01:00
818a3f3829 bugfixes 2021-12-23 16:27:06 +01:00
546133bc46 bugfixes 2021-12-23 16:18:37 +01:00
8b48e7edaf bugfixes 2021-12-23 16:07:18 +01:00
6bb206ccdb Merge branch 'dev' of https://github.com/SCS-ASSE-FS21-Group1/tapas into dev 2021-12-23 15:57:23 +01:00
8658efc09e workflow updates 2021-12-23 15:57:20 +01:00
reynisson
edc2279434 Code clean up and test fixes 2021-12-23 14:14:32 +00:00
Julius Lautz
4bbe71729c
Update 0014-use-choreography-for-task-execution-workflow.md 2021-12-23 11:51:59 +01:00
Julius Lautz
53cbb86710
Update 0012-separate-service-for-crawler.md 2021-12-23 11:49:42 +01:00
Julius Lautz
97990cbe29
Update 0010-single-ownership-for-services.md 2021-12-23 11:47:50 +01:00
Julius Lautz
fff7c5e816
Update 0001-microservice-architecture.md 2021-12-23 11:37:57 +01:00
reynisson
70cf269dde A lot of docs 2021-12-23 07:15:07 +00:00
reynisson
e519baf0f9 Merge remote-tracking branch 'origin/dev' into dev 2021-12-22 21:17:06 +00:00
reynisson
e124e126aa More final submission stuff 2021-12-22 21:16:59 +00:00
e0a8aa5a14 removed unused variables + bugfixes 2021-12-22 21:48:49 +01:00
2279ebb89c
Merge pull request #106 from SCS-ASSE-FS21-Group1/Use_db_for_task_list
Removed the TaskList domain object and fixed everything that broke. A…
2021-12-22 19:39:09 +01:00
d319d4a90c Merge branch 'dev' of https://github.com/SCS-ASSE-FS21-Group1/tapas into dev 2021-12-22 19:35:12 +01:00
88623f6327 executorbase restructure + improvments 2021-12-22 19:35:09 +01:00
reynisson
5803380263 Merge remote-tracking branch 'origin/dev' into dev 2021-12-22 15:55:56 +00:00
reynisson
8faabb4d44 Final submission draft 2021-12-22 15:55:48 +00:00
1153b75322 use json patch 2021-12-22 13:04:03 +01:00
56788d7150 bugfixes 2021-12-21 15:30:33 +01:00
0eb21d2083 fixes 2021-12-19 16:33:11 +01:00
0022ebaf88 added humidity executor to deployment 2021-12-18 16:18:54 +01:00
reynisson
9a8596341f Removed the TaskList domain object and fixed everything that broke. All task list commands are now implemented via the DB 2021-12-17 23:28:28 +01:00
reynisson
cab63d6b76 Implemented the following points:
- Roster/Auctionhouse send initial getExecutors request
- Remove executor (made DELETE endpoint in executor pool)
2021-12-16 20:39:14 +01:00
6c17b20c55 bugfixes 2021-12-16 11:42:27 +01:00
27ccc54458
Merge pull request #105 from SCS-ASSE-FS21-Group1/websub-improvements
Websub improvements
2021-12-15 12:11:03 +01:00
f66b7ab587
Merge pull request #104 from SCS-ASSE-FS21-Group1/executor_humidity
Executor humidity
2021-12-15 12:10:12 +01:00
dd93be535c
Merge branch 'dev' into executor_humidity 2021-12-15 12:09:40 +01:00
reynisson
48d5c6fe90 Merge remote-tracking branch 'origin/dev' into dev 2021-12-14 23:46:42 +01:00
reynisson
3e141e5318 Implemented the remove task workflow. Still got one todo for the workflow that I want to discuss 2021-12-14 23:46:07 +01:00
69b5949f71 roster bugfixes 2021-12-14 22:19:32 +01:00
45edd76c8b executorbase bugfixes 2021-12-14 22:00:32 +01:00
467d7aa015 updates 2021-12-14 21:59:24 +01:00
julius.lautz
b1b94336b2 added td discovery for humidity and robot executor 2021-12-14 21:13:49 +01:00
0460f1c793
Merge pull request #102 from SCS-ASSE-FS21-Group1/Roster-request-auction-when-executor-missing
Roster requests auction when an internal executor is missing
2021-12-14 20:57:22 +01:00
7e34a5a7b1
Merge pull request #101 from SCS-ASSE-FS21-Group1/Renam-task-type
Renaming task type
2021-12-14 20:56:39 +01:00
99e60f656c small bugfixes 2021-12-12 20:40:22 +01:00
rahimiankeanu
13b02aa115 Roster requests auction when an internal executor is missing 2021-12-12 20:26:14 +01:00
4593e5bddb uri updates 2021-12-12 20:24:04 +01:00
7a66f37556 WebSub fixes 2021-12-12 19:41:41 +01:00
rahimiankeanu
bcb8130f78 Renaming task type 2021-12-12 16:49:03 +01:00
julius.lautz
aaffb0371e made changes to executor-humidity 2021-12-11 19:09:34 +01:00
julius.lautz
c87a732e2a added executor-humidity 2021-12-11 18:36:23 +01:00
32bf461026
Merge pull request #98 from SCS-ASSE-FS21-Group1/discovery-web-controller
added the necessary classes for the discovery web controller
2021-12-06 03:34:30 +01:00
560f1ff34b added ahCrawler and finished discovery endpoint 2021-12-06 03:32:15 +01:00
reynisson
ec26b84dc9 Added a discover adapter and changed the domain object a bit 2021-12-05 22:41:52 +01:00
julius.lautz
0b89e88905 added the necessary classes for the discovery web controller 2021-12-04 15:16:29 +01:00
reynisson
9f42fcfcc4 Updated ADR on event driven microservices. 2021-12-02 23:39:21 +01:00
reynisson
96e323a705 Merge remote-tracking branch 'origin/dev' into dev 2021-12-02 23:32:01 +01:00
reynisson
de2f6cf0c4 Updated ADRs 2021-12-02 23:31:50 +01:00
67a952003d updated workflow 2021-12-02 22:48:54 +01:00
reynisson
4b85b640ae Architecture tests for executor-pool 2021-11-29 00:34:30 +01:00
reynisson
84c284677e
Merge pull request #89 from SCS-ASSE-FS21-Group1/roster_tests
added unit tests for the roster
2021-11-29 00:26:37 +01:00
reynisson
18399ecf15 Merge remote-tracking branch 'origin/roster_tests' into roster_tests
# Conflicts:
#	roster/pom.xml
2021-11-29 00:24:33 +01:00
reynisson
3f7f19a3c6 Architecture tests for roster 2021-11-29 00:23:54 +01:00
reynisson
09e139cdf8 Roster tests working 2021-11-29 00:23:54 +01:00
julius.lautz
c446a854ee fixed most of the tests 2021-11-29 00:23:54 +01:00
reynisson
49977ae8a2 Fixed some roster tests 2021-11-29 00:23:53 +01:00
julius.lautz
2f36e01c57 fixed some of the tests 2021-11-29 00:23:53 +01:00
reynisson
bd78aba16d Added TODOs 2021-11-29 00:23:53 +01:00
julius.lautz
d732ab47d7 added unit tests for the roster 2021-11-29 00:23:51 +01:00
julius.lautz
767dcfa82a fixed some of the tests 2021-11-29 00:23:42 +01:00
reynisson
1661db5d47 Added TODOs 2021-11-29 00:23:42 +01:00
julius.lautz
e9169c8419 rebased to dev 2021-11-29 00:23:42 +01:00
reynisson
6278bea13b
Merge pull request #94 from SCS-ASSE-FS21-Group1/chaos-monkey-tests
chaos monkey tests
2021-11-29 00:18:03 +01:00
reynisson
f187283bd5 Architecture tests for roster 2021-11-29 00:16:27 +01:00
reynisson
f1e0aacee3 Roster tests working 2021-11-28 20:33:01 +01:00
julius.lautz
1c9b924eab fixed most of the tests 2021-11-28 19:47:12 +01:00
453cd37217 chaos monkey tests 2021-11-28 18:20:36 +01:00
reynisson
21ce1d3567
Merge pull request #92 from SCS-ASSE-FS21-Group1/testing-executorPool
Testing executor pool
2021-11-28 17:50:43 +01:00
reynisson
8e76a2e1c9 Merge remote-tracking branch 'origin/testing-executorPool' into testing-executorPool 2021-11-28 17:49:31 +01:00
reynisson
c0412f6eba Fixed executor-pool tests that were failing 2021-11-28 17:43:50 +01:00
rahimiankeanu
3c8171af8e ExecutorPoolTest code should be fine.
But half of tests failed
2021-11-28 17:25:08 +01:00
rahimiankeanu
e03fc296ee Testing ExecutorPool version 1 2021-11-28 17:25:08 +01:00
reynisson
d1fe47db6f Retrieve task from memory to be able to check task results. Temp fix until we start updating tasks in DB 2021-11-28 17:13:14 +01:00
rahimiankeanu
e1cd5774f1 ExecutorPoolTest code should be fine.
But half of tests failed
2021-11-27 12:53:30 +01:00
8bfc231a7e deployment script fixes 2021-11-26 22:57:34 +01:00
rahimiankeanu
0288082cd5 Testing ExecutorPool version 1 2021-11-26 22:16:23 +01:00
reynisson
af74eaaeeb Fixed some roster tests 2021-11-26 14:48:49 +01:00
reynisson
3442702197 Merge remote-tracking branch 'origin/roster_tests' into roster_tests
# Conflicts:
#	roster/src/main/java/ch/unisg/roster/RosterApplication.java
2021-11-26 13:40:13 +01:00
julius.lautz
b82285e3cc fixed some of the tests 2021-11-26 13:18:17 +01:00
reynisson
5d9865b26d Added TODOs 2021-11-26 13:18:17 +01:00
julius.lautz
459383b733 rebased to dev 2021-11-26 13:18:03 +01:00
julius.lautz
8ab87cda82 fixed some of the tests 2021-11-26 13:07:10 +01:00
62993ea985 bugfixes 2021-11-25 17:54:07 +01:00
3cb1d9bf20 deployment fixes 2021-11-25 17:49:49 +01:00
reynisson
f99aa7536e
Merge pull request #86 from SCS-ASSE-FS21-Group1/persistency-bugfixes
Persistency Bugfixes
2021-11-25 15:58:12 +01:00
reynisson
801a520255 Added TODOs 2021-11-25 12:02:04 +01:00
julius.lautz
d083edc2f3 added unit tests for the roster 2021-11-25 10:59:47 +01:00
6c118a82c0
Merge branch 'SCS-ASSE-FS21-Tutors:main' into dev 2021-11-23 16:54:11 +01:00
3c35f84913 bugfixes 2021-11-22 10:11:33 +01:00
reynisson
43036b4312 Merge remote-tracking branch 'origin/dev' into dev 2021-11-21 22:37:26 +01:00
reynisson
0f5adff167 Updated ADRs 2021-11-21 22:37:17 +01:00
df0e91fb23
Merge pull request #83 from SCS-ASSE-FS21-Group1/db_roster
added database to roster
2021-11-21 21:19:10 +01:00
d70ea75fb7
Merge pull request #84 from SCS-ASSE-FS21-Group1/Persistence-mongodb
Persistence mongodb
2021-11-21 21:18:14 +01:00
reynisson
c1f27d51f7 Updated ADRs 2021-11-21 19:48:37 +01:00
reynisson
54f959ac23 Updated ADRs 2021-11-21 19:45:16 +01:00
julius.lautz
ae9e3acbd2 added database to roster 2021-11-21 19:40:32 +01:00
rahimiankeanu
2aeaf86e59 Persistence layer in executor pool
(RemoveExecutorFrom... under Service folder still has an error)
2021-11-21 18:07:07 +01:00
reynisson
5968184b08 Merge remote-tracking branch 'origin/dev' into dev 2021-11-21 17:16:13 +01:00
reynisson
af820f23d9 Path the task output data instead of a hard coded 0 2021-11-21 17:16:01 +01:00
ronsei
a923fb1adc Small extension for Web Controller test, now works using a stub instead of mock 2021-11-21 15:42:38 +01:00
bc5c654154 Merge remote-tracking branch 'upstream/main' into dev 2021-11-21 12:14:26 +01:00
Ronny Seiger
b027a83aad
Merge pull request #11 from SCS-ASSE-FS21-Tutors/test
Test
2021-11-21 11:32:13 +01:00
reynisson
1bd387413e fixed Content-type header in external patch 2021-11-20 23:44:47 +01:00
reynisson
53d815b93d smallest fixes 2021-11-20 23:26:02 +01:00
reynisson
3141f97f41 smaller fixes 2021-11-20 23:08:22 +01:00
reynisson
ad27697bc7
Merge pull request #78 from SCS-ASSE-FS21-Group1/dev
using https for auction house link
2021-11-20 22:54:41 +01:00
reynisson
332f035622 small fixes 2021-11-20 22:53:52 +01:00
reynisson
3b205d80a5 using the bidders auction house uri 2021-11-20 22:39:20 +01:00
reynisson
e3768280ac using https for auction house link 2021-11-20 22:09:07 +01:00
ronsei
f6c0495c04 ArchUnit test for Assignment 8 2021-11-18 18:13:49 +01:00
ronsei
c126c34972 First set tests for Assignment 8 2021-11-18 16:02:28 +01:00
reynisson
ef044f1cf1
Merge pull request #76 from SCS-ASSE-FS21-Group1/dev
bugfixes + env variables
2021-11-17 21:37:26 +01:00
6fe4b4dfbe bugfixes + env variables 2021-11-17 21:35:38 +01:00
reynisson
ee818c8149
Merge pull request #75 from SCS-ASSE-FS21-Group1/dev
deployment script & tasklist & executor fixes
2021-11-17 19:55:36 +01:00
9d75a87dd6 deployment script & tasklist & executor fixes 2021-11-17 19:54:04 +01:00
reynisson
47956d1ac6
Merge pull request #73 from SCS-ASSE-FS21-Group1/dev
fixed deployment script
2021-11-17 19:03:13 +01:00
6b8f5bf013 fixed deployment script 2021-11-17 19:00:52 +01:00
reynisson
1e917ec3e8
Merge pull request #72 from SCS-ASSE-FS21-Group1/dev
Bugfixes + Security fixes
2021-11-17 18:29:37 +01:00
reynisson
9d8e6cf216 Logging bids received 2021-11-17 18:29:08 +01:00
reynisson
96b0e82113 Merge remote-tracking branch 'origin/dev' into dev 2021-11-17 18:26:02 +01:00
reynisson
01b5056671 Testing out getting Environment variables from main 2021-11-17 18:25:49 +01:00
Andrei Ciortea
1d2c7103e4 Merge branch 'main' of github.com:SCS-ASSE-FS21-Tutors/tapas into main 2021-11-16 22:41:45 +01:00
Andrei Ciortea
292d30d1bd Add example for reading config properties in the main method for TapasAuctionHouse 2021-11-16 22:41:22 +01:00
add257fd5e updated dependencies to remove security issues 2021-11-16 21:20:26 +01:00
b6488fa36f added environment variables for uri's 2021-11-16 21:17:10 +01:00
reynisson
778535a437
Merge pull request #71 from SCS-ASSE-FS21-Group1/dev
fixes
2021-11-16 19:47:09 +01:00
084270bbb8 env changes 2021-11-16 19:43:46 +01:00
reynisson
1bc6ec6813 Small URI fixes 2021-11-16 19:41:56 +01:00
98c38b4fcf
Merge pull request #65 from SCS-ASSE-FS21-Group1/dev
Dev
2021-11-16 19:13:59 +01:00
1d13b8e746
Merge pull request #69 from SCS-ASSE-FS21-Group1/change_mqtt_broker_in_roster
Changed mqtt broker address in roster
2021-11-16 19:11:49 +01:00
861cf82f67
Merge pull request #68 from SCS-ASSE-FS21-Group1/auction_house_external_communication
Implemented auctioning of tasks workflow in auction house
2021-11-16 19:11:16 +01:00
reynisson
7a0488df74
Merge pull request #70 from SCS-ASSE-FS21-Group1/improvments-for-plugfest
Fixes
2021-11-16 19:10:58 +01:00
44cc0929bd fixes 2021-11-16 19:09:38 +01:00
reynisson
5a2cc7a131 Changed mqtt broker address in roster 2021-11-16 18:53:06 +01:00
reynisson
e869fb9699 Bidding workflow 2021-11-16 18:51:39 +01:00
reynisson
33ab37c661
Merge pull request #67 from SCS-ASSE-FS21-Group1/renaming-executors
Renaming executors
2021-11-16 17:46:28 +01:00
reynisson
8fba9136b2 Implemented auctioning of tasks workflow in auction house 2021-11-16 17:42:14 +01:00
Peter Guhl
df53236853
Compiling and running tapas on a local docker installation (#10)
* First version building tasks and mongodb

* Creating container for local tests

* Initial version

* Added mongodb to correct network

* Added auction house

* Acknowledgments, Dockerfile for app

* Added app to build

* Dockerfile for app

* Mapped app port to localhost:8080

Co-authored-by: Ubuntu <ubuntu@docker-tests.novalocal>
2021-11-16 16:12:15 +01:00
bce3619638 renaming 2021-11-16 15:48:46 +01:00
247768b5d6
Merge pull request #66 from SCS-ASSE-FS21-Group1/v2bugfixes
fixed multiple bugs & updated cicd workflows
2021-11-16 14:32:23 +01:00
4c5da8eed6 fix naming 2021-11-15 12:03:25 +01:00
1c4da28480 fixed multiple bugs & updated cicd workflows 2021-11-15 11:59:27 +01:00
ronsei
343d33270a Extending the README.md for tapas-tasks with details on setting up MongoDB as DB for repositories. 2021-11-12 10:21:05 +01:00
Andrei Ciortea
430055a6ff Merge branch 'main' of github.com:SCS-ASSE-FS21-Tutors/tapas into main 2021-11-11 17:17:12 +01:00
Andrei Ciortea
3f4f2f4a1b Update BROKERS.md 2021-11-11 17:16:09 +01:00
Ronny Seiger
b4efa1ee54
Minor change in dbadmin URL 2021-11-11 11:47:28 +01:00
Ronny Seiger
f97188cdad
Merge pull request #8 from SCS-ASSE-FS21-Tutors/db
Adding a MongoDB repository and extending the use cases for adding ne…
2021-11-11 11:37:41 +01:00
ronsei
32ecd6a5d4 Adding a MongoDB repository and extending the use cases for adding new tasks and retrieval of a new task 2021-11-11 11:32:10 +01:00
Ronny Seiger
fdb7d2bf64
Update build-and-deploy.yml
Removing old containers during deploy
2021-11-11 11:03:53 +01:00
348 changed files with 10533 additions and 2284 deletions

View File

@ -26,12 +26,28 @@ services:
- "traefik.http.routers.http-catchall.middlewares=redirect-to-https" - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
tapas-db:
image: mongo
restart: unless-stopped
container_name: tapas_mongodb
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
ports:
- "27017:27017"
command: mongod --quiet --logpath /dev/null
tapas-tasks: tapas-tasks:
image: openjdk image: openjdk
command: "java -jar /data/tapas-tasks-0.0.1-SNAPSHOT.jar" command: "java -jar /data/tapas-tasks-0.0.1-SNAPSHOT.jar"
restart: unless-stopped restart: unless-stopped
depends_on:
- tapas-db
volumes: volumes:
- ./:/data/ - ./:/data/
environment:
roster.uri: http://roster:8082
spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.tapas-tasks.rule=Host(`tapas-tasks.${PUB_IP}.nip.io`)" - "traefik.http.routers.tapas-tasks.rule=Host(`tapas-tasks.${PUB_IP}.nip.io`)"
@ -45,8 +61,15 @@ services:
image: openjdk image: openjdk
command: "java -jar /data/tapas-auction-house-0.0.1-SNAPSHOT.jar" command: "java -jar /data/tapas-auction-house-0.0.1-SNAPSHOT.jar"
restart: unless-stopped restart: unless-stopped
depends_on:
- tapas-db
volumes: volumes:
- ./:/data/ - ./:/data/
environment:
mqtt.broker.uri: tcp://broker.hivemq.com:1883
discovery.endpoint.uri: https://tapas-auction-house.86-119-34-242.nip.io
auction.house.uri: https://tapas-auction-house.86-119-35-40.nip.io
tasks.list.uri: https://tapas-tasks.86-119-35-40.nip.io
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.tapas-auction-house.rule=Host(`tapas-auction-house.${PUB_IP}.nip.io`)" - "traefik.http.routers.tapas-auction-house.rule=Host(`tapas-auction-house.${PUB_IP}.nip.io`)"
@ -56,27 +79,40 @@ services:
- "traefik.http.routers.tapas-auction-house.entryPoints=web,websecure" - "traefik.http.routers.tapas-auction-house.entryPoints=web,websecure"
- "traefik.http.routers.tapas-auction-house.tls.certresolver=le" - "traefik.http.routers.tapas-auction-house.tls.certresolver=le"
assignment: roster:
image: openjdk image: openjdk
command: "java -jar /data/assignment-0.0.1-SNAPSHOT.jar" command: "java -jar /data/roster-0.0.1-SNAPSHOT.jar"
restart: unless-stopped restart: unless-stopped
depends_on:
- tapas-db
volumes: volumes:
- ./:/data/ - ./:/data/
environment:
task.list.uri: http://tapas-tasks:8081
auction.house.uri: http://tapas-auction-house:8086
executor.pool.uri: http://executor-pool:8083
mqtt.broker.uri: tcp://broker.hivemq.com:1883
spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.assignment.rule=Host(`assignment.${PUB_IP}.nip.io`)" - "traefik.http.routers.roster.rule=Host(`roster.${PUB_IP}.nip.io`)"
- "traefik.http.routers.assignment.service=assignment" - "traefik.http.routers.roster.service=roster"
- "traefik.http.services.assignment.loadbalancer.server.port=8082" - "traefik.http.services.roster.loadbalancer.server.port=8082"
- "traefik.http.routers.assignment.tls=true" - "traefik.http.routers.roster.tls=true"
- "traefik.http.routers.assignment.entryPoints=web,websecure" - "traefik.http.routers.roster.entryPoints=web,websecure"
- "traefik.http.routers.assignment.tls.certresolver=le" - "traefik.http.routers.roster.tls.certresolver=le"
executor-pool: executor-pool:
image: openjdk image: openjdk
command: "java -jar /data/executor-pool-0.0.1-SNAPSHOT.jar" command: "java -jar /data/executor-pool-0.0.1-SNAPSHOT.jar"
restart: unless-stopped restart: unless-stopped
depends_on:
- tapas-db
volumes: volumes:
- ./:/data/ - ./:/data/
environment:
mqtt.broker.uri: tcp://broker.hivemq.com:1883
spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.executor-pool.rule=Host(`executor-pool.${PUB_IP}.nip.io`)" - "traefik.http.routers.executor-pool.rule=Host(`executor-pool.${PUB_IP}.nip.io`)"
@ -86,38 +122,72 @@ services:
- "traefik.http.routers.executor-pool.entryPoints=web,websecure" - "traefik.http.routers.executor-pool.entryPoints=web,websecure"
- "traefik.http.routers.executor-pool.tls.certresolver=le" - "traefik.http.routers.executor-pool.tls.certresolver=le"
executor1: executor-computation:
image: openjdk image: openjdk
command: "java -jar /data/executor1-0.0.1-SNAPSHOT.jar" command: "java -jar /data/executor-computation-0.0.1-SNAPSHOT.jar"
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- executor-pool - executor-pool
- assignment - roster
- tapas-db
volumes: volumes:
- ./:/data/ - ./:/data/
environment:
executor.type: COMPUTATION
executor.uri: http://executor-computation:8085
executor.pool.uri: http://executor-pool:8083
roster.uri: http://roster:8082
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.executor1.rule=Host(`executor1.${PUB_IP}.nip.io`)" - "traefik.http.routers.executor-computation.rule=Host(`executor-computation.${PUB_IP}.nip.io`)"
- "traefik.http.routers.executor1.service=executor1" - "traefik.http.routers.executor-computation.service=executor-computation"
- "traefik.http.services.executor1.loadbalancer.server.port=8084" - "traefik.http.services.executor-computation.loadbalancer.server.port=8085"
- "traefik.http.routers.executor1.tls=true" - "traefik.http.routers.executor-computation.tls=true"
- "traefik.http.routers.executor1.entryPoints=web,websecure" - "traefik.http.routers.executor-computation.entryPoints=web,websecure"
- "traefik.http.routers.executor1.tls.certresolver=le" - "traefik.http.routers.executor-computation.tls.certresolver=le"
executor-robot:
executor2:
image: openjdk image: openjdk
command: "java -jar /data/executor2-0.0.1-SNAPSHOT.jar" command: "java -jar /data/executor-robot-0.0.1-SNAPSHOT.jar"
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- executor-pool - executor-pool
- assignment - roster
- tapas-db
volumes: volumes:
- ./:/data/ - ./:/data/
environment:
executor.type: SMALLROBOT
executor.uri: http://executor-robot:8084
executor.pool.uri: http://executor-pool:8083
roster.uri: http://roster:8082
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.executor2.rule=Host(`executor2.${PUB_IP}.nip.io`)" - "traefik.http.routers.executor-robot.rule=Host(`executor-robot.${PUB_IP}.nip.io`)"
- "traefik.http.routers.executor2.service=executor2" - "traefik.http.routers.executor-robot.service=executor-robot"
- "traefik.http.services.executor2.loadbalancer.server.port=8085" - "traefik.http.services.executor-robot.loadbalancer.server.port=8084"
- "traefik.http.routers.executor2.tls=true" - "traefik.http.routers.executor-robot.tls=true"
- "traefik.http.routers.executor2.entryPoints=web,websecure" - "traefik.http.routers.executor-robot.entryPoints=web,websecure"
- "traefik.http.routers.executor2.tls.certresolver=le" - "traefik.http.routers.executor-robot.tls.certresolver=le"
executor-humidity:
image: openjdk
command: "java -jar /data/executor-humidity-0.0.1-SNAPSHOT.jar"
restart: unless-stopped
depends_on:
- executor-pool
- roster
- tapas-db
volumes:
- ./:/data/
environment:
executor.type: HUMIDITY
executor.uri: http://executor-humidity:8087
executor.pool.uri: http://executor-pool:8083
roster.uri: http://roster:8082
labels:
- "traefik.enable=true"
- "traefik.http.routers.executor-computation.rule=Host(`executor-humidity.${PUB_IP}.nip.io`)"
- "traefik.http.routers.executor-computation.service=executor-computation"
- "traefik.http.services.executor-computation.loadbalancer.server.port=8087"
- "traefik.http.routers.executor-computation.tls=true"
- "traefik.http.routers.executor-computation.entryPoints=web,websecure"
- "traefik.http.routers.executor-computation.tls.certresolver=le"

View File

@ -0,0 +1,266 @@
[2021-11-28 16:28:04 DEBUG] [cli:103] ###############################################################################
[2021-11-28 16:28:04 DEBUG] [cli:104] Running command 'run'
[2021-11-28 16:28:04 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 16:28:05 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 16:28:05 DEBUG] [caching:24] Building activity cache...
[2021-11-28 16:28:05 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 16:28:05 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 16:28:05 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 16:28:05 DEBUG] [secret:78] Loading secrets...
[2021-11-28 16:28:05 DEBUG] [secret:104] Done loading secrets
[2021-11-28 16:28:05 INFO] [experiment:109] Experiment looks valid
[2021-11-28 16:28:05 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 16:28:05 DEBUG] [caching:24] Building activity cache...
[2021-11-28 16:28:05 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 16:28:05 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 16:28:05 DEBUG] [secret:78] Loading secrets...
[2021-11-28 16:28:05 DEBUG] [secret:104] Done loading secrets
[2021-11-28 16:28:05 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-28 16:28:05 DEBUG] [__init__:49] Initializing controls
[2021-11-28 16:28:05 INFO] [run:336] Steady-state strategy: default
[2021-11-28 16:28:05 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 16:28:05 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 16:28:05 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:28:05 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-28 16:28:05 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 16:28:05 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 96, in create_connection
raise err
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 86, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1279, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1325, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1274, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1034, in _send_output
self.send(msg)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 974, in send
self.connect()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 205, in connect
conn = self._new_conn()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x10438d220>: Failed to establish a new connection: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/enable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438d220>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 24, in enable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/enable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438d220>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 24, in enable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
chaoslib.exceptions.ActivityFailed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/enable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438d220>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-28 16:28:05 ERROR] [activity:213] => failed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/enable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438d220>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:28:05 INFO] [activity:188] Action: configure_assaults
[2021-11-28 16:28:05 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 16:28:05 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 96, in create_connection
raise err
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 86, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1279, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1325, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1274, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1034, in _send_output
self.send(msg)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 974, in send
self.connect()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 205, in connect
conn = self._new_conn()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x10438de50>: Failed to establish a new connection: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/assaults (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438de50>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 83, in change_assaults_configuration
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/assaults (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438de50>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 83, in change_assaults_configuration
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
chaoslib.exceptions.ActivityFailed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/assaults (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438de50>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-28 16:28:05 ERROR] [activity:213] => failed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8085): Max retries exceeded with url: /actuator/chaosmonkey/assaults (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10438de50>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 16:28:05 INFO] [run:885] Let's rollback...
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 16:28:05 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 16:28:05 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 16:28:05 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 16:28:05 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 16:28:05 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 16:54:22 DEBUG] [cli:103] ###############################################################################
[2021-11-28 16:54:22 DEBUG] [cli:104] Running command 'run'
[2021-11-28 16:54:22 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 16:54:23 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 16:54:23 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 16:54:23 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 16:54:23 DEBUG] [caching:24] Building activity cache...
[2021-11-28 16:54:23 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 16:54:23 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 16:54:23 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 16:54:23 DEBUG] [secret:78] Loading secrets...
[2021-11-28 16:54:23 DEBUG] [secret:104] Done loading secrets
[2021-11-28 16:54:23 INFO] [experiment:109] Experiment looks valid
[2021-11-28 16:54:23 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 16:54:23 DEBUG] [caching:24] Building activity cache...
[2021-11-28 16:54:23 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 16:54:23 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 16:54:23 DEBUG] [secret:78] Loading secrets...
[2021-11-28 16:54:23 DEBUG] [secret:104] Done loading secrets
[2021-11-28 16:54:23 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-28 16:54:23 DEBUG] [__init__:49] Initializing controls
[2021-11-28 16:54:23 INFO] [run:336] Steady-state strategy: default
[2021-11-28 16:54:23 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 16:54:23 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 16:54:23 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 16:54:23 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 16:54:23 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 16:54:23 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:54:23 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-28 16:54:23 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 16:54:24 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-28T15:54:24.502699Z"}'
[2021-11-28 16:54:24 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:54:24 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:54:24 INFO] [activity:188] Action: configure_assaults
[2021-11-28 16:54:24 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 16:54:25 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-28 16:54:25 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:54:25 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 16:54:25 INFO] [run:885] Let's rollback...
[2021-11-28 16:54:25 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 16:54:25 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-28 16:54:25 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 16:54:25 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 16:54:25 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 16:54:25 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 16:54:25 DEBUG] [caching:42] Clearing activities cache

View File

@ -0,0 +1,24 @@
{
"title": "Disable chaos monkey",
"description": "Disable",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [],
"rollbacks": [
{
"name": "disable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "disable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
]
}

View File

@ -0,0 +1,54 @@
{
"title": "Testing exceptions",
"description": "Testing exceptions!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": false,
"killApplicationActive": false,
"restartApplicationActive": false,
"exceptionsActive": true,
"exception": {
"type": "java.lang.RuntimeException",
"arguments": [
{
"className": "java.lang.String",
"value": "Exception assault has been carried out"
}
]
}
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,113 @@
{
"chaoslib-version": "1.23.0",
"platform": "macOS-12.0-arm64-arm-64bit",
"node": "Marcels-MBP-M1",
"experiment": {
"title": "What is the impact of an expired certificate on our application chain?",
"description": "If a certificate expires, we should gracefully deal with the issue.",
"tags": [
"tls"
],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": [],
"dry": null
},
"start": "2021-11-28T15:54:23.134945",
"status": "completed",
"deviated": false,
"steady_states": {
"before": null,
"after": null,
"during": []
},
"run": [
{
"activity": {
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
"output": "{\"status\":\"Chaos Monkey is enabled\",\"enabledAt\":\"2021-11-28T15:54:24.502699Z\"}",
"status": "succeeded",
"start": "2021-11-28T15:54:23.135657",
"end": "2021-11-28T15:54:24.853870",
"duration": 1.718213
},
{
"activity": {
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
"output": "Assault config has changed",
"status": "succeeded",
"start": "2021-11-28T15:54:24.854282",
"end": "2021-11-28T15:54:25.705360",
"duration": 0.851078
}
],
"rollbacks": [],
"end": "2021-11-28T15:54:25.706100",
"duration": 2.609093189239502
}

View File

@ -0,0 +1,45 @@
{
"title": "Testing kill & restart",
"description": "Testing behavoir when killing and restarting the application",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 5000,
"latencyActive": false,
"exceptionsActive": false,
"killApplicationActive": true,
"restartApplicationActive": true
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,45 @@
{
"title": "Testing latency",
"description": "Testing latency!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,49 @@
{
"title": "Testing memory",
"description": "Testing memory!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8085/actuator",
"assaults_configuration": {
"level": 5,
"latencyActive": false,
"killApplicationActive": false,
"restartApplicationActive": false,
"exceptionsActive": false,
"memoryActive": true,
"memoryMillisecondsHoldFilledMemory": 90000,
"memoryMillisecondsWaitNextIncrease": 100,
"memoryFillIncrementFraction": 0.9,
"memoryFillTargetFraction": 0.95,
"runtimeAssaultCronExpression": "*/1 * * * * ?"
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

14
.experiments/readme.md Normal file
View File

@ -0,0 +1,14 @@
# Create python env
python3 -m venv ~/.venvs/chaostk
# Activate python env
source ~/.venvs/chaostk/bin/activate
# Run tests
chaos run latency.json
chaos run kill-restart.json
# Disable tests
chaos run disable.json

View File

@ -0,0 +1,135 @@
[2021-11-28 14:43:28 DEBUG] [cli:103] ###############################################################################
[2021-11-28 14:43:28 DEBUG] [cli:104] Running command 'run'
[2021-11-28 14:43:28 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 14:43:42 DEBUG] [cli:103] ###############################################################################
[2021-11-28 14:43:42 DEBUG] [cli:104] Running command 'run'
[2021-11-28 14:43:42 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 14:43:42 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 14:43:42 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 14:43:42 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 14:43:42 DEBUG] [caching:24] Building activity cache...
[2021-11-28 14:43:42 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 14:43:42 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 14:43:42 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 14:43:42 DEBUG] [secret:78] Loading secrets...
[2021-11-28 14:43:42 DEBUG] [secret:104] Done loading secrets
[2021-11-28 14:43:42 INFO] [experiment:109] Experiment looks valid
[2021-11-28 14:43:42 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 14:43:42 DEBUG] [caching:24] Building activity cache...
[2021-11-28 14:43:42 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 14:43:42 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 14:43:42 DEBUG] [secret:78] Loading secrets...
[2021-11-28 14:43:42 DEBUG] [secret:104] Done loading secrets
[2021-11-28 14:43:42 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-28 14:43:42 DEBUG] [__init__:49] Initializing controls
[2021-11-28 14:43:42 INFO] [run:336] Steady-state strategy: default
[2021-11-28 14:43:42 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 14:43:42 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 14:43:42 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 14:43:42 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 14:43:42 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 14:43:42 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 14:43:42 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-28 14:43:42 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 14:43:43 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 36, in enable_chaosmonkey
raise FailedActivity(f"Enable ChaosMonkey failed: {response.text}")
chaoslib.exceptions.ActivityFailed: Enable ChaosMonkey failed: {"timestamp":"2021-11-28T13:43:43.069+00:00","status":404,"error":"Not Found","message":"No message available","path":"/actuator/chaosmonkey/enable"}
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 36, in enable_chaosmonkey
raise FailedActivity(f"Enable ChaosMonkey failed: {response.text}")
chaoslib.exceptions.ActivityFailed: chaoslib.exceptions.ActivityFailed: Enable ChaosMonkey failed: {"timestamp":"2021-11-28T13:43:43.069+00:00","status":404,"error":"Not Found","message":"No message available","path":"/actuator/chaosmonkey/enable"}
[2021-11-28 14:43:43 ERROR] [activity:213] => failed: chaoslib.exceptions.ActivityFailed: Enable ChaosMonkey failed: {"timestamp":"2021-11-28T13:43:43.069+00:00","status":404,"error":"Not Found","message":"No message available","path":"/actuator/chaosmonkey/enable"}
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 14:43:43 INFO] [activity:188] Action: configure_assaults
[2021-11-28 14:43:43 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 14:43:43 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 96, in change_assaults_configuration
raise FailedActivity(
chaoslib.exceptions.ActivityFailed: Change ChaosMonkey Assaults Configuration failed: {"timestamp":"2021-11-28T13:43:43.203+00:00","status":404,"error":"Not Found","message":"No message available","path":"/actuator/chaosmonkey/assaults"}
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 96, in change_assaults_configuration
raise FailedActivity(
chaoslib.exceptions.ActivityFailed: chaoslib.exceptions.ActivityFailed: Change ChaosMonkey Assaults Configuration failed: {"timestamp":"2021-11-28T13:43:43.203+00:00","status":404,"error":"Not Found","message":"No message available","path":"/actuator/chaosmonkey/assaults"}
[2021-11-28 14:43:43 ERROR] [activity:213] => failed: chaoslib.exceptions.ActivityFailed: Change ChaosMonkey Assaults Configuration failed: {"timestamp":"2021-11-28T13:43:43.203+00:00","status":404,"error":"Not Found","message":"No message available","path":"/actuator/chaosmonkey/assaults"}
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 14:43:43 INFO] [run:885] Let's rollback...
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 14:43:43 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 14:43:43 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 14:43:43 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 14:43:43 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 14:43:43 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 16:24:55 DEBUG] [cli:103] ###############################################################################
[2021-11-28 16:24:55 DEBUG] [cli:104] Running command 'run'
[2021-11-28 16:24:55 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 16:24:55 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 16:24:55 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 16:24:55 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 16:24:55 DEBUG] [caching:24] Building activity cache...
[2021-11-28 16:24:55 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 16:24:55 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 16:24:55 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 16:24:55 DEBUG] [secret:78] Loading secrets...
[2021-11-28 16:24:55 DEBUG] [secret:104] Done loading secrets
[2021-11-28 16:24:55 INFO] [experiment:109] Experiment looks valid
[2021-11-28 16:24:55 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 16:24:55 DEBUG] [caching:24] Building activity cache...
[2021-11-28 16:24:55 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 16:24:55 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 16:24:55 DEBUG] [secret:78] Loading secrets...
[2021-11-28 16:24:55 DEBUG] [secret:104] Done loading secrets
[2021-11-28 16:24:55 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-28 16:24:55 DEBUG] [__init__:49] Initializing controls
[2021-11-28 16:24:55 INFO] [run:336] Steady-state strategy: default
[2021-11-28 16:24:55 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 16:24:55 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 16:24:55 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 16:24:55 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 16:24:55 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 16:24:55 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:24:55 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-28 16:24:55 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 16:24:56 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-28T15:24:56.52458Z"}'
[2021-11-28 16:24:56 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:24:56 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:24:56 INFO] [activity:188] Action: configure_assaults
[2021-11-28 16:24:56 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 16:24:57 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-28 16:24:57 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 16:24:57 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 16:24:57 INFO] [run:885] Let's rollback...
[2021-11-28 16:24:57 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 16:24:57 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-28 16:24:57 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 16:24:57 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 16:24:57 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 16:24:57 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 16:24:57 DEBUG] [caching:42] Clearing activities cache

View File

@ -0,0 +1,24 @@
{
"title": "Disable chaos monkey",
"description": "Disable",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [],
"rollbacks": [
{
"name": "disable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "disable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
]
}

View File

@ -0,0 +1,54 @@
{
"title": "Testing exceptions",
"description": "Testing exceptions!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": false,
"killApplicationActive": false,
"restartApplicationActive": false,
"exceptionsActive": true,
"exception": {
"type": "java.lang.RuntimeException",
"arguments": [
{
"className": "java.lang.String",
"value": "Exception assault has been carried out"
}
]
}
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,113 @@
{
"chaoslib-version": "1.23.0",
"platform": "macOS-12.0-arm64-arm-64bit",
"node": "Marcels-MBP-M1",
"experiment": {
"title": "What is the impact of an expired certificate on our application chain?",
"description": "If a certificate expires, we should gracefully deal with the issue.",
"tags": [
"tls"
],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": [],
"dry": null
},
"start": "2021-11-28T15:24:55.984078",
"status": "completed",
"deviated": false,
"steady_states": {
"before": null,
"after": null,
"during": []
},
"run": [
{
"activity": {
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
"output": "{\"status\":\"Chaos Monkey is enabled\",\"enabledAt\":\"2021-11-28T15:24:56.52458Z\"}",
"status": "succeeded",
"start": "2021-11-28T15:24:55.984855",
"end": "2021-11-28T15:24:56.785205",
"duration": 0.80035
},
{
"activity": {
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
"output": "Assault config has changed",
"status": "succeeded",
"start": "2021-11-28T15:24:56.785494",
"end": "2021-11-28T15:24:57.394090",
"duration": 0.608596
}
],
"rollbacks": [],
"end": "2021-11-28T15:24:57.394597",
"duration": 1.4326798915863037
}

View File

@ -0,0 +1,45 @@
{
"title": "Testing kill & restart",
"description": "Testing behavoir when killing and restarting the application",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 5000,
"latencyActive": false,
"exceptionsActive": false,
"killApplicationActive": true,
"restartApplicationActive": true
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,45 @@
{
"title": "Testing latency",
"description": "Testing latency!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,49 @@
{
"title": "Testing memory",
"description": "Testing memory!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8082/actuator",
"assaults_configuration": {
"level": 5,
"latencyActive": false,
"killApplicationActive": false,
"restartApplicationActive": false,
"exceptionsActive": false,
"memoryActive": true,
"memoryMillisecondsHoldFilledMemory": 90000,
"memoryMillisecondsWaitNextIncrease": 100,
"memoryFillIncrementFraction": 0.9,
"memoryFillTargetFraction": 0.95,
"runtimeAssaultCronExpression": "*/1 * * * * ?"
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,936 @@
[2021-11-27 11:35:02 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:35:02 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:35:02 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:35:02 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:35:02 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:35:02 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:35:02 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:35:02 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:35:02 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:35:02 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:35:02 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:35:02 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:35:02 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:35:02 ERROR] [cli:251] hypothesis requires a title
[2021-11-27 11:35:02 DEBUG] [cli:252] hypothesis requires a title
[2021-11-27 11:35:57 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:35:57 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:35:57 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:35:58 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:35:58 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:35:58 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:35:58 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:35:58 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:35:58 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:35:58 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:35:58 ERROR] [cli:251] experiment requires a description
[2021-11-27 11:35:58 DEBUG] [cli:252] experiment requires a description
[2021-11-27 11:36:18 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:36:18 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:36:18 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:36:18 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:36:18 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:36:18 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:36:18 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:36:18 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:36:18 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:36:18 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:36:18 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:36:18 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:36:18 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:36:18 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:36:18 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:36:18 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:36:18 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:36:18 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:36:18 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:36:18 INFO] [run:319] Running experiment: Testing kill & restart
[2021-11-27 11:36:18 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:36:18 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:36:18 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:36:18 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:36:18 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:36:18 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:36:18 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:36:18 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:18 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:36:18 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:36:19 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:36:19.060458Z"}'
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:19 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:36:19 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:36:19 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:36:19 INFO] [run:885] Let's rollback...
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:36:19 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:19 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:36:19 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:36:19 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 96, in create_connection
raise err
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 86, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1279, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1325, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1274, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1034, in _send_output
self.send(msg)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 974, in send
self.connect()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 205, in connect
conn = self._new_conn()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x106688100>: Failed to establish a new connection: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x106688100>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 53, in disable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x106688100>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 53, in disable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
chaoslib.exceptions.ActivityFailed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x106688100>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-27 11:36:19 ERROR] [activity:213] => failed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x106688100>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:36:19 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:36:19 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:36:19 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:36:19 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:36:54 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:36:54 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:36:54 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:36:54 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:36:54 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:36:54 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:36:54 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:36:54 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:36:54 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:36:54 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:36:54 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:36:54 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:36:54 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:36:54 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:36:54 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:36:54 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:36:54 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:36:54 INFO] [run:319] Running experiment: Testing kill & restart
[2021-11-27 11:36:54 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:36:54 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:36:54 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:36:54 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:36:54 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:54 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:36:54 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:36:54 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:36:54.668324Z"}'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:54 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:36:54 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:36:54 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:36:54 INFO] [run:885] Let's rollback...
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:36:54 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:54 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:36:54 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:36:54 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 96, in create_connection
raise err
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 86, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1279, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1325, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1274, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1034, in _send_output
self.send(msg)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 974, in send
self.connect()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 205, in connect
conn = self._new_conn()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x104be0100>: Failed to establish a new connection: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x104be0100>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 53, in disable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x104be0100>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 53, in disable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
chaoslib.exceptions.ActivityFailed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x104be0100>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-27 11:36:54 ERROR] [activity:213] => failed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x104be0100>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:36:54 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:36:54 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:36:54 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:36:54 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:36:59 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:36:59 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:36:59 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:37:00 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:37:00 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:37:00 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:37:00 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:37:00 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:37:00 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:37:00 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:37:00 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:37:00 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:37:00 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:37:00 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:37:00 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:37:00 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:37:00 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:37:00 INFO] [run:319] Running experiment: Testing kill & restart
[2021-11-27 11:37:00 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:37:00 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:37:00 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:37:00 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:37:00 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:37:00 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:37:00 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:37:00 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:37:00.591716Z"}'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:37:00 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:37:00 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:37:00 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:37:00 INFO] [run:885] Let's rollback...
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:37:00 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:37:00 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:37:00 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:37:00 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is disabled","disabledAt":"2021-11-27T10:37:00.650024Z"}'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:37:00 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:37:00 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:37:00 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:37:00 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:38:39 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:38:39 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:38:39 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:38:40 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:38:40 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:38:40 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:38:40 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:38:40 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:38:40 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:38:40 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:38:40 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:38:40 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:38:40 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:38:40 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:38:40 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:38:40 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:38:40 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:38:40 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:38:40 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:38:40 INFO] [run:319] Running experiment: Testing kill & restart
[2021-11-27 11:38:40 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:38:40 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:38:40 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:38:40 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:38:40 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:38:40 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:38:40 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:38:40 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:38:40 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:38:40 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:38:41 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:38:40.795245Z"}'
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:38:41 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:38:41 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:38:41 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:38:41 INFO] [run:885] Let's rollback...
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:38:41 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:38:41 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:38:41 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:38:41 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is disabled","disabledAt":"2021-11-27T10:38:41.923689Z"}'
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:38:41 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:38:41 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:38:41 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:38:41 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:42:14 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:42:14 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:42:14 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:42:15 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:42:15 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:42:15 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:42:15 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:42:15 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:42:15 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:42:15 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:42:15 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:42:15 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:42:15 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:42:15 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:42:15 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:42:15 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:42:15 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:42:15 INFO] [run:319] Running experiment: Testing kill & restart
[2021-11-27 11:42:15 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:42:15 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:42:15 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:42:15 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:42:15 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:42:15 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:42:15 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:42:15 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:42:15.310527Z"}'
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:42:15 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:42:15 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:42:15 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:42:15 INFO] [run:885] Let's rollback...
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:42:15 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:42:15 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:42:15 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:42:15 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:42:15 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:43:22 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:43:22 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:43:22 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:43:23 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:43:23 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:43:23 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:43:23 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:43:23 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:43:23 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:43:23 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:43:23 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:43:23 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:43:23 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:43:23 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:43:23 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:43:23 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:43:23 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:43:23 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-27 11:43:23 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:43:23 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:43:23 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:43:23 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:43:23 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:23 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:43:23 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:43:23 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:43:23.565576Z"}'
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:23 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:43:23 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:43:23 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:43:23 INFO] [run:885] Let's rollback...
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:43:23 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:43:23 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:43:23 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:43:23 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:43:23 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:43:50 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:43:50 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:43:50 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:43:50 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:43:50 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:43:50 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:43:50 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:43:50 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:43:50 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:43:50 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:43:50 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:43:50 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:43:50 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:43:50 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:43:50 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:43:50 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:43:50 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:43:50 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-27 11:43:50 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:43:50 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:43:50 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:43:50 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:43:50 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:50 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:43:50 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:43:50 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:43:50.888054Z"}'
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:50 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:43:50 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:43:50 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:43:50 INFO] [run:885] Let's rollback...
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:43:50 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:43:50 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:43:50 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:43:50 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:43:50 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:47:20 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:47:20 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:47:20 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:47:21 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:47:21 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:47:21 DEBUG] [caching:35] Cached 0 activities
[2021-11-27 11:47:21 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:47:21 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:47:21 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:47:21 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:47:21 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:47:21 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:47:21 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:47:21 DEBUG] [caching:35] Cached 0 activities
[2021-11-27 11:47:21 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:47:21 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:47:21 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:47:21 INFO] [run:319] Running experiment: Disable chaos monkey
[2021-11-27 11:47:21 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:47:21 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:47:21 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:47:21 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:47:21 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:47:21 INFO] [activity:113] No declared activities, let's move on.
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:47:21 INFO] [run:885] Let's rollback...
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:47:21 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:47:21 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:47:21 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:47:21 DEBUG] [activity:260] Activity failed
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 96, in create_connection
raise err
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/connection.py", line 86, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1279, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1325, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1274, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1034, in _send_output
self.send(msg)
File "/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 974, in send
self.connect()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 205, in connect
conn = self._new_conn()
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x1024bf220>: Failed to establish a new connection: [Errno 61] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x1024bf220>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 53, in disable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x1024bf220>: Failed to establish a new connection: [Errno 61] Connection refused'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/activity.py", line 253, in run_activity
result = run_python_activity(activity, configuration, secrets)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 58, in run_python_activity
raise ActivityFailed(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaoslib/provider/python.py", line 56, in run_python_activity
return func(**arguments)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py", line 53, in disable_chaosmonkey
response = api.call_api(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/api.py", line 56, in call_api
return requests.request(
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
chaoslib.exceptions.ActivityFailed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x1024bf220>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-27 11:47:21 ERROR] [activity:213] => failed: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /actuator/chaosmonkey/disable (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x1024bf220>: Failed to establish a new connection: [Errno 61] Connection refused'))
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:47:21 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:47:21 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:47:21 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:47:21 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:47:29 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:47:29 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:47:29 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:47:30 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:47:30 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:47:30 DEBUG] [caching:35] Cached 0 activities
[2021-11-27 11:47:30 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:47:30 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:47:30 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:47:30 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:47:30 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:47:30 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:47:30 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:47:30 DEBUG] [caching:35] Cached 0 activities
[2021-11-27 11:47:30 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:47:30 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:47:30 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:47:30 INFO] [run:319] Running experiment: Disable chaos monkey
[2021-11-27 11:47:30 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:47:30 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:47:30 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:47:30 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:47:30 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:47:30 INFO] [activity:113] No declared activities, let's move on.
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:47:30 INFO] [run:885] Let's rollback...
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:47:30 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:47:30 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:47:30 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:47:30 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is disabled","disabledAt":"2021-11-27T10:47:30.172107Z"}'
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:47:30 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:47:30 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:47:30 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:47:30 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:49:33 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:49:33 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:49:33 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:49:33 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:49:33 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:49:33 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:49:33 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:49:33 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:49:33 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:49:33 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:49:33 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:49:33 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:49:33 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:49:33 DEBUG] [caching:35] Cached 2 activities
[2021-11-27 11:49:33 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:49:33 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:49:33 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:49:33 INFO] [run:319] Running experiment: What is the impact of an expired certificate on our application chain?
[2021-11-27 11:49:33 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:49:33 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:49:33 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:49:33 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:49:33 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:49:33 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-27 11:49:33 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:49:33 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-27T10:49:33.912573Z"}'
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:49:33 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:49:33 INFO] [activity:188] Action: configure_assaults
[2021-11-27 11:49:33 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:49:34 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-27 11:49:34 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:49:34 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:49:34 INFO] [run:885] Let's rollback...
[2021-11-27 11:49:34 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:49:34 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-27 11:49:34 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:49:34 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:49:34 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:49:34 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:49:34 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:50:00 DEBUG] [cli:103] ###############################################################################
[2021-11-27 11:50:00 DEBUG] [cli:104] Running command 'run'
[2021-11-27 11:50:00 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-27 11:50:01 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-27 11:50:01 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:50:01 DEBUG] [caching:35] Cached 0 activities
[2021-11-27 11:50:01 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-27 11:50:01 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:50:01 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:50:01 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:50:01 INFO] [experiment:109] Experiment looks valid
[2021-11-27 11:50:01 DEBUG] [caching:42] Clearing activities cache
[2021-11-27 11:50:01 DEBUG] [caching:24] Building activity cache...
[2021-11-27 11:50:01 DEBUG] [caching:35] Cached 0 activities
[2021-11-27 11:50:01 DEBUG] [configuration:54] Loading configuration...
[2021-11-27 11:50:01 DEBUG] [secret:78] Loading secrets...
[2021-11-27 11:50:01 DEBUG] [secret:104] Done loading secrets
[2021-11-27 11:50:01 INFO] [run:319] Running experiment: Disable chaos monkey
[2021-11-27 11:50:01 DEBUG] [__init__:49] Initializing controls
[2021-11-27 11:50:01 INFO] [run:336] Steady-state strategy: default
[2021-11-27 11:50:01 INFO] [run:340] Rollbacks strategy: default
[2021-11-27 11:50:01 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:50:01 INFO] [run:599] Playing your experiment's method now...
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:50:01 INFO] [activity:113] No declared activities, let's move on.
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-27 11:50:01 INFO] [run:885] Let's rollback...
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:50:01 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:50:01 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-27 11:50:01 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-27 11:50:01 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is disabled","disabledAt":"2021-11-27T10:50:01.207712Z"}'
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-27 11:50:01 INFO] [run:450] Experiment ended with status: completed
[2021-11-27 11:50:01 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-27 11:50:01 DEBUG] [__init__:82] Cleaning up controls
[2021-11-27 11:50:01 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 18:00:15 DEBUG] [cli:103] ###############################################################################
[2021-11-28 18:00:15 DEBUG] [cli:104] Running command 'run'
[2021-11-28 18:00:15 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 18:00:15 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 18:00:15 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 18:00:15 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 18:00:15 DEBUG] [caching:24] Building activity cache...
[2021-11-28 18:00:15 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 18:00:15 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 18:00:15 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 18:00:15 DEBUG] [secret:78] Loading secrets...
[2021-11-28 18:00:15 DEBUG] [secret:104] Done loading secrets
[2021-11-28 18:00:15 INFO] [experiment:109] Experiment looks valid
[2021-11-28 18:00:15 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 18:00:15 DEBUG] [caching:24] Building activity cache...
[2021-11-28 18:00:15 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 18:00:15 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 18:00:15 DEBUG] [secret:78] Loading secrets...
[2021-11-28 18:00:15 DEBUG] [secret:104] Done loading secrets
[2021-11-28 18:00:15 INFO] [run:319] Running experiment: Testing latency
[2021-11-28 18:00:15 DEBUG] [__init__:49] Initializing controls
[2021-11-28 18:00:15 INFO] [run:336] Steady-state strategy: default
[2021-11-28 18:00:15 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 18:00:15 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 18:00:15 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 18:00:15 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 18:00:15 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 18:00:15 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:00:15 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-28 18:00:15 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 18:00:17 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-28T17:00:16.734825Z"}'
[2021-11-28 18:00:17 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:00:17 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:00:17 INFO] [activity:188] Action: configure_assaults
[2021-11-28 18:00:17 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 18:00:19 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-28 18:00:19 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:00:19 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 18:00:19 INFO] [run:885] Let's rollback...
[2021-11-28 18:00:19 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 18:00:19 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-28 18:00:19 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 18:00:19 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 18:00:19 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 18:00:19 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 18:00:19 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 18:07:50 DEBUG] [cli:103] ###############################################################################
[2021-11-28 18:07:50 DEBUG] [cli:104] Running command 'run'
[2021-11-28 18:07:50 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 18:07:50 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 18:07:50 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 18:07:50 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 18:07:50 DEBUG] [caching:24] Building activity cache...
[2021-11-28 18:07:50 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 18:07:50 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 18:07:50 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 18:07:50 DEBUG] [secret:78] Loading secrets...
[2021-11-28 18:07:50 DEBUG] [secret:104] Done loading secrets
[2021-11-28 18:07:50 INFO] [experiment:109] Experiment looks valid
[2021-11-28 18:07:50 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 18:07:50 DEBUG] [caching:24] Building activity cache...
[2021-11-28 18:07:50 DEBUG] [caching:35] Cached 2 activities
[2021-11-28 18:07:50 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 18:07:50 DEBUG] [secret:78] Loading secrets...
[2021-11-28 18:07:51 DEBUG] [secret:104] Done loading secrets
[2021-11-28 18:07:51 INFO] [run:319] Running experiment: Testing latency
[2021-11-28 18:07:51 DEBUG] [__init__:49] Initializing controls
[2021-11-28 18:07:51 INFO] [run:336] Steady-state strategy: default
[2021-11-28 18:07:51 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 18:07:51 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 18:07:51 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:07:51 INFO] [activity:188] Action: enable_chaosmonkey
[2021-11-28 18:07:51 DEBUG] [python:33] Activity 'enable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 18:07:51 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is enabled","enabledAt":"2021-11-28T17:07:51.182021Z"}'
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:07:51 INFO] [activity:188] Action: configure_assaults
[2021-11-28 18:07:51 DEBUG] [python:33] Activity 'configure_assaults' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 18:07:51 DEBUG] [activity:205] => succeeded with 'Assault config has changed'
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 18:07:51 INFO] [run:885] Let's rollback...
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 18:07:51 INFO] [rollback:27] No declared rollbacks, let's move on.
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 18:07:51 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 18:07:51 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 18:07:51 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 18:07:51 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 18:09:39 DEBUG] [cli:103] ###############################################################################
[2021-11-28 18:09:39 DEBUG] [cli:104] Running command 'run'
[2021-11-28 18:09:39 DEBUG] [cli:108] Using settings file '/Users/maece/.chaostoolkit/settings.yaml'
[2021-11-28 18:09:40 DEBUG] [settings:30] The Chaos Toolkit settings file could not be found at '/Users/maece/.chaostoolkit/settings.yaml'.
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'loader'
[2021-11-28 18:09:40 DEBUG] [caching:24] Building activity cache...
[2021-11-28 18:09:40 DEBUG] [caching:35] Cached 0 activities
[2021-11-28 18:09:40 INFO] [experiment:58] Validating the experiment's syntax
[2021-11-28 18:09:40 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 18:09:40 DEBUG] [secret:78] Loading secrets...
[2021-11-28 18:09:40 DEBUG] [secret:104] Done loading secrets
[2021-11-28 18:09:40 INFO] [experiment:109] Experiment looks valid
[2021-11-28 18:09:40 DEBUG] [caching:42] Clearing activities cache
[2021-11-28 18:09:40 DEBUG] [caching:24] Building activity cache...
[2021-11-28 18:09:40 DEBUG] [caching:35] Cached 0 activities
[2021-11-28 18:09:40 DEBUG] [configuration:54] Loading configuration...
[2021-11-28 18:09:40 DEBUG] [secret:78] Loading secrets...
[2021-11-28 18:09:40 DEBUG] [secret:104] Done loading secrets
[2021-11-28 18:09:40 INFO] [run:319] Running experiment: Disable chaos monkey
[2021-11-28 18:09:40 DEBUG] [__init__:49] Initializing controls
[2021-11-28 18:09:40 INFO] [run:336] Steady-state strategy: default
[2021-11-28 18:09:40 INFO] [run:340] Rollbacks strategy: default
[2021-11-28 18:09:40 INFO] [run:345] No steady state hypothesis defined. That's ok, just exploring.
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 18:09:40 INFO] [run:599] Playing your experiment's method now...
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 18:09:40 INFO] [activity:113] No declared activities, let's move on.
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'method'
[2021-11-28 18:09:40 INFO] [run:885] Let's rollback...
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 18:09:40 INFO] [rollback:30] Rollback: disable_chaosmonkey
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:09:40 INFO] [activity:188] Action: disable_chaosmonkey
[2021-11-28 18:09:40 DEBUG] [python:33] Activity 'disable_chaosmonkey' loaded from '/Users/maece/.venvs/chaostk/lib/python3.9/site-packages/chaosspring/actions.py'
[2021-11-28 18:09:40 DEBUG] [activity:205] => succeeded with '{"status":"Chaos Monkey is disabled","disabledAt":"2021-11-28T17:09:40.443253Z"}'
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'activity'
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'rollback'
[2021-11-28 18:09:40 INFO] [run:450] Experiment ended with status: completed
[2021-11-28 18:09:40 DEBUG] [__init__:389] No controls to apply on 'experiment'
[2021-11-28 18:09:40 DEBUG] [__init__:82] Cleaning up controls
[2021-11-28 18:09:40 DEBUG] [caching:42] Clearing activities cache

View File

@ -0,0 +1,24 @@
{
"title": "Disable chaos monkey",
"description": "Disable",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [],
"rollbacks": [
{
"name": "disable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "disable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
]
}

View File

@ -0,0 +1,54 @@
{
"title": "Testing exceptions",
"description": "Testing exceptions!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": false,
"killApplicationActive": false,
"restartApplicationActive": false,
"exceptionsActive": true,
"exception": {
"type": "java.lang.RuntimeException",
"arguments": [
{
"className": "java.lang.String",
"value": "Exception assault has been carried out"
}
]
}
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,62 @@
{
"chaoslib-version": "1.23.0",
"platform": "macOS-12.0-arm64-arm-64bit",
"node": "Marcels-MBP-M1",
"experiment": {
"title": "Disable chaos monkey",
"description": "Disable",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [],
"rollbacks": [
{
"name": "disable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "disable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"dry": null
},
"start": "2021-11-28T17:09:40.224824",
"status": "completed",
"deviated": false,
"steady_states": {
"before": null,
"after": null,
"during": []
},
"run": [],
"rollbacks": [
{
"activity": {
"name": "disable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "disable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
"output": "{\"status\":\"Chaos Monkey is disabled\",\"disabledAt\":\"2021-11-28T17:09:40.443253Z\"}",
"status": "succeeded",
"start": "2021-11-28T17:09:40.226419",
"end": "2021-11-28T17:09:40.531586",
"duration": 0.305167
}
],
"end": "2021-11-28T17:09:40.531671",
"duration": 0.33724117279052734
}

View File

@ -0,0 +1,45 @@
{
"title": "Testing kill & restart",
"description": "Testing behavoir when killing and restarting the application",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 5000,
"latencyActive": false,
"exceptionsActive": false,
"killApplicationActive": true,
"restartApplicationActive": true
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,45 @@
{
"title": "Testing latency",
"description": "Testing latency!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator",
"assaults_configuration": {
"level": 5,
"latencyRangeStart": 2000,
"latencyRangeEnd": 15000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false,
"restartApplicationActive": false
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -0,0 +1,49 @@
{
"title": "Testing memory",
"description": "Testing memory!",
"tags": [],
"steady-state-hypothesis": {
"title": "Hypothesis",
"probes": []
},
"method": [
{
"name": "enable_chaosmonkey",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator"
},
"func": "enable_chaosmonkey",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
},
{
"name": "configure_assaults",
"provider": {
"arguments": {
"base_url": "http://localhost:8081/actuator",
"assaults_configuration": {
"level": 5,
"latencyActive": false,
"killApplicationActive": false,
"restartApplicationActive": false,
"exceptionsActive": false,
"memoryActive": true,
"memoryMillisecondsHoldFilledMemory": 90000,
"memoryMillisecondsWaitNextIncrease": 100,
"memoryFillIncrementFraction": 0.9,
"memoryFillTargetFraction": 0.95,
"runtimeAssaultCronExpression": "*/1 * * * * ?"
}
},
"func": "change_assaults_configuration",
"module": "chaosspring.actions",
"type": "python"
},
"type": "action"
}
],
"rollbacks": []
}

View File

@ -33,30 +33,37 @@ jobs:
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2 restore-keys: ${{ runner.os }}-m2
- name: Build with Maven - name: Build common library
run: mvn -f assignment/pom.xml --batch-mode --update-snapshots verify run: mvn -f common/pom.xml --batch-mode --update-snapshots install
- run: cp ./assignment/target/assignment-0.0.1-SNAPSHOT.jar ./target
- name: Build with Maven - name: Build roster service
run: mvn -f roster/pom.xml --batch-mode --update-snapshots verify
- run: cp ./roster/target/roster-0.0.1-SNAPSHOT.jar ./target
- name: Build executor-pool service
run: mvn -f executor-pool/pom.xml --batch-mode --update-snapshots verify run: mvn -f executor-pool/pom.xml --batch-mode --update-snapshots verify
- run: cp ./executor-pool/target/executor-pool-0.0.1-SNAPSHOT.jar ./target - run: cp ./executor-pool/target/executor-pool-0.0.1-SNAPSHOT.jar ./target
- name: Build with Maven - name: Build executor-base library
run: mvn -f executor-base/pom.xml --batch-mode --update-snapshots install run: mvn -f executor-base/pom.xml --batch-mode --update-snapshots install
- name: Build with Maven - name: Build executor-computation service
run: mvn -f executor1/pom.xml --batch-mode --update-snapshots verify run: mvn -f executor-computation/pom.xml --batch-mode --update-snapshots verify
- run: cp ./executor1/target/executor1-0.0.1-SNAPSHOT.jar ./target - run: cp ./executor-computation/target/executor-computation-0.0.1-SNAPSHOT.jar ./target
- name: Build with Maven - name: Build executor-robot service
run: mvn -f executor2/pom.xml --batch-mode --update-snapshots verify run: mvn -f executor-robot/pom.xml --batch-mode --update-snapshots verify
- run: cp ./executor2/target/executor2-0.0.1-SNAPSHOT.jar ./target - run: cp ./executor-robot/target/executor-robot-0.0.1-SNAPSHOT.jar ./target
- name: Build with Maven - name: Build executor-humidity service
run: mvn -f executor-humidity/pom.xml --batch-mode --update-snapshots verify
- run: cp ./executor-humidity/target/executor-humidity-0.0.1-SNAPSHOT.jar ./target
- name: Build tapas-task service
run: mvn -f tapas-tasks/pom.xml --batch-mode --update-snapshots verify run: mvn -f tapas-tasks/pom.xml --batch-mode --update-snapshots verify
- run: cp ./tapas-tasks/target/tapas-tasks-0.0.1-SNAPSHOT.jar ./target - run: cp ./tapas-tasks/target/tapas-tasks-0.0.1-SNAPSHOT.jar ./target
- name: Build with Maven - name: Build tapas-auction-house service
run: mvn -f tapas-auction-house/pom.xml --batch-mode --update-snapshots verify run: mvn -f tapas-auction-house/pom.xml --batch-mode --update-snapshots verify
- run: cp ./tapas-auction-house/target/tapas-auction-house-0.0.1-SNAPSHOT.jar ./target - run: cp ./tapas-auction-house/target/tapas-auction-house-0.0.1-SNAPSHOT.jar ./target
@ -100,5 +107,6 @@ jobs:
cd /home/${{ secrets.SSH_USER }}/ cd /home/${{ secrets.SSH_USER }}/
touch acme.json touch acme.json
sudo chmod 0600 acme.json sudo chmod 0600 acme.json
sudo docker-compose down --remove-orphans
sudo echo "PUB_IP=$(wget -qO- http://ipecho.net/plain | xargs echo)" | sed -e 's/\./-/g' > .env sudo echo "PUB_IP=$(wget -qO- http://ipecho.net/plain | xargs echo)" | sed -e 's/\./-/g' > .env
sudo docker-compose up -d --build --force-recreate sudo docker-compose up -d

View File

@ -1,41 +0,0 @@
name: CI Assignment
on:
push:
branches: [main, dev]
paths:
- "assignment/**"
pull_request:
branches: [main, dev]
paths:
- "assignment/**"
workflow_dispatch:
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache SonarCloud packages
uses: actions/cache@v1
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven packages
uses: actions/cache@v1
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn -f assignment/pom.xml -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=scs-asse-fs21-group1_tapas-assignment

View File

@ -1,15 +1,17 @@
name: CI Executor 2 name: CI executor-computation
on: on:
push: push:
branches: [main, dev] branches: [main, dev]
paths: paths:
- "executor-base/**" - "executor-base/**"
- "executor2/**" - "executor-computation/**"
- "common/**"
pull_request: pull_request:
branches: [main, dev] branches: [main, dev]
paths: paths:
- "executor-base/**" - "executor-base/**"
- "executor2/**" - "executor-computation/**"
- "common/**"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -36,10 +38,12 @@ jobs:
path: ~/.m2 path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2 restore-keys: ${{ runner.os }}-m2
- name: Build common
run: mvn -f common/pom.xml -B install
- name: Build executorBase - name: Build executorBase
run: mvn -f executor-base/pom.xml -B install run: mvn -f executor-base/pom.xml -B install
- name: Build and analyze - name: Build and analyze
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn -f executor2/pom.xml -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=scs-asse-fs21-group1_tapas-executor2 run: mvn -f executor-computation/pom.xml -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=scs-asse-fs21-group1_tapas-executor2

View File

@ -1,15 +1,17 @@
name: CI Executor 1 name: CI executor-robot
on: on:
push: push:
branches: [main, dev] branches: [main, dev]
paths: paths:
- "executor-base/**" - "executor-base/**"
- "executor1/**" - "executor-robot/**"
- "common/**"
pull_request: pull_request:
branches: [main, dev] branches: [main, dev]
paths: paths:
- "executor-base/**" - "executor-base/**"
- "executor1/**" - "executor-robot/**"
- "common/**"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -36,10 +38,12 @@ jobs:
path: ~/.m2 path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2 restore-keys: ${{ runner.os }}-m2
- name: Build executorBase
run: mvn -f common/pom.xml -B install
- name: Build executorBase - name: Build executorBase
run: mvn -f executor-base/pom.xml -B install run: mvn -f executor-base/pom.xml -B install
- name: Build and analyze - name: Build and analyze
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn -f executor1/pom.xml -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=scs-asse-fs21-group1_tapas-executor1 run: mvn -f executor-robot/pom.xml -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=scs-asse-fs21-group1_tapas-executor1

45
.github/workflows/ci.roster.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: CI Roster
on:
push:
branches: [main, dev]
paths:
- "roster/**"
- "common/**"
pull_request:
branches: [main, dev]
paths:
- "roster/**"
- "common/**"
workflow_dispatch:
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache SonarCloud packages
uses: actions/cache@v1
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven packages
uses: actions/cache@v1
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build common package
run: mvn -f common/pom.xml -B install
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn -f roster/pom.xml -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=scs-asse-fs21-group1_tapas-assignment

145
README.md
View File

@ -1,125 +1,63 @@
# TAPAS # TAPAS
This is the main GitHub project for your implementation of the TAPAS application. This is the main GitHub project for the implementation of the TAPAS application from Group 1.
## Run application in developent
We use Docker & docker-compose in development to easly start all the microservices and other needed application (db's, message-broker's) at once. All microservices have hot-reloads enabled by default!
#### Start
```
docker-compose up
```
#### Rebuild container
```
docker-compose up --build
```
#### Start detached
```
docker-compose up -d
```
#### Stop detached
```
docker-compose down
```
## Available Services
Ports and debug ports of each service are listed below:
| Name | Port | Debug Port |
| ------------------ | ---- | ---------- |
| Tasklist | 8081 | 5005 |
| Assignment Service | 8082 | 5006 |
| Executor Pool | 8083 | 5007 |
| Executor 1 | 8084 | 5008 |
| Executor 2 | 8085 | 5009 |
## Project Structure ## Project Structure
This project is structured as follows: This project is structured as follows:
- [tapas-tasks](tapas-tasks): standalone project for the Tapas-Tasks micro-service (Spring Boot project) - [.deployment/docker-compose.yml](.deployment/docker-compose.yml): Docker Compose configuration file for all services (deployment)
- [tapas-tasks/src](tapas-tasks/src): source code of the project (following the Hexagonal Architecture) - [.experiments](.experiments): Experiment files for chaos monkey tests
- [tapas-tasks/pom.xml](tapas-tasks\pom.xml): Maven pom-file - [.github/workflows](.github/workflows): GitHub actions scripts (CI/CD workflow)
- [app](app): folder as placeholder for a second micro-service (Spring Boot project) - [common](common): common library for shared elements across the whole application
- [docker-compose.yml](docker-compose.yml): Docker Compose configuration file for all services - [common/src](common/src): source code of the library
- [.github/workflows/build-and-deploy.yml](.github/workflows/build-and-deploy.yml): GitHub actions script (CI/CD workflow) - [common/pom.xml](common/pom.xml): Maven pom-file
- [doc/architecture/decisions](doc/architecture/decisions): ADRs
- [doc/workflow.png](doc/workflow.png): Workflow diagram
- [executor-base](executor-base): library for the executors. Includes the logic for executors to connect to the system
- [executor-base/src](executor-base/src): source code of the library
- [executor-base/pom.xml](executor-base/pom.xml): Maven pom-file
- [executor-computation](executor-computation): standalone project for the computation executor micro-service (Spring Boot project)
- [executor-computation/src](executor-computation/src): source code of the project
- [executor-computation/pom.xml](executor-computation/pom.xml): Maven pom-file
- [executor-humidity](executor-humidity): standalone project for the humidity executor micro-service (Spring Boot project)
- [executor-humidity/src](executor-humidity/src): source code of the project
- [executor-humidity/pom.xml](executor-humidity/pom.xml): Maven pom-file
- [executor-pool](executor-pool): standalone project for the executor-pool micro-service (Spring Boot project)
- [executor-pool/src](executor-pool/src): source code of the project (following the Hexagonal Architecture)
- [executor-pool/pom.xml](executor-pool/pom.xml): Maven pom-file
- [executor-robot](executor-robot): standalone project for the robot executor micro-service (Spring Boot project)
## How to Add a New Service with Spring Boot - [executor-robot/src](executor-robot/src): source code of the project
- [executor-robot/pom.xml](executor-robot/pom.xml): Maven pom-file
### Create a new Spring Boot project - [mocks](mocks): some auction-house mock files to test localy
- Recommended: use [Spring Initialzr](https://start.spring.io/) (Maven, Spring Boot 2.5.5, Jar, Java 11, dependencies as needed) - [roster](roster): standalone project for the Roster micro-service (Spring Boot project)
- Set the Spring application properties for your service (e.g., port of the web server) in `src/resources/application.properties`
### Update the Docker Compose file - [roster/src](roster/src): source code of the project (following the Hexagonal Architecture)
- [roster/pom.xml](roster/pom.xml): Maven pom-file
Your TAPAS application is a multi-container Docker application ran with [Docker Compose](https://docs.docker.com/compose/). - [tapas-auction-house](tapas-auction-house): standalone project for the Tapas-Aution-House micro-service (Spring Boot project)
To add your newly created service to the Docker Compose configuration file, you need to create a new service
definition in [docker-compose.yml](docker-compose.yml):
- copy and edit the `tapas-tasks` service definition from [lines 29-42](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L29-L42) - [tapas-auction-house/src](tapas-auction-house/src): source code of the project (following the Hexagonal Architecture)
- change `command` (see [line 31](https://github.com/scs-asse/tapas/blob/main/docker-compose.yml#L31)) - [tapas-auction-house/pom.xml](tapas-auction-house/pom.xml): Maven pom-file
to use the name of the JAR file generated by Maven for your service
- note: if you change the version of your service, you need to update this line to reflect the change
- update the Traefik label names to reflect the name of your new service (see [lines 37-42](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L37-L42))
- e.g., change `traefik.http.routers.tapas-tasks.rule` to `traefik.http.routers.<new-service-name>.rule`
- update the Traefik `rule` (see [line 37](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L37)) with the name of your new service: `` Host(`<new-service-name>.${PUB_IP}.nip.io`) ``
- update the Traefik `port` (see [line 39](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L39)) with the port configured for your new service
### Update the GitHub Actions Workflow - [tapas-tasks](tapas-tasks): standalone project for the Tapas-Tasks micro-service (Spring Boot project)
This project uses GitHub Actions to build and deploy your TAPAS application whenever a new commit is - [tapas-tasks/src](tapas-tasks/src): source code of the project (following the Hexagonal Architecture)
pushed on the `main` branch. You can add your new service to the GitHub Actions workflow defined in - [tapas-tasks/pom.xml](tapas-tasks/pom.xml): Maven pom-file
[.github/workflows/build-and-deploy.yml](.github/workflows/build-and-deploy.yml):
- copy and edit the definition for `tapas-tasks` from [line 28-30](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/.github/workflows/build-and-deploy.yml#L28-L30) - [docker-compose.yml](docker-compose.yml): Docker Compose configuration file for local development
- update the `mvn` command used to build your service to point to the `pom.xml` file of your new service (see [line 29](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/.github/workflows/build-and-deploy.yml#L29))
- update the `cp` command to point to the JAR file of your new service directive (see [line 30](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/.github/workflows/build-and-deploy.yml#L30))
- note you will need to update the complete file path (folder structure and JAR name)
### How to Run Your Service Locally
You can run and test your micro-service on your local machine just like a regular Maven project:
- Run from IntelliJ:
- Reload _pom.xml_ if necessary
- Run the micro-service's main class from IntelliJ for all required projects
- Use Maven to run from the command line:
```shell
mvn spring-boot:run
```
## How to Deploy on your VM
1. Start your Ubuntu VM on Switch.
- VM shuts down automatically at 2 AM
- Group admins can do this via https://engines.switch.ch/horizon
2. Push new code to the _main_ branch
- Check the status of the workflow on the _Actions_ page of the GitHub project
- We recommend to test your project locally before pushing the code to GitHub. The GitHub Organizations
used in the course are on a free tier plan, which comes with [various limits](https://github.com/pricing).
3. Open in your browser `https://app.<server-ip>.nip.io`
For the server IP address (see below), you should use dashes instead of dots, e.g.: `127.0.0.1` becomes `127-0-0-1`.
## VM Configurations ## VM Configurations
Specs (we can upgrade if needed): Specs (we can upgrade if needed):
- 1 CPU - 1 CPU
- 2 GB RAM - 2 GB RAM
- 20 GB HD - 20 GB HD
- Ubuntu 20.04 - Ubuntu 20.04
| Name | Server IP | | Name | Server IP |
| ------------------ | ------------- | | ------------------ | ------------- |
@ -128,8 +66,3 @@ Specs (we can upgrade if needed):
| SCS-ASSE-VM-Group3 | 86.119.34.242 | | SCS-ASSE-VM-Group3 | 86.119.34.242 |
| SCS-ASSE-VM-Group4 | 86.119.35.199 | | SCS-ASSE-VM-Group4 | 86.119.35.199 |
| SCS-ASSE-VM-Group5 | 86.119.35.72 | | SCS-ASSE-VM-Group5 | 86.119.35.72 |
## Architecture Decision Records
We recommend you to use [adr-tools](https://github.com/npryce/adr-tools) to manage your ADRs here in
this GitHub project in a dedicated folder. The tool works best on a Mac OS or Linux machine.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

View File

@ -0,0 +1,25 @@
# 1. microservice architecture
Date: 2021-12-02
## Status
Accepted
## Context
The system is made up of five distinct bounded contexts, namely the Task Domain, the Roster Domain, the Executor Pool Domain, the Executor Domain, and the Auction Domain. The way that these bounded contexts function together to fulfil the system requirements can be based on many different architectures.
## Decision
The system will follow the Microservice architecture.
The Microservices architecture suits our system's driving architectural characteristics particularly well. Scalability and fault tolerance are two of the systems top 3 driving characteristics and elasticity and evolvability are two of the systems other driving characteristics. These are all characteristics that the Microservices architecture excels at. Furthermore, none of our system's driving characteristics is hindered by the Microservices architecture (none of them have below 3 stars out of 5).
We do not expect to have a single monolithic database, so this is not a concern.
## Consequences
There is a considerable amount of communication between bounded contexts. This could cause responsiveness and performance issues due to added latency. This could therefore mean we would need to use asynchronous REST calls or publish-subscribe communication to mitigate these issues as much of the communication does not have to be synchronous.
Using a distributed architecture makes managing transactions more complex. This means that we could need to use sagas to manage distributed transactions. So far the only workflow that would require transactions between domains would be the deletion of tasks.

View File

@ -0,0 +1,24 @@
# 5. Event driven communication
Date: 2021-10-18
## Status
Accepted
## Context
The TAPAS system will be implemented following the Microservices architecture. Each service encapsulates a different bounded context with different functional and non-functional requirements. The TAPAS system could either be implemented as Synchronous Microservices or Event-Driven Microservices.
## Decision
The TAPAS system could either be implemented as Event-Driven Microservices.
Event-driven asynchronous communication suits the TAPAS system better than synchronous communication. This will facilitate looser coupling between services.
Scalability, one of the system's top 3 driving architectural characteristics, will be positively impacted as individual services can be scaled up and down as needed.
Responsiveness (another of the system's driving architectural characteristics) will also improve as services do not need to wait for other services to respond before responding themselves.
## Consequences
Asynchronous communication makes error handling more complex. At this moment in time we do not see this coming a problem. However, if the error handling becomes overly complex, then we might need to implement the workflow event pattern in order to combat this increased complexity.

View File

@ -0,0 +1,26 @@
# 3. Separate service for the Roster
Date: 2021-11-21
## Status
Accepted
## Context
The Task domain includes the creation and deletion of tasks from the system. It also stores all tasks and keeps track of a task's status. The Roster domain keeps track of internal task execution. It receives tasks from the Task domain. If the task can be executed internally then it queues it and keeps track of it until it has been executed by an internal executor. If it cannot be executed internally then it sends the task on to the Auction domain. These two domains could be implemented as a consolidated service or as two separate services.
## Decision
We will create two separate services; a Task List service and a Roster service.
Firstly, having two separate services will improve the system's fault tolerance. If the Task List goes down then the Roster can keep on managing the internal execution of tasks. Similarly, if the Roster goes down then the Task List can keep on being receiving input from users. Since we use asynchronous messaging for internal communication, the services can process new events when they come back up. The creation and execution of tasks is the heartbeat of the TAPAS system. Therefore, making it more fault tolerant is critical.
Secondly, we don't expect the Task List to change as frequently as the Roster. The Task List usually just needs to change when there are large new features that will impact more than just the Task domain. These large changes will be not very frequent. Conversely, we expect the Roster to change more frequently due to changes in the assignment algorithm, communication with executors, or error handling.
## Consequences
Before deleting a task from the Task List we first need to delete it from the Roster (and make sure it is not being executed). Having these as two separate services makes this transaction more complicated to manage.
Moreover, the services have to talk a lot to each other and having them seperated will add latency between them.

View File

@ -0,0 +1,27 @@
# 4. Separate service for each Executor
Date: 2021-11-21
## Status
Accepted
## Context
Executors must receive tasks of different types and execute them. The executors could either all be implemented within one service or as multiple services, one for each type of executor.
## Decision
We will have a separate service for each type of executor.
Firstly, execution time differs significantly between task types. Therefore, having seperate services will allow the executors to scale differently based on their tasks' specific needs.
Secondly, the systems functioning should not be disrupted in case an Executor fails. Having each type of executor in a separate service will increase fault tolerance in this regard.
Lastly, evolvability is one of the systems most important non-functional requirement and providers of executors need to be able to easily add executors to the executor pool. These factors are also positively impacted by having seperate services.
There should not be any shared data between the executors. Additionally, there should be no flow of information between them. Thus, there should be no issues due to workflow and data concerns due to this decision.
## Consequences
Executors share a lot of functionality when it comes to connecting to the rest of the system. Therefore, this decision means that we will either have to duplicate the code that implements the common functionality, or we have to have a way to share the code (e.g. through a common library)

View File

@ -0,0 +1,26 @@
# 5. Separate service for the Executor Pool
Date: 2021-11-21
## Status
Accepted
## Context
The Executor Pool has to keep track of which Executors are online and what task types they can execute. The Roster keeps track of tasks that need to be executed and assigns Executors to tasks. The Executor Pool functionality could be implemented in a separate service or as a part of the Roster.
## Decision
The executor pool will be implemented as a separate service.
Most importantly, the Executor Pool and the Roster need to scale differently. The Roster needs to scale depending on the number of tasks in the system while the Executor Pool needs to scale based on the number of Executors in the system. As the number of tasks is likely to far exceed the number of Executors, the two services should scale differently.
Another reason why the two should be separate services is that they have quite different responsibilities and reasons to change. On one hand, the Executor Pool manages the Executors, and therefore it will change if we want to add functionality that impacts how Executors log onto the system and how we keep track of them. For example, if we want to check if an executor fulfills some requirements before logging on. On the other hand, the Roster manages the internal execution of tasks.
Lastly, separating the two will improve the fault tolerance of the system. If the Executor Pool goes down then the Roster will keep being able to delegate tasks to internal executors, although the Roster will not be notified about added/removed executors while the Executor Pool is down. This should however not be a problem if the Executor Pool is only down for a short amount of time. Similarly, the Executor Pool can continue to keep track of added and removed executors while the Roster is down.
## Consequences
Having the services separate will add latency between an executor being added to the Executor Pool and the Roster being notified about it. However, it is only really critical that the Roster is notified about new Executors that execute a new Task Type, which should happen relatively rarely. Therefore, a small increase in latency to this workflow should not have a large effect on the overall operation of the system.

View File

@ -0,0 +1,29 @@
# 7. Separate service for Auction House
Date: 2021-11-21
## Status
Accepted
## Context
The Auction House has to launch auctions and manage auctions for tasks that we cannot execute internally. Moreover, it has to subscribe to other Auction Houses and bid on their auctions. The Roster keeps track of tasks that need to be executed and assigns Executors to tasks. Additionally, the Roster passes tasks that cannot be executed internally onto the Auction House. The Auction House functionality can either be implemented as a separate service or as a part of the Roster.
## Decision
The Auction House will be implemented as a separate service.
Most importantly, the Auction House and the Roster need to scale differently. The Roster needs to scale depending on the number of tasks in the system as all tasks go through the Roster initially. We predict that the majority of tasks will be executed internally. The Auction House also needs to scale depending on the number of external auctions. Moreover, the Auction House has different throughput as the Auction House has to communicate synchronously with a number of external clients.
Furthermore, separating the Auction House from the Roster will allow us to isolate the Roster from external communication. This improves the security of the TAPAS system as the Roster is more critical to the functioning of the system than the Auction House. Opening the Roster up to external communication could for example expose it to denial of service attacks.
Similarly, having two services separate will improve fault tolerance as either can fail without taking down the other. This is more important for the Roster as it can keep the main workflow of executing tasks going if the Auction House goes down.
## Consequences
Latency is added to the communication between the two domains. However, this should not have a major impact on the overall functioning of the system.
Data needs to be duplicated since both services need to keep track of the executors available in our system.
Deleting of tasks becomes an even more complex transaction as now we also need to check the Auction House to see if the task is being auctioned before deleting (we don't want to delete a task that another group will then go on to execute). This transaction now involves three services (the Task List, the Roster, and the Auction House). We will most likely need to implement a saga pattern to manage this transaction properly.

View File

@ -0,0 +1,23 @@
# 7. Common library for shared code
Date: 2021-11-21
## Status
Accepted
## Context
The numerous services that make up the Tapas app all have common, non-domain specific, functionality that can be shared via a common library, or be replicated in each service.
## Decision
We will use a common code library for shared code which does not change frequently, but if it would be changed, would need to be changed everywhere.
This improves maintainability as you only have to change the code in one place. This does not only save time, but also reduces the likelihood of forgetting to replace it in one service which could introduce bugs.
## Consequences
Changes in the common code will most likely require multiple services to be redeployed. However, those services would most likely have to have been changed individually and redeployed anyways.
Another consequence is that versioning becomes more complicated.

View File

@ -0,0 +1,29 @@
# 8. Executor base library
Date: 2021-11-21
## Status
Accepted
## Context
According to the project requirements, Executors can be developed by other teams within the organisation. Executors all use the same logic to communicate with other services. This means that their code base is near identical except for the code that implements their specific task execution. The code that implements the executor's shared logic can either be implemented by a shared library, or replicated across all executors.
## Decision
We will implement a shared library for common Executor functionality.
All executors use the same logic to communicate with other services, any change to this logic would have to be made for every executor. Having this shared logic in a separate library makes it easy to change the common logic at one place. The code sharing happens at compile time, which reduces the chance of runtime errors, compared to other code sharing approaches.
Additionally, if other teams need to create executors, they can just reference the executor-base library and implement the actual execution part. Therefore, they dont need to worry about the connection implementations to the TAPAS system.
## Consequences
Using a shared library will increase the complexity of the executors.
Changes in the common code will most likely require multiple services to be redeployed. However, those services would most likely have to have been changed individually and redeployed anyways.
Another consequence is that versioning becomes more complicated.
Lastly, we have to make sure that we don't become over reliant on everyone using this library to communicate with the TAPAS system. Future IoT Executors might want to use a more lightweight way to communicate, so we will have to be aware of this.

View File

@ -0,0 +1,21 @@
# 9. Separation of common and executor-base library
Date: 2021-11-21
## Status
Accepted
## Context
We have two code sharing libraries, the executor-base and the common library. The executor-base implements shared logic that all executors need, but other services don't. The common library has much more wide-reaching implementations, such as the implementation of the SelfValidating class. These could form a single common library, or two separate common libraries.
## Decision
There will be a separate library for common and executor-base.
The libraries share different type of code, and have different reasons to change. It would not make sense to have the shared code from executors in every other service which needs access to other shared code. Services that use the code in the common library should not need to be dependent in any way on the executor-base.
## Consequences
Changes impact fewer services. However, this decision will increase the number of service dependencies and therefore increase complexity in managing those dependencies.

View File

@ -0,0 +1,23 @@
# 10. Single ownership for services
Date: 2021-10-18
## Status
Accepted
## Context
There are generally three options for persisting data. Single ownership, joint ownership, or common ownership.
## Decision
We will go for single ownership for all our databases. That is, each domain/service that will persist data will have its own database of which that service will be the sole owner. Any service that wants to write data to or read data from a database other than its own will have to go through the database's owner.
Having single ownership preserves the bounded contexts and allows each service to be its own architectural quantum. This allows the services to stay decoupled and therefore can allow us to also decouple the scope of the architectural characteristics of each bounded context. We can for example more easily scale each service up and down as we can also scale the databases (size, performance) for each service.
## Consequences
Having a distributed architecture and asynchronous communication along with single ownership will force us to rely on eventual consistency.
Moreover, this decision could negatively impact performance as we add latency to data access across bounded contexts.

View File

@ -0,0 +1,21 @@
# 11. Data access
Date: 2021-10-18
## Status
Accepted
## Context
Services can generally access data that they do not own via the Interservice Communication Pattern, the Column Schema Replication Pattern, the Replicated Caching Pattern, or the Data Domain Pattern
## Decision
Data access will follow the Interservice Communication Pattern.
All the information needed to process any given event in our system is almost always included in the event itself or already cached in the service from a previous event (e.g. the Executor registry being cached in the Roster and Auction House via new/removed executor events). Therefore, there are very few occasions where access to data from other services is needed. Since the Interservice Communication Pattern is the simplest, we will go for that.
## Consequences
There will be performance and fault tolerance issues when we need to access data from other services, but since does not often occur it will not have a significant effect on the system overall.

View File

@ -0,0 +1,27 @@
# 12. Separate service for Crawler
Date: 2021-10-18
## Status
Accepted
## Context
The Auction House Discovery Crawler (for simplicity referred to as the Crawler) continuously crawls external auction houses that we already know about to try and discover new auction houses. It maintains the information we have about other auction houses and notifies our Action House when it has discovered new information. The Crawler can either be a part of the Auction House service or be a standalone service.
## Decision
The Crawler will be implemented as a standalone service.
The most important reason for this is that it has different responsibilities to the Auction House. The Crawler has to continuously crawl for new information while the Auction House only needs to launch auctions for internal tasks and bid on external auctions.
Additionally, the services might have to scale differently depending on how rapidly we want to crawl new auction house information.
## Consequences
We will have to duplicate some code and data as the auction house information will be duplicated across both services (although the business logic for updating the information based on the timestamp will solely reside in the Crawler).
There will be an added latency to the communication between the two domains. However, since this information should not be overly time sensitive (a few ms should not matter), this should not impact overall system performance.

View File

@ -0,0 +1,21 @@
# 13. Use Hypermedia APIs when possible
Date: 2021-10-18
## Status
Accepted
## Context
When Executors need to communicate with external devices they can either hard code the API requests or it can discover them at run time via Semantic Hypermedia.
## Decision
We will discover the requests at run-time via the Semantic Hypermedia APIs.
This will decouples the Executors that offer physical services from the Web-enabled devices they use. This will make these Executors more resilient to change in the devices they use and therefore less likely to experience problems over time as the device APIs change.
## Consequences
The implementation of the run-time discovery is more complex, at least until the team has gained more experience in this domain.

View File

@ -0,0 +1,27 @@
# 13. Use Choreography For Task Execution Workflow
Date: 2021-12-10
## Status
Accepted
## Context
The Task Execution Workflow (workflow that takes a task from created to executed) is the main workflow in the whole TAPAS system. It can either be orchestrated, or choreographed. If it is choreographed then it should follow one of the following patterns: Front Controller Pattern, Stateless, or Stamp coupling.
## Decision
The Task Execution Workflow will be choreographed and will follow the Front Controller Pattern, storing the workflow state in the Task List.
The reason for why it should be choreographed is that this will optimise the for responsiveness, scalability, and fault tolerance. There are all driving architectural characteristics for our system.
Moreover, the workflow should utilise the Front Controller Pattern as this pattern fits the architecture naturally. The tasks in the Task List already have a Status property. This property can be used to keep track of the state of the task within the execution workflow. Moreover, since updating this state is already a part of the architecture, the system will not suffer greatly from the normal drawback of using this pattern (additional state property, increased communication overhead).
Using this pattern will make querying the state trivial since we just need to look up the status of the task in the Task List. Moreover, it makes the Task List a pseudo-orchestrator within our choreography which will reduce the complexity for error handling, as much of it can be added to the Task List. Lastly, since the Task List is accessible by the users that created the task, they can then make ultimate decisions for error handling. For example, when no executor has been found for a task (neither internal nor external) then the end user could either delete the task or ask for it to be re-run through the roster and auction house at a later date.
## Consequences
Making the Task Execution Workflow choreographed will make error handling more complex. For now it seems manageable, but if the complexity becomes to great we could implement the Workflow Event Pattern in order to mitigate the increased complexity.
Recoverability and state management might also suffer, but a good implementation of the Front Controller Pattern should mitigate more of the negatives for those aspects.

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -9,7 +9,7 @@ import java.util.Set;
public abstract class SelfValidating<T> { public abstract class SelfValidating<T> {
private Validator validator; private final Validator validator;
protected SelfValidating() { protected SelfValidating() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

View File

@ -1,19 +0,0 @@
# 1. Record architecture decisions
Date: 2021-10-18
## Status
Accepted
## Context
We need to record the architectural decisions made on this project.
## Decision
We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions).
## Consequences
See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools).

View File

@ -1,21 +0,0 @@
# 2. Seperate service for Executors
Date: 2021-10-18
## Status
Accepted
## Context
The users need to be able to add new executors to the executor pool. The functionality of the executor is currently unknown.
## Decision
We will use a separate microservice for each executor.
New executors will be added/removed during runtime. Therefore, we need a high extensibility.
Different executors can have different execution times and a different load. This means the executors scale differently.
## Consequences
Having executors as its own service we can deploy new executors independently and easily add new executors during runtime and guarantee high scalability as well as evolvability.

View File

@ -1,21 +0,0 @@
# 3. Seperate service for assignment domain
Date: 2021-10-18
## Status
Accepted
## Context
The Assignment Service handles the assignment of a task to a corresponding and available executor. It keeps track of all the connections between tasks and executors.
## Decision
The assignment domain will be its own service.
The assignment service will be a central point in our application. It will have most of the business logic in it and will communicate with all the different services. Therefore, other services can be kind of “dumb” and only need to focus on their simple tasks.
The code of the assignment will change more often than the code of the other services, thus having the assignment service split from the other makes it more deployable.
## Consequences
Having this system as its own service we reduce the Fault tolerance because the assignment service can be the single point of failure. We can mitigate this risk by implementing (server) replication and/or having an event driven communication with persisting messages. Therefore, all other services can run independently, and the assignment service can recover from a crash.

View File

@ -1,21 +0,0 @@
# 4. Seperate service for executor pool
Date: 2021-10-18
## Status
Accepted
## Context
The Executor pool keeps track of the connected executors and their purpose and status.
## Decision
We will have a separate service for the executor pool.
There are no other domains which share the same or similar functionality.
The executor pool also scales differently than other services.
## Consequences
Having the executor pool as a separate service will help with the deployability of this service but will make the overall structure more complex and reduces testability.

View File

@ -1,20 +0,0 @@
# 5. Event driven communication
Date: 2021-10-18
## Status
Accepted
## Context
Services need to be able to communicate with each other. Services need to be scalable and therefore multiple services will need to get the same messages. Most of the processes are about responding to events that are happening throughout the system.
## Decision
We will use mainly event driven communication.
## Consequences
Event driven communication will help use to create a system which has high scalability and elasticity. Through persisting messages, we will also reach way higher fault tolerance and recoverability.
Having an event driven communication, we can only guarantee eventual consistency.

View File

@ -1,20 +0,0 @@
# 6. One global database or one database per service
Date: 2021-10-18
## Status
Accepted
## Context
We can have one database for all services or each Microservice can have its own database.
## Decision
Each Microservice will have its own database.
The different services dont need to store a lot of similar data. Therefore, we can have every Microservice handle its own data. This also gives the advantage that every Microservice owns its own data and is also responsible for it. (Data ownership, Data responsibility).
## Consequences
Having one database per Microservice will lead to eventual consistency. Having an event driven communication we can use event-based synchronisation to keep the data in sync between the services, thus the individual services dont need to know about each other. To guarantee data consistency we can also use a pattern like sagas.

View File

@ -1,337 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0grlf6g" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.8.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:collaboration id="Collaboration_0p9il2x">
<bpmn:participant id="Participant_06nkquo" name="Task Service" processRef="Process_12mqbju" />
<bpmn:participant id="Participant_016oseg" name="Roster Service" processRef="Process_1s4t9qw" />
<bpmn:participant id="Participant_11sfrgz" name="Executor Pool" processRef="Process_0bur8vc" />
<bpmn:participant id="Participant_1x7nd70" name="executor" processRef="Process_1wq3sju" />
<bpmn:messageFlow id="Flow_14smr2g" sourceRef="Activity_13xp2vr" targetRef="Activity_0iljjpd" />
<bpmn:messageFlow id="Flow_1pr8430" name="Get All available executors" sourceRef="Activity_0iljjpd" targetRef="Activity_0qbi1wr" />
<bpmn:messageFlow id="Flow_0je874m" name="Return executorlist" sourceRef="Activity_0qbi1wr" targetRef="Activity_05ck4dv" />
<bpmn:messageFlow id="Flow_0z85582" name="notify executor about new tasks in event channel" sourceRef="Activity_0qh2a6b" targetRef="Activity_0feawyi" />
<bpmn:messageFlow id="Flow_02hwoew" sourceRef="Activity_1hdmlbq" targetRef="Activity_0x47yx9" />
<bpmn:messageFlow id="Flow_0jg4g6h" name="return task informations" sourceRef="Activity_0a4kzh7" targetRef="Activity_12tzfd7" />
<bpmn:messageFlow id="Flow_1ejujjc" name="Notify about status change" sourceRef="Activity_0a4kzh7" targetRef="Activity_0fiiuon" />
<bpmn:messageFlow id="Flow_1gknjes" name="Notify about task finish" sourceRef="Activity_1f06uud" targetRef="Activity_01iahon" />
<bpmn:messageFlow id="Flow_0fihv5s" name="return task results" sourceRef="Activity_12tzfd7" targetRef="Activity_1f06uud" />
<bpmn:messageFlow id="Flow_1qv7s55" name="Sends started message to executor pool" sourceRef="Activity_1r2yhx0" targetRef="Activity_14xojfa" />
<bpmn:messageFlow id="Flow_1l0z3bv" name="Return success message if added" sourceRef="Activity_14xojfa" targetRef="Activity_09ae5r2" />
</bpmn:collaboration>
<bpmn:process id="Process_12mqbju" isExecutable="true">
<bpmn:task id="Activity_0fiiuon" name="Change status to assigned" />
<bpmn:task id="Activity_01iahon" name="Update status and task" />
<bpmn:task id="Activity_13xp2vr" name="Task created" />
</bpmn:process>
<bpmn:process id="Process_1s4t9qw" isExecutable="false">
<bpmn:exclusiveGateway id="Gateway_0sqs3j7">
<bpmn:incoming>Flow_1rie16h</bpmn:incoming>
<bpmn:outgoing>Flow_159tlyd</bpmn:outgoing>
<bpmn:outgoing>Flow_01pbz6s</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Activity_0qh2a6b" name="Add task to task queue">
<bpmn:incoming>Flow_159tlyd</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_005fqxd" name="Auction House">
<bpmn:incoming>Flow_01pbz6s</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_0x47yx9" name="Check if task available for this executor">
<bpmn:outgoing>Flow_1urp3d2</bpmn:outgoing>
</bpmn:task>
<bpmn:exclusiveGateway id="Gateway_1apm7h8">
<bpmn:incoming>Flow_1urp3d2</bpmn:incoming>
<bpmn:outgoing>Flow_1oy6e8u</bpmn:outgoing>
<bpmn:outgoing>Flow_1rxws1j</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Activity_1v2mt3m" name="Return no task available">
<bpmn:incoming>Flow_1oy6e8u</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_0a4kzh7" name="Assign executor to task and add to roster">
<bpmn:incoming>Flow_1rxws1j</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_1f06uud" name="Remove assignment from roster" />
<bpmn:task id="Activity_0iljjpd" name="Receive Task" />
<bpmn:task id="Activity_05ck4dv" name="Check if executor is available">
<bpmn:outgoing>Flow_1rie16h</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_1rie16h" sourceRef="Activity_05ck4dv" targetRef="Gateway_0sqs3j7" />
<bpmn:sequenceFlow id="Flow_159tlyd" name="Yes" sourceRef="Gateway_0sqs3j7" targetRef="Activity_0qh2a6b" />
<bpmn:sequenceFlow id="Flow_01pbz6s" name="No" sourceRef="Gateway_0sqs3j7" targetRef="Activity_005fqxd" />
<bpmn:sequenceFlow id="Flow_1urp3d2" sourceRef="Activity_0x47yx9" targetRef="Gateway_1apm7h8" />
<bpmn:sequenceFlow id="Flow_1oy6e8u" name="No" sourceRef="Gateway_1apm7h8" targetRef="Activity_1v2mt3m" />
<bpmn:sequenceFlow id="Flow_1rxws1j" sourceRef="Gateway_1apm7h8" targetRef="Activity_0a4kzh7" />
</bpmn:process>
<bpmn:process id="Process_0bur8vc" isExecutable="false">
<bpmn:task id="Activity_0qbi1wr" name="Retrieve executors by type" />
<bpmn:task id="Activity_14xojfa" name="Adds executor to pool" />
</bpmn:process>
<bpmn:process id="Process_1wq3sju" isExecutable="false">
<bpmn:task id="Activity_0feawyi" name="check if right tasktype and if idling">
<bpmn:outgoing>Flow_0nuuhk7</bpmn:outgoing>
</bpmn:task>
<bpmn:exclusiveGateway id="Gateway_0nyndyn">
<bpmn:incoming>Flow_0nuuhk7</bpmn:incoming>
<bpmn:outgoing>Flow_197gie6</bpmn:outgoing>
<bpmn:outgoing>Flow_0ruufha</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Activity_1v0d9zm" name="Do nothing">
<bpmn:incoming>Flow_197gie6</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_12tzfd7" name="Execute task" />
<bpmn:task id="Activity_1hdmlbq" name="Apply for Assignment">
<bpmn:incoming>Flow_0ruufha</bpmn:incoming>
<bpmn:incoming>Flow_1duwugb</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_1r2yhx0" name="Executor Starts" />
<bpmn:task id="Activity_09ae5r2" name="Was startup successfull">
<bpmn:outgoing>Flow_19m4xhk</bpmn:outgoing>
</bpmn:task>
<bpmn:exclusiveGateway id="Gateway_1o0lihs">
<bpmn:incoming>Flow_19m4xhk</bpmn:incoming>
<bpmn:outgoing>Flow_0b4g73l</bpmn:outgoing>
<bpmn:outgoing>Flow_1duwugb</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Activity_0n6hvhw" name="Shut down">
<bpmn:incoming>Flow_0b4g73l</bpmn:incoming>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_0nuuhk7" sourceRef="Activity_0feawyi" targetRef="Gateway_0nyndyn" />
<bpmn:sequenceFlow id="Flow_197gie6" name="No" sourceRef="Gateway_0nyndyn" targetRef="Activity_1v0d9zm" />
<bpmn:sequenceFlow id="Flow_0ruufha" sourceRef="Gateway_0nyndyn" targetRef="Activity_1hdmlbq" />
<bpmn:sequenceFlow id="Flow_19m4xhk" sourceRef="Activity_09ae5r2" targetRef="Gateway_1o0lihs" />
<bpmn:sequenceFlow id="Flow_0b4g73l" name="No" sourceRef="Gateway_1o0lihs" targetRef="Activity_0n6hvhw" />
<bpmn:sequenceFlow id="Flow_1duwugb" name="Yes" sourceRef="Gateway_1o0lihs" targetRef="Activity_1hdmlbq" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_0p9il2x">
<bpmndi:BPMNShape id="Participant_016oseg_di" bpmnElement="Participant_016oseg" isHorizontal="true">
<dc:Bounds x="160" y="310" width="1950" height="260" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1rie16h_di" bpmnElement="Flow_1rie16h">
<di:waypoint x="510" y="390" />
<di:waypoint x="805" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_159tlyd_di" bpmnElement="Flow_159tlyd">
<di:waypoint x="855" y="390" />
<di:waypoint x="950" y="390" />
<bpmndi:BPMNLabel>
<dc:Bounds x="894" y="372" width="18" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_01pbz6s_di" bpmnElement="Flow_01pbz6s">
<di:waypoint x="830" y="415" />
<di:waypoint x="830" y="500" />
<di:waypoint x="950" y="500" />
<bpmndi:BPMNLabel>
<dc:Bounds x="882" y="483" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1urp3d2_di" bpmnElement="Flow_1urp3d2">
<di:waypoint x="1490" y="400" />
<di:waypoint x="1585" y="400" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1oy6e8u_di" bpmnElement="Flow_1oy6e8u">
<di:waypoint x="1610" y="425" />
<di:waypoint x="1610" y="480" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1618" y="443" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1rxws1j_di" bpmnElement="Flow_1rxws1j">
<di:waypoint x="1635" y="400" />
<di:waypoint x="1750" y="400" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Gateway_0sqs3j7_di" bpmnElement="Gateway_0sqs3j7" isMarkerVisible="true">
<dc:Bounds x="805" y="365" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0qh2a6b_di" bpmnElement="Activity_0qh2a6b">
<dc:Bounds x="950" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_005fqxd_di" bpmnElement="Activity_005fqxd">
<dc:Bounds x="950" y="460" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0x47yx9_di" bpmnElement="Activity_0x47yx9">
<dc:Bounds x="1390" y="360" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1apm7h8_di" bpmnElement="Gateway_1apm7h8" isMarkerVisible="true">
<dc:Bounds x="1585" y="375" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1v2mt3m_di" bpmnElement="Activity_1v2mt3m">
<dc:Bounds x="1560" y="480" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0a4kzh7_di" bpmnElement="Activity_0a4kzh7">
<dc:Bounds x="1750" y="360" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1f06uud_di" bpmnElement="Activity_1f06uud">
<dc:Bounds x="1970" y="360" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0iljjpd_di" bpmnElement="Activity_0iljjpd">
<dc:Bounds x="230" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_05ck4dv_di" bpmnElement="Activity_05ck4dv">
<dc:Bounds x="410" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Participant_11sfrgz_di" bpmnElement="Participant_11sfrgz" isHorizontal="true">
<dc:Bounds x="160" y="640" width="860" height="250" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0qbi1wr_di" bpmnElement="Activity_0qbi1wr">
<dc:Bounds x="230" y="730" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_14xojfa_di" bpmnElement="Activity_14xojfa">
<dc:Bounds x="550" y="710" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Participant_1x7nd70_di" bpmnElement="Participant_1x7nd70" isHorizontal="true">
<dc:Bounds x="160" y="930" width="1950" height="300" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0nuuhk7_di" bpmnElement="Flow_0nuuhk7">
<di:waypoint x="1180" y="1040" />
<di:waypoint x="1265" y="1040" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_197gie6_di" bpmnElement="Flow_197gie6">
<di:waypoint x="1290" y="1065" />
<di:waypoint x="1290" y="1150" />
<di:waypoint x="1400" y="1150" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1332" y="1133" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ruufha_di" bpmnElement="Flow_0ruufha">
<di:waypoint x="1315" y="1040" />
<di:waypoint x="1400" y="1040" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_19m4xhk_di" bpmnElement="Flow_19m4xhk">
<di:waypoint x="810" y="1010" />
<di:waypoint x="905" y="1010" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0b4g73l_di" bpmnElement="Flow_0b4g73l">
<di:waypoint x="930" y="1035" />
<di:waypoint x="930" y="1110" />
<bpmndi:BPMNLabel>
<dc:Bounds x="938" y="1063" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1duwugb_di" bpmnElement="Flow_1duwugb">
<di:waypoint x="930" y="985" />
<di:waypoint x="930" y="960" />
<di:waypoint x="1420" y="960" />
<di:waypoint x="1420" y="1000" />
<bpmndi:BPMNLabel>
<dc:Bounds x="961" y="942" width="18" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Activity_0feawyi_di" bpmnElement="Activity_0feawyi">
<dc:Bounds x="1080" y="1000" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0nyndyn_di" bpmnElement="Gateway_0nyndyn" isMarkerVisible="true">
<dc:Bounds x="1265" y="1015" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1v0d9zm_di" bpmnElement="Activity_1v0d9zm">
<dc:Bounds x="1400" y="1110" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_12tzfd7_di" bpmnElement="Activity_12tzfd7">
<dc:Bounds x="1750" y="1000" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1hdmlbq_di" bpmnElement="Activity_1hdmlbq">
<dc:Bounds x="1400" y="1000" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1r2yhx0_di" bpmnElement="Activity_1r2yhx0">
<dc:Bounds x="340" y="1050" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_09ae5r2_di" bpmnElement="Activity_09ae5r2">
<dc:Bounds x="710" y="970" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1o0lihs_di" bpmnElement="Gateway_1o0lihs" isMarkerVisible="true">
<dc:Bounds x="905" y="985" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0n6hvhw_di" bpmnElement="Activity_0n6hvhw">
<dc:Bounds x="880" y="1110" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Participant_06nkquo_di" bpmnElement="Participant_06nkquo" isHorizontal="true">
<dc:Bounds x="160" y="80" width="1970" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0fiiuon_di" bpmnElement="Activity_0fiiuon">
<dc:Bounds x="1750" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_01iahon_di" bpmnElement="Activity_01iahon">
<dc:Bounds x="1970" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_13xp2vr_di" bpmnElement="Activity_13xp2vr">
<dc:Bounds x="230" y="120" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_14smr2g_di" bpmnElement="Flow_14smr2g">
<di:waypoint x="280" y="200" />
<di:waypoint x="280" y="350" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1pr8430_di" bpmnElement="Flow_1pr8430">
<di:waypoint x="280" y="430" />
<di:waypoint x="280" y="730" />
<bpmndi:BPMNLabel>
<dc:Bounds x="285" y="661" width="80" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0je874m_di" bpmnElement="Flow_0je874m">
<di:waypoint x="330" y="770" />
<di:waypoint x="460" y="770" />
<di:waypoint x="460" y="430" />
<bpmndi:BPMNLabel>
<dc:Bounds x="379" y="736" width="56" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0z85582_di" bpmnElement="Flow_0z85582">
<di:waypoint x="1050" y="390" />
<di:waypoint x="1130" y="390" />
<di:waypoint x="1130" y="1000" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1040" y="726" width="81" height="40" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_02hwoew_di" bpmnElement="Flow_02hwoew">
<di:waypoint x="1450" y="1000" />
<di:waypoint x="1450" y="440" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0jg4g6h_di" bpmnElement="Flow_0jg4g6h">
<di:waypoint x="1800" y="440" />
<di:waypoint x="1800" y="1000" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1820" y="717" width="60" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ejujjc_di" bpmnElement="Flow_1ejujjc">
<di:waypoint x="1800" y="360" />
<di:waypoint x="1800" y="200" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1815" y="256" width="69" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0fihv5s_di" bpmnElement="Flow_0fihv5s">
<di:waypoint x="1850" y="1040" />
<di:waypoint x="2020" y="1040" />
<di:waypoint x="2020" y="440" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2036" y="724" width="88" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1gknjes_di" bpmnElement="Flow_1gknjes">
<di:waypoint x="2020" y="360" />
<di:waypoint x="2020" y="200" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2029" y="262" width="82" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1qv7s55_di" bpmnElement="Flow_1qv7s55">
<di:waypoint x="440" y="1090" />
<di:waypoint x="600" y="1090" />
<di:waypoint x="600" y="790" />
<bpmndi:BPMNLabel>
<dc:Bounds x="486" y="1030" width="68" height="40" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1l0z3bv_di" bpmnElement="Flow_1l0z3bv">
<di:waypoint x="650" y="750" />
<di:waypoint x="760" y="750" />
<di:waypoint x="760" y="970" />
<bpmndi:BPMNLabel>
<dc:Bounds x="777" y="800" width="87" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 817 KiB

View File

@ -1,5 +1,20 @@
version: "3.6" version: "3.6"
services: services:
tapas-db:
image: mongo
restart: unless-stopped
container_name: tapas_mongodb
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
ports:
- "27017:27017"
command: mongod --quiet --logpath /dev/null
hivemq:
image: hivemq/hivemq4
restart: unless-stopped
ports:
- "1883:1883"
tapas-tasks: tapas-tasks:
container_name: tapas-tasks container_name: tapas-tasks
build: build:
@ -9,54 +24,63 @@ services:
ports: ports:
- "8081:8081" - "8081:8081"
- "5005:5005" - "5005:5005"
depends_on:
- tapas-db
# - hivemq
volumes: volumes:
- ./tapas-tasks/src:/opt/app/src - ./tapas-tasks/src:/opt/app/src
- ./tapas-tasks/target:/opt/app/target - ./tapas-tasks/target:/opt/app/target
assignment: roster:
container_name: assignment container_name: roster
build: build:
context: "./assignment" context: "."
dockerfile: "Dockerfile" dockerfile: "./roster/Dockerfile"
target: development target: development
depends_on:
- tapas-db
# - hivemq
ports: ports:
- "8082:8082" - "8082:8082"
- "5006:5005" - "5006:5005"
volumes: volumes:
- ./assignment/src:/opt/app/src - ./roster/src:/opt/app/src
- ./assignment/target:/opt/app/target - ./roster/target:/opt/app/target
executor-pool: executor-pool:
container_name: executor-pool container_name: executor-pool
build: build:
context: "./executor-pool" context: "./executor-pool"
dockerfile: "Dockerfile" dockerfile: "Dockerfile"
target: development target: development
depends_on:
- tapas-db
# - hivemq
ports: ports:
- "8083:8083" - "8083:8083"
- "5007:5005" - "5007:5005"
volumes: volumes:
- ./executor-pool/src:/opt/app/src - ./executor-pool/src:/opt/app/src
- ./executor-pool/target:/opt/app/target - ./executor-pool/target:/opt/app/target
executor1: executor-computation:
container_name: executor1 container_name: executor-computation
build: build:
context: "./executor1" context: "."
dockerfile: "Dockerfile" dockerfile: "./executor-computation/Dockerfile"
target: development
ports:
- "8084:8084"
- "5008:5005"
volumes:
- ./executor1/src:/opt/app/src
- ./executor1/target:/opt/app/target
executor2:
container_name: executor2
build:
context: "./executor2"
dockerfile: "Dockerfile"
target: development target: development
ports: ports:
- "8085:8085" - "8085:8085"
- "5009:5005" - "5008:5005"
volumes: volumes:
- ./executor2/src:/opt/app/src - ./executor-computation/src:/opt/app/src
- ./executor2/target:/opt/app/target - ./executor-computation/target:/opt/app/target
# executor-robot:
# container_name: executor-robot
# build:
# context: "."
# dockerfile: "./executor-robot/Dockerfile"
# target: development
# ports:
# - "8084:8084"
# - "5009:5005"
# volumes:
# - ./executor-robot/src:/opt/app/src
# - ./executor-robot/target:/opt/app/target

View File

@ -9,9 +9,9 @@
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>ch.unisg</groupId> <groupId>ch.unisg</groupId>
<artifactId>executorbase</artifactId> <artifactId>executor-base</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>executorbase</name> <name>executor-base</name>
<description>Demo project for Spring Boot</description> <description>Demo project for Spring Boot</description>
<properties> <properties>
<java.version>11</java.version> <java.version>11</java.version>
@ -66,6 +66,21 @@
<artifactId>common</artifactId> <artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>chaos-monkey-spring-boot</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,40 +0,0 @@
package ch.unisg.executorbase.executor.adapter.in.web;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand;
import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase;
import ch.unisg.executorbase.executor.domain.ExecutorType;
@RestController
public class TaskAvailableController {
private final TaskAvailableUseCase taskAvailableUseCase;
public TaskAvailableController(TaskAvailableUseCase taskAvailableUseCase) {
this.taskAvailableUseCase = taskAvailableUseCase;
}
/**
* Controller for notification about new events.
* @return 200 OK
**/
@GetMapping(path = "/newtask/{taskType}", consumes = { "application/json" })
public ResponseEntity<String> retrieveTaskFromTaskList(@PathVariable("taskType") String taskType) {
if (ExecutorType.contains(taskType.toUpperCase())) {
TaskAvailableCommand command = new TaskAvailableCommand(
ExecutorType.valueOf(taskType.toUpperCase()));
taskAvailableUseCase.newTaskAvailable(command);
}
// Add the content type as a response header
HttpHeaders responseHeaders = new HttpHeaders();
return new ResponseEntity<>("OK", responseHeaders, HttpStatus.OK);
}
}

View File

@ -1,71 +0,0 @@
package ch.unisg.executorbase.executor.adapter.out.web;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.executor.application.port.out.GetAssignmentPort;
import ch.unisg.executorbase.executor.domain.ExecutorType;
import ch.unisg.executorbase.executor.domain.Task;
import org.json.JSONObject;
@Component
@Primary
public class GetAssignmentAdapter implements GetAssignmentPort {
@Value("${roster.url}")
String server;
Logger logger = Logger.getLogger(GetAssignmentAdapter.class.getName());
/**
* Requests a new task assignment
* @return the assigned task
* @see Task
**/
@Override
public Task getAssignment(ExecutorType executorType, ExecutorURI executorURI) {
String body = new JSONObject()
.put("executorType", executorType)
.put("executorURI", executorURI.getValue())
.toString();
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(server+"/task/apply"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
try {
logger.info("Sending getAssignment Request");
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
logger.log(Level.INFO, "getAssignment request result:\n {}", response.body());
if (response.body().equals("")) {
return null;
}
JSONObject responseBody = new JSONObject(response.body());
return new Task(responseBody.getString("taskID"), responseBody.getString("input"));
} catch (InterruptedException e) {
logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
Thread.currentThread().interrupt();
} catch (IOException e) {
logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
return null;
}
}

View File

@ -1,19 +0,0 @@
package ch.unisg.executorbase.executor.application.port.in;
import javax.validation.constraints.NotNull;
import ch.unisg.common.validation.SelfValidating;
import ch.unisg.executorbase.executor.domain.ExecutorType;
import lombok.Value;
@Value
public class TaskAvailableCommand extends SelfValidating<TaskAvailableCommand> {
@NotNull
private final ExecutorType taskType;
public TaskAvailableCommand(ExecutorType taskType) {
this.taskType = taskType;
this.validateSelf();
}
}

View File

@ -1,5 +0,0 @@
package ch.unisg.executorbase.executor.application.port.in;
public interface TaskAvailableUseCase {
void newTaskAvailable(TaskAvailableCommand command);
}

View File

@ -1,7 +0,0 @@
package ch.unisg.executorbase.executor.application.port.out;
import ch.unisg.executorbase.executor.domain.ExecutionFinishedEvent;
public interface ExecutionFinishedEventPort {
void publishExecutionFinishedEvent(ExecutionFinishedEvent event);
}

View File

@ -1,9 +0,0 @@
package ch.unisg.executorbase.executor.application.port.out;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.executor.domain.ExecutorType;
import ch.unisg.executorbase.executor.domain.Task;
public interface GetAssignmentPort {
Task getAssignment(ExecutorType executorType, ExecutorURI executorURI);
}

View File

@ -1,8 +0,0 @@
package ch.unisg.executorbase.executor.application.port.out;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.executor.domain.ExecutorType;
public interface NotifyExecutorPoolPort {
boolean notifyExecutorPool(ExecutorURI executorURI, ExecutorType executorType);
}

View File

@ -1,16 +0,0 @@
package ch.unisg.executorbase.executor.application.service;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.executor.application.port.out.NotifyExecutorPoolPort;
import ch.unisg.executorbase.executor.domain.ExecutorType;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class NotifyExecutorPoolService {
private final NotifyExecutorPoolPort notifyExecutorPoolPort;
public boolean notifyExecutorPool(ExecutorURI executorURI, ExecutorType executorType) {
return notifyExecutorPoolPort.notifyExecutorPool(executorURI, executorType);
}
}

View File

@ -1,20 +0,0 @@
package ch.unisg.executorbase.executor.application.service;
import org.springframework.stereotype.Component;
import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand;
import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase;
import lombok.RequiredArgsConstructor;
import javax.transaction.Transactional;
@RequiredArgsConstructor
@Component
@Transactional
public class TaskAvailableService implements TaskAvailableUseCase {
@Override
public void newTaskAvailable(TaskAvailableCommand command) {
// Placeholder so spring can create a bean, implementation of this function is inside the executors
}
}

View File

@ -1,21 +0,0 @@
package ch.unisg.executorbase.executor.domain;
import lombok.Getter;
public class ExecutionFinishedEvent {
@Getter
private String taskID;
@Getter
private String result;
@Getter
private String status;
public ExecutionFinishedEvent(String taskID, String result, String status) {
this.taskID = taskID;
this.result = result;
this.status = status;
}
}

View File

@ -1,89 +0,0 @@
package ch.unisg.executorbase.executor.domain;
import java.util.logging.Logger;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.executor.adapter.out.web.ExecutionFinishedEventAdapter;
import ch.unisg.executorbase.executor.adapter.out.web.GetAssignmentAdapter;
import ch.unisg.executorbase.executor.adapter.out.web.NotifyExecutorPoolAdapter;
import ch.unisg.executorbase.executor.application.port.out.ExecutionFinishedEventPort;
import ch.unisg.executorbase.executor.application.port.out.GetAssignmentPort;
import ch.unisg.executorbase.executor.application.port.out.NotifyExecutorPoolPort;
import ch.unisg.executorbase.executor.application.service.NotifyExecutorPoolService;
import lombok.Getter;
public abstract class ExecutorBase {
@Getter
private ExecutorURI executorURI;
@Getter
private ExecutorType executorType;
@Getter
private ExecutorStatus status;
// TODO Violation of the Dependency Inversion Principle?, but we havn't really got a better solutions to send a http request / access a service from a domain model
// TODO I guess we can implement the execution as a service but there still is the problem with the startup request.
// TODO I guess we can somehow autowire this but I don't know why it's not working :D
private final NotifyExecutorPoolPort notifyExecutorPoolPort = new NotifyExecutorPoolAdapter();
private final NotifyExecutorPoolService notifyExecutorPoolService = new NotifyExecutorPoolService(notifyExecutorPoolPort);
private final GetAssignmentPort getAssignmentPort = new GetAssignmentAdapter();
private final ExecutionFinishedEventPort executionFinishedEventPort = new ExecutionFinishedEventAdapter();
Logger logger = Logger.getLogger(ExecutorBase.class.getName());
protected ExecutorBase(ExecutorType executorType) {
logger.info("Starting Executor");
this.status = ExecutorStatus.STARTING_UP;
this.executorType = executorType;
// TODO set this automaticly
this.executorURI = new ExecutorURI("localhost:8084");
// Notify executor-pool about existence. If executor-pools response is successfull start with getting an assignment, else shut down executor.
if(!notifyExecutorPoolService.notifyExecutorPool(this.executorURI, this.executorType)) {
System.exit(0);
} else {
this.status = ExecutorStatus.IDLING;
getAssignment();
}
}
/**
* Requests a new task from the task queue
* @return void
**/
public void getAssignment() {
Task newTask = getAssignmentPort.getAssignment(this.getExecutorType(), this.getExecutorURI());
if (newTask != null) {
this.executeTask(newTask);
} else {
this.status = ExecutorStatus.IDLING;
}
}
/**
* Start the execution of a task
* @return void
**/
private void executeTask(Task task) {
logger.info("Starting execution");
this.status = ExecutorStatus.EXECUTING;
task.setResult(execution(task.getInput()));
// TODO implement logic if execution was not successful
executionFinishedEventPort.publishExecutionFinishedEvent(
new ExecutionFinishedEvent(task.getTaskID(), task.getResult(), "SUCCESS"));
logger.info("Finish execution");
getAssignment();
}
/**
* Implementation of the actual execution method of an executor
* @return the execution result
**/
protected abstract String execution(String... input);
}

View File

@ -1,22 +0,0 @@
package ch.unisg.executorbase.executor.domain;
public enum ExecutorType {
ADDITION, ROBOT;
/**
* Checks if the give executor type exists.
* @return Wheter the given executor type exists
**/
public static boolean contains(String test) {
for (ExecutorType x : ExecutorType.values()) {
if (x.name().equals(test)) {
return true;
}
}
return false;
}
}

View File

@ -1,23 +0,0 @@
package ch.unisg.executorbase.executor.domain;
import lombok.Getter;
import lombok.Setter;
public class Task {
@Getter
private String taskID;
@Getter
@Setter
private String result;
@Getter
private String[] input;
public Task(String taskID, String... input) {
this.taskID = taskID;
this.input = input;
}
}

View File

@ -0,0 +1,66 @@
package ch.unisg.executorbase;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.services.GetAssignmentService;
import ch.unisg.executorbase.services.NotifyExecutorPoolService;
import lombok.Getter;
@Component
public class Executor {
@Getter
ExecutorStatus executorStatus = ExecutorStatus.STARTING_UP;
@Getter
@Value("${executor.type}")
String executorType;
@Getter
@Value("${executor.uri}")
ExecutorURI executorUri;
@Autowired
NotifyExecutorPoolService notifyExecutorPoolService;
@Autowired
GetAssignmentService getAssignmentService;
private Logger logger = Logger.getLogger(Executor.class.getName());
public Executor() {
executorStatus = ExecutorStatus.IDLING;
}
public void init() {
if(!notifyExecutorPoolService.executorStarted(this.executorUri, this.executorType)) {
logger.log(Level.WARNING, "ExecutorBase | Executor could not connect to executor pool! Shuting down!");
System.exit(0);
} else {
logger.info("ExecutorBase | Executor conntected to executor pool");
this.setIdling();
getAssignmentService.getAssignment();
}
}
// @PreDestroy
// public void preDestroy() {
// System.out.println("TEST");
// notifyExecutorPoolService.executorStopped(this.executorUri);
// }
public void setIdling() {
this.executorStatus = ExecutorStatus.IDLING;
}
public void setExecuting() {
this.executorStatus = ExecutorStatus.EXECUTING;
}
}

View File

@ -0,0 +1,22 @@
package ch.unisg.executorbase;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Autowired;
import ch.unisg.executorbase.services.NotifyExecutorPoolService;
public class ExecutorBase {
@Autowired
Executor executor;
@Autowired
NotifyExecutorPoolService notifyExecutorPoolService;
@PostConstruct
private void initialiseRoster(){
executor.init();
}
}

View File

@ -1,4 +1,4 @@
package ch.unisg.executorbase.executor.domain; package ch.unisg.executorbase;
public enum ExecutorStatus { public enum ExecutorStatus {
STARTING_UP, // Executor is starting STARTING_UP, // Executor is starting

View File

@ -0,0 +1,30 @@
package ch.unisg.executorbase;
import lombok.Getter;
import lombok.Setter;
public class Task {
@Getter
private final String taskID;
@Getter
@Setter
private String outputData;
// TODO maybe create a value object for inputData so we can make sure it is in the right
// format.
@Getter
private final String inputData;
public Task(String taskID, String inputData) {
this.taskID = taskID;
this.inputData = inputData;
}
public Task(String taskID) {
this.taskID = taskID;
this.inputData = "";
}
}

View File

@ -0,0 +1,40 @@
package ch.unisg.executorbase.controller;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import ch.unisg.executorbase.services.TaskAvailableService;
@RestController
public class TaskAvailableController {
@Autowired
private TaskAvailableService taskAvailableService;
Logger logger = Logger.getLogger(TaskAvailableController.class.getName());
/**
* Controller for notification about new events.
* @return 200 OK
**/
@GetMapping(path = "/newtask/{taskType}")
public ResponseEntity<String> retrieveTaskFromTaskList(@PathVariable("taskType") String taskType) {
logger.info("ExecutorBase | New " + taskType + " task available");
CompletableFuture.runAsync(() -> taskAvailableService.newTaskAvailable(taskType.toUpperCase()));
// Add the content type as a response header
HttpHeaders responseHeaders = new HttpHeaders();
return new ResponseEntity<>("OK", responseHeaders, HttpStatus.OK);
}
}

View File

@ -0,0 +1,42 @@
package ch.unisg.executorbase.services;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import ch.unisg.executorbase.Executor;
import ch.unisg.executorbase.Task;
public abstract class ExecuteTaskServiceBase implements ExecuteTaskServiceInterface {
private final Logger logger = Logger.getLogger(ExecuteTaskServiceBase.class.getName());
@Autowired
private Executor executor;
@Autowired
private GetAssignmentService getAssignmentService;
@Autowired
private ExecutionFinishedService executionFinishedService;
/**
* Start the execution of a task
* @return void
**/
public void executeTask(Task task) {
logger.info("ExecutorBase | Starting execution");
executor.setExecuting();
task.setOutputData(execution(task.getInputData()));
// TODO implement logic if execution was not successful
executionFinishedService.publishExecutionFinishedEvent(task.getTaskID(), task.getOutputData(), "SUCCESS");
logger.info("ExecutorBase | Finish execution");
getAssignmentService.getAssignment();
}
}

View File

@ -0,0 +1,13 @@
package ch.unisg.executorbase.services;
import ch.unisg.executorbase.Task;
public interface ExecuteTaskServiceInterface {
void executeTask(Task task);
/**
* Implementation of the actual execution method of an executor
* @return the execution result
**/
String execution(String input);
}

View File

@ -1,4 +1,4 @@
package ch.unisg.executorbase.executor.adapter.out.web; package ch.unisg.executorbase.services;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
@ -10,37 +10,38 @@ import java.util.logging.Logger;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import ch.unisg.executorbase.executor.application.port.out.ExecutionFinishedEventPort; @Component
import ch.unisg.executorbase.executor.domain.ExecutionFinishedEvent; public class ExecutionFinishedService {
public class ExecutionFinishedEventAdapter implements ExecutionFinishedEventPort { @Value("${roster.uri}")
private String rosterUri;
@Value("${roster.url}") private final Logger logger = Logger.getLogger(ExecutionFinishedService.class.getName());
String server;
Logger logger = Logger.getLogger(ExecutionFinishedEventAdapter.class.getName());
/** /**
* Publishes the execution finished event * Publishes the execution finished event
* @return void * @return void
**/ **/
@Override public void publishExecutionFinishedEvent(String taskID, String outputData, String status) {
public void publishExecutionFinishedEvent(ExecutionFinishedEvent event) {
logger.log(Level.INFO, "ExecutorBase | Sending finish execution event....");
String body = new JSONObject() String body = new JSONObject()
.put("taskID", event.getTaskID()) .put("taskID", taskID)
.put("result", event.getResult()) .put("outputData", outputData)
.put("status", event.getStatus()) .put("status", status)
.toString(); .toString();
HttpClient client = HttpClient.newHttpClient(); HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(server+"/task/completed")) .uri(URI.create(rosterUri+"/task/completed"))
.header("Content-Type", "application/json") .header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)) .POST(HttpRequest.BodyPublishers.ofString(body))
.build(); .build();
try { try {
client.send(request, HttpResponse.BodyHandlers.ofString()); client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -50,8 +51,7 @@ public class ExecutionFinishedEventAdapter implements ExecutionFinishedEventPort
logger.log(Level.SEVERE, e.getLocalizedMessage(), e); logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
} }
logger.log(Level.INFO, "Finish execution event sent with result: {}", event.getResult()); logger.log(Level.INFO, "ExecutorBase | Finish execution event sent with result: {0}", outputData);
} }
} }

View File

@ -0,0 +1,90 @@
package ch.unisg.executorbase.services;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import ch.unisg.executorbase.Executor;
import ch.unisg.executorbase.Task;
@Component
@Primary
public class GetAssignmentService {
@Value("${roster.uri}")
String rosterUri;
Logger logger = Logger.getLogger(GetAssignmentService.class.getName());
@Autowired
private Executor executor;
@Autowired
private ExecuteTaskServiceInterface executeTaskService;
public void getAssignment() {
Task newTask = requestAssignment();
if (newTask != null) {
logger.info("ExecutorBase | Executor got a new task");
executeTaskService.executeTask(newTask);
} else {
logger.info("ExecutorBase | Executor got no new task");
executor.setIdling();
}
}
/**
* Requests a new task assignment
* @return the assigned task
* @see Task
**/
private Task requestAssignment() {
String body = new JSONObject()
.put("executorType", executor.getExecutorType())
.put("executorURI", executor.getExecutorUri().getValue())
.toString();
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(rosterUri + "/task/apply"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
try {
logger.info("ExecutorBase | Sending getAssignment request");
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != HttpStatus.OK.value()) {
logger.info("ExecutorBase | No task assigned");
return null;
}
logger.info("ExecutorBase | Task assigned");
JSONObject responseBody = new JSONObject(response.body());
if (!responseBody.get("inputData").equals(null)) {
return new Task(responseBody.getString("taskID"), responseBody.getString("inputData"));
}
return new Task(responseBody.getString("taskID"));
} catch (InterruptedException e) {
logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
Thread.currentThread().interrupt();
} catch (IOException e) {
logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
return null;
}
}

View File

@ -1,4 +1,4 @@
package ch.unisg.executorbase.executor.adapter.out.web; package ch.unisg.executorbase.services;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
@ -15,33 +15,30 @@ import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ch.unisg.common.valueobject.ExecutorURI; import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.executorbase.executor.application.port.out.NotifyExecutorPoolPort;
import ch.unisg.executorbase.executor.domain.ExecutorType;
@Component @Component
@Primary @Primary
public class NotifyExecutorPoolAdapter implements NotifyExecutorPoolPort { public class NotifyExecutorPoolService {
@Value("${executor-pool.url}") @Value("${executor.pool.uri}")
String server; String executorPoolUri;
Logger logger = Logger.getLogger(NotifyExecutorPoolAdapter.class.getName()); Logger logger = Logger.getLogger(NotifyExecutorPoolService.class.getName());
/** /**
* Notifies the executor-pool about the startup of this executor * Notifies the executor-pool about the startup of this executor
* @return if the notification was successful * @return if the notification was successful
**/ **/
@Override public boolean executorStarted(ExecutorURI executorURI, String executorType) {
public boolean notifyExecutorPool(ExecutorURI executorURI, ExecutorType executorType) {
String body = new JSONObject() String body = new JSONObject()
.put("executorTaskType", executorType) .put("executorTaskType", executorType)
.put("executorURI", executorURI.getValue()) .put("executorUri", executorURI.getValue())
.toString(); .toString();
HttpClient client = HttpClient.newHttpClient(); HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(server+"/executor-pool/AddExecutor")) .uri(URI.create(executorPoolUri + "/executor-pool/executors"))
.header("Content-Type", "application/json") .header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)) .POST(HttpRequest.BodyPublishers.ofString(body))
.build(); .build();
@ -59,6 +56,28 @@ public class NotifyExecutorPoolAdapter implements NotifyExecutorPoolPort {
} }
return false; return false;
} }
/**
* Notifies the executor-pool about the shutdown of this executor
**/
public static void executorStopped(String executorURI) {
System.out.println("TEST");
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8083" + "/executor-pool/executors/" + executorURI))
// .uri(URI.create(executorPoolUri + "/executor-pool/executors/" + executorURI))
.header("Content-Type", "application/json")
.DELETE()
.build();
try {
client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (InterruptedException e) {
// logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
// Thread.currentThread().interrupt();
} catch (IOException e) {
// logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
} }

Some files were not shown because too many files have changed in this diff Show More