apisonator 2.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +317 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.base +65 -0
  5. data/Gemfile.lock +319 -0
  6. data/Gemfile.on_prem +1 -0
  7. data/Gemfile.on_prem.lock +297 -0
  8. data/LICENSE +202 -0
  9. data/NOTICE +15 -0
  10. data/README.md +230 -0
  11. data/Rakefile +287 -0
  12. data/apisonator.gemspec +47 -0
  13. data/app/api/api.rb +13 -0
  14. data/app/api/internal/alert_limits.rb +32 -0
  15. data/app/api/internal/application_keys.rb +49 -0
  16. data/app/api/internal/application_referrer_filters.rb +43 -0
  17. data/app/api/internal/applications.rb +77 -0
  18. data/app/api/internal/errors.rb +54 -0
  19. data/app/api/internal/events.rb +42 -0
  20. data/app/api/internal/internal.rb +104 -0
  21. data/app/api/internal/metrics.rb +40 -0
  22. data/app/api/internal/service_tokens.rb +46 -0
  23. data/app/api/internal/services.rb +58 -0
  24. data/app/api/internal/stats.rb +42 -0
  25. data/app/api/internal/usagelimits.rb +62 -0
  26. data/app/api/internal/utilization.rb +23 -0
  27. data/bin/3scale_backend +223 -0
  28. data/bin/3scale_backend_worker +26 -0
  29. data/config.ru +4 -0
  30. data/config/puma.rb +192 -0
  31. data/config/schedule.rb +9 -0
  32. data/ext/mkrf_conf.rb +64 -0
  33. data/lib/3scale/backend.rb +67 -0
  34. data/lib/3scale/backend/alert_limit.rb +56 -0
  35. data/lib/3scale/backend/alerts.rb +137 -0
  36. data/lib/3scale/backend/analytics/kinesis.rb +3 -0
  37. data/lib/3scale/backend/analytics/kinesis/adapter.rb +180 -0
  38. data/lib/3scale/backend/analytics/kinesis/exporter.rb +86 -0
  39. data/lib/3scale/backend/analytics/kinesis/job.rb +135 -0
  40. data/lib/3scale/backend/analytics/redshift.rb +3 -0
  41. data/lib/3scale/backend/analytics/redshift/adapter.rb +367 -0
  42. data/lib/3scale/backend/analytics/redshift/importer.rb +83 -0
  43. data/lib/3scale/backend/analytics/redshift/job.rb +33 -0
  44. data/lib/3scale/backend/application.rb +330 -0
  45. data/lib/3scale/backend/application_events.rb +76 -0
  46. data/lib/3scale/backend/background_job.rb +65 -0
  47. data/lib/3scale/backend/configurable.rb +20 -0
  48. data/lib/3scale/backend/configuration.rb +151 -0
  49. data/lib/3scale/backend/configuration/loader.rb +42 -0
  50. data/lib/3scale/backend/constants.rb +19 -0
  51. data/lib/3scale/backend/cors.rb +84 -0
  52. data/lib/3scale/backend/distributed_lock.rb +67 -0
  53. data/lib/3scale/backend/environment.rb +21 -0
  54. data/lib/3scale/backend/error_storage.rb +52 -0
  55. data/lib/3scale/backend/errors.rb +343 -0
  56. data/lib/3scale/backend/event_storage.rb +120 -0
  57. data/lib/3scale/backend/experiment.rb +84 -0
  58. data/lib/3scale/backend/extensions.rb +5 -0
  59. data/lib/3scale/backend/extensions/array.rb +19 -0
  60. data/lib/3scale/backend/extensions/hash.rb +26 -0
  61. data/lib/3scale/backend/extensions/nil_class.rb +13 -0
  62. data/lib/3scale/backend/extensions/redis.rb +44 -0
  63. data/lib/3scale/backend/extensions/string.rb +13 -0
  64. data/lib/3scale/backend/extensions/time.rb +110 -0
  65. data/lib/3scale/backend/failed_jobs_scheduler.rb +141 -0
  66. data/lib/3scale/backend/job_fetcher.rb +122 -0
  67. data/lib/3scale/backend/listener.rb +728 -0
  68. data/lib/3scale/backend/listener_metrics.rb +99 -0
  69. data/lib/3scale/backend/logging.rb +48 -0
  70. data/lib/3scale/backend/logging/external.rb +44 -0
  71. data/lib/3scale/backend/logging/external/impl.rb +93 -0
  72. data/lib/3scale/backend/logging/external/impl/airbrake.rb +66 -0
  73. data/lib/3scale/backend/logging/external/impl/bugsnag.rb +69 -0
  74. data/lib/3scale/backend/logging/external/impl/default.rb +18 -0
  75. data/lib/3scale/backend/logging/external/resque.rb +57 -0
  76. data/lib/3scale/backend/logging/logger.rb +18 -0
  77. data/lib/3scale/backend/logging/middleware.rb +62 -0
  78. data/lib/3scale/backend/logging/middleware/json_writer.rb +21 -0
  79. data/lib/3scale/backend/logging/middleware/text_writer.rb +60 -0
  80. data/lib/3scale/backend/logging/middleware/writer.rb +143 -0
  81. data/lib/3scale/backend/logging/worker.rb +107 -0
  82. data/lib/3scale/backend/manifest.rb +80 -0
  83. data/lib/3scale/backend/memoizer.rb +277 -0
  84. data/lib/3scale/backend/metric.rb +275 -0
  85. data/lib/3scale/backend/metric/collection.rb +91 -0
  86. data/lib/3scale/backend/oauth.rb +4 -0
  87. data/lib/3scale/backend/oauth/token.rb +26 -0
  88. data/lib/3scale/backend/oauth/token_key.rb +30 -0
  89. data/lib/3scale/backend/oauth/token_storage.rb +313 -0
  90. data/lib/3scale/backend/oauth/token_value.rb +25 -0
  91. data/lib/3scale/backend/period.rb +3 -0
  92. data/lib/3scale/backend/period/boundary.rb +107 -0
  93. data/lib/3scale/backend/period/cache.rb +28 -0
  94. data/lib/3scale/backend/period/period.rb +402 -0
  95. data/lib/3scale/backend/queue_storage.rb +16 -0
  96. data/lib/3scale/backend/rack.rb +49 -0
  97. data/lib/3scale/backend/rack/exception_catcher.rb +136 -0
  98. data/lib/3scale/backend/rack/internal_error_catcher.rb +23 -0
  99. data/lib/3scale/backend/rack/prometheus.rb +19 -0
  100. data/lib/3scale/backend/saas.rb +6 -0
  101. data/lib/3scale/backend/saas_analytics.rb +4 -0
  102. data/lib/3scale/backend/server.rb +30 -0
  103. data/lib/3scale/backend/server/falcon.rb +52 -0
  104. data/lib/3scale/backend/server/puma.rb +71 -0
  105. data/lib/3scale/backend/service.rb +317 -0
  106. data/lib/3scale/backend/service_token.rb +97 -0
  107. data/lib/3scale/backend/stats.rb +8 -0
  108. data/lib/3scale/backend/stats/aggregator.rb +170 -0
  109. data/lib/3scale/backend/stats/aggregators/base.rb +72 -0
  110. data/lib/3scale/backend/stats/aggregators/response_code.rb +58 -0
  111. data/lib/3scale/backend/stats/aggregators/usage.rb +34 -0
  112. data/lib/3scale/backend/stats/bucket_reader.rb +135 -0
  113. data/lib/3scale/backend/stats/bucket_storage.rb +108 -0
  114. data/lib/3scale/backend/stats/cleaner.rb +195 -0
  115. data/lib/3scale/backend/stats/codes_commons.rb +14 -0
  116. data/lib/3scale/backend/stats/delete_job_def.rb +60 -0
  117. data/lib/3scale/backend/stats/key_generator.rb +73 -0
  118. data/lib/3scale/backend/stats/keys.rb +104 -0
  119. data/lib/3scale/backend/stats/partition_eraser_job.rb +58 -0
  120. data/lib/3scale/backend/stats/partition_generator_job.rb +46 -0
  121. data/lib/3scale/backend/stats/period_commons.rb +34 -0
  122. data/lib/3scale/backend/stats/stats_parser.rb +141 -0
  123. data/lib/3scale/backend/stats/storage.rb +113 -0
  124. data/lib/3scale/backend/statsd.rb +14 -0
  125. data/lib/3scale/backend/storable.rb +35 -0
  126. data/lib/3scale/backend/storage.rb +40 -0
  127. data/lib/3scale/backend/storage_async.rb +4 -0
  128. data/lib/3scale/backend/storage_async/async_redis.rb +21 -0
  129. data/lib/3scale/backend/storage_async/client.rb +205 -0
  130. data/lib/3scale/backend/storage_async/pipeline.rb +79 -0
  131. data/lib/3scale/backend/storage_async/resque_extensions.rb +30 -0
  132. data/lib/3scale/backend/storage_helpers.rb +278 -0
  133. data/lib/3scale/backend/storage_key_helpers.rb +9 -0
  134. data/lib/3scale/backend/storage_sync.rb +43 -0
  135. data/lib/3scale/backend/transaction.rb +62 -0
  136. data/lib/3scale/backend/transactor.rb +177 -0
  137. data/lib/3scale/backend/transactor/limit_headers.rb +54 -0
  138. data/lib/3scale/backend/transactor/notify_batcher.rb +139 -0
  139. data/lib/3scale/backend/transactor/notify_job.rb +47 -0
  140. data/lib/3scale/backend/transactor/process_job.rb +33 -0
  141. data/lib/3scale/backend/transactor/report_job.rb +84 -0
  142. data/lib/3scale/backend/transactor/status.rb +236 -0
  143. data/lib/3scale/backend/transactor/usage_report.rb +182 -0
  144. data/lib/3scale/backend/usage.rb +63 -0
  145. data/lib/3scale/backend/usage_limit.rb +115 -0
  146. data/lib/3scale/backend/use_cases/provider_key_change_use_case.rb +60 -0
  147. data/lib/3scale/backend/util.rb +17 -0
  148. data/lib/3scale/backend/validators.rb +26 -0
  149. data/lib/3scale/backend/validators/base.rb +36 -0
  150. data/lib/3scale/backend/validators/key.rb +17 -0
  151. data/lib/3scale/backend/validators/limits.rb +57 -0
  152. data/lib/3scale/backend/validators/oauth_key.rb +15 -0
  153. data/lib/3scale/backend/validators/oauth_setting.rb +15 -0
  154. data/lib/3scale/backend/validators/redirect_uri.rb +33 -0
  155. data/lib/3scale/backend/validators/referrer.rb +60 -0
  156. data/lib/3scale/backend/validators/service_state.rb +15 -0
  157. data/lib/3scale/backend/validators/state.rb +15 -0
  158. data/lib/3scale/backend/version.rb +5 -0
  159. data/lib/3scale/backend/views/oauth_access_tokens.builder +14 -0
  160. data/lib/3scale/backend/views/oauth_app_id_by_token.builder +4 -0
  161. data/lib/3scale/backend/worker.rb +87 -0
  162. data/lib/3scale/backend/worker_async.rb +88 -0
  163. data/lib/3scale/backend/worker_metrics.rb +44 -0
  164. data/lib/3scale/backend/worker_sync.rb +32 -0
  165. data/lib/3scale/bundler_shim.rb +17 -0
  166. data/lib/3scale/prometheus_server.rb +10 -0
  167. data/lib/3scale/tasks/connectivity.rake +41 -0
  168. data/lib/3scale/tasks/helpers.rb +3 -0
  169. data/lib/3scale/tasks/helpers/environment.rb +23 -0
  170. data/lib/3scale/tasks/stats.rake +131 -0
  171. data/lib/3scale/tasks/swagger.rake +46 -0
  172. data/licenses.xml +1215 -0
  173. metadata +227 -0
data/NOTICE ADDED
@@ -0,0 +1,15 @@
1
+ Red Hat 3scale API Management Platform Apisonator
2
+ Copyright (c) 2010-2016 3scale, Inc
3
+ Copyright (c) 2016-2018 Red Hat, Inc.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
@@ -0,0 +1,230 @@
1
+ # Apisonator
2
+
3
+ [![Docker Repository on Quay](https://quay.io/repository/3scale/apisonator/status "Docker Repository on Quay")](https://quay.io/repository/3scale/apisonator)
4
+ [![CircleCI](https://circleci.com/gh/3scale/apisonator.svg?style=shield)](https://circleci.com/gh/3scale/apisonator)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/d2cea8016f0089cb2fd6/maintainability)](https://codeclimate.com/github/3scale/apisonator/maintainability)
6
+
7
+ This software is licensed under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0).
8
+
9
+ See the LICENSE and NOTICE files that should have been provided along with this
10
+ software for details.
11
+
12
+ ## Description
13
+
14
+ This is the Red Hat 3scale API Management backend.
15
+
16
+ It has the following components:
17
+
18
+ ### Apisonator listener
19
+
20
+ It provides the point of entry of the API Management Platform's Backend.
21
+ The Service management API (SM API) is provided to authorize and report consumer
22
+ API requests.
23
+
24
+ Three main operations can be performed with this API:
25
+
26
+ * Report: Reports a number of hits to one or more metrics, performing the
27
+ corresponding metric aggregations
28
+ * Authorize: Authorize a request. The authorization of a request checks that:
29
+ * The provided API key to authorize the request is valid
30
+ * The current usage metrics of the API related to the request are within
31
+ the specified limits
32
+ * Authrep: Combination of both the above
33
+
34
+ Make sure to read the corresponding Swagger-generated documentation of this
35
+ operations, located in [docs/active_docs/Service Management API.json](docs%2Factive_docs%2FService%20Management%20API.json)
36
+
37
+ It attempts to respond with lowest possible latency, performing minimal work
38
+ and offloading other work to Apisonator workers by enqueuing tasks into job queues.
39
+
40
+ This component needs access to a Redis database to perform the following actions:
41
+ * Enqueue reports, which will be processed by the Apisonator worker component
42
+ * Perform authorization of the requests
43
+
44
+ These two actions can be configured to be performed in different Redis
45
+ databases if desired (see the [Prerequisites](#prerequisites)
46
+ and [Configuration](#configuration) sections).
47
+
48
+ Finally, another API named 'Internal API' is provided to configure services
49
+ in Apisonator. This API is intended only for administrative purposes and not
50
+ for general consumption. Therefore, usage of this API should be protected or
51
+ not exposed to untrusted parties. You can also generate its documentation with
52
+ Rake tasks. The [Pisoni](https://github.com/3scale/pisoni) API client can be
53
+ used to interact with the Internal API.
54
+
55
+ To quickly test Apisonator, random services can be created and configured on it
56
+ via the use of the 'Buddhi' tool located in our performance tests
57
+ toolkit: [3scale perftest-toolkit](https://github.com/3scale/perftest-toolkit/).
58
+
59
+ This component may also be referred to as '3scale_backend'.
60
+
61
+ ### Apisonator worker
62
+
63
+ It is responsible for performing background tasks off-loaded from
64
+ Apisonator listeners (enqueued jobs).
65
+
66
+ The worker component takes care of running these enqueued jobs, mainly related
67
+ to reporting of previous traffic.
68
+
69
+ Specifically, this component:
70
+ * Dequeues and runs the report jobs that have been submitted to the Redis
71
+ background jobs database by the Apisonator listener/s or the
72
+ Apisonator failed jobs rescheduler
73
+ * Stores the results of running the report jobs in the Redis Storage database
74
+
75
+ This component may also be referred to as '3scale_backend_worker'.
76
+
77
+ ### Apisonator failed jobs rescheduler
78
+
79
+ This is a simple task that acts as a cron scheduler to requeue jobs that failed
80
+ when being processed by an Apisonator worker. The jobs are requeued into
81
+ the Redis background jobs database.
82
+
83
+ This component may also be referred to as 'backend-cron'.
84
+
85
+ ## Development
86
+
87
+ See the file [DEVELOPMENT](DEVELOPMENT.md)
88
+
89
+ ## Documentation
90
+
91
+ You can find documentation about Apisonator (also called referred to as `3scale
92
+ backend`) at the [Red Hat 3scale API Management product pages](https://access.redhat.com/products/red-hat-3scale/).
93
+
94
+ Documentation about specific parts of Apisonator (APIs, specs, behaviour, etc)
95
+ can be found in the [`docs`](https://github.com/3scale/apisonator/tree/master/docs) folder, though this is mostly meant for development and design purposes rather
96
+ than user documentation.
97
+
98
+ ## How to run
99
+
100
+ ### Prerequisites
101
+
102
+ * Docker (requires version 1.10.0 or later)
103
+ * A Redis database, used to store API request statistics and services. Also
104
+ used to perform API requests authorizations. In Apisonator this database
105
+ is commonly referred to as 'Redis Storage'
106
+ * A Redis database, used to store background jobs. The Redis Resque library
107
+ is used for this. In Apisonator this database is commonly referred to as
108
+ 'Redis Resque', or as the 'background jobs database'
109
+
110
+ The two previous Redis databases can be configured in the following ways:
111
+
112
+ * In a single machine/vm, using a single Redis process by specifying
113
+ different database identifiers, which is supported by the Redis URI
114
+ specification. i.e. redis://host:port/0, redis://host:port/1
115
+ * In a single machine/vm, using different Redis processes with different
116
+ assigned ports
117
+ * In separate machines/vms
118
+
119
+ The first thing you will need is cloning the project:
120
+ > `$ git clone git@github.com:3scale/apisonator.git`
121
+
122
+ Next cd into the directory, `cd apisonator`.
123
+
124
+ ### Apisonator image generation
125
+
126
+ Go to the `openshift` directory and execute `make build`. This will generate
127
+ a local docker image named `amp:apisonator-<version_number>` based on CentOS 7.
128
+
129
+ ### Configuration
130
+
131
+ To run any Apisonator component, application-related environment variables must
132
+ be previously set. This can be done by setting them via the `--env` flag in
133
+ Docker or by placing them in a ENV file and setting the ENV file in Docker via
134
+ the `--env-file` flag.
135
+
136
+ The most important variables to set are:
137
+
138
+ * CONFIG_QUEUES_MASTER_NAME: Set this to the [`redis://` URL](http://www.iana.org/assignments/uri-schemes/prov/redis)
139
+ of where the Redis Storage has been installed
140
+ * CONFIG_REDIS_PROXY: Set this to the [`redis://` URL](http://www.iana.org/assignments/uri-schemes/prov/redis)
141
+ of where the Redis Resque has been installed
142
+ * CONFIG_INTERNAL_API_USER: Set this to an arbitrary username <username>
143
+ that will be the one used to be able to use the Apisonator internal api
144
+ * CONFIG_INTERNAL_API_PASSWORD: Set this to an arbitrary
145
+ password <password> that will be the one used to be able to use the
146
+ Apisonator internal api
147
+ * RACK_ENV: Set this to 'production'
148
+
149
+ A complete list of configuration variables that can be set can be
150
+ found in the file `openshift/3scale_backend.conf`
151
+
152
+ An example of an ENV file can be found at `openshift/.env.test`
153
+
154
+ ### Automatic execution (with Makefile)
155
+
156
+ Makefile rules can be run to execute the different Apisonator components
157
+ with some predefined behaviour. To do this a file named `.env` in
158
+ the `openshift` directory must be created before.
159
+
160
+ Once this has been performed, go to the `openshift` directory and execute
161
+ one of the available Makefile commands to run Apisonator components:
162
+
163
+ #### Apisonator Listener
164
+
165
+ Execute the Apisonator Listener, exposing the port 3001:
166
+
167
+ ```
168
+ make listener
169
+ ```
170
+
171
+ #### Apisonator Worker
172
+
173
+ ```
174
+ make worker
175
+ ```
176
+
177
+ #### Apisonator failed jobs rescheduler
178
+
179
+ Execute the 'cron' Apisonator component:
180
+
181
+ ```
182
+ make cron
183
+ ```
184
+
185
+ #### Apisonator bash shell
186
+
187
+ Execute a bash shell with the Apisonator source code with all the available
188
+ components:
189
+
190
+ ```
191
+ make bash
192
+ ```
193
+
194
+ ### Manual execution
195
+
196
+ Another way of executing the Apisonator components is by running a container
197
+ using the previously generated Apisonator image:
198
+
199
+ #### Apisonator Listener
200
+
201
+ To run an Apisonator listener, the script bin/3scale_backend is used. To
202
+ run it from a previously generated Apisonator docker image:
203
+
204
+ ```
205
+ docker run -p 3001:3001 --env-file <myenv_file> -it amp:apisonator-<version_number> 3scale_backend start -p 3001 -x /dev/stdout
206
+ ```
207
+
208
+ You can see all the available options of the apisonator listener by executing:
209
+
210
+ ```
211
+ docker run -it amp:apisonator-<version_number> 3scale_backend help
212
+ ```
213
+
214
+ #### Apisonator Worker
215
+
216
+ ```
217
+ docker run --env-file <myenv_file> -it amp:apisonator-<version_number> 3scale_backend_worker
218
+ ```
219
+
220
+ #### Apisonator failed jobs rescheduler
221
+
222
+ ```
223
+ docker run --env-file <myenv_file> -it amp:apisonator-<version_number> backend-cron
224
+ ```
225
+
226
+ #### Apisonator bash shell
227
+
228
+ ```
229
+ docker run --env-file <myenv_file> -it amp:apisonator-<version_number> bash
230
+ ```
@@ -0,0 +1,287 @@
1
+ # encoding: utf-8
2
+
3
+ require '3scale/backend/configuration'
4
+ require '3scale/backend'
5
+ require '3scale/tasks/helpers'
6
+
7
+ include ThreeScale::Tasks::Helpers
8
+
9
+ load 'lib/3scale/tasks/connectivity.rake'
10
+
11
+
12
+ if Environment.saas?
13
+ require '3scale/backend/logging/external'
14
+
15
+ ThreeScale::Backend::Logging::External.setup_rake
16
+
17
+ load 'lib/3scale/tasks/swagger.rake'
18
+ load 'lib/3scale/tasks/stats.rake'
19
+
20
+ if Environment.testable?
21
+
22
+ ENV['RACK_ENV'] = "test"
23
+ require 'rake/testtask'
24
+
25
+ task :default => [:test, :spec]
26
+
27
+ test_task_dependencies = ['test:unit', 'test:integration']
28
+
29
+ desc 'Run unit and integration tests'
30
+ task :test => test_task_dependencies
31
+
32
+ desc 'Benchmark'
33
+ task :bench, [:file] do |_, args|
34
+ require 'benchmark/ips'
35
+ require 'pathname'
36
+ require File.dirname(__FILE__) + '/test/test_helpers/configuration'
37
+
38
+ filelist = if args[:file]
39
+ "#{args[:file].sub(/\Abench\//, '')}"
40
+ else
41
+ '**/*_bench.rb'
42
+ end
43
+ FileList["#{File.dirname(__FILE__)}/bench/#{filelist}"].each do |f|
44
+ bench = Pathname.new(f).cleanpath
45
+ if bench.to_s.start_with?(File.dirname(__FILE__) + File::SEPARATOR)
46
+ puts "Running benchmark #{bench}"
47
+ load f
48
+ else
49
+ STDERR.puts "Ignoring path #{f} as it points outside the project"
50
+ end
51
+ end
52
+
53
+ puts "Benchmarks finished"
54
+ end
55
+
56
+ namespace :test do
57
+ Rake::TestTask.new(:unit) do |task|
58
+ task.test_files = FileList['test/unit/**/*_test.rb']
59
+ task.verbose = true
60
+ task.warning = false
61
+ end
62
+
63
+ Rake::TestTask.new(:integration) do |task|
64
+ task.test_files = FileList['test/integration/**/*_test.rb']
65
+ task.verbose = true
66
+ task.warning = false
67
+ end
68
+ end
69
+
70
+ require 'rspec/core/rake_task'
71
+ spec_task_dependencies = [
72
+ 'spec:unit', 'spec:integration', 'spec:acceptance', 'spec:api', 'spec:use_cases', 'spec:server'
73
+ ]
74
+
75
+ desc 'Run RSpec tests'
76
+ task :spec => spec_task_dependencies
77
+
78
+ namespace :spec do
79
+
80
+ require 'rspec/core/rake_task'
81
+ desc 'Run all RSpec tests (unit, integration, acceptance, api, use_cases, server)'
82
+ task :all => spec_task_dependencies
83
+
84
+ desc 'Run RSpec unit tests'
85
+ RSpec::Core::RakeTask.new(:unit) do |task|
86
+ task.pattern = 'spec/unit/**/*_spec.rb'
87
+ #We require spec_helper because some tests
88
+ #do not include spec_helper by themselves
89
+ task.rspec_opts = '--require=spec_helper'
90
+ end
91
+
92
+ desc 'Run RSpec integration tests'
93
+ RSpec::Core::RakeTask.new(:integration) do |task|
94
+ task.pattern = 'spec/integration/**/*_spec.rb'
95
+ task.rspec_opts = '--require=spec_helper'
96
+ end
97
+
98
+ desc 'Run RSpec acceptance tests'
99
+ RSpec::Core::RakeTask.new(:acceptance) do |task|
100
+ task.pattern = 'spec/acceptance/**/*_spec.rb'
101
+ task.rspec_opts = '--require=spec_helper'
102
+ end
103
+
104
+ desc 'Run RSpec api tests'
105
+ RSpec::Core::RakeTask.new(:api) do |task|
106
+ task.pattern = 'spec/api/**/*_spec.rb'
107
+ task.rspec_opts = '--require=spec_helper'
108
+ end
109
+
110
+ desc 'Run RSpec use_cases tests'
111
+ RSpec::Core::RakeTask.new(:use_cases) do |task|
112
+ task.pattern = 'spec/use_cases/**/*_spec.rb'
113
+ task.rspec_opts = '--require=spec_helper'
114
+ end
115
+
116
+ desc 'Run Rspec server tests'
117
+ RSpec::Core::RakeTask.new(:server) do |task|
118
+ task.pattern = 'spec/server/**/*_spec.rb'
119
+ task.rspec_opts = '--require=spec_helper'
120
+ end
121
+
122
+ desc 'Run RSpec test/s specified by input file pattern'
123
+ RSpec::Core::RakeTask.new(:specific, :test_name) do |task, task_args|
124
+ task.pattern = "#{task_args[:test_name]}"
125
+ task.rspec_opts = '--require=spec_helper'
126
+ end
127
+
128
+ end
129
+
130
+ desc 'Generate API request documentation from API specs'
131
+ RSpec::Core::RakeTask.new('docs:generate') do |t|
132
+ t.pattern = 'spec/acceptance/**/*_spec.rb'
133
+ t.rspec_opts = ['--format RspecApiDocumentation::ApiFormatter']
134
+ end
135
+
136
+ desc 'Tag and push the current version'
137
+ task :release => ['release:tag', 'release:push']
138
+
139
+ namespace :release do
140
+ namespace :changelog do
141
+ task :shortlog do
142
+ version = `git describe --abbrev=0`.chomp
143
+ STDOUT.puts "Changes from #{version} to HEAD\n\n"
144
+ system "git shortlog --no-merges #{version}.."
145
+ end
146
+
147
+ # Link all issues and PRs in the changelog that have no link.
148
+ #
149
+ # By default links to PRs (althought GitHub redirects IIRC) but you can
150
+ # specify an issue link by preceding it with "issue"/"Issue" or specify
151
+ # a PR link (default) by preceding it with "PR".
152
+ task :link_prs, [:file] do |_, args|
153
+ file = args[:file] || File.join(File.dirname(__FILE__), 'CHANGELOG.md')
154
+
155
+ File.open file, File::RDWR do |f|
156
+ contents = f.read
157
+ contents.
158
+ # this regexp is not perfect but ok - ie. it would match issue(#5)
159
+ gsub!(/(\b|[^[:alnum]])([iI]ssue|PR)?([\([:space:]])#(\d+)/) do
160
+
161
+ # unfortunately gsub uses globals for groups :(
162
+ type_prefix, type, separator, number = $1, $2, $3, $4
163
+
164
+ link = case type.to_s.upcase
165
+ when 'ISSUE'
166
+ # even if quoted like this, remember that \ still escapes
167
+ %{https://github.com/3scale/apisonator/issues/%s}
168
+ else
169
+ # default to PR links
170
+ %{https://github.com/3scale/apisonator/pull/%s}
171
+ end
172
+
173
+ prefix = if type && separator == ' '
174
+ # remove "issue "
175
+ type_prefix
176
+ else
177
+ "#{type_prefix}#{separator}"
178
+ end
179
+
180
+ prefix << "[##{number}](#{link % number})"
181
+ end
182
+
183
+ # Overwrite the changelog
184
+ f.seek 0, IO::SEEK_SET
185
+ f.write contents
186
+ end
187
+ end
188
+ end
189
+
190
+ task :tag do
191
+ require File.dirname(__FILE__) + '/lib/3scale/backend/version'
192
+ version = "v#{ThreeScale::Backend::VERSION}"
193
+ STDOUT.puts "Creating tag #{version}"
194
+ system "git tag -sa #{version} -m \"#{version}\""
195
+ end
196
+
197
+ task :push do
198
+ system 'git push --tags'
199
+ end
200
+ end
201
+
202
+ desc 'Start the backend server in development'
203
+ task :start do
204
+ system "ruby -Ilib bin/3scale_backend start -p #{ENV['PORT'] || 3001}"
205
+ end
206
+
207
+ desc 'Start a backend_worker in development'
208
+ task :start_worker do
209
+ system 'ruby -Ilib bin/3scale_backend_worker --no-daemonize'
210
+ end
211
+
212
+ desc 'Stop a backend_worker in development'
213
+ task :stop_worker do
214
+ system 'ruby -Ilib bin/3scale_backend_worker stop'
215
+ end
216
+
217
+ desc 'Restart a backend_worker in development'
218
+ task :restart_worker do
219
+ system 'ruby -Ilib bin/3scale_backend_worker restart'
220
+ end
221
+
222
+ desc 'Check license compliance of dependencies'
223
+ task :license_finder do
224
+ STDOUT.puts "Checking license compliance\n"
225
+ unless system("license_finder --decisions-file=#{File.dirname(__FILE__)}" \
226
+ "/.dependency_decisions.yml")
227
+ STDERR.puts "\n*** License compliance test failed ***\n"
228
+ exit 1
229
+ end
230
+ end
231
+
232
+ namespace :license_finder do
233
+ namespace :report do
234
+ desc 'Generate an XML report for licenses'
235
+ task :xml do
236
+ require 'license_finder'
237
+ LicenseFinder::CLI::Main.start [
238
+ 'report',
239
+ "--decisions-file=#{File.dirname(__FILE__)}/.dependency_decisions.yml",
240
+ '--format=xml',
241
+ '--quiet'
242
+ ]
243
+ end
244
+ end
245
+ end
246
+ end
247
+ end
248
+
249
+ desc 'Reschedule failed jobs'
250
+ task :reschedule_failed_jobs do
251
+ reschedule_method = ThreeScale::Backend::FailedJobsScheduler.method(:reschedule_failed_jobs)
252
+
253
+ result = if Environment.using_async_redis?
254
+ Async { reschedule_method.call }.result
255
+ else
256
+ reschedule_method.call
257
+ end
258
+
259
+ puts "Rescheduled: #{result[:rescheduled]}. "\
260
+ "Failed and discarded: #{result[:failed_while_rescheduling]}. "\
261
+ "Pending failed jobs: #{result[:failed_current]}."
262
+ end
263
+
264
+ desc 'Delete stats of services marked for deletion'
265
+ namespace :stats do
266
+ task :cleanup, [:redis_urls, :log_deleted_keys] do |_, args|
267
+ redis_urls = args[:redis_urls] && args[:redis_urls].split(' ')
268
+
269
+ if redis_urls.nil? || redis_urls.empty?
270
+ puts 'No Redis URLs specified'
271
+ exit(false)
272
+ end
273
+
274
+ redis_clients = redis_urls.map do |redis_url|
275
+ parsed_uri = URI.parse(ThreeScale::Backend::Storage::Helpers.send(
276
+ :to_redis_uri, redis_url)
277
+ )
278
+ Redis.new(host: parsed_uri.host, port: parsed_uri.port)
279
+ end
280
+
281
+ log_deleted = args[:log_deleted_keys] == 'true' ? STDOUT : nil
282
+
283
+ ThreeScale::Backend::Stats::Cleaner.delete!(
284
+ redis_clients, log_deleted_keys: log_deleted
285
+ )
286
+ end
287
+ end