3scale_toolbox 0.2.0 → 0.2.1
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.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/exe/3scale-copy +16 -6
- data/exe/3scale-import +178 -0
- data/lib/3scale_toolbox/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6edc160258055594806f1c1acd494201e8f9ae67
|
4
|
+
data.tar.gz: 3dfe9b992cd0310113edd5eff26499a061a76400
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c731d310c1ff612f8f522a6c60f61ed37f64b8519ac86121f8a0b0ab776f6b441a2f564f9ac21c1eb783de6903837c533d52d2b37d3e3a03662f5d80eb592d8
|
7
|
+
data.tar.gz: 66c9e710b6764bf1b87a15391b151223c5b23f29532b24b723c583ef241e168308e437bd2d0cf6e785f1fb73e0f3150f6079927b454c3e58cc62664032523cdf
|
data/README.md
CHANGED
@@ -23,6 +23,14 @@ Will create a new service, copy existing methods, metrics, application plans and
|
|
23
23
|
3scale copy service NUMBER --source=https://provider_key@foo-admin.3scale.net --destination=https://provider_key@foo2-admin.3scale.net
|
24
24
|
```
|
25
25
|
|
26
|
+
### Import from CSV
|
27
|
+
|
28
|
+
Will create a new services, metrics, methods and mapping rules.
|
29
|
+
|
30
|
+
```shell
|
31
|
+
3scale import csv --destination=https://provider_key@user-admin.3scale.net --file=examples/import_example.csv
|
32
|
+
```
|
33
|
+
|
26
34
|
## Development
|
27
35
|
|
28
36
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec threescale_toolbox` to use the gem in this directory, ignoring other installed copies of this gem.
|
data/exe/3scale-copy
CHANGED
@@ -9,14 +9,18 @@ options = {}
|
|
9
9
|
parser = OptionParser.new do |parser|
|
10
10
|
parser.banner = '3scale copy <command> [options]'
|
11
11
|
|
12
|
-
parser.on('-
|
12
|
+
parser.on('-s', '--source SOURCE', "Source") do |domain|
|
13
13
|
options[:source] = domain
|
14
14
|
end
|
15
15
|
|
16
|
-
parser.on('-
|
16
|
+
parser.on('-d', '--destination DESTINATION', "Destination") do |domain|
|
17
17
|
options[:destination] = domain
|
18
18
|
end
|
19
19
|
|
20
|
+
parser.on('-t', '--target-system-name TARGET_SYSTEM_NAME', 'Target system name') do |name|
|
21
|
+
options[:target_system_name] = name
|
22
|
+
end
|
23
|
+
|
20
24
|
parser.on('-h', '--help', 'Prints this help') do
|
21
25
|
puts parser
|
22
26
|
puts
|
@@ -52,10 +56,19 @@ def endpoint_from_url(url)
|
|
52
56
|
url.sub /\w*@/, ''
|
53
57
|
end
|
54
58
|
|
59
|
+
def copy_service_params(original, system_name)
|
60
|
+
{
|
61
|
+
name: original['name'],
|
62
|
+
system_name: system_name,
|
63
|
+
end_user_registration_required: original['end_user_registration_required']
|
64
|
+
}.reject { |key, value| !value }
|
65
|
+
end
|
66
|
+
|
55
67
|
case (command = ARGV.shift)
|
56
68
|
when 'service'
|
57
69
|
source = fetch_option options, :source
|
58
70
|
destination = fetch_option options, :destination
|
71
|
+
system_name = options[:target_system_name]
|
59
72
|
|
60
73
|
require '3scale/api'
|
61
74
|
|
@@ -71,10 +84,7 @@ case (command = ARGV.shift)
|
|
71
84
|
)
|
72
85
|
|
73
86
|
service = source_client.show_service(service_id)
|
74
|
-
copy = client.create_service(
|
75
|
-
name: service['name'],
|
76
|
-
end_user_registration_required: service['end_user_registration_required']
|
77
|
-
)
|
87
|
+
copy = client.create_service(copy_service_params(service, system_name))
|
78
88
|
|
79
89
|
raise "Service has not been saved. Errors: #{copy['errors']}" unless copy['errors'].nil?
|
80
90
|
|
data/exe/3scale-import
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require '3scale_toolbox/cli'
|
4
|
+
require 'optparse'
|
5
|
+
require '3scale/api'
|
6
|
+
require 'uri'
|
7
|
+
require 'csv'
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
|
11
|
+
parser = OptionParser.new do |parser|
|
12
|
+
parser.banner = '3scale import <command> [options]'
|
13
|
+
|
14
|
+
parser.on('-d', '--destination DESTINATION') do |domain|
|
15
|
+
options[:destination] = domain
|
16
|
+
end
|
17
|
+
|
18
|
+
parser.on('-f', '--file FILE') do |file|
|
19
|
+
options[:file] = file
|
20
|
+
end
|
21
|
+
|
22
|
+
parser.on('-h', '--help', 'Prints this help') do
|
23
|
+
puts parser
|
24
|
+
puts
|
25
|
+
puts 'Available Commands:', ['csv', 'help']
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
print_help = ->(error = nil) do
|
31
|
+
if error
|
32
|
+
puts "Error: #{error}"
|
33
|
+
puts
|
34
|
+
end
|
35
|
+
parser.parse(['--help'])
|
36
|
+
end
|
37
|
+
|
38
|
+
parser.parse!
|
39
|
+
|
40
|
+
def fetch_option(options, key)
|
41
|
+
options.fetch(key) { raise OptionParser::MissingArgument, key }
|
42
|
+
end
|
43
|
+
|
44
|
+
def provider_key_from_url(url)
|
45
|
+
URI(url).user
|
46
|
+
end
|
47
|
+
|
48
|
+
def endpoint_from_url(url)
|
49
|
+
uri = URI(url)
|
50
|
+
uri.user = nil
|
51
|
+
|
52
|
+
uri.to_s
|
53
|
+
end
|
54
|
+
|
55
|
+
def auth_app_key_according_service(service)
|
56
|
+
case service['backend_version']
|
57
|
+
when '1'
|
58
|
+
'user_key'
|
59
|
+
when '2'
|
60
|
+
'app_id'
|
61
|
+
when 'oauth'
|
62
|
+
'oauth'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
case (command = ARGV.shift)
|
67
|
+
when 'csv'
|
68
|
+
destination = fetch_option options, :destination
|
69
|
+
file_path = fetch_option options, :file
|
70
|
+
endpoint = endpoint_from_url destination
|
71
|
+
provider_key = provider_key_from_url destination
|
72
|
+
|
73
|
+
client = ThreeScale::API.new(endpoint: endpoint, provider_key: provider_key)
|
74
|
+
data = CSV.read file_path
|
75
|
+
headings = data.shift
|
76
|
+
services = {}
|
77
|
+
stats = { services: 0, metrics: 0, methods: 0 , mapping_rules: 0 }
|
78
|
+
|
79
|
+
# prepare services data
|
80
|
+
data.each do |row|
|
81
|
+
service_name = row[headings.find_index('service_name')]
|
82
|
+
item = {}
|
83
|
+
|
84
|
+
services[service_name] ||= {}
|
85
|
+
services[service_name][:items] ||= []
|
86
|
+
|
87
|
+
(headings - ['service_name']).each do |heading|
|
88
|
+
item[heading] = row[headings.find_index(heading)]
|
89
|
+
end
|
90
|
+
|
91
|
+
services[service_name][:items].push item
|
92
|
+
end
|
93
|
+
|
94
|
+
services.keys.each do |service_name|
|
95
|
+
# create service
|
96
|
+
service = client.create_service name: service_name
|
97
|
+
|
98
|
+
if service['errors'].nil?
|
99
|
+
stats[:services] += 1
|
100
|
+
puts "Service #{service_name} has been created."
|
101
|
+
else
|
102
|
+
abort "Service has not been saved. Errors: #{service['errors']}"
|
103
|
+
end
|
104
|
+
|
105
|
+
# find hits metric (default)
|
106
|
+
hits_metric = client.list_metrics(service['id']).find do |metric|
|
107
|
+
metric['system_name'] == 'hits'
|
108
|
+
end
|
109
|
+
|
110
|
+
services[service_name][:items].each do |item|
|
111
|
+
|
112
|
+
metric, method = {}
|
113
|
+
|
114
|
+
case item['type']
|
115
|
+
# create a metric
|
116
|
+
when 'metric'
|
117
|
+
metric = client.create_metric(service['id'], {
|
118
|
+
system_name: item['endpoint_system_name'],
|
119
|
+
friendly_name: item['endpoint_name'],
|
120
|
+
unit: 'unit'
|
121
|
+
})
|
122
|
+
|
123
|
+
if metric['errors'].nil?
|
124
|
+
stats[:metrics] += 1
|
125
|
+
puts "Metric #{item['endpoint_name']} has been created."
|
126
|
+
else
|
127
|
+
puts "Metric has not been saved. Errors: #{metric['errors']}"
|
128
|
+
end
|
129
|
+
# create a method
|
130
|
+
when 'method'
|
131
|
+
method = client.create_method(service['id'], hits_metric['id'], {
|
132
|
+
system_name: item['endpoint_system_name'],
|
133
|
+
friendly_name: item['endpoint_name'],
|
134
|
+
unit: 'unit'
|
135
|
+
})
|
136
|
+
|
137
|
+
if method['errors'].nil?
|
138
|
+
stats[:methods] += 1
|
139
|
+
puts "Method #{item['endpoint_name']} has been created."
|
140
|
+
else
|
141
|
+
puts "Method has not been saved. Errors: #{method['errors']}"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# create a mapping rule
|
146
|
+
if (metric_id = metric ? metric['id'] : (method ? method['id'] : nil))
|
147
|
+
mapping_rule = client.create_mapping_rule(service['id'], {
|
148
|
+
metric_id: metric_id,
|
149
|
+
pattern: item['endpoint_path'],
|
150
|
+
http_method: item['endpoint_http_method'],
|
151
|
+
metric_system_name: item['endpoint_system_name'],
|
152
|
+
auth_app_key: auth_app_key_according_service(service),
|
153
|
+
delta: 1
|
154
|
+
})
|
155
|
+
|
156
|
+
if mapping_rule['errors'].nil?
|
157
|
+
stats[:mapping_rules] += 1
|
158
|
+
puts "Mapping rule #{item['endpoint_system_name']} has been created."
|
159
|
+
else
|
160
|
+
puts "Mapping rule has not been saved. Errors: #{mapping_rule['errors']}"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
puts "#{services.keys.count} services in CSV file"
|
167
|
+
puts "#{stats[:services]} services have been created"
|
168
|
+
puts "#{stats[:metrics]} metrics have been created"
|
169
|
+
puts "#{stats[:methods]} methods have beeen created"
|
170
|
+
puts "#{stats[:mapping_rules]} mapping rules have been created"
|
171
|
+
|
172
|
+
when 'help'
|
173
|
+
print_help.call
|
174
|
+
when nil
|
175
|
+
print_help.call('missing subcommand')
|
176
|
+
else
|
177
|
+
print_help.call("unknown command #{command}")
|
178
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: 3scale_toolbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michal Cichra
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -59,6 +59,7 @@ executables:
|
|
59
59
|
- 3scale
|
60
60
|
- 3scale-copy
|
61
61
|
- 3scale-help
|
62
|
+
- 3scale-import
|
62
63
|
extensions: []
|
63
64
|
extra_rdoc_files: []
|
64
65
|
files:
|
@@ -66,6 +67,7 @@ files:
|
|
66
67
|
- exe/3scale
|
67
68
|
- exe/3scale-copy
|
68
69
|
- exe/3scale-help
|
70
|
+
- exe/3scale-import
|
69
71
|
- lib/3scale_toolbox.rb
|
70
72
|
- lib/3scale_toolbox/cli.rb
|
71
73
|
- lib/3scale_toolbox/version.rb
|
@@ -88,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
90
|
version: '0'
|
89
91
|
requirements: []
|
90
92
|
rubyforge_project:
|
91
|
-
rubygems_version: 2.5
|
93
|
+
rubygems_version: 2.2.5
|
92
94
|
signing_key:
|
93
95
|
specification_version: 4
|
94
96
|
summary: 3scale CLI Toolbox.
|