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