apisonator 2.100.0

Sign up to get free protection for your applications and to get access to all the features.
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