diff --git a/docs/devguide/docs/configuration.md b/docs/devguide/docs/configuration.md
index 944f8f789..c812d0c2d 100644
--- a/docs/devguide/docs/configuration.md
+++ b/docs/devguide/docs/configuration.md
@@ -9,7 +9,7 @@ Below are variables Predator can be configured with.
| Environment Variable | Configuration key | Description | Configurable from UI/API | Default value |
|-----------------------------|----------------------- |----------------------------------------------------------------------------------------- |-------------------------- |----------------------------- |
| INTERNAL_ADDRESS | internal_address | The local ip address of your machine | ✓ | |
-| DOCKER_NAME | docker_name | The predator-runner docker image that will run the test | ✓ | zooz/predator-runner:latest |
+| RUNNER_DOCKER_IMAGE | runner_docker_image | The predator-runner docker image that will run the test | ✓ | zooz/predator-runner:latest |
| RUNNER_CPU | runner_cpu | Number of CPU use by the each runner | ✓ | 1 |
| RUNNER_MEMORY | runner_memory | Max memory to use by each runner | ✓ | 2048 |
| DEFAULT_EMAIL_ADDRESS | default_email_address | Default email to send final report to, address can be configured | ✓ | |
diff --git a/docs/devguide/docs/swagger-docs.yaml b/docs/devguide/docs/swagger-docs.yaml
index 33414a844..b3d09a52a 100644
--- a/docs/devguide/docs/swagger-docs.yaml
+++ b/docs/devguide/docs/swagger-docs.yaml
@@ -19,39 +19,39 @@ info:
For an introduction to Predator and its concepts, see the Predator Documentation.
tags:
- - name: DSL Definitions
- description: |
- Predator's Domain Specific Language (DSL) allows you to generate request templates, which you can then reuse in the same test and in other tests, reducing replication.
- - name: Tests
- description: |
- Tests include end-to-end scenarios that are executed at pre-configured intervals to provide in-depth performance metrics of your API.
- - name: Jobs
- description: |
- Predator executes tests through so-called **jobs**. Depending on your configuration, the job will either execute immediately or at scheduled intervals.
- - name: Reports
- description: |
- Reports give you insight into the performance of your API. Predator generates a report for each test that is executed.
- - name: Configuration
- description: |
- This resource allows you to configure Predator programmatically.
+- name: DSL Definitions
+ description: |
+ Predator's Domain Specific Language (DSL) allows you to generate request templates, which you can then reuse in the same test and in other tests, reducing replication.
+- name: Tests
+ description: |
+ Tests include end-to-end scenarios that are executed at pre-configured intervals to provide in-depth performance metrics of your API.
+- name: Jobs
+ description: |
+ Predator executes tests through so-called **jobs**. Depending on your configuration, the job will either execute immediately or at scheduled intervals.
+- name: Reports
+ description: |
+ Reports give you insight into the performance of your API. Predator generates a report for each test that is executed.
+- name: Configuration
+ description: |
+ This resource allows you to configure Predator programmatically.
x-tagGroups:
- - name: Reference
- tags:
- - DSL Definitions
- - Tests
- - Jobs
- - Reports
- - Configuration
+- name: Reference
+ tags:
+ - DSL Definitions
+ - Tests
+ - Jobs
+ - Reports
+ - Configuration
paths:
#DSL Definitions
'/v1/dsl/{dsl_name}/definitions':
parameters:
- - $ref: '#/components/parameters/dsl_name'
+ - $ref: '#/components/parameters/dsl_name'
post:
operationId: create-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Create a DSL Definition
description: Create a new DSL definition to generate a request template.
responses:
@@ -89,7 +89,7 @@ paths:
get:
operationId: retrieve-all-dsl-definitions
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Retrieve all DSL Definitions
description: Retrieve all DSL definitions for the specified DSL group name.
responses:
@@ -119,12 +119,12 @@ paths:
$ref: '#/components/schemas/error_response'
'/v1/dsl/{dsl_name}/definitions/{definition_name}':
parameters:
- - $ref: '#/components/parameters/dsl_name'
- - $ref: '#/components/parameters/definition_name'
+ - $ref: '#/components/parameters/dsl_name'
+ - $ref: '#/components/parameters/definition_name'
get:
operationId: retrieve-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Retrieve a DSL Definition
description: Retrieve a specific DSL definition.
responses:
@@ -155,7 +155,7 @@ paths:
put:
operationId: update-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Update a DSL Definition
description: Update a specific DSL definition.
responses:
@@ -193,7 +193,7 @@ paths:
delete:
operationId: Delete-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Delete a DSL Definition
description: Delete a specific DSL definition.
responses:
@@ -216,7 +216,7 @@ paths:
post:
operationId: create-a-test
tags:
- - Tests
+ - Tests
summary: Create a Test
description: Create a new test.
responses:
@@ -254,7 +254,7 @@ paths:
get:
operationId: retrieve-all-tests
tags:
- - Tests
+ - Tests
summary: Retrieve all Tests
description: Retrieve all available tests.
responses:
@@ -282,18 +282,18 @@ paths:
get:
operationId: retrieve-a-test
tags:
- - Tests
+ - Tests
summary: Retrieve a Test
description: Retrieve a specific test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- format: uuid
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -322,17 +322,17 @@ paths:
put:
operationId: update-a-test
tags:
- - Tests
+ - Tests
summary: Update a Test
description: Update a specific test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -368,17 +368,17 @@ paths:
delete:
operationId: delete-a-test
tags:
- - Tests
+ - Tests
summary: Delete a Test
description: Delete a specific test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -398,18 +398,18 @@ paths:
get:
operationId: retrieve-all-test-revisions
tags:
- - Tests
+ - Tests
summary: Retrieve Test Revisions
description: Retrieve the revisions of the specified test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- format: uuid
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -442,7 +442,7 @@ paths:
post:
operationId: create-a-job
tags:
- - Jobs
+ - Jobs
summary: Create a Job
description: Create a new job that will trigger a test run.
responses:
@@ -480,15 +480,15 @@ paths:
get:
operationId: retrieve-all-jobs
tags:
- - Jobs
+ - Jobs
summary: Retrieve all Jobs
description: Retrieve the details of all available jobs.
parameters:
- - in: query
- name: one_time
- description: Should return the one time tests (no cron expression)
- schema:
- type: boolean
+ - in: query
+ name: one_time
+ description: Should return the one time tests (no cron expression)
+ schema:
+ type: boolean
responses:
'200':
description: Success
@@ -515,16 +515,16 @@ paths:
get:
operationId: retrieve-a-job
tags:
- - Jobs
+ - Jobs
summary: Retrieve a Job
description: Retrieve a specific job.
parameters:
- - in: path
- name: job_id
- description: The id of the job to retrieve.
- required: true
- schema:
- type: string
+ - in: path
+ name: job_id
+ description: The id of the job to retrieve.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -553,16 +553,16 @@ paths:
put:
operationId: update-a-job
tags:
- - Jobs
+ - Jobs
summary: Update a Job
description: Update a specific job.
parameters:
- - in: path
- name: job_id
- description: The id of the job to update.
- required: true
- schema:
- type: string
+ - in: path
+ name: job_id
+ description: The id of the job to update.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -598,15 +598,15 @@ paths:
delete:
operationId: delete-a-job
tags:
- - Jobs
+ - Jobs
summary: Delete a Job
description: Delete a specific job.
parameters:
- - in: path
- name: job_id
- required: true
- schema:
- type: string
+ - in: path
+ name: job_id
+ required: true
+ schema:
+ type: string
responses:
'204':
description: Success
@@ -626,22 +626,22 @@ paths:
post:
operationId: terminate-a-job
tags:
- - Jobs
+ - Jobs
summary: Terminate a Job
description: Terminate the execution of a running job.
parameters:
- - in: path
- description: The ID of the job.
- name: job_id
- required: true
- schema:
- type: string
- - in: path
- description: The id of a specific run in metronome which is also the report id.
- name: run_id
- required: true
- schema:
- type: string
+ - in: path
+ description: The ID of the job.
+ name: job_id
+ required: true
+ schema:
+ type: string
+ - in: path
+ description: The id of a specific run in metronome which is also the report id.
+ name: run_id
+ required: true
+ schema:
+ type: string
responses:
'204':
description: Success
@@ -660,21 +660,21 @@ paths:
/v1/jobs/{job_id}/runs/{run_id}/logs:
get:
tags:
- - jobs
+ - jobs
description: get logs of specific job.
parameters:
- - in: path
- description: The ID of the job.
- name: job_id
- required: true
- schema:
- type: string
- - in: path
- description: The id of a specific run in metronome which is also the report id.
- name: run_id
- required: true
- schema:
- type: string
+ - in: path
+ description: The ID of the job.
+ name: job_id
+ required: true
+ schema:
+ type: string
+ - in: path
+ description: The id of a specific run in metronome which is also the report id.
+ name: run_id
+ required: true
+ schema:
+ type: string
responses:
"200":
description: Success
@@ -701,16 +701,16 @@ paths:
get:
operationId: retrieve-all-reports
tags:
- - Reports
+ - Reports
summary: Retrieve all Reports
description: Retrieve all reports for the specified test.
parameters:
- - in: path
- name: test_id
- description: The id of the test for which to retrieve the reports.
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ description: The id of the test for which to retrieve the reports.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -735,15 +735,15 @@ paths:
post:
operationId: create-a-report
tags:
- - Reports
+ - Reports
summary: Create a Report
description: Create a new report for the specified test.
parameters:
- - in: path
- name: test_id
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ required: true
+ schema:
+ type: string
responses:
'201':
description: Success
@@ -776,23 +776,23 @@ paths:
get:
operationId: retrieve-a-report
tags:
- - Reports
+ - Reports
summary: Retrieve a Report
description: Retrieve a specific report for the specified test.
parameters:
- - in: path
- name: test_id
- required: true
- description: The id of the test for which to retrieve the report.
- schema:
- type: string
- example: 81a27853-0db5-4e57-ad63-4b637528398a
- - in: path
- name: report_id
- description: The id of the report to retrieve.
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ required: true
+ description: The id of the test for which to retrieve the report.
+ schema:
+ type: string
+ example: 81a27853-0db5-4e57-ad63-4b637528398a
+ - in: path
+ name: report_id
+ description: The id of the report to retrieve.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -822,17 +822,17 @@ paths:
get:
operationId: retrieve-recent-reports
tags:
- - Reports
+ - Reports
summary: Retrieve Recent Reports
description: Retrieve the most recent reports.
parameters:
- - in: query
- name: limit
- description: The number of most recent reports to retrieve.
- required: true
- minimum: 1
- maximum: 250
- type: integer
+ - in: query
+ name: limit
+ description: The number of most recent reports to retrieve.
+ required: true
+ minimum: 1
+ maximum: 250
+ type: integer
responses:
'200':
description: Success
@@ -857,20 +857,20 @@ paths:
'/v1/tests/{test_id}/reports/{report_id}/stats':
post:
tags:
- - Reports
+ - Reports
summary: Insert a Stats Object
description: Insert a new stats object for a specific report
parameters:
- - in: path
- name: test_id
- required: true
- schema:
- type: string
- - in: path
- name: report_id
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ required: true
+ schema:
+ type: string
+ - in: path
+ name: report_id
+ required: true
+ schema:
+ type: string
responses:
'204':
description: Success
@@ -904,7 +904,7 @@ paths:
get:
operationId: retrieve-configurations
tags:
- - Configuration
+ - Configuration
summary: Retrieve Configuration Settings
description: Retrieve all Predator configuration settings.
responses:
@@ -919,7 +919,7 @@ paths:
put:
operationId: update-configurations
tags:
- - Configuration
+ - Configuration
summary: Update Configuration Settings
description: Update existing configuration settings. This will override environment variables.
requestBody:
@@ -946,18 +946,18 @@ paths:
delete:
operationId: delete-a-configuration
tags:
- - Configuration
+ - Configuration
summary: Delete a Specific Configuration Value
description: |
Delete a specific configuration value. This will restore the original
environment variable.
parameters:
- - in: path
- name: config_key
- required: true
- description: They key to delete.
- schema:
- type: string
+ - in: path
+ name: config_key
+ required: true
+ description: They key to delete.
+ schema:
+ type: string
responses:
"204":
description: Success
@@ -990,8 +990,8 @@ components:
definition:
type: object
required:
- - name
- - request
+ - name
+ - request
properties:
name:
description: The name of the DSL definition.
@@ -1025,7 +1025,7 @@ components:
}
update_definition:
required:
- - request
+ - request
properties:
request:
type: object
@@ -1041,12 +1041,12 @@ components:
discriminator:
propertyName: type
oneOf:
- - $ref: '#/components/schemas/basic'
- - $ref: '#/components/schemas/dsl'
+ - $ref: '#/components/schemas/basic'
+ - $ref: '#/components/schemas/dsl'
required:
- - name
- - description
- - type
+ - name
+ - description
+ - type
properties:
name:
type: string
@@ -1072,7 +1072,7 @@ components:
dsl:
description: A test that is made of scenarios base on domain specific language
required:
- - scenarios
+ - scenarios
properties:
scenarios:
description: A scenario is a sequence of HTTP requests aimed to test the performance of specific functionality.
@@ -1112,13 +1112,13 @@ components:
basic:
description: A test that is made of artillery json
required:
- - artillery_test
+ - artillery_test
properties:
artillery_test:
type: object
test_id:
required:
- - id
+ - id
properties:
id:
type: string
@@ -1126,9 +1126,9 @@ components:
description: The id of the test.
create_test_response:
allOf:
- - $ref: '#/components/schemas/test_id'
+ - $ref: '#/components/schemas/test_id'
required:
- - revision_id
+ - revision_id
properties:
revision_id:
type: string
@@ -1145,10 +1145,10 @@ components:
dsl: '#/components/schemas/dsl_test_response'
basic: '#/components/schemas/basic_test_response'
required:
- - type
- - name
- - description
- - updated_at
+ - type
+ - name
+ - description
+ - updated_at
properties:
type:
$ref: '#/components/schemas/test_type'
@@ -1166,9 +1166,9 @@ components:
type: object
description: A test that is made of scenarios base on domain specific language
allOf:
- - $ref: '#/components/schemas/create_test_response'
- required:
- - raw_data
+ - $ref: '#/components/schemas/create_test_response'
+ required:
+ - raw_data
properties:
raw_data:
type: object
@@ -1265,10 +1265,10 @@ components:
type: object
description: bla
allOf:
- - $ref: '#/components/schemas/create_test_response'
- - type: object
- required:
- - artillery_test
+ - $ref: '#/components/schemas/create_test_response'
+ - type: object
+ required:
+ - artillery_test
properties:
artillery_test:
type: object
@@ -1296,14 +1296,14 @@ components:
}
error_response:
required:
- - message
+ - message
properties:
message:
type: string
scenario:
required:
- - scenario_name
- - steps
+ - scenario_name
+ - steps
properties:
scenario_name:
type: string
@@ -1315,7 +1315,7 @@ components:
items:
type: object
required:
- - action
+ - action
properties:
action:
type: string
@@ -1348,12 +1348,12 @@ components:
example: 20
job:
required:
- - test_id
- - arrival_rate
- - duration
+ - test_id
+ - arrival_rate
+ - duration
allOf:
- - $ref: '#/components/schemas/job_update'
- - type: object
+ - $ref: '#/components/schemas/job_update'
+ - type: object
properties:
run_immediately:
type: boolean
@@ -1416,32 +1416,40 @@ components:
type: string
description: Free text describing the environment against which the test is executed.
example: test
+ proxy_url:
+ type: string
+ description: URL of the proxy server that predator runners will use
+ example: test
+ debug:
+ type: string
+ description: set to * in order to print all requests and responeses of the runner
+ example: test
job_response:
allOf:
- - $ref: '#/components/schemas/job'
- - properties:
- id:
- type: string
- pattern: >-
- ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
- description: The job id.
+ - $ref: '#/components/schemas/job'
+ - properties:
+ id:
+ type: string
+ pattern: >-
+ ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
+ description: The job id.
create_job_response:
allOf:
- - $ref: '#/components/schemas/job_response'
- - properties:
- run_id:
- type: string
- description: The run id. Only shown if the job is ran immediately.
+ - $ref: '#/components/schemas/job_response'
+ - properties:
+ run_id:
+ type: string
+ description: The run id. Only shown if the job is ran immediately.
post_report:
required:
- - report_id
- - job_id
- - revision_id
- - test_type
- - test_name
- - test_description
- - start_time
- - runner_id
+ - report_id
+ - job_id
+ - revision_id
+ - test_type
+ - test_name
+ - test_description
+ - start_time
+ - runner_id
properties:
report_id:
type: string
@@ -1475,16 +1483,16 @@ components:
description: the id of the runner that created the report
post_report_response:
required:
- - report_id
+ - report_id
properties:
report_id:
type: string
description: The id of the report/same as run_id
stats:
required:
- - stats_time
- - phase_status
- - data
+ - stats_time
+ - phase_status
+ - data
properties:
stats_time:
type: string
@@ -1503,16 +1511,16 @@ components:
description: Error thrown while running test
report_response:
required:
- - test_id
- - revision_id
- - report_id
- - job_id
- - test_type
- - status
- - start_time
- - end_time
- - duration_seconds
- - arrival_rate
+ - test_id
+ - revision_id
+ - report_id
+ - job_id
+ - test_type
+ - status
+ - start_time
+ - end_time
+ - duration_seconds
+ - arrival_rate
properties:
test_id:
type: string
@@ -1561,29 +1569,32 @@ components:
internal_address:
type: string
description: The local ip address of your machine.
- docker_name:
+ runner_docker_image:
type: string
description: The predator-runner docker image that will run the test.
job_platform:
type: string
description: Type of platform using to run predator (METRONOME,KUBERNETES,DOCKER)
runner_cpu:
+ minimum: 0
type: number
description: Number of CPU use by the each runner.
runner_memory:
type: number
+ minimum: 128
description: Max memory to use by each runner.
metrics_plugin_name:
type: string
enum:
- - influx
- - prometheus
+ - influx
+ - prometheus
description: Metrics to use, in case one or both metrics are configured.
default_email_address:
type: string
description: Default email to send final report to, address can be configured
only by using API.
minimum_wait_for_delayed_report_status_update_in_ms:
+ minimum: 0
type: number
description: The minimum of time waiting for runner to report before the test considered as finished.
configured only by using API.
@@ -1591,15 +1602,21 @@ components:
type: string
description: Default webhook url to send live report statistics to, can be
configured only by using API.
+ delay_runner_ms:
+ type: number
+ minimum: 0
+ description: Delay before the runners will start the test,
+ useful for enviroments like kubernetes with sidecars that should be
+ initialized before the runner starts
influx_metrics:
additionalProperties: false
type: object
description: Influx configuration .
required:
- - host
- - username
- - password
- - database
+ - host
+ - username
+ - password
+ - database
properties:
host:
type: string
@@ -1618,7 +1635,7 @@ components:
type: object
description: prometheus configuration.
required:
- - push_gateway_url
+ - push_gateway_url
properties:
push_gateway_url:
type: string
@@ -1631,12 +1648,12 @@ components:
type: object
description: Simple mail transfer protocol.
required:
- - from
- - host
- - port
- - username
- - password
- - timeout
+ - from
+ - host
+ - port
+ - username
+ - password
+ - timeout
properties:
from:
type: string
diff --git a/docs/devguide/mkdocs-windmill/mkdocs_windmill/img/mickeythepredator-logo.png b/docs/devguide/mkdocs-windmill/mkdocs_windmill/img/mickeythepredator-logo.png
new file mode 100644
index 000000000..2f64e6b7d
Binary files /dev/null and b/docs/devguide/mkdocs-windmill/mkdocs_windmill/img/mickeythepredator-logo.png differ
diff --git a/docs/devguide/mkdocs-windmill/mkdocs_windmill/img/predator-screens.gif b/docs/devguide/mkdocs-windmill/mkdocs_windmill/img/predator-screens.gif
new file mode 100644
index 000000000..94eb2ff7d
Binary files /dev/null and b/docs/devguide/mkdocs-windmill/mkdocs_windmill/img/predator-screens.gif differ
diff --git a/docs/devguide/mkdocs.yml b/docs/devguide/mkdocs.yml
index b873ad200..caf840e2c 100644
--- a/docs/devguide/mkdocs.yml
+++ b/docs/devguide/mkdocs.yml
@@ -30,4 +30,3 @@ markdown_extensions:
extra:
version: 1.0
logo: logo.png
-
diff --git a/docs/devguide/site/img/predator-overview.png b/docs/devguide/site/img/predator-overview.png
deleted file mode 100644
index 130dc6b3d..000000000
Binary files a/docs/devguide/site/img/predator-overview.png and /dev/null differ
diff --git a/docs/openapi3.yaml b/docs/openapi3.yaml
index 33414a844..b3d09a52a 100644
--- a/docs/openapi3.yaml
+++ b/docs/openapi3.yaml
@@ -19,39 +19,39 @@ info:
For an introduction to Predator and its concepts, see the Predator Documentation.
tags:
- - name: DSL Definitions
- description: |
- Predator's Domain Specific Language (DSL) allows you to generate request templates, which you can then reuse in the same test and in other tests, reducing replication.
- - name: Tests
- description: |
- Tests include end-to-end scenarios that are executed at pre-configured intervals to provide in-depth performance metrics of your API.
- - name: Jobs
- description: |
- Predator executes tests through so-called **jobs**. Depending on your configuration, the job will either execute immediately or at scheduled intervals.
- - name: Reports
- description: |
- Reports give you insight into the performance of your API. Predator generates a report for each test that is executed.
- - name: Configuration
- description: |
- This resource allows you to configure Predator programmatically.
+- name: DSL Definitions
+ description: |
+ Predator's Domain Specific Language (DSL) allows you to generate request templates, which you can then reuse in the same test and in other tests, reducing replication.
+- name: Tests
+ description: |
+ Tests include end-to-end scenarios that are executed at pre-configured intervals to provide in-depth performance metrics of your API.
+- name: Jobs
+ description: |
+ Predator executes tests through so-called **jobs**. Depending on your configuration, the job will either execute immediately or at scheduled intervals.
+- name: Reports
+ description: |
+ Reports give you insight into the performance of your API. Predator generates a report for each test that is executed.
+- name: Configuration
+ description: |
+ This resource allows you to configure Predator programmatically.
x-tagGroups:
- - name: Reference
- tags:
- - DSL Definitions
- - Tests
- - Jobs
- - Reports
- - Configuration
+- name: Reference
+ tags:
+ - DSL Definitions
+ - Tests
+ - Jobs
+ - Reports
+ - Configuration
paths:
#DSL Definitions
'/v1/dsl/{dsl_name}/definitions':
parameters:
- - $ref: '#/components/parameters/dsl_name'
+ - $ref: '#/components/parameters/dsl_name'
post:
operationId: create-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Create a DSL Definition
description: Create a new DSL definition to generate a request template.
responses:
@@ -89,7 +89,7 @@ paths:
get:
operationId: retrieve-all-dsl-definitions
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Retrieve all DSL Definitions
description: Retrieve all DSL definitions for the specified DSL group name.
responses:
@@ -119,12 +119,12 @@ paths:
$ref: '#/components/schemas/error_response'
'/v1/dsl/{dsl_name}/definitions/{definition_name}':
parameters:
- - $ref: '#/components/parameters/dsl_name'
- - $ref: '#/components/parameters/definition_name'
+ - $ref: '#/components/parameters/dsl_name'
+ - $ref: '#/components/parameters/definition_name'
get:
operationId: retrieve-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Retrieve a DSL Definition
description: Retrieve a specific DSL definition.
responses:
@@ -155,7 +155,7 @@ paths:
put:
operationId: update-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Update a DSL Definition
description: Update a specific DSL definition.
responses:
@@ -193,7 +193,7 @@ paths:
delete:
operationId: Delete-a-dsl-definition
tags:
- - DSL Definitions
+ - DSL Definitions
summary: Delete a DSL Definition
description: Delete a specific DSL definition.
responses:
@@ -216,7 +216,7 @@ paths:
post:
operationId: create-a-test
tags:
- - Tests
+ - Tests
summary: Create a Test
description: Create a new test.
responses:
@@ -254,7 +254,7 @@ paths:
get:
operationId: retrieve-all-tests
tags:
- - Tests
+ - Tests
summary: Retrieve all Tests
description: Retrieve all available tests.
responses:
@@ -282,18 +282,18 @@ paths:
get:
operationId: retrieve-a-test
tags:
- - Tests
+ - Tests
summary: Retrieve a Test
description: Retrieve a specific test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- format: uuid
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -322,17 +322,17 @@ paths:
put:
operationId: update-a-test
tags:
- - Tests
+ - Tests
summary: Update a Test
description: Update a specific test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -368,17 +368,17 @@ paths:
delete:
operationId: delete-a-test
tags:
- - Tests
+ - Tests
summary: Delete a Test
description: Delete a specific test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -398,18 +398,18 @@ paths:
get:
operationId: retrieve-all-test-revisions
tags:
- - Tests
+ - Tests
summary: Retrieve Test Revisions
description: Retrieve the revisions of the specified test.
parameters:
- - in: path
- name: test_id
- description: The test id.
- required: true
- schema:
- type: string
- format: uuid
- example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
+ - in: path
+ name: test_id
+ description: The test id.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ example: 4bf5d7ab-f310-4a64-8ec2-d65c06188ec1
responses:
'200':
description: Success
@@ -442,7 +442,7 @@ paths:
post:
operationId: create-a-job
tags:
- - Jobs
+ - Jobs
summary: Create a Job
description: Create a new job that will trigger a test run.
responses:
@@ -480,15 +480,15 @@ paths:
get:
operationId: retrieve-all-jobs
tags:
- - Jobs
+ - Jobs
summary: Retrieve all Jobs
description: Retrieve the details of all available jobs.
parameters:
- - in: query
- name: one_time
- description: Should return the one time tests (no cron expression)
- schema:
- type: boolean
+ - in: query
+ name: one_time
+ description: Should return the one time tests (no cron expression)
+ schema:
+ type: boolean
responses:
'200':
description: Success
@@ -515,16 +515,16 @@ paths:
get:
operationId: retrieve-a-job
tags:
- - Jobs
+ - Jobs
summary: Retrieve a Job
description: Retrieve a specific job.
parameters:
- - in: path
- name: job_id
- description: The id of the job to retrieve.
- required: true
- schema:
- type: string
+ - in: path
+ name: job_id
+ description: The id of the job to retrieve.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -553,16 +553,16 @@ paths:
put:
operationId: update-a-job
tags:
- - Jobs
+ - Jobs
summary: Update a Job
description: Update a specific job.
parameters:
- - in: path
- name: job_id
- description: The id of the job to update.
- required: true
- schema:
- type: string
+ - in: path
+ name: job_id
+ description: The id of the job to update.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -598,15 +598,15 @@ paths:
delete:
operationId: delete-a-job
tags:
- - Jobs
+ - Jobs
summary: Delete a Job
description: Delete a specific job.
parameters:
- - in: path
- name: job_id
- required: true
- schema:
- type: string
+ - in: path
+ name: job_id
+ required: true
+ schema:
+ type: string
responses:
'204':
description: Success
@@ -626,22 +626,22 @@ paths:
post:
operationId: terminate-a-job
tags:
- - Jobs
+ - Jobs
summary: Terminate a Job
description: Terminate the execution of a running job.
parameters:
- - in: path
- description: The ID of the job.
- name: job_id
- required: true
- schema:
- type: string
- - in: path
- description: The id of a specific run in metronome which is also the report id.
- name: run_id
- required: true
- schema:
- type: string
+ - in: path
+ description: The ID of the job.
+ name: job_id
+ required: true
+ schema:
+ type: string
+ - in: path
+ description: The id of a specific run in metronome which is also the report id.
+ name: run_id
+ required: true
+ schema:
+ type: string
responses:
'204':
description: Success
@@ -660,21 +660,21 @@ paths:
/v1/jobs/{job_id}/runs/{run_id}/logs:
get:
tags:
- - jobs
+ - jobs
description: get logs of specific job.
parameters:
- - in: path
- description: The ID of the job.
- name: job_id
- required: true
- schema:
- type: string
- - in: path
- description: The id of a specific run in metronome which is also the report id.
- name: run_id
- required: true
- schema:
- type: string
+ - in: path
+ description: The ID of the job.
+ name: job_id
+ required: true
+ schema:
+ type: string
+ - in: path
+ description: The id of a specific run in metronome which is also the report id.
+ name: run_id
+ required: true
+ schema:
+ type: string
responses:
"200":
description: Success
@@ -701,16 +701,16 @@ paths:
get:
operationId: retrieve-all-reports
tags:
- - Reports
+ - Reports
summary: Retrieve all Reports
description: Retrieve all reports for the specified test.
parameters:
- - in: path
- name: test_id
- description: The id of the test for which to retrieve the reports.
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ description: The id of the test for which to retrieve the reports.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -735,15 +735,15 @@ paths:
post:
operationId: create-a-report
tags:
- - Reports
+ - Reports
summary: Create a Report
description: Create a new report for the specified test.
parameters:
- - in: path
- name: test_id
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ required: true
+ schema:
+ type: string
responses:
'201':
description: Success
@@ -776,23 +776,23 @@ paths:
get:
operationId: retrieve-a-report
tags:
- - Reports
+ - Reports
summary: Retrieve a Report
description: Retrieve a specific report for the specified test.
parameters:
- - in: path
- name: test_id
- required: true
- description: The id of the test for which to retrieve the report.
- schema:
- type: string
- example: 81a27853-0db5-4e57-ad63-4b637528398a
- - in: path
- name: report_id
- description: The id of the report to retrieve.
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ required: true
+ description: The id of the test for which to retrieve the report.
+ schema:
+ type: string
+ example: 81a27853-0db5-4e57-ad63-4b637528398a
+ - in: path
+ name: report_id
+ description: The id of the report to retrieve.
+ required: true
+ schema:
+ type: string
responses:
'200':
description: Success
@@ -822,17 +822,17 @@ paths:
get:
operationId: retrieve-recent-reports
tags:
- - Reports
+ - Reports
summary: Retrieve Recent Reports
description: Retrieve the most recent reports.
parameters:
- - in: query
- name: limit
- description: The number of most recent reports to retrieve.
- required: true
- minimum: 1
- maximum: 250
- type: integer
+ - in: query
+ name: limit
+ description: The number of most recent reports to retrieve.
+ required: true
+ minimum: 1
+ maximum: 250
+ type: integer
responses:
'200':
description: Success
@@ -857,20 +857,20 @@ paths:
'/v1/tests/{test_id}/reports/{report_id}/stats':
post:
tags:
- - Reports
+ - Reports
summary: Insert a Stats Object
description: Insert a new stats object for a specific report
parameters:
- - in: path
- name: test_id
- required: true
- schema:
- type: string
- - in: path
- name: report_id
- required: true
- schema:
- type: string
+ - in: path
+ name: test_id
+ required: true
+ schema:
+ type: string
+ - in: path
+ name: report_id
+ required: true
+ schema:
+ type: string
responses:
'204':
description: Success
@@ -904,7 +904,7 @@ paths:
get:
operationId: retrieve-configurations
tags:
- - Configuration
+ - Configuration
summary: Retrieve Configuration Settings
description: Retrieve all Predator configuration settings.
responses:
@@ -919,7 +919,7 @@ paths:
put:
operationId: update-configurations
tags:
- - Configuration
+ - Configuration
summary: Update Configuration Settings
description: Update existing configuration settings. This will override environment variables.
requestBody:
@@ -946,18 +946,18 @@ paths:
delete:
operationId: delete-a-configuration
tags:
- - Configuration
+ - Configuration
summary: Delete a Specific Configuration Value
description: |
Delete a specific configuration value. This will restore the original
environment variable.
parameters:
- - in: path
- name: config_key
- required: true
- description: They key to delete.
- schema:
- type: string
+ - in: path
+ name: config_key
+ required: true
+ description: They key to delete.
+ schema:
+ type: string
responses:
"204":
description: Success
@@ -990,8 +990,8 @@ components:
definition:
type: object
required:
- - name
- - request
+ - name
+ - request
properties:
name:
description: The name of the DSL definition.
@@ -1025,7 +1025,7 @@ components:
}
update_definition:
required:
- - request
+ - request
properties:
request:
type: object
@@ -1041,12 +1041,12 @@ components:
discriminator:
propertyName: type
oneOf:
- - $ref: '#/components/schemas/basic'
- - $ref: '#/components/schemas/dsl'
+ - $ref: '#/components/schemas/basic'
+ - $ref: '#/components/schemas/dsl'
required:
- - name
- - description
- - type
+ - name
+ - description
+ - type
properties:
name:
type: string
@@ -1072,7 +1072,7 @@ components:
dsl:
description: A test that is made of scenarios base on domain specific language
required:
- - scenarios
+ - scenarios
properties:
scenarios:
description: A scenario is a sequence of HTTP requests aimed to test the performance of specific functionality.
@@ -1112,13 +1112,13 @@ components:
basic:
description: A test that is made of artillery json
required:
- - artillery_test
+ - artillery_test
properties:
artillery_test:
type: object
test_id:
required:
- - id
+ - id
properties:
id:
type: string
@@ -1126,9 +1126,9 @@ components:
description: The id of the test.
create_test_response:
allOf:
- - $ref: '#/components/schemas/test_id'
+ - $ref: '#/components/schemas/test_id'
required:
- - revision_id
+ - revision_id
properties:
revision_id:
type: string
@@ -1145,10 +1145,10 @@ components:
dsl: '#/components/schemas/dsl_test_response'
basic: '#/components/schemas/basic_test_response'
required:
- - type
- - name
- - description
- - updated_at
+ - type
+ - name
+ - description
+ - updated_at
properties:
type:
$ref: '#/components/schemas/test_type'
@@ -1166,9 +1166,9 @@ components:
type: object
description: A test that is made of scenarios base on domain specific language
allOf:
- - $ref: '#/components/schemas/create_test_response'
- required:
- - raw_data
+ - $ref: '#/components/schemas/create_test_response'
+ required:
+ - raw_data
properties:
raw_data:
type: object
@@ -1265,10 +1265,10 @@ components:
type: object
description: bla
allOf:
- - $ref: '#/components/schemas/create_test_response'
- - type: object
- required:
- - artillery_test
+ - $ref: '#/components/schemas/create_test_response'
+ - type: object
+ required:
+ - artillery_test
properties:
artillery_test:
type: object
@@ -1296,14 +1296,14 @@ components:
}
error_response:
required:
- - message
+ - message
properties:
message:
type: string
scenario:
required:
- - scenario_name
- - steps
+ - scenario_name
+ - steps
properties:
scenario_name:
type: string
@@ -1315,7 +1315,7 @@ components:
items:
type: object
required:
- - action
+ - action
properties:
action:
type: string
@@ -1348,12 +1348,12 @@ components:
example: 20
job:
required:
- - test_id
- - arrival_rate
- - duration
+ - test_id
+ - arrival_rate
+ - duration
allOf:
- - $ref: '#/components/schemas/job_update'
- - type: object
+ - $ref: '#/components/schemas/job_update'
+ - type: object
properties:
run_immediately:
type: boolean
@@ -1416,32 +1416,40 @@ components:
type: string
description: Free text describing the environment against which the test is executed.
example: test
+ proxy_url:
+ type: string
+ description: URL of the proxy server that predator runners will use
+ example: test
+ debug:
+ type: string
+ description: set to * in order to print all requests and responeses of the runner
+ example: test
job_response:
allOf:
- - $ref: '#/components/schemas/job'
- - properties:
- id:
- type: string
- pattern: >-
- ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
- description: The job id.
+ - $ref: '#/components/schemas/job'
+ - properties:
+ id:
+ type: string
+ pattern: >-
+ ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
+ description: The job id.
create_job_response:
allOf:
- - $ref: '#/components/schemas/job_response'
- - properties:
- run_id:
- type: string
- description: The run id. Only shown if the job is ran immediately.
+ - $ref: '#/components/schemas/job_response'
+ - properties:
+ run_id:
+ type: string
+ description: The run id. Only shown if the job is ran immediately.
post_report:
required:
- - report_id
- - job_id
- - revision_id
- - test_type
- - test_name
- - test_description
- - start_time
- - runner_id
+ - report_id
+ - job_id
+ - revision_id
+ - test_type
+ - test_name
+ - test_description
+ - start_time
+ - runner_id
properties:
report_id:
type: string
@@ -1475,16 +1483,16 @@ components:
description: the id of the runner that created the report
post_report_response:
required:
- - report_id
+ - report_id
properties:
report_id:
type: string
description: The id of the report/same as run_id
stats:
required:
- - stats_time
- - phase_status
- - data
+ - stats_time
+ - phase_status
+ - data
properties:
stats_time:
type: string
@@ -1503,16 +1511,16 @@ components:
description: Error thrown while running test
report_response:
required:
- - test_id
- - revision_id
- - report_id
- - job_id
- - test_type
- - status
- - start_time
- - end_time
- - duration_seconds
- - arrival_rate
+ - test_id
+ - revision_id
+ - report_id
+ - job_id
+ - test_type
+ - status
+ - start_time
+ - end_time
+ - duration_seconds
+ - arrival_rate
properties:
test_id:
type: string
@@ -1561,29 +1569,32 @@ components:
internal_address:
type: string
description: The local ip address of your machine.
- docker_name:
+ runner_docker_image:
type: string
description: The predator-runner docker image that will run the test.
job_platform:
type: string
description: Type of platform using to run predator (METRONOME,KUBERNETES,DOCKER)
runner_cpu:
+ minimum: 0
type: number
description: Number of CPU use by the each runner.
runner_memory:
type: number
+ minimum: 128
description: Max memory to use by each runner.
metrics_plugin_name:
type: string
enum:
- - influx
- - prometheus
+ - influx
+ - prometheus
description: Metrics to use, in case one or both metrics are configured.
default_email_address:
type: string
description: Default email to send final report to, address can be configured
only by using API.
minimum_wait_for_delayed_report_status_update_in_ms:
+ minimum: 0
type: number
description: The minimum of time waiting for runner to report before the test considered as finished.
configured only by using API.
@@ -1591,15 +1602,21 @@ components:
type: string
description: Default webhook url to send live report statistics to, can be
configured only by using API.
+ delay_runner_ms:
+ type: number
+ minimum: 0
+ description: Delay before the runners will start the test,
+ useful for enviroments like kubernetes with sidecars that should be
+ initialized before the runner starts
influx_metrics:
additionalProperties: false
type: object
description: Influx configuration .
required:
- - host
- - username
- - password
- - database
+ - host
+ - username
+ - password
+ - database
properties:
host:
type: string
@@ -1618,7 +1635,7 @@ components:
type: object
description: prometheus configuration.
required:
- - push_gateway_url
+ - push_gateway_url
properties:
push_gateway_url:
type: string
@@ -1631,12 +1648,12 @@ components:
type: object
description: Simple mail transfer protocol.
required:
- - from
- - host
- - port
- - username
- - password
- - timeout
+ - from
+ - host
+ - port
+ - username
+ - password
+ - timeout
properties:
from:
type: string
diff --git a/package-lock.json b/package-lock.json
index 449cc18a7..722a714f2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -934,7 +934,6 @@
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "dev": true,
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
@@ -1683,6 +1682,37 @@
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
+ "conventional-changelog": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.3.tgz",
+ "integrity": "sha512-JBfdDSdSGasTNaBRZbOeFn8CJTIpP/sB/kiawmWAiLapLZ+wCDVDZR6Q+Hh9rjh3dxNAFR03bWTeqjKajXvPYA==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-angular": "^5.0.3",
+ "conventional-changelog-atom": "^2.0.1",
+ "conventional-changelog-codemirror": "^2.0.1",
+ "conventional-changelog-conventionalcommits": "^1.1.1",
+ "conventional-changelog-core": "^3.2.2",
+ "conventional-changelog-ember": "^2.0.2",
+ "conventional-changelog-eslint": "^3.0.2",
+ "conventional-changelog-express": "^2.0.1",
+ "conventional-changelog-jquery": "^3.0.4",
+ "conventional-changelog-jshint": "^2.0.1",
+ "conventional-changelog-preset-loader": "^2.1.1"
+ },
+ "dependencies": {
+ "conventional-changelog-angular": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz",
+ "integrity": "sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "q": "^1.5.1"
+ }
+ }
+ }
+ },
"conventional-changelog-angular": {
"version": "1.6.6",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
@@ -1693,46 +1723,95 @@
"q": "^1.5.1"
}
},
- "conventional-changelog-jscs": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz",
- "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=",
+ "conventional-changelog-atom": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.1.tgz",
+ "integrity": "sha512-9BniJa4gLwL20Sm7HWSNXd0gd9c5qo49gCi8nylLFpqAHhkFTj7NQfROq3f1VpffRtzfTQp4VKU5nxbe2v+eZQ==",
"dev": true,
"requires": {
- "q": "^1.4.1"
+ "q": "^1.5.1"
}
},
- "conventional-commit-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz",
- "integrity": "sha1-XblXOdbCEqy+e29lahG5QLqmiUY=",
- "dev": true
+ "conventional-changelog-codemirror": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.1.tgz",
+ "integrity": "sha512-23kT5IZWa+oNoUaDUzVXMYn60MCdOygTA2I+UjnOMiYVhZgmVwNd6ri/yDlmQGXHqbKhNR5NoXdBzSOSGxsgIQ==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
},
- "conventional-commits-filter": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz",
- "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==",
+ "conventional-changelog-conventionalcommits": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-1.1.1.tgz",
+ "integrity": "sha512-21BcbiSfvYIon7sF80Rwn6vnfhaiuZUyHHFYr9Zz8H2B+O/3grud5TbEYpU1/SFXD5aD48IdSme/KkJl9wCsCw==",
"dev": true,
"requires": {
- "is-subset": "^0.1.1",
- "modify-values": "^1.0.0"
+ "compare-func": "^1.3.1",
+ "q": "^1.5.1"
}
},
- "conventional-commits-parser": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
- "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==",
+ "conventional-changelog-core": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.2.tgz",
+ "integrity": "sha512-cssjAKajxaOX5LNAJLB+UOcoWjAIBvXtDMedv/58G+YEmAXMNfC16mmPl0JDOuVJVfIqM0nqQiZ8UCm8IXbE0g==",
"dev": true,
"requires": {
- "JSONStream": "^1.0.4",
- "is-text-path": "^1.0.0",
+ "conventional-changelog-writer": "^4.0.5",
+ "conventional-commits-parser": "^3.0.2",
+ "dateformat": "^3.0.0",
+ "get-pkg-repo": "^1.0.0",
+ "git-raw-commits": "2.0.0",
+ "git-remote-origin-url": "^2.0.0",
+ "git-semver-tags": "^2.0.2",
"lodash": "^4.2.1",
- "meow": "^4.0.0",
- "split2": "^2.0.0",
- "through2": "^2.0.0",
- "trim-off-newlines": "^1.0.0"
+ "normalize-package-data": "^2.3.5",
+ "q": "^1.5.1",
+ "read-pkg": "^3.0.0",
+ "read-pkg-up": "^3.0.0",
+ "through2": "^3.0.0"
},
"dependencies": {
+ "conventional-commits-parser": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.2.tgz",
+ "integrity": "sha512-y5eqgaKR0F6xsBNVSQ/5cI5qIF3MojddSUi1vKIggRkqUTbkqFKH9P5YX/AT1BVZp9DtSzBTIkvjyVLotLsVog==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.4",
+ "is-text-path": "^1.0.0",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^3.0.0",
+ "trim-off-newlines": "^1.0.0"
+ }
+ },
+ "git-raw-commits": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz",
+ "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==",
+ "dev": true,
+ "requires": {
+ "dargs": "^4.0.1",
+ "lodash.template": "^4.0.2",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^2.0.0"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -1813,94 +1892,115 @@
"find-up": "^2.0.0",
"read-pkg": "^3.0.0"
}
+ },
+ "through2": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
+ "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2 || 3"
+ }
}
}
},
- "conventional-recommended-bump": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz",
- "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==",
+ "conventional-changelog-ember": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.2.tgz",
+ "integrity": "sha512-qtZbA3XefO/n6DDmkYywDYi6wDKNNc98MMl2F9PKSaheJ25Trpi3336W8fDlBhq0X+EJRuseceAdKLEMmuX2tg==",
"dev": true,
"requires": {
- "concat-stream": "^1.4.10",
- "conventional-commits-filter": "^1.1.1",
- "conventional-commits-parser": "^2.1.1",
- "git-raw-commits": "^1.3.0",
- "git-semver-tags": "^1.3.0",
- "meow": "^3.3.0",
- "object-assign": "^4.0.1"
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-eslint": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.2.tgz",
+ "integrity": "sha512-Yi7tOnxjZLXlCYBHArbIAm8vZ68QUSygFS7PgumPRiEk+9NPUeucy5Wg9AAyKoBprSV3o6P7Oghh4IZSLtKCvQ==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-express": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz",
+ "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-jquery": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.4.tgz",
+ "integrity": "sha512-IVJGI3MseYoY6eybknnTf9WzeQIKZv7aNTm2KQsiFVJH21bfP2q7XVjfoMibdCg95GmgeFlaygMdeoDDa+ZbEQ==",
+ "dev": true,
+ "requires": {
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-jshint": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.1.tgz",
+ "integrity": "sha512-kRFJsCOZzPFm2tzRHULWP4tauGMvccOlXYf3zGeuSW4U0mZhk5NsjnRZ7xFWrTFPlCLV+PNmHMuXp5atdoZmEg==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-changelog-preset-loader": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.1.1.tgz",
+ "integrity": "sha512-K4avzGMLm5Xw0Ek/6eE3vdOXkqnpf9ydb68XYmCc16cJ99XMMbc2oaNMuPwAsxVK6CC1yA4/I90EhmWNj0Q6HA==",
+ "dev": true
+ },
+ "conventional-changelog-writer": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.5.tgz",
+ "integrity": "sha512-g/Myp4MaJ1A+f7Ai+SnVhkcWtaHk6flw0SYN7A+vQ+MTu0+gSovQWs4Pg4NtcNUcIztYQ9YHsoxHP+GGQplI7Q==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "conventional-commits-filter": "^2.0.2",
+ "dateformat": "^3.0.0",
+ "handlebars": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "semver": "^5.5.0",
+ "split": "^1.0.0",
+ "through2": "^3.0.0"
},
"dependencies": {
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
- "dev": true
- },
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
- "dev": true,
- "requires": {
- "camelcase": "^2.0.0",
- "map-obj": "^1.0.0"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
"load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
}
},
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- },
"meow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
+ "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
"dev": true,
"requires": {
- "camelcase-keys": "^2.0.0",
- "decamelize": "^1.1.2",
+ "camelcase-keys": "^4.0.0",
+ "decamelize-keys": "^1.0.0",
"loud-rejection": "^1.0.0",
- "map-obj": "^1.0.1",
"minimist": "^1.1.3",
+ "minimist-options": "^3.0.1",
"normalize-package-data": "^2.3.4",
- "object-assign": "^4.0.1",
- "read-pkg-up": "^1.0.1",
- "redent": "^1.0.0",
- "trim-newlines": "^1.0.0"
+ "read-pkg-up": "^3.0.0",
+ "redent": "^2.0.0",
+ "trim-newlines": "^2.0.0"
}
},
"minimist": {
@@ -1909,80 +2009,366 @@
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
"dev": true,
"requires": {
- "pinkie-promise": "^2.0.0"
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
}
},
"path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
+ "pify": "^3.0.0"
}
},
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
"read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
"dev": true,
"requires": {
- "load-json-file": "^1.0.0",
+ "load-json-file": "^4.0.0",
"normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
+ "path-type": "^3.0.0"
}
},
"read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
"dev": true,
"requires": {
- "indent-string": "^2.1.0",
- "strip-indent": "^1.0.1"
+ "find-up": "^2.0.0",
+ "read-pkg": "^3.0.0"
}
},
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
},
- "strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "through2": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
+ "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
"dev": true,
"requires": {
- "get-stdin": "^4.0.1"
+ "readable-stream": "2 || 3"
+ }
+ }
+ }
+ },
+ "conventional-commit-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz",
+ "integrity": "sha1-XblXOdbCEqy+e29lahG5QLqmiUY=",
+ "dev": true
+ },
+ "conventional-commits-filter": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz",
+ "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==",
+ "dev": true,
+ "requires": {
+ "lodash.ismatch": "^4.4.0",
+ "modify-values": "^1.0.0"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
+ "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.4",
+ "is-text-path": "^1.0.0",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^2.0.0",
+ "trim-off-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
}
},
- "trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "meow": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
+ "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^4.0.0",
+ "decamelize-keys": "^1.0.0",
+ "loud-rejection": "^1.0.0",
+ "minimist": "^1.1.3",
+ "minimist-options": "^3.0.1",
+ "normalize-package-data": "^2.3.4",
+ "read-pkg-up": "^3.0.0",
+ "redent": "^2.0.0",
+ "trim-newlines": "^2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^3.0.0"
+ }
+ }
+ }
+ },
+ "conventional-recommended-bump": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.1.1.tgz",
+ "integrity": "sha512-JT2vKfSP9kR18RXXf55BRY1O3AHG8FPg5btP3l7LYfcWJsiXI6MCf30DepQ98E8Qhowvgv7a8iev0J1bEDkTFA==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^2.0.0",
+ "conventional-changelog-preset-loader": "^2.1.1",
+ "conventional-commits-filter": "^2.0.2",
+ "conventional-commits-parser": "^3.0.2",
+ "git-raw-commits": "2.0.0",
+ "git-semver-tags": "^2.0.2",
+ "meow": "^4.0.0",
+ "q": "^1.5.1"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.2.tgz",
+ "integrity": "sha512-y5eqgaKR0F6xsBNVSQ/5cI5qIF3MojddSUi1vKIggRkqUTbkqFKH9P5YX/AT1BVZp9DtSzBTIkvjyVLotLsVog==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.4",
+ "is-text-path": "^1.0.0",
+ "lodash": "^4.2.1",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^3.0.0",
+ "trim-off-newlines": "^1.0.0"
+ }
+ },
+ "git-raw-commits": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz",
+ "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==",
+ "dev": true,
+ "requires": {
+ "dargs": "^4.0.1",
+ "lodash.template": "^4.0.2",
+ "meow": "^4.0.0",
+ "split2": "^2.0.0",
+ "through2": "^2.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "meow": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
+ "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^4.0.0",
+ "decamelize-keys": "^1.0.0",
+ "loud-rejection": "^1.0.0",
+ "minimist": "^1.1.3",
+ "minimist-options": "^3.0.1",
+ "normalize-package-data": "^2.3.4",
+ "read-pkg-up": "^3.0.0",
+ "redent": "^2.0.0",
+ "trim-newlines": "^2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^3.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz",
+ "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "through2": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
+ "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2 || 3"
+ }
}
}
},
@@ -2248,11 +2634,23 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
+ "detect-indent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+ "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
+ "dev": true
+ },
"detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
},
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true
+ },
"docker-modem": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-1.0.8.tgz",
@@ -2376,13 +2774,58 @@
}
},
"dotgitignore": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-1.0.3.tgz",
- "integrity": "sha512-eu5XjSstm0WXQsARgo6kPjkINYZlOUW+z/KtAAIBjHa5mUpMPrxJytbPIndWz6GubBuuuH5ljtVcXKnVnH5q8w==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz",
+ "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==",
"dev": true,
"requires": {
- "find-up": "^2.1.0",
+ "find-up": "^3.0.0",
"minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
+ "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ }
}
},
"dottie": {
@@ -3640,9 +4083,9 @@
}
},
"git-semver-tags": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz",
- "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.2.tgz",
+ "integrity": "sha512-34lMF7Yo1xEmsK2EkbArdoU79umpvm0MfzaDkSNYSJqtM5QLAVTPWgpiXSVI5o/O9EvZPSrP4Zvnec/CqhSd5w==",
"dev": true,
"requires": {
"meow": "^4.0.0",
@@ -3731,9 +4174,9 @@
}
},
"semver": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"dev": true
}
}
@@ -3818,12 +4261,12 @@
"dev": true
},
"handlebars": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz",
- "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
+ "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
"dev": true,
"requires": {
- "async": "^2.5.0",
+ "neo-async": "^2.6.0",
"optimist": "^0.6.1",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4"
@@ -4437,12 +4880,6 @@
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
- "is-subset": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
- "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
- "dev": true
- },
"is-text-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
@@ -4802,6 +5239,12 @@
"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
"dev": true
},
+ "lodash.ismatch": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
+ "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
+ "dev": true
+ },
"lodash.map": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
@@ -5409,6 +5852,12 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
},
+ "neo-async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
+ "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
+ "dev": true
+ },
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -5704,15 +6153,6 @@
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
- "async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
- "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.11"
- }
- },
"balanced-match": {
"version": "1.0.0",
"resolved": false,
@@ -5764,13 +6204,6 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
- "commander": {
- "version": "2.17.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
- "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
- "dev": true,
- "optional": true
- },
"commondir": {
"version": "1.0.1",
"resolved": false,
@@ -5952,23 +6385,15 @@
"dev": true
},
"handlebars": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz",
- "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
+ "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
"dev": true,
"requires": {
- "async": "^2.5.0",
+ "neo-async": "^2.6.0",
"optimist": "^0.6.1",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
}
},
"has-flag": {
@@ -6148,12 +6573,6 @@
"path-exists": "^3.0.0"
}
},
- "lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
- "dev": true
- },
"lodash.flattendeep": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
@@ -6231,12 +6650,6 @@
"brace-expansion": "^1.1.7"
}
},
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
- "dev": true
- },
"mkdirp": {
"version": "0.5.1",
"resolved": false,
@@ -6302,16 +6715,6 @@
"wrappy": "1"
}
},
- "optimist": {
- "version": "0.6.1",
- "resolved": false,
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "dev": true,
- "requires": {
- "minimist": "~0.0.1",
- "wordwrap": "~0.0.2"
- }
- },
"os-homedir": {
"version": "1.0.2",
"resolved": false,
@@ -6651,26 +7054,6 @@
"require-main-filename": "^1.0.1"
}
},
- "uglify-js": {
- "version": "3.4.9",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
- "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
- "dev": true,
- "optional": true,
- "requires": {
- "commander": "~2.17.1",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "optional": true
- }
- }
- },
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
@@ -6702,12 +7085,6 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
- "wordwrap": {
- "version": "0.0.3",
- "resolved": false,
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
- "dev": true
- },
"wrap-ansi": {
"version": "2.1.0",
"resolved": false,
@@ -7466,8 +7843,7 @@
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"regexpp": {
"version": "2.0.1",
@@ -8625,387 +9001,176 @@
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "standard-version": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.4.0.tgz",
- "integrity": "sha512-jJ8FZhnmh9xJRQLnaXiGRLaAUNItIH29lOQZGpL5fd4+jUHto9Ij6SPCYN86h6ZNNXkYq2TYiIVVF7gVyC+pcQ==",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "conventional-changelog": "^1.1.0",
- "conventional-recommended-bump": "^1.0.0",
- "dotgitignore": "^1.0.3",
- "figures": "^1.5.0",
- "fs-access": "^1.0.0",
- "semver": "^5.1.0",
- "yargs": "^8.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- }
- }
- },
- "conventional-changelog": {
- "version": "1.1.24",
- "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz",
- "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==",
- "dev": true,
- "requires": {
- "conventional-changelog-angular": "^1.6.6",
- "conventional-changelog-atom": "^0.2.8",
- "conventional-changelog-codemirror": "^0.3.8",
- "conventional-changelog-core": "^2.0.11",
- "conventional-changelog-ember": "^0.3.12",
- "conventional-changelog-eslint": "^1.0.9",
- "conventional-changelog-express": "^0.3.6",
- "conventional-changelog-jquery": "^0.1.0",
- "conventional-changelog-jscs": "^0.1.0",
- "conventional-changelog-jshint": "^0.3.8",
- "conventional-changelog-preset-loader": "^1.1.8"
- }
- },
- "conventional-changelog-atom": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz",
- "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
- },
- "conventional-changelog-codemirror": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz",
- "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
- },
- "conventional-changelog-core": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz",
- "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==",
- "dev": true,
- "requires": {
- "conventional-changelog-writer": "^3.0.9",
- "conventional-commits-parser": "^2.1.7",
- "dateformat": "^3.0.0",
- "get-pkg-repo": "^1.0.0",
- "git-raw-commits": "^1.3.6",
- "git-remote-origin-url": "^2.0.0",
- "git-semver-tags": "^1.3.6",
- "lodash": "^4.2.1",
- "normalize-package-data": "^2.3.5",
- "q": "^1.5.1",
- "read-pkg": "^1.1.0",
- "read-pkg-up": "^1.0.1",
- "through2": "^2.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- }
- }
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "standard-version": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-5.0.2.tgz",
+ "integrity": "sha512-vvdWZySinwWU9UZhtgYUGGTkYzqrwYMw3c7CFJ17E7vMbAEqVSui/bm+ZcSukAAU2WmphPTWIKFmn8ni+lk4NA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "conventional-changelog": "^3.0.6",
+ "conventional-recommended-bump": "^4.0.4",
+ "detect-indent": "^5.0.0",
+ "detect-newline": "^2.1.0",
+ "dotgitignore": "^2.1.0",
+ "figures": "^2.0.0",
+ "fs-access": "^1.0.0",
+ "git-semver-tags": "^2.0.2",
+ "semver": "^5.2.0",
+ "stringify-package": "^1.0.0",
+ "yargs": "^12.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
},
- "conventional-changelog-ember": {
- "version": "0.3.12",
- "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz",
- "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
},
- "conventional-changelog-eslint": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz",
- "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==",
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
- "q": "^1.5.1"
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
}
},
- "conventional-changelog-express": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz",
- "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==",
+ "execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"dev": true,
"requires": {
- "q": "^1.5.1"
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
}
},
- "conventional-changelog-jquery": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz",
- "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=",
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
- "q": "^1.4.1"
+ "locate-path": "^3.0.0"
}
},
- "conventional-changelog-jshint": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz",
- "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==",
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
- "compare-func": "^1.3.1",
- "q": "^1.5.1"
+ "pump": "^3.0.0"
}
},
- "conventional-changelog-preset-loader": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz",
- "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==",
+ "invert-kv": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
"dev": true
},
- "conventional-changelog-writer": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz",
- "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==",
- "dev": true,
- "requires": {
- "compare-func": "^1.3.1",
- "conventional-commits-filter": "^1.1.6",
- "dateformat": "^3.0.0",
- "handlebars": "^4.0.2",
- "json-stringify-safe": "^5.0.1",
- "lodash": "^4.2.1",
- "meow": "^4.0.0",
- "semver": "^5.5.0",
- "split": "^1.0.0",
- "through2": "^2.0.0"
- }
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
},
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+ "lcid": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
"dev": true,
"requires": {
- "escape-string-regexp": "^1.0.5",
- "object-assign": "^4.1.0"
+ "invert-kv": "^2.0.0"
}
},
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
}
},
- "meow": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
- "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
+ "mem": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
+ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
"dev": true,
"requires": {
- "camelcase-keys": "^4.0.0",
- "decamelize-keys": "^1.0.0",
- "loud-rejection": "^1.0.0",
- "minimist": "^1.1.3",
- "minimist-options": "^3.0.1",
- "normalize-package-data": "^2.3.4",
- "read-pkg-up": "^3.0.0",
- "redent": "^2.0.0",
- "trim-newlines": "^2.0.0"
- },
- "dependencies": {
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "dev": true,
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
- "dev": true,
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
- }
- }
+ "map-age-cleaner": "^0.1.1",
+ "mimic-fn": "^2.0.0",
+ "p-is-promise": "^2.0.0"
}
},
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true
},
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "os-locale": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
"dev": true,
"requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "execa": "^1.0.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
}
},
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "p-limit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
+ "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
"dev": true,
"requires": {
- "pinkie-promise": "^2.0.0"
+ "p-try": "^2.0.0"
}
},
- "path-type": {
+ "p-locate": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
- "pify": "^3.0.0"
+ "p-limit": "^2.0.0"
}
},
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dev": true,
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- },
- "dependencies": {
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true,
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- }
- }
- },
"semver": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"dev": true
},
"string-width": {
@@ -9016,53 +9181,45 @@
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
}
},
"yargs": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
- "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "version": "12.0.5",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
"dev": true,
"requires": {
- "camelcase": "^4.1.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
+ "cliui": "^4.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
"get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
- "read-pkg-up": "^2.0.0",
+ "os-locale": "^3.0.0",
"require-directory": "^2.1.1",
"require-main-filename": "^1.0.1",
"set-blocking": "^2.0.0",
"string-width": "^2.0.0",
"which-module": "^2.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^7.0.0"
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^11.1.1"
}
},
"yargs-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
- "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
"dev": true,
"requires": {
- "camelcase": "^4.1.0"
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
}
}
@@ -9135,6 +9292,12 @@
"safe-buffer": "~5.1.0"
}
},
+ "stringify-package": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.0.tgz",
+ "integrity": "sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g==",
+ "dev": true
+ },
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@@ -9622,6 +9785,15 @@
}
}
},
+ "umzug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz",
+ "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==",
+ "requires": {
+ "babel-runtime": "^6.23.0",
+ "bluebird": "^3.5.3"
+ }
+ },
"underscore": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
diff --git a/package.json b/package.json
index f1b6f7f7a..287195ead 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
},
"scripts": {
"start": "node src/server.js",
- "unit-tests": "nyc --check-coverage --lines 94 --reporter=html --reporter=text mocha ./tests/unit-tests --recursive",
+ "unit-tests": "nyc --check-coverage --lines 95 --reporter=html --reporter=text mocha ./tests/unit-tests --recursive",
"integration-tests": "bash ./tests/integration-tests/run.sh",
"end-to-end-tests": "bash ./tests/end-to-end-tests/run.sh",
"local-integration-tests": "bash ./tests/integration-tests/runLocal.sh",
@@ -66,7 +66,8 @@
"sequelize": "^5.3.5",
"sqlite3": "^4.0.6",
"tedious": "^4.1.3",
- "uuid": "^3.3.2"
+ "uuid": "^3.2.1",
+ "umzug": "^2.2.0"
},
"devDependencies": {
"@commitlint/cli": "^7.4.0",
@@ -88,7 +89,7 @@
"rewire": "^4.0.1",
"should": "^13.2.1",
"sinon": "^4.5.0",
- "standard-version": "^4.4.0",
+ "standard-version": "^5.0.2",
"supertest": "^3.4.2"
},
"husky": {
diff --git a/src/common/consts.js b/src/common/consts.js
index 5838b626a..b9d9e42e3 100644
--- a/src/common/consts.js
+++ b/src/common/consts.js
@@ -11,8 +11,9 @@ module.exports = {
CONFIG: {
GRFANA_URL: 'grafana_url',
+ DELAY_RUNNER_MS: 'delay_runner_ms',
INTERNAL_ADDRESS: 'internal_address',
- DOCKER_NAME: 'docker_name',
+ RUNNER_DOCKER_IMAGE: 'runner_docker_image',
JOB_PLATFORM: 'job_platform',
RUNNER_CPU: 'runner_cpu',
RUNNER_MEMORY: 'runner_memory',
diff --git a/src/configManager/helpers/configDataMap.js b/src/configManager/helpers/configDataMap.js
index 78ef5ad7e..715607481 100644
--- a/src/configManager/helpers/configDataMap.js
+++ b/src/configManager/helpers/configDataMap.js
@@ -2,12 +2,16 @@ const constConfig = require('../../common/consts').CONFIG;
let configDataMap = {
[constConfig.GRFANA_URL]: { value: process.env.GRAFANA_URL },
+ [constConfig.DELAY_RUNNER_MS]: { value: process.env.DELAY_RUNNER_MS || 0, type: 'int' },
[constConfig.INTERNAL_ADDRESS]: { value: process.env.INTERNAL_ADDRESS },
- [constConfig.DOCKER_NAME]: { value: process.env.DOCKER_NAME || 'zooz/predator-runner:latest' },
+ [constConfig.RUNNER_DOCKER_IMAGE]: { value: process.env.RUNNER_DOCKER_IMAGE || 'zooz/predator-runner:latest' },
[constConfig.JOB_PLATFORM]: { value: process.env.JOB_PLATFORM },
[constConfig.RUNNER_CPU]: { value: process.env.RUNNER_CPU || 1, type: 'int' },
- [constConfig.RUNNER_MEMORY]: { value: process.env.RUNNER_MEMORY || 2048, type: 'int' },
- [constConfig.MINIMUM_WAIT_FOR_DELAYED_REPORT_STATUS_UPDATE_IN_MS]: { value: process.env.MINIMUM_WAIT_FOR_DELAYED_REPORT_STATUS_UPDATE_IN_MS || 30000, type: 'int' },
+ [constConfig.RUNNER_MEMORY]: { value: process.env.RUNNER_MEMORY || 256, type: 'int' },
+ [constConfig.MINIMUM_WAIT_FOR_DELAYED_REPORT_STATUS_UPDATE_IN_MS]: {
+ value: process.env.MINIMUM_WAIT_FOR_DELAYED_REPORT_STATUS_UPDATE_IN_MS || 30000,
+ type: 'int'
+ },
[constConfig.METRICS_PLUGIN_NAME]: { value: process.env.METRICS_PLUGIN_NAME, type: 'string' },
[constConfig.PROMETHEUS_METRICS]: { value: process.env.METRICS_EXPORT_CONFIG, type: 'json' },
[constConfig.INFLUX_METRICS]: { value: process.env.METRICS_EXPORT_CONFIG, type: 'json' },
diff --git a/src/database/cassandra-handler/init-scripts/9__add_proxy_and_debug_jobs_table_.cql b/src/database/cassandra-handler/init-scripts/9__add_proxy_and_debug_jobs_table_.cql
new file mode 100644
index 000000000..09bad07ef
--- /dev/null
+++ b/src/database/cassandra-handler/init-scripts/9__add_proxy_and_debug_jobs_table_.cql
@@ -0,0 +1,3 @@
+ALTER TABLE jobs ADD proxy_url text;
+---
+ALTER TABLE jobs ADD debug text;
\ No newline at end of file
diff --git a/src/database/sequlize-handler/migrations/00_jobs_proxy_and_debug.js b/src/database/sequlize-handler/migrations/00_jobs_proxy_and_debug.js
new file mode 100644
index 000000000..fb391d242
--- /dev/null
+++ b/src/database/sequlize-handler/migrations/00_jobs_proxy_and_debug.js
@@ -0,0 +1,22 @@
+const Sequelize = require('sequelize');
+
+module.exports.up = async (query, DataTypes) => {
+ let jobsTable = await query.describeTable('jobs');
+
+ if (!jobsTable.proxy_url) {
+ await query.addColumn(
+ 'jobs', 'proxy_url',
+ Sequelize.DataTypes.STRING);
+ }
+
+ if (!jobsTable.debug) {
+ await query.addColumn(
+ 'jobs', 'debug',
+ Sequelize.DataTypes.STRING);
+ }
+};
+
+module.exports.down = async (query, DataTypes) => {
+ await query.removeColumn('jobs', 'proxy_url');
+ await query.removeColumn('jobs', 'debug');
+};
\ No newline at end of file
diff --git a/src/database/sequlize-handler/sequlize.js b/src/database/sequlize-handler/sequlize.js
index b20b5ce9c..acda53091 100644
--- a/src/database/sequlize-handler/sequlize.js
+++ b/src/database/sequlize-handler/sequlize.js
@@ -1,10 +1,12 @@
'use strict';
+const path = require('path');
+const Umzug = require('umzug');
const schedulerSequlizeConnector = require('../../jobs/models/database/sequelize/sequelizeConnector');
const reportsSequlizeConnector = require('../../reports/models/database/sequelize/sequelizeConnector');
const testsSequlizeConnector = require('../../tests/models/database/sequelize/sequelizeConnector');
const configSequlizeConnector = require('../../configManager/models/database/sequelize/sequelizeConnector');
-
+const logger = require('../../../src/common/logger');
const databaseConfig = require('../../config/databaseConfig');
const Sequelize = require('sequelize');
let sequlizeClient;
@@ -15,6 +17,7 @@ module.exports.init = async () => {
await reportsSequlizeConnector.init(sequlizeClient);
await testsSequlizeConnector.init(sequlizeClient);
await configSequlizeConnector.init(sequlizeClient);
+ await runSequlizeMigrations();
};
module.exports.ping = async () => {
@@ -48,4 +51,30 @@ async function createClient() {
let client = new Sequelize(databaseConfig.name.toLowerCase(), databaseConfig.username, databaseConfig.password, options);
await client.authenticate();
return client;
-}
\ No newline at end of file
+}
+
+async function runSequlizeMigrations() {
+ const umzug = new Umzug({
+ storage: 'sequelize',
+
+ storageOptions: {
+ sequelize: sequlizeClient
+ },
+
+ migrations: {
+ params: [
+ sequlizeClient.getQueryInterface(),
+ Sequelize
+ ],
+ path: path.join(__dirname, './migrations')
+ }
+ });
+
+ try {
+ await umzug.up();
+ } catch (error) {
+ logger.error(error, 'Failed to run sequlize migration, doing rollback');
+ await umzug.down();
+ throw error;
+ }
+}
diff --git a/src/jobs/models/database/cassandra/cassandraConnector.js b/src/jobs/models/database/cassandra/cassandraConnector.js
index 3107c30ba..da63c338c 100644
--- a/src/jobs/models/database/cassandra/cassandraConnector.js
+++ b/src/jobs/models/database/cassandra/cassandraConnector.js
@@ -2,7 +2,7 @@ let logger = require('../../../../common/logger');
let databaseConfig = require('../../../../config/databaseConfig');
let client;
-const INSERT_JOB = 'INSERT INTO jobs(id, test_id, arrival_rate, cron_expression, duration, emails, environment, ramp_to, webhooks, parallelism, max_virtual_users, notes) values(?,?,?,?,?,?,?,?,?,?,?,?)';
+const INSERT_JOB = 'INSERT INTO jobs(id, test_id, arrival_rate, cron_expression, duration, emails, environment, ramp_to, webhooks, parallelism, max_virtual_users, notes, proxy_url, debug) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
const GET_JOBS = 'SELECT * FROM jobs';
const DELETE_JOB = 'DELETE FROM jobs WHERE id=?';
const GET_JOB = 'SELECT * FROM jobs WHERE id=?';
@@ -41,7 +41,7 @@ function getJob(jobId) {
}
function insertJob(jobId, jobInfo) {
- let params = [jobId, jobInfo.test_id, jobInfo.arrival_rate, jobInfo.cron_expression, jobInfo.duration, jobInfo.emails, jobInfo.environment, jobInfo.ramp_to, jobInfo.webhooks, jobInfo.parallelism, jobInfo.max_virtual_users, jobInfo.notes];
+ let params = [jobId, jobInfo.test_id, jobInfo.arrival_rate, jobInfo.cron_expression, jobInfo.duration, jobInfo.emails, jobInfo.environment, jobInfo.ramp_to, jobInfo.webhooks, jobInfo.parallelism, jobInfo.max_virtual_users, jobInfo.notes, jobInfo.proxy_url, jobInfo.debug];
return executeQuery(INSERT_JOB, params, queryOptions);
}
diff --git a/src/jobs/models/database/sequelize/sequelizeConnector.js b/src/jobs/models/database/sequelize/sequelizeConnector.js
index 61b2295ba..c73e6d33d 100644
--- a/src/jobs/models/database/sequelize/sequelizeConnector.js
+++ b/src/jobs/models/database/sequelize/sequelizeConnector.js
@@ -31,6 +31,8 @@ async function insertJob(jobId, jobInfo) {
parallelism: jobInfo.parallelism,
max_virtual_users: jobInfo.max_virtual_users,
notes: jobInfo.notes,
+ proxy_url: jobInfo.proxy_url,
+ debug: jobInfo.debug,
webhooks: jobInfo.webhooks ? jobInfo.webhooks.map(webhookUrl => {
return { id: uuid(), url: webhookUrl };
}) : undefined,
@@ -91,7 +93,9 @@ async function updateJob(jobId, jobInfo) {
environment: jobInfo.environment,
ramp_to: jobInfo.ramp_to,
parallelism: jobInfo.parallelism,
- max_virtual_users: jobInfo.max_virtual_users
+ max_virtual_users: jobInfo.max_virtual_users,
+ proxy_url: jobInfo.proxy_url,
+ debug: jobInfo.debug
};
let options = {
@@ -164,6 +168,12 @@ async function initSchemas() {
},
notes: {
type: Sequelize.DataTypes.STRING
+ },
+ proxy_url: {
+ type: Sequelize.DataTypes.STRING
+ },
+ debug: {
+ type: Sequelize.DataTypes.STRING
}
});
diff --git a/src/jobs/models/dockerHubConnector.js b/src/jobs/models/dockerHubConnector.js
index c40df7a80..4b6001962 100644
--- a/src/jobs/models/dockerHubConnector.js
+++ b/src/jobs/models/dockerHubConnector.js
@@ -1,14 +1,14 @@
const requestSender = require('../../common/requestSender'),
configHandler = require('../../configManager/models/configHandler'),
+ configConstants = require('../../common/consts').CONFIG,
LATEST = 'latest';
module.exports.getMostRecentRunnerTag = async () => {
- const configData = await configHandler.getConfig();
- let dockerImageToUse = configData.docker_name;
- if (!configData.docker_name.includes(':')) {
+ let dockerImageToUse = await configHandler.getConfigValue(configConstants.RUNNER_DOCKER_IMAGE);
+ if (!dockerImageToUse.includes(':')) {
let dockerHubInfo = await requestSender.send({
method: 'GET',
- url: `https://hub.docker.com/v2/repositories/${configData.docker_name}/tags`,
+ url: `https://hub.docker.com/v2/repositories/${dockerImageToUse}/tags`,
json: true
});
let newestVersion = dockerHubInfo.results.map(version => version.name)
@@ -17,12 +17,12 @@ module.exports.getMostRecentRunnerTag = async () => {
.pop();
if (!newestVersion && !dockerHubInfo.results.find((version) => version.name === LATEST)) {
- throw new Error(`No docker found for ${configData.docker_name}`);
+ throw new Error(`No docker found for ${dockerImageToUse}`);
} else if (!newestVersion) {
newestVersion = LATEST;
}
- dockerImageToUse = `${configData.docker_name}:${newestVersion}`;
+ dockerImageToUse = `${dockerImageToUse}:${newestVersion}`;
}
return dockerImageToUse;
diff --git a/src/jobs/models/jobManager.js b/src/jobs/models/jobManager.js
index dc61cb71f..c0e4fba2e 100644
--- a/src/jobs/models/jobManager.js
+++ b/src/jobs/models/jobManager.js
@@ -155,7 +155,9 @@ function createResponse(jobId, jobBody, runId) {
arrival_rate: jobBody.arrival_rate,
duration: jobBody.duration,
environment: jobBody.environment,
- notes: jobBody.notes
+ notes: jobBody.notes,
+ proxy_url: jobBody.proxy_url,
+ debug: jobBody.debug
};
Object.keys(response).forEach(key => {
@@ -188,6 +190,7 @@ function createJobRequest(jobId, runId, jobBody, dockerImage, configData) {
ENVIRONMENT: jobBody.environment,
TEST_ID: jobBody.test_id,
PREDATOR_URL: configData.internal_address,
+ DELAY_RUNNER_MS: configData.delay_runner_ms,
ARRIVAL_RATE: arrivalRatePerRunner.toString(),
DURATION: jobBody.duration.toString()
};
@@ -201,6 +204,12 @@ function createJobRequest(jobId, runId, jobBody, dockerImage, configData) {
environmentVariables.METRICS_EXPORT_CONFIG = Buffer.from(metricsExport).toString('base64');
}
+ if (jobBody.proxy_url) {
+ environmentVariables.PROXY_URL = jobBody.proxy_url;
+ }
+ if (jobBody.debug) {
+ environmentVariables.DEBUG = jobBody.debug;
+ }
if (jobBody.emails) {
environmentVariables.EMAILS = jobBody.emails.join(';');
}
diff --git a/src/reports/models/database/cassandra/cassandraConnector.js b/src/reports/models/database/cassandra/cassandraConnector.js
index 1a8bc8b20..a5a7f61c3 100644
--- a/src/reports/models/database/cassandra/cassandraConnector.js
+++ b/src/reports/models/database/cassandra/cassandraConnector.js
@@ -12,7 +12,8 @@ const GET_LAST_SUMMARIES = 'SELECT * FROM last_reports LIMIT ?';
const INSERT_REPORT_STATS = 'INSERT INTO reports_stats(runner_id, test_id, report_id, stats_id, stats_time, phase_index, phase_status, data) values(?,?,?,?,?,?,?,?)';
const GET_REPORT_STATS = 'SELECT * FROM reports_stats WHERE test_id=? AND report_id=?';
const SUBSCRIBE_RUNNER = 'INSERT INTO report_subscribers(test_id, report_id, runner_id, phase_status) values(?,?,?,?)';
-const UPDATE_SUBSCRIBERS = 'UPDATE report_subscribers SET phase_status=?, last_stats=? WHERE test_id=? AND report_id=? AND runner_id=?';
+const UPDATE_SUBSCRIBER_WITH_STATS = 'UPDATE report_subscribers SET phase_status=?, last_stats=? WHERE test_id=? AND report_id=? AND runner_id=?';
+const UPDATE_SUBSCRIBER = 'UPDATE report_subscribers SET phase_status=? WHERE test_id=? AND report_id=? AND runner_id=?';
const GET_REPORT_SUBSCRIBERS = 'SELECT * FROM report_subscribers WHERE test_id=? AND report_id=?';
module.exports = {
@@ -25,7 +26,8 @@ module.exports = {
insertStats,
getStats,
subscribeRunner,
- updateSubscribers
+ updateSubscriberWithStats,
+ updateSubscriber
};
let queryOptions = {
@@ -86,10 +88,16 @@ function subscribeRunner(testId, reportId, runnerId, phaseStatus) {
return executeQuery(SUBSCRIBE_RUNNER, params, queryOptions);
}
-async function updateSubscribers(testId, reportId, runnerId, phaseStatus, lastStats) {
+async function updateSubscriberWithStats(testId, reportId, runnerId, phaseStatus, lastStats) {
let params;
params = [phaseStatus, lastStats, testId, reportId, runnerId];
- return executeQuery(UPDATE_SUBSCRIBERS, params, queryOptions);
+ return executeQuery(UPDATE_SUBSCRIBER_WITH_STATS, params, queryOptions);
+}
+
+async function updateSubscriber(testId, reportId, runnerId, phaseStatus) {
+ let params;
+ params = [phaseStatus, testId, reportId, runnerId];
+ return executeQuery(UPDATE_SUBSCRIBER, params, queryOptions);
}
function getReportSubscribers(testId, reportId) {
diff --git a/src/reports/models/database/sequelize/sequelizeConnector.js b/src/reports/models/database/sequelize/sequelizeConnector.js
index cd7fab858..c621773b3 100644
--- a/src/reports/models/database/sequelize/sequelizeConnector.js
+++ b/src/reports/models/database/sequelize/sequelizeConnector.js
@@ -16,7 +16,8 @@ module.exports = {
getLastReports,
getStats,
subscribeRunner,
- updateSubscribers
+ updateSubscriberWithStats,
+ updateSubscriber
};
async function init(sequlizeClient) {
@@ -95,26 +96,20 @@ async function subscribeRunner(testId, reportId, runnerId) {
return reportToSubscribeRunner.createSubscriber(newSubscriber);
}
-async function updateSubscribers(testId, reportId, runnerId, phaseStatus, lastStats) {
- const reportModel = client.model('report');
- const getReportOptions = {
- where: {
- test_id: testId,
- report_id: reportId
- }
- };
- let report = await reportModel.findAll(getReportOptions);
- report = report[0];
-
- const subscribers = await report.getSubscribers();
- const subscriberToUpdate = await subscribers.find((subscriber) => {
- return subscriber.dataValues.runner_id === runnerId;
- });
+async function updateSubscriberWithStats(testId, reportId, runnerId, phaseStatus, lastStats) {
+ const subscriberToUpdate = await getSubscriber(testId, reportId, runnerId);
await subscriberToUpdate.set({ 'phase_status': phaseStatus, last_stats: lastStats });
return subscriberToUpdate.save();
}
+async function updateSubscriber(testId, reportId, runnerId, phaseStatus) {
+ const subscriberToUpdate = await getSubscriber(testId, reportId, runnerId);
+
+ await subscriberToUpdate.set({ 'phase_status': phaseStatus });
+ return subscriberToUpdate.save();
+}
+
async function getReportsAndParse(query) {
const report = client.model('report');
@@ -265,4 +260,22 @@ async function initSchemas() {
await report.sync();
await stats.sync();
await subscriber.sync();
-}
\ No newline at end of file
+}
+
+async function getSubscriber(testId, reportId, runnerId) {
+ const reportModel = client.model('report');
+ const getReportOptions = {
+ where: {
+ test_id: testId,
+ report_id: reportId
+ }
+ };
+ let report = await reportModel.findAll(getReportOptions);
+ report = report[0];
+
+ const subscribers = await report.getSubscribers();
+ const subscriberToUpdate = await subscribers.find((subscriber) => {
+ return subscriber.dataValues.runner_id === runnerId;
+ });
+ return subscriberToUpdate;
+}
diff --git a/src/reports/models/databaseConnector.js b/src/reports/models/databaseConnector.js
index ac70785d9..224fe652e 100644
--- a/src/reports/models/databaseConnector.js
+++ b/src/reports/models/databaseConnector.js
@@ -14,7 +14,9 @@ module.exports = {
getLastReports,
getStats,
subscribeRunner,
- updateSubscribers
+ updateSubscriberWithStats,
+ updateSubscriber
+
};
function insertReport(testId, revisionId, reportId, jobId, testType, phase, startTime, testName, testDescription, testConfiguration, notes, lastUpdatedAt) {
@@ -49,6 +51,10 @@ function subscribeRunner(testId, reportId, runnerId, phaseStatus) {
return databaseConnector.subscribeRunner(testId, reportId, runnerId, phaseStatus);
}
-function updateSubscribers(testId, reportId, runnerId, phaseStatus, lastStats) {
- return databaseConnector.updateSubscribers(testId, reportId, runnerId, phaseStatus, lastStats);
+function updateSubscriberWithStats(testId, reportId, runnerId, phaseStatus, lastStats) {
+ return databaseConnector.updateSubscriberWithStats(testId, reportId, runnerId, phaseStatus, lastStats);
+}
+
+function updateSubscriber(testId, reportId, runnerId, phaseStatus) {
+ return databaseConnector.updateSubscriber(testId, reportId, runnerId, phaseStatus);
}
\ No newline at end of file
diff --git a/src/reports/models/reportsManager.js b/src/reports/models/reportsManager.js
index 10dce32e6..814ec8627 100644
--- a/src/reports/models/reportsManager.js
+++ b/src/reports/models/reportsManager.js
@@ -72,7 +72,12 @@ module.exports.postReport = async (testId, reportBody) => {
module.exports.postStats = async (report, stats) => {
const statsParsed = JSON.parse(stats.data);
const statsTime = statsParsed.timestamp;
- await databaseConnector.updateSubscribers(report.test_id, report.report_id, stats.runner_id, stats.phase_status, stats.data);
+
+ if (stats.phase_status === constants.SUBSCRIBER_DONE_STAGE) {
+ await databaseConnector.updateSubscriber(report.test_id, report.report_id, stats.runner_id, stats.phase_status);
+ } else {
+ await databaseConnector.updateSubscriberWithStats(report.test_id, report.report_id, stats.runner_id, stats.phase_status, stats.data);
+ }
if (stats.phase_status === constants.SUBSCRIBER_INTERMEDIATE_STAGE || stats.phase_status === constants.SUBSCRIBER_FIRST_INTERMEDIATE_STAGE) {
await databaseConnector.insertStats(stats.runner_id, report.test_id, report.report_id, uuid(), statsTime, report.phase, stats.phase_status, stats.data);
diff --git a/tests/integration-tests/configManager/configHandler-test.js b/tests/integration-tests/configManager/configHandler-test.js
index db4fc9465..1a649e6ee 100644
--- a/tests/integration-tests/configManager/configHandler-test.js
+++ b/tests/integration-tests/configManager/configHandler-test.js
@@ -7,10 +7,11 @@ const configValues = require('../../../src/common/consts').CONFIG;
const defaultBody = {
internal_address: 'http://localhost:80',
- docker_name: 'zooz/predator-runner:latest',
+ runner_docker_image: 'zooz/predator-runner:latest',
job_platform: process.env.JOB_PLATFORM || 'DOCKER',
runner_cpu: 1,
- runner_memory: 2048,
+ runner_memory: 256,
+ delay_runner_ms: 0,
minimum_wait_for_delayed_report_status_update_in_ms: 30000
};
const updateBodyWithTypes = {
@@ -32,17 +33,18 @@ const updateBodyWithTypes = {
password: 'string_value',
timeout: 2
},
- runner_memory: 2
+ runner_memory: 256
};
const requestBody =
{
grafana_url: 'string_value_grafana_url',
internal_address: 'string_value_internal_address',
- docker_name: 'string_value_docker_name',
+ runner_docker_image: 'string_value_docker_name',
job_platform: 'string_value_job_platform',
+ delay_runner_ms: 0,
runner_cpu: 0,
- runner_memory: 0,
+ runner_memory: 256,
metrics_plugin_name: 'prometheus',
default_email_address: 'string_value_default_email_address',
default_webhook_url: 'string_value_default_webhook_url',
@@ -149,6 +151,25 @@ describe('update and get config', () => {
should(response.body.message).eql(validationError);
});
});
+
+ describe('Update config with values below minimum', () => {
+ it('params below minimum', async () => {
+ let response = await configRequestCreator.updateConfig({
+ runner_memory: 100,
+ runner_cpu: -1,
+ minimum_wait_for_delayed_report_status_update_in_ms: -1,
+ delay_runner_ms: -1
+ });
+ should(response.statusCode).eql(400);
+ should(response.body.message).eql(validationError);
+ should(response.body.validation_errors).eql([
+ 'body/runner_cpu should be >= 0',
+ 'body/runner_memory should be >= 128',
+ 'body/minimum_wait_for_delayed_report_status_update_in_ms should be >= 0',
+ 'body/delay_runner_ms should be >= 0'
+ ]);
+ });
+ });
});
async function cleanData() {
diff --git a/tests/integration-tests/jobs/createJobDocker-test.js b/tests/integration-tests/jobs/createJobDocker-test.js
index 30b6d56b9..6e4f61c41 100644
--- a/tests/integration-tests/jobs/createJobDocker-test.js
+++ b/tests/integration-tests/jobs/createJobDocker-test.js
@@ -47,7 +47,9 @@ describe('Create job specific docker tests', async function () {
test_id: testId,
duration: 1,
arrival_rate: 1,
- max_virtual_users: 100
+ max_virtual_users: 100,
+ proxy_url: 'http://proxy.com',
+ debug: '*'
};
});
after(async () => {
@@ -76,7 +78,9 @@ describe('Create job specific docker tests', async function () {
duration: 1,
environment: 'test',
run_immediately: true,
- max_virtual_users: 100
+ max_virtual_users: 100,
+ proxy_url: 'http://proxy.com',
+ debug: '*'
};
createJobResponse = await schedulerRequestCreator.createJob(validBody, {
@@ -111,7 +115,7 @@ describe('Create job specific docker tests', async function () {
it('Get logs', async () => {
let logs = await schedulerRequestCreator.getLogs(createJobResponse.body.id, createJobResponse.body.run_id, {});
should(logs.status).eql(200);
- should(logs.headers['content-type']).eql('application/zip')
+ should(logs.headers['content-type']).eql('application/zip');
});
it('Stop run', async () => {
diff --git a/tests/unit-tests/configManager/configHandler-test.js b/tests/unit-tests/configManager/configHandler-test.js
index 42d6cf07c..f9d3dcd80 100644
--- a/tests/unit-tests/configManager/configHandler-test.js
+++ b/tests/unit-tests/configManager/configHandler-test.js
@@ -11,10 +11,11 @@ const configConstants = require('../../../src/common/consts').CONFIG;
let manager;
const defaultConfig = {
+ delay_runner_ms: 0,
job_platform: 'DOCKER',
- docker_name: 'zooz/predator-runner:latest',
+ runner_docker_image: 'zooz/predator-runner:latest',
runner_cpu: 1,
- runner_memory: 2048,
+ runner_memory: 256,
smtp_server: {
timeout: 200
},
@@ -22,10 +23,11 @@ const defaultConfig = {
};
const defaultConfigNotEscaped = {
+ delay_runner_ms: 0,
job_platform: 'DOCKER',
- docker_name: 'zooz/predator-runner:latest',
+ runner_docker_image: 'zooz/predator-runner:latest',
runner_cpu: 1,
- runner_memory: 2048,
+ runner_memory: 256,
smtp_server: {
from: undefined,
host: undefined,
@@ -50,10 +52,11 @@ const configResponseParseObject = {
};
const configParseExpected = {
+ delay_runner_ms: 0,
job_platform: 'DOCKER',
- docker_name: 'zooz/predator-runner:latest',
+ runner_docker_image: 'zooz/predator-runner:latest',
runner_cpu: 5,
- runner_memory: 2048,
+ runner_memory: 256,
smtp_server: {
host: 'test',
port: 'test',
@@ -70,11 +73,12 @@ const convertObjectDBData = {
minimum_wait_for_delayed_report_status_update_in_ms: 30000
};
const resultAfterConvert = {
+ delay_runner_ms: 0,
job_platform: 'DOCKER',
- docker_name: 'zooz/predator-runner:latest',
+ runner_docker_image: 'zooz/predator-runner:latest',
grafana_url: 'test_grafana_url',
runner_cpu: 2,
- runner_memory: 2048,
+ runner_memory: 256,
smtp_server: {
timeout: 200
},
diff --git a/tests/unit-tests/configManager/helpers/configDataMap-test.js b/tests/unit-tests/configManager/helpers/configDataMap-test.js
index 70a0e3ad7..83e5ba33a 100644
--- a/tests/unit-tests/configManager/helpers/configDataMap-test.js
+++ b/tests/unit-tests/configManager/helpers/configDataMap-test.js
@@ -4,13 +4,13 @@ const should = require('should');
const rewire = require('rewire');
const configConstants = require('../../../../src/common/consts').CONFIG;
-const valuesToCheck = ['grafana_url', 'internal_address', 'docker_name', 'job_platform', 'runner_memory', 'runner_cpu', 'metrics_plugin_name', 'minimum_wait_for_delayed_report_status_update_in_ms'];
+const valuesToCheck = ['grafana_url', 'internal_address', 'runner_docker_image', 'job_platform', 'runner_memory', 'runner_cpu', 'metrics_plugin_name', 'minimum_wait_for_delayed_report_status_update_in_ms'];
let manager;
const expectedTypes = {
grafana_url: undefined,
internal_address: undefined,
- docker_name: undefined,
+ runner_docker_image: undefined,
job_platform: undefined,
runner_memory: 'int',
runner_cpu: 'int',
@@ -20,13 +20,14 @@ const expectedTypes = {
default_webhook_url: undefined,
influx_metrics: 'json',
prometheus_metrics: 'json',
- smtp_server: 'json'
+ smtp_server: 'json',
+ delay_runner_ms: 'int'
};
function changeAllEnvData() {
process.env.GRAFANA_URL = 'grafana_url_test';
process.env.INTERNAL_ADDRESS = 'internal_address_test';
- process.env.DOCKER_NAME = 'docker_name_test';
+ process.env.RUNNER_DOCKER_IMAGE = 'runner_docker_image_test';
process.env.JOB_PLATFORM = 'job_platform_test';
process.env.RUNNER_CPU = 'runner_cpu_test';
process.env.RUNNER_MEMORY = 'runner_memory_test';
diff --git a/tests/unit-tests/jobs/cassandra/cassandra-test.js b/tests/unit-tests/jobs/cassandra/cassandra-test.js
index 14b3f8a23..501b4ab38 100644
--- a/tests/unit-tests/jobs/cassandra/cassandra-test.js
+++ b/tests/unit-tests/jobs/cassandra/cassandra-test.js
@@ -48,7 +48,7 @@ describe('Cassandra client tests', function() {
let id = uuid.v4();
let testId = uuid.v4();
- let query = 'INSERT INTO jobs(id, test_id, arrival_rate, cron_expression, duration, emails, environment, ramp_to, webhooks, parallelism, max_virtual_users, notes) values(?,?,?,?,?,?,?,?,?,?,?,?)';
+ let query = 'INSERT INTO jobs(id, test_id, arrival_rate, cron_expression, duration, emails, environment, ramp_to, webhooks, parallelism, max_virtual_users, notes, proxy_url, debug) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
return cassandraClient.insertJob(id, { test_id: testId, arrival_rate: 1, duration: 1, cron_expression: '* * * *', emails: {}, environment: 'test', ramp_to: '1', webhooks: 1, parallelism: 3, max_virtual_users: 500, notes: 'hello' })
.then(function(){
loggerErrorStub.callCount.should.eql(0);
diff --git a/tests/unit-tests/jobs/helpers/dockerHubConnector-test.js b/tests/unit-tests/jobs/helpers/dockerHubConnector-test.js
index 622490023..da01dad4a 100644
--- a/tests/unit-tests/jobs/helpers/dockerHubConnector-test.js
+++ b/tests/unit-tests/jobs/helpers/dockerHubConnector-test.js
@@ -16,8 +16,8 @@ describe('Docker hub connector tests', () => {
beforeEach(() => {
dockerHubConnector.__set__('configHandler', {
- getConfig: () => {
- return { docker_name: 'runner' };
+ getConfigValue: () => {
+ return 'runner';
}
});
sandbox.resetHistory();
@@ -29,8 +29,8 @@ describe('Docker hub connector tests', () => {
it('Docker version is provided, no need to fetch latest version', async () => {
dockerHubConnector.__set__('configHandler', {
- getConfig: () => {
- return { docker_name: 'zooz/predator-runner:1.0.0' };
+ getConfigValue: () => {
+ return 'zooz/predator-runner:1.0.0';
}
});
let newestTag = await dockerHubConnector.getMostRecentRunnerTag();
diff --git a/tests/unit-tests/jobs/models/jobManager-test.js b/tests/unit-tests/jobs/models/jobManager-test.js
index 38f27fdcb..8513eb458 100644
--- a/tests/unit-tests/jobs/models/jobManager-test.js
+++ b/tests/unit-tests/jobs/models/jobManager-test.js
@@ -92,7 +92,7 @@ const jobBodyWithCustomEnvVars = {
emails: ['dina@niv.eli'],
environment: 'test',
webhooks: ['dina', 'niv', 'eli'],
- custom_env_vars: {'KEY1': 'A', 'KEY2': 'B'},
+ custom_env_vars: { 'KEY1': 'A', 'KEY2': 'B' },
max_virtual_users: 100
};
@@ -160,7 +160,7 @@ describe('Manager tests', function () {
});
it('Cassandra connector returns an array with job with no schedules', async () => {
- cassandraGetStub.resolves([{cron_expression: null}]);
+ cassandraGetStub.resolves([{ cron_expression: null }]);
await manager.reloadCronJobs();
manager.__get__('cronJobs').should.eql({});
});
@@ -203,8 +203,8 @@ describe('Manager tests', function () {
});
it('Simple request with custom env vars, should save new job to cassandra, deploy the job and return the job id and the job configuration', async () => {
- jobConnectorRunJobStub.resolves({id: 'run_id'});
- cassandraInsertStub.resolves({success: 'success'});
+ jobConnectorRunJobStub.resolves({ id: 'run_id' });
+ cassandraInsertStub.resolves({ success: 'success' });
let expectedResult = {
id: '5a9eee73-cf56-47aa-ac77-fad59e961aaf',
test_id: '5a9eee73-cf56-47aa-ac77-fad59e961aaa',
@@ -243,7 +243,7 @@ describe('Manager tests', function () {
it('Simple request, should save new job to cassandra, deploy the job and return the job id and the job configuration', async () => {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
let expectedResult = {
id: '5a9eee73-cf56-47aa-ac77-fad59e961aaf',
ramp_to: '1',
@@ -263,7 +263,7 @@ describe('Manager tests', function () {
it('Simple request, with parallelism, should save new job to cassandra, deploy the job and return the job id and the job configuration', async () => {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
let expectedResult = {
id: '5a9eee73-cf56-47aa-ac77-fad59e961aaf',
ramp_to: '150',
@@ -300,7 +300,7 @@ describe('Manager tests', function () {
it('Simple request, with parallelism, and arrival rate splits with decimal point, should round up', async () => {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
let expectedResult = {
id: '5a9eee73-cf56-47aa-ac77-fad59e961aaf',
ramp_to: '150',
@@ -336,8 +336,8 @@ describe('Manager tests', function () {
});
it('Simple request without ramp to, should save new job to cassandra, deploy the job and return the job id and the job configuration', async () => {
- jobConnectorRunJobStub.resolves({id: 'run_id'});
- cassandraInsertStub.resolves({success: 'success'});
+ jobConnectorRunJobStub.resolves({ id: 'run_id' });
+ cassandraInsertStub.resolves({ success: 'success' });
let expectedResult = {
id: '5a9eee73-cf56-47aa-ac77-fad59e961aaf',
test_id: '5a9eee73-cf56-47aa-ac77-fad59e961aaa',
@@ -355,27 +355,27 @@ describe('Manager tests', function () {
});
it('Fail to save job to cassandra', function () {
- cassandraInsertStub.rejects({error: 'cassandra error'});
+ cassandraInsertStub.rejects({ error: 'cassandra error' });
return manager.createJob(jobBodyWithoutRampTo)
.catch(function (error) {
jobConnectorRunJobStub.callCount.should.eql(0);
loggerErrorStub.callCount.should.eql(1);
- loggerErrorStub.args[0].should.eql([{error: 'cassandra error'}, 'Error occurred trying to create new job']);
- error.should.eql({error: 'cassandra error'});
+ loggerErrorStub.args[0].should.eql([{ error: 'cassandra error' }, 'Error occurred trying to create new job']);
+ error.should.eql({ error: 'cassandra error' });
});
});
it('Fail to create a job', function () {
- jobConnectorRunJobStub.rejects({error: 'job creator error'});
- cassandraInsertStub.resolves({success: 'success'});
+ jobConnectorRunJobStub.rejects({ error: 'job creator error' });
+ cassandraInsertStub.resolves({ success: 'success' });
return manager.createJob(jobBodyWithoutRampTo)
.catch(function (error) {
jobConnectorRunJobStub.callCount.should.eql(1);
loggerErrorStub.callCount.should.eql(1);
- loggerErrorStub.args[0].should.eql([{error: 'job creator error'}, 'Error occurred trying to create new job']);
- error.should.eql({error: 'job creator error'});
+ loggerErrorStub.args[0].should.eql([{ error: 'job creator error' }, 'Error occurred trying to create new job']);
+ error.should.eql({ error: 'job creator error' });
});
});
@@ -385,7 +385,7 @@ describe('Manager tests', function () {
});
it('Validate response', function () {
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
cassandraDeleteStub.resolves({});
let expectedResult = {
'cron_expression': '* * * * * *',
@@ -427,7 +427,7 @@ describe('Manager tests', function () {
it('Validate response', function () {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
cassandraDeleteStub.resolves({});
let expectedResult = {
cron_expression: '* * * * * *',
@@ -464,7 +464,7 @@ describe('Manager tests', function () {
describe('Request with cron expression, that is not invoked immediately', function () {
it('Validate response', function () {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
cassandraDeleteStub.resolves({});
let date = new Date();
date.setSeconds(date.getSeconds() + 5);
@@ -529,7 +529,7 @@ describe('Manager tests', function () {
it('Should update job successfully', async function () {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
cassandraUpdateJobStub.resolves({});
cassandraGetSingleJobStub.resolves([{
id: '5a9eee73-cf56-47aa-ac77-fad59e961aaf',
@@ -543,7 +543,7 @@ describe('Manager tests', function () {
ramp_to: '1'
}]);
await manager.createJob(jobBodyWithCron);
- await manager.updateJob('5a9eee73-cf56-47aa-ac77-fad59e961aaf', {cron_expression: '20 * * * *'});
+ await manager.updateJob('5a9eee73-cf56-47aa-ac77-fad59e961aaf', { cron_expression: '20 * * * *' });
loggerInfoStub.callCount.should.eql(4);
manager.__get__('cronJobs')[JOB_ID].cronTime.source.should.eql('20 * * * *');
await manager.deleteJob('5a9eee73-cf56-47aa-ac77-fad59e961aaf');
@@ -552,12 +552,12 @@ describe('Manager tests', function () {
it('Updating data in cassandra fails', async function () {
try {
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
- cassandraUpdateJobStub.rejects({error: 'error'});
+ cassandraInsertStub.resolves({ success: 'success' });
+ cassandraUpdateJobStub.rejects({ error: 'error' });
await manager.createJob(jobBodyWithCron);
- await manager.updateJob('5a9eee73-cf56-47aa-ac77-fad59e961aaf', {cron_expression: '20 * * * *'});
+ await manager.updateJob('5a9eee73-cf56-47aa-ac77-fad59e961aaf', { cron_expression: '20 * * * *' });
} catch (error) {
- error.should.eql({error: 'error'});
+ error.should.eql({ error: 'error' });
loggerInfoStub.callCount.should.eql(2);
loggerErrorStub.callCount.should.eql(1);
manager.__get__('cronJobs')[JOB_ID].cronTime.source.should.eql('* * * * * *');
@@ -579,7 +579,7 @@ describe('Manager tests', function () {
});
uuidStub.returns('5a9eee73-cf56-47aa-ac77-fad59e961aaf');
jobConnectorRunJobStub.resolves({});
- cassandraInsertStub.resolves({success: 'success'});
+ cassandraInsertStub.resolves({ success: 'success' });
cassandraDeleteStub.resolves({});
await manager.createJob(jobBodyWithCron);
@@ -603,29 +603,33 @@ describe('Manager tests', function () {
describe('Get jobs', function () {
it('Get a list of all jobs - also one time jobs', async function () {
cassandraGetStub.resolves([{
- id: 'id',
- test_id: 'test_id',
- environment: 'test',
- arrival_rate: 1,
- duration: 1,
- cron_expression: '* * * * *',
- emails: null,
- webhooks: ['dina', 'niv'],
- ramp_to: '1',
- notes: 'some notes'
- },
- {
- id: 'id2',
- test_id: 'test_id2',
- arrival_rate: 1,
- duration: 1,
- environment: 'test',
- cron_expression: null,
- emails: ['eli@eli.eli'],
- webhooks: null,
- ramp_to: '1',
- notes: 'some other notes'
- }]
+ id: 'id',
+ test_id: 'test_id',
+ environment: 'test',
+ arrival_rate: 1,
+ duration: 1,
+ cron_expression: '* * * * *',
+ emails: null,
+ webhooks: ['dina', 'niv'],
+ ramp_to: '1',
+ notes: 'some notes',
+ proxy_url: 'http://proxyUrl.com',
+ debug: '*'
+ },
+ {
+ id: 'id2',
+ test_id: 'test_id2',
+ arrival_rate: 1,
+ duration: 1,
+ environment: 'test',
+ cron_expression: null,
+ emails: ['eli@eli.eli'],
+ webhooks: null,
+ ramp_to: '1',
+ notes: 'some other notes',
+ proxy_url: 'http://proxyUrl.com',
+ debug: '*'
+ }]
);
let expectedResult = [{
@@ -641,7 +645,9 @@ describe('Manager tests', function () {
max_virtual_users: undefined,
parallelism: undefined,
run_id: undefined,
- notes: 'some notes'
+ notes: 'some notes',
+ proxy_url: 'http://proxyUrl.com',
+ debug: '*'
}, {
id: 'id2',
test_id: 'test_id2',
@@ -654,7 +660,9 @@ describe('Manager tests', function () {
max_virtual_users: undefined,
parallelism: undefined,
run_id: undefined,
- notes: 'some other notes'
+ notes: 'some other notes',
+ proxy_url: 'http://proxyUrl.com',
+ debug: '*'
}];
let jobs = await manager.getJobs(true);
jobs.should.eql(expectedResult);
@@ -663,27 +671,27 @@ describe('Manager tests', function () {
it('Get a list of jobs - only scheduled jobs', async function () {
cassandraGetStub.resolves([{
- id: 'id',
- test_id: 'test_id',
- environment: 'test',
- arrival_rate: 1,
- duration: 1,
- cron_expression: '* * * * *',
- emails: null,
- webhooks: ['dina', 'niv'],
- ramp_to: '1'
- },
- {
- id: 'id2',
- test_id: 'test_id2',
- arrival_rate: 1,
- duration: 1,
- environment: 'test',
- cron_expression: null,
- emails: ['eli@eli.eli'],
- webhooks: null,
- ramp_to: '1'
- }]
+ id: 'id',
+ test_id: 'test_id',
+ environment: 'test',
+ arrival_rate: 1,
+ duration: 1,
+ cron_expression: '* * * * *',
+ emails: null,
+ webhooks: ['dina', 'niv'],
+ ramp_to: '1'
+ },
+ {
+ id: 'id2',
+ test_id: 'test_id2',
+ arrival_rate: 1,
+ duration: 1,
+ environment: 'test',
+ cron_expression: null,
+ emails: ['eli@eli.eli'],
+ webhooks: null,
+ ramp_to: '1'
+ }]
);
let expectedResult = [{
@@ -699,7 +707,9 @@ describe('Manager tests', function () {
max_virtual_users: undefined,
parallelism: undefined,
run_id: undefined,
- notes: undefined
+ notes: undefined,
+ proxy_url: undefined,
+ debug: undefined
}];
let jobs = await manager.getJobs();
jobs.should.eql(expectedResult);
@@ -716,14 +726,14 @@ describe('Manager tests', function () {
});
it('Fail to get jobs from cassandra', function () {
- cassandraGetStub.rejects({error: 'cassandra error'});
+ cassandraGetStub.rejects({ error: 'cassandra error' });
return manager.getJobs()
.catch(function (error) {
jobConnectorRunJobStub.callCount.should.eql(0);
loggerErrorStub.callCount.should.eql(1);
- loggerErrorStub.args[0].should.eql([{error: 'cassandra error'}, 'Error occurred trying to get jobs']);
- error.should.eql({error: 'cassandra error'});
+ loggerErrorStub.args[0].should.eql([{ error: 'cassandra error' }, 'Error occurred trying to get jobs']);
+ error.should.eql({ error: 'cassandra error' });
});
});
});
@@ -740,8 +750,9 @@ describe('Manager tests', function () {
emails: null,
webhooks: ['dina', 'niv'],
ramp_to: '1',
- notes: 'some nice notes'
-
+ notes: 'some nice notes',
+ proxy_url: 'http://proxyUrl.com',
+ debug: '*'
}]);
let expectedResult = {
@@ -757,7 +768,9 @@ describe('Manager tests', function () {
max_virtual_users: undefined,
parallelism: undefined,
run_id: undefined,
- notes: 'some nice notes'
+ notes: 'some nice notes',
+ proxy_url: 'http://proxyUrl.com',
+ debug: '*'
};
let job = await manager.getJob('id');
@@ -790,24 +803,24 @@ describe('Manager tests', function () {
});
it('Fail to get jobs from cassandra', function () {
- cassandraGetSingleJobStub.rejects({error: 'cassandra error'});
+ cassandraGetSingleJobStub.rejects({ error: 'cassandra error' });
return manager.getJob('id')
.catch(function (error) {
jobConnectorRunJobStub.callCount.should.eql(0);
loggerErrorStub.callCount.should.eql(1);
- loggerErrorStub.args[0].should.eql([{error: 'cassandra error'}, 'Error occurred trying to get job']);
- error.should.eql({error: 'cassandra error'});
+ loggerErrorStub.args[0].should.eql([{ error: 'cassandra error' }, 'Error occurred trying to get job']);
+ error.should.eql({ error: 'cassandra error' });
});
});
});
describe('Get logs', function () {
it('Success getting logs from job', async function () {
- jobGetLogsStub.resolves([{type: 'file', name: 'log.txt', content: 'this is the log'}]);
+ jobGetLogsStub.resolves([{ type: 'file', name: 'log.txt', content: 'this is the log' }]);
let logs = await manager.getLogs('jobId', 'runId');
logs.should.eql({
- files: [{type: 'file', name: 'log.txt', content: 'this is the log'}],
+ files: [{ type: 'file', name: 'log.txt', content: 'this is the log' }],
filename: 'jobId-runId.zip'
});
});
diff --git a/tests/unit-tests/jobs/sequelize/sequelizeConnector-test.js b/tests/unit-tests/jobs/sequelize/sequelizeConnector-test.js
index c7b456ac3..a143ab012 100644
--- a/tests/unit-tests/jobs/sequelize/sequelizeConnector-test.js
+++ b/tests/unit-tests/jobs/sequelize/sequelizeConnector-test.js
@@ -102,7 +102,9 @@ describe('Sequelize client tests', function () {
webhooks: ['http://zooz.com', 'http://payu.com'],
parallelism: 4,
max_virtual_users: 100,
- notes: 'some nice notes'
+ notes: 'some nice notes',
+ proxy_url: 'http://proxy.com',
+ debug: '*'
});
should(sequelizeCreateStub.args[0][0]).eql({
@@ -116,6 +118,8 @@ describe('Sequelize client tests', function () {
'parallelism': 4,
'notes': 'some nice notes',
'max_virtual_users': 100,
+ 'proxy_url': 'http://proxy.com',
+ 'debug': '*',
'webhooks': [{
'id': 'UUIDSTUB',
'url': 'http://zooz.com'
@@ -148,7 +152,9 @@ describe('Sequelize client tests', function () {
ramp_to: '1',
parallelism: 4,
max_virtual_users: 100,
- notes: 'some notes'
+ notes: 'some notes',
+ proxy_url: 'http://proxy.com',
+ debug: '*'
});
should(sequelizeCreateStub.args[0][0]).eql({
@@ -163,7 +169,9 @@ describe('Sequelize client tests', function () {
'emails': undefined,
'notes': 'some notes',
'parallelism': 4,
- 'max_virtual_users': 100
+ 'max_virtual_users': 100,
+ 'proxy_url': 'http://proxy.com',
+ 'debug': '*'
});
});
@@ -460,7 +468,9 @@ describe('Sequelize client tests', function () {
environment: 'test',
ramp_to: '1',
max_virtual_users: 500,
- parallelism: 3
+ parallelism: 3,
+ proxy_url: 'http://proxy.com',
+ debug: '*'
});
should(sequelizeUpdateStub.args[0][0]).eql({
@@ -471,7 +481,9 @@ describe('Sequelize client tests', function () {
'environment': 'test',
'ramp_to': '1',
'max_virtual_users': 500,
- 'parallelism': 3
+ 'parallelism': 3,
+ 'proxy_url': 'http://proxy.com',
+ 'debug': '*'
});
should(sequelizeUpdateStub.args[0][1]).eql({
diff --git a/tests/unit-tests/reporter/cassandra/cassandra-test.js b/tests/unit-tests/reporter/cassandra/cassandra-test.js
index dc9873a92..86c45328a 100644
--- a/tests/unit-tests/reporter/cassandra/cassandra-test.js
+++ b/tests/unit-tests/reporter/cassandra/cassandra-test.js
@@ -41,7 +41,7 @@ const REPORT = {
'Create token and get token': 173732,
'Create token, create customer and assign token to customer': 115716
},
- 'errors': {EAI_AGAIN: 112, NOTREACH: 123 },
+ 'errors': { EAI_AGAIN: 112, NOTREACH: 123 },
'codes': {
'200': 173732,
'201': 520878,
@@ -283,12 +283,28 @@ describe('Cassandra client tests', function() {
});
describe('Update Subscriber', function(){
- it('should update subscriber stage in report', function(){
+ it('should update subscriber stage in report without stats', function(){
+ let cassandraResponse = { rows: [REPORT] };
+ clientExecuteStub.resolves(cassandraResponse);
+
+ let query = 'UPDATE report_subscribers SET phase_status=? WHERE test_id=? AND report_id=? AND runner_id=?';
+ return cassandraClient.updateSubscriber('test_id', 'report_id', 'runner_id', 'intermediate')
+ .then(function(result){
+ loggerErrorStub.callCount.should.eql(0);
+ clientExecuteStub.getCall(0).args[0].should.eql(query);
+ clientExecuteStub.getCall(0).args[1][0].should.eql('intermediate');
+ clientExecuteStub.getCall(0).args[1][1].should.eql('test_id');
+ clientExecuteStub.getCall(0).args[1][2].should.eql('report_id');
+ clientExecuteStub.getCall(0).args[1][3].should.eql('runner_id');
+ });
+ });
+
+ it('should update subscriber stage in report with stats', function(){
let cassandraResponse = { rows: [REPORT] };
clientExecuteStub.resolves(cassandraResponse);
let query = 'UPDATE report_subscribers SET phase_status=?, last_stats=? WHERE test_id=? AND report_id=? AND runner_id=?';
- return cassandraClient.updateSubscribers('test_id', 'report_id', 'runner_id', 'intermediate', 'last_stats')
+ return cassandraClient.updateSubscriberWithStats('test_id', 'report_id', 'runner_id', 'intermediate', 'last_stats')
.then(function(result){
loggerErrorStub.callCount.should.eql(0);
clientExecuteStub.getCall(0).args[0].should.eql(query);
diff --git a/tests/unit-tests/reporter/models/reportsManager-test.js b/tests/unit-tests/reporter/models/reportsManager-test.js
index 895ebe7b1..804f309b5 100644
--- a/tests/unit-tests/reporter/models/reportsManager-test.js
+++ b/tests/unit-tests/reporter/models/reportsManager-test.js
@@ -55,7 +55,8 @@ describe('Reports manager tests', function () {
let databasePostReportStub;
let databasePostStatsStub;
let databaseSubscribeRunnerStub;
- let databaseUpdateSubscribersStub;
+ let databaseUpdateSubscriberStub;
+ let databaseUpdateSubscriberWithStatsStub;
let databaseUpdateReportStub;
let getJobStub;
let configStub;
@@ -70,7 +71,8 @@ describe('Reports manager tests', function () {
databasePostReportStub = sandbox.stub(databaseConnector, 'insertReport');
databasePostStatsStub = sandbox.stub(databaseConnector, 'insertStats');
databaseSubscribeRunnerStub = sandbox.stub(databaseConnector, 'subscribeRunner');
- databaseUpdateSubscribersStub = sandbox.stub(databaseConnector, 'updateSubscribers');
+ databaseUpdateSubscriberStub = sandbox.stub(databaseConnector, 'updateSubscriber');
+ databaseUpdateSubscriberWithStatsStub = sandbox.stub(databaseConnector, 'updateSubscriberWithStats');
databaseUpdateReportStub = sandbox.stub(databaseConnector, 'updateReport');
loggerErrorStub = sandbox.stub(logger, 'error');
loggerInfoStub = sandbox.stub(logger, 'info');
@@ -352,16 +354,36 @@ describe('Reports manager tests', function () {
});
describe('Create new stats', function () {
- it('Stats consumer handles message', async () => {
+ it('Stats consumer handles message with status intermediate', async () => {
configStub.resolves({});
databaseGetReportStub.resolves([REPORT]);
databasePostStatsStub.resolves();
getJobStub.resolves(JOB);
- databaseUpdateSubscribersStub.resolves();
notifierStub.resolves();
const stats = { phase_status: 'intermediate', data: JSON.stringify({ median: 4 }) };
const statsResponse = await manager.postStats('test_id', stats);
+
+ databaseUpdateSubscriberStub.callCount.should.eql(0);
+ databaseUpdateSubscriberWithStatsStub.callCount.should.eql(1);
+
+ should.exist(statsResponse);
+ statsResponse.should.eql(stats);
+ });
+
+ it('Stats consumer handles message with status done', async () => {
+ configStub.resolves({});
+ databaseGetReportStub.resolves([REPORT]);
+ databasePostStatsStub.resolves();
+ getJobStub.resolves(JOB);
+ notifierStub.resolves();
+ const stats = { phase_status: 'done', data: JSON.stringify({ median: 4 }) };
+
+ const statsResponse = await manager.postStats('test_id', stats);
+
+ databaseUpdateSubscriberStub.callCount.should.eql(1);
+ databaseUpdateSubscriberWithStatsStub.callCount.should.eql(0);
+
should.exist(statsResponse);
statsResponse.should.eql(stats);
});
diff --git a/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js b/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js
index dbbfa872a..33239cafb 100644
--- a/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js
+++ b/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js
@@ -401,7 +401,29 @@ describe('Sequelize client tests', function () {
});
describe('Update subscribers', () => {
- it('Should successfully subscribe runner', async () => {
+ it('Should successfully update subscriber with stats', async () => {
+ sequelizeGetSubscribersStatsStub.resolves([{
+ dataValues: {
+ runner_id: 'runner_id',
+ phase_status: 'initializing'
+ },
+ set: () => {
+ },
+ save: () => {
+ }
+ }]);
+
+
+ let sequelizeResponse = [{
+ dataValues: {
+ },
+ getSubscribers: sequelizeGetSubscribersStatsStub
+ }];
+
+ sequelizeGetStub.resolves(sequelizeResponse);
+ await sequelizeConnector.updateSubscriberWithStats('test_id', 'report_id', 'runner_id', 'started_phase', {codes: {}, errors: {}});
+ });
+ it('Should successfully update subscriber without stats', async () => {
sequelizeGetSubscribersStatsStub.resolves([{
dataValues: {
runner_id: 'runner_id',
@@ -416,23 +438,13 @@ describe('Sequelize client tests', function () {
let sequelizeResponse = [{
dataValues: {
- reportId,
- testId,
- jobId,
- revisionId,
- testType,
- startTime,
- testName,
- testDescription,
- testConfiguration,
- notes
},
getSubscribers: sequelizeGetSubscribersStatsStub,
- createSubscriber: sequelizeCreateSubscriberStatsStub
}];
sequelizeGetStub.resolves(sequelizeResponse);
- await sequelizeConnector.updateSubscribers('test_id', 'report_id', 'runner_id', 'started_phase');
+ await sequelizeConnector.updateSubscriber('test_id', 'report_id', 'runner_id', 'started_phase');
});
+
});
});
\ No newline at end of file