MuranoCLI 3.0.1 → 3.0.2

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.agignore +1 -0
  3. data/.rubocop.yml +67 -5
  4. data/Gemfile +6 -3
  5. data/MuranoCLI.gemspec +14 -10
  6. data/README.markdown +299 -126
  7. data/Rakefile +6 -1
  8. data/bin/murano +2 -2
  9. data/docs/completions/murano_completion-bash +93 -0
  10. data/lib/MrMurano.rb +19 -2
  11. data/lib/MrMurano/Business.rb +22 -19
  12. data/lib/MrMurano/Config.rb +19 -9
  13. data/lib/MrMurano/Content.rb +4 -4
  14. data/lib/MrMurano/Exchange-Element.rb +99 -0
  15. data/lib/MrMurano/Exchange.rb +137 -0
  16. data/lib/MrMurano/Gateway.rb +9 -9
  17. data/lib/MrMurano/Keystore.rb +4 -2
  18. data/lib/MrMurano/ReCommander.rb +3 -5
  19. data/lib/MrMurano/Solution-ServiceConfig.rb +12 -12
  20. data/lib/MrMurano/Solution-Services.rb +15 -14
  21. data/lib/MrMurano/Solution-Users.rb +2 -2
  22. data/lib/MrMurano/Solution.rb +43 -49
  23. data/lib/MrMurano/SolutionId.rb +28 -28
  24. data/lib/MrMurano/SyncUpDown.rb +32 -22
  25. data/lib/MrMurano/Webservice-Endpoint.rb +2 -1
  26. data/lib/MrMurano/Webservice.rb +5 -5
  27. data/lib/MrMurano/commands.rb +2 -1
  28. data/lib/MrMurano/commands/business.rb +21 -19
  29. data/lib/MrMurano/commands/domain.rb +16 -2
  30. data/lib/MrMurano/commands/exchange.rb +272 -0
  31. data/lib/MrMurano/commands/globals.rb +17 -1
  32. data/lib/MrMurano/commands/init.rb +3 -3
  33. data/lib/MrMurano/commands/link.rb +16 -16
  34. data/lib/MrMurano/commands/postgresql.rb +2 -2
  35. data/lib/MrMurano/commands/show.rb +13 -7
  36. data/lib/MrMurano/commands/solution.rb +23 -17
  37. data/lib/MrMurano/commands/solution_picker.rb +49 -44
  38. data/lib/MrMurano/commands/sync.rb +2 -1
  39. data/lib/MrMurano/commands/timeseries.rb +2 -2
  40. data/lib/MrMurano/commands/tsdb.rb +2 -2
  41. data/lib/MrMurano/hash.rb +19 -7
  42. data/lib/MrMurano/http.rb +12 -2
  43. data/lib/MrMurano/orderedhash.rb +200 -0
  44. data/lib/MrMurano/spec_commander.rb +98 -0
  45. data/lib/MrMurano/verbosing.rb +2 -2
  46. data/lib/MrMurano/version.rb +2 -2
  47. data/spec/Business_spec.rb +8 -6
  48. data/spec/Solution-ServiceConfig_spec.rb +1 -1
  49. data/spec/SyncUpDown_spec.rb +6 -6
  50. data/spec/_workspace.rb +9 -4
  51. data/spec/cmd_business_spec.rb +8 -2
  52. data/spec/cmd_common.rb +266 -25
  53. data/spec/cmd_exchange_spec.rb +118 -0
  54. data/spec/cmd_help_spec.rb +54 -13
  55. data/spec/cmd_init_spec.rb +1 -12
  56. data/spec/cmd_link_spec.rb +94 -72
  57. data/spec/spec_helper.rb +11 -16
  58. metadata +23 -17
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.22 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -40,6 +40,22 @@ global_option('-n', '--dry', %(Do not run actions that make changes)) do
40
40
  $cfg['tool.verbose'] = true
41
41
  end
42
42
 
43
+ global_option('--csv', %(Output as comma-separated values)) do
44
+ $cfg['tool.outformat'] = 'csv'
45
+ end
46
+
47
+ global_option('--json', %(Output as JSON)) do
48
+ $cfg['tool.outformat'] = 'json'
49
+ end
50
+
51
+ global_option('--yaml', %(Output as Yaml)) do
52
+ $cfg['tool.outformat'] = 'yaml'
53
+ end
54
+
55
+ global_option('--pp', %(Output using Ruby pretty-printer)) do
56
+ $cfg['tool.outformat'] = 'pp'
57
+ end
58
+
43
59
  exclude_help = %(
44
60
  Except config values from the specified scope(s).
45
61
  SCOPES can be 1 scope or comma-separated list of
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.17 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -181,12 +181,12 @@ command :init do |c|
181
181
  verbose: true,
182
182
  }
183
183
  # Get/Create Application ID
184
- sol_opts[:match_sid] = options.application_id
184
+ sol_opts[:match_api_id] = options.application_id
185
185
  sol_opts[:match_name] = options.application_name
186
186
  sol_opts[:match_fuzzy] = options.application
187
187
  appl = solution_find_or_create(biz: biz, type: :application, **sol_opts)
188
188
  # Get/Create Product ID
189
- sol_opts[:match_sid] = options.product_id
189
+ sol_opts[:match_api_id] = options.product_id
190
190
  sol_opts[:match_name] = options.product_name
191
191
  sol_opts[:match_fuzzy] = options.product
192
192
  prod = solution_find_or_create(biz: biz, type: :product, **sol_opts)
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.23 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -48,20 +48,20 @@ List the solutions that are linked.
48
48
  biz = MrMurano::Business.new
49
49
  products = biz.products
50
50
  MrMurano::Verbose.whirly_stop
51
- pids = products.map(&:apiId)
51
+ pids = products.map(&:api_id)
52
52
 
53
53
  sol_opts = { biz: biz, type: :application }
54
- sol_opts[:match_sid] = $cfg['application.id'] unless options.all
54
+ sol_opts[:match_api_id] = $cfg['application.id'] unless options.all
55
55
  appl = solution_find_or_create(**sol_opts)
56
56
 
57
57
  if !appl.nil?
58
58
  MrMurano::Verbose.whirly_msg('Fetching application services...')
59
- sercfg = MrMurano::ServiceConfig.new(appl.sid)
59
+ sercfg = MrMurano::ServiceConfig.new(appl.api_id)
60
60
  #scfgs = sercfg.list('?select=service,id,solution_id,script_key,alias')
61
61
  scfgs = sercfg.list
62
62
  MrMurano::Verbose.whirly_stop
63
63
  else
64
- sercfg = MrMurano::ServiceConfig.new(MrMurano::SolutionId::INVALID_SID)
64
+ sercfg = MrMurano::ServiceConfig.new(MrMurano::SolutionId::INVALID_API_ID)
65
65
  scfgs = []
66
66
  end
67
67
 
@@ -150,7 +150,7 @@ def link_solutions(sol_a, sol_b, options)
150
150
  warn_on_conflict = options[:warn_on_conflict] || false
151
151
  verbose = options[:verbose] || false
152
152
 
153
- if sol_a.nil? || sol_a.sid.to_s.empty? || sol_b.nil? || sol_b.sid.to_s.empty?
153
+ if sol_a.nil? || sol_a.api_id.to_s.empty? || sol_b.nil? || sol_b.api_id.to_s.empty?
154
154
  msg = 'Missing Solution(s) (Applications or Products): Nothing to link'
155
155
  if warn_on_conflict
156
156
  sercfg.warning msg
@@ -172,9 +172,9 @@ def link_solutions(sol_a, sol_b, options)
172
172
 
173
173
  # Get services for solution to which being linked (application),
174
174
  # and look for linkee (product) service.
175
- sercfg = MrMurano::ServiceConfig.new(sol_a.sid)
175
+ sercfg = MrMurano::ServiceConfig.new(sol_a.api_id)
176
176
  MrMurano::Verbose.whirly_msg 'Fetching services...'
177
- scfgs = sercfg.search(sol_b.sid)
177
+ scfgs = sercfg.search(sol_b.api_id)
178
178
  svc_cfg_exists = scfgs.any?
179
179
  MrMurano::Verbose.whirly_stop
180
180
 
@@ -182,7 +182,7 @@ def link_solutions(sol_a, sol_b, options)
182
182
  unless svc_cfg_exists
183
183
  MrMurano::Verbose.whirly_msg 'Linking solutions...'
184
184
  # Call Murano.
185
- _ret = sercfg.create(sol_b.sid, sol_b.name) do |request, http|
185
+ _ret = sercfg.create(sol_b.api_id, sol_b.name) do |request, http|
186
186
  response = http.request(request)
187
187
  MrMurano::Verbose.whirly_stop
188
188
  if response.is_a?(Net::HTTPSuccess)
@@ -208,8 +208,8 @@ def link_solutions(sol_a, sol_b, options)
208
208
 
209
209
  # Get event handlers for application, and look for product event handler.
210
210
  MrMurano::Verbose.whirly_msg 'Fetching handlers...'
211
- evthlr = MrMurano::EventHandlerSolnApp.new(sol_a.sid)
212
- hdlrs = evthlr.search(sol_b.sid)
211
+ evthlr = MrMurano::EventHandlerSolnApp.new(sol_a.api_id)
212
+ hdlrs = evthlr.search(sol_b.api_id)
213
213
  evt_hlr_exists = hdlrs.any?
214
214
  MrMurano::Verbose.whirly_stop
215
215
 
@@ -218,7 +218,7 @@ def link_solutions(sol_a, sol_b, options)
218
218
  unless evt_hlr_exists
219
219
  MrMurano::Verbose.whirly_msg 'Setting default event handler...'
220
220
  # Call Murano.
221
- evthlr.default_event_script(sol_b.sid) do |request, http|
221
+ evthlr.default_event_script(sol_b.api_id) do |request, http|
222
222
  response = http.request(request)
223
223
  MrMurano::Verbose.whirly_stop
224
224
  if response.is_a?(Net::HTTPSuccess)
@@ -244,10 +244,10 @@ def link_solutions(sol_a, sol_b, options)
244
244
  end
245
245
 
246
246
  def unlink_solutions(sol_a, sol_b)
247
- sercfg = MrMurano::ServiceConfig.new(sol_a.sid)
247
+ sercfg = MrMurano::ServiceConfig.new(sol_a.api_id)
248
248
  MrMurano::Verbose.whirly_msg 'Fetching services...'
249
249
  #scfgs = sercfg.list('?select=service,id,solution_id,script_key,alias')
250
- scfgs = sercfg.search(sol_b.sid)
250
+ scfgs = sercfg.search(sol_b.api_id)
251
251
  MrMurano::Verbose.whirly_stop
252
252
 
253
253
  if scfgs.length > 1
@@ -272,8 +272,8 @@ def unlink_solutions(sol_a, sol_b)
272
272
  end
273
273
 
274
274
  MrMurano::Verbose.whirly_msg 'Fetching handlers...'
275
- evthlr = MrMurano::EventHandlerSolnApp.new(sol_a.sid)
276
- hdlrs = evthlr.search(sol_b.sid)
275
+ evthlr = MrMurano::EventHandlerSolnApp.new(sol_a.api_id)
276
+ hdlrs = evthlr.search(sol_b.api_id)
277
277
  #evt_hlr_exists = hdlrs.any?
278
278
  MrMurano::Verbose.whirly_stop
279
279
 
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.23 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -10,7 +10,7 @@ require 'MrMurano/Solution-ServiceConfig'
10
10
 
11
11
  module MrMurano
12
12
  class Postgresql < ServiceConfig
13
- def initialize(sid=nil)
13
+ def initialize(api_id=nil)
14
14
  # FIXME/2017-07-03: What soln types have PSQLs?
15
15
  @solntype = 'application.id'
16
16
  super
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.22 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -39,7 +39,10 @@ Show readable information about the current configuration.
39
39
  unless selected_application_id.to_s.empty?
40
40
  MrMurano::Verbose.whirly_start('Fetching Applications...')
41
41
  biz.applications.each do |sol|
42
- selected_application = sol if sol.apiId == selected_application_id
42
+ next unless sol.api_id == selected_application_id
43
+ #next unless [sol.api_id, sol.sid].include?(selected_application_id)
44
+ selected_application = sol
45
+ break
43
46
  end
44
47
  MrMurano::Verbose.whirly_stop
45
48
  end
@@ -49,7 +52,10 @@ Show readable information about the current configuration.
49
52
  unless selected_product_id.to_s.empty?
50
53
  MrMurano::Verbose.whirly_start('Fetching Products...')
51
54
  biz.products.each do |sol|
52
- selected_product = sol if sol.apiId == selected_product_id
55
+ next unless sol.api_id == selected_product_id
56
+ #next unless [sol.api_id, sol.sid].include?(selected_product_id)
57
+ selected_product = sol
58
+ break
53
59
  end
54
60
  MrMurano::Verbose.whirly_stop
55
61
  end
@@ -71,11 +77,11 @@ Show readable information about the current configuration.
71
77
 
72
78
  id_not_in_biz = false
73
79
 
74
- # E.g., {:bizid=>"ABC", :type=>"application", :apiId=>"XXX", :sid=>"XXX",
80
+ # E.g., {:bizid=>"ABC", :type=>"application", :api_id=>"XXX", :sid=>"XXX",
75
81
  # :name=>"ABC", :domain=>"ABC.apps.exosite.io" }
76
82
  if selected_application
77
83
  sol_info = %(application: https://#{selected_application.domain})
78
- sol_info += %( <#{selected_application.sid}>) if options.ids
84
+ sol_info += %( <#{selected_application.api_id}>) if options.ids
79
85
  puts sol_info
80
86
  elsif selected_application_id
81
87
  #puts 'selected application not in business'
@@ -88,11 +94,11 @@ Show readable information about the current configuration.
88
94
  puts 'application ID not found in config'
89
95
  end
90
96
 
91
- # E.g., {:bizid=>"ABC", :type=>"product", :apiId=>"XXX", :sid=>"XXX",
97
+ # E.g., {:bizid=>"ABC", :type=>"product", :api_id=>"XXX", :sid=>"XXX",
92
98
  # :name=>"ABC", :domain=>"ABC.m2.exosite.io" }
93
99
  if selected_product
94
100
  sol_info = %(product: #{selected_product.name})
95
- sol_info += %( <#{selected_product.sid}>) if options.ids
101
+ sol_info += %( <#{selected_product.api_id}>) if options.ids
96
102
  puts sol_info
97
103
  elsif selected_product_id
98
104
  #puts 'selected product not in business'
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.23 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -68,11 +68,11 @@ Create a new solution in the current business.
68
68
 
69
69
  if options.save
70
70
  section = options.type.to_s
71
- $cfg.set("#{section}.id", sol.sid)
71
+ $cfg.set("#{section}.id", sol.api_id)
72
72
  $cfg.set("#{section}.name", sol.name)
73
73
  end
74
74
 
75
- biz.outf(sol.sid)
75
+ biz.outf(sol.api_id)
76
76
  end
77
77
  end
78
78
  alias_command 'create application', 'solution create', '--type', 'application'
@@ -157,7 +157,9 @@ def cmd_solution_del_get_names_and_ids!(biz, args, options)
157
157
  end
158
158
  solz = must_fetch_solutions!(options, args, biz)
159
159
  solz.each do |sol|
160
- nmorids += [[sol.sid, "#{MrMurano::Verbose.fancy_ticks(sol.name)} <#{sol.sid}>", sol]]
160
+ nmorids += [
161
+ [sol.api_id, "#{MrMurano::Verbose.fancy_ticks(sol.name)} <#{sol.api_id}>", sol],
162
+ ]
161
163
  end
162
164
  nmorids
163
165
  end
@@ -217,7 +219,9 @@ def solution_delete(name_or_id, use_sol: nil, type: :all, yes: false)
217
219
  # would return true if, say, sol.meta[:any_key] equaled name_or_id.)
218
220
  unless name_or_id.empty?
219
221
  solz.select! do |sol|
220
- sol.sid == name_or_id || sol.name == name_or_id || sol.domain =~ /#{Regexp.escape(name_or_id)}\./i
222
+ sol.api_id == name_or_id \
223
+ || sol.name == name_or_id \
224
+ || sol.domain =~ /#{Regexp.escape(name_or_id)}\./i
221
225
  end
222
226
  end
223
227
  MrMurano::Verbose.whirly_stop
@@ -255,7 +259,7 @@ def solution_delete(name_or_id, use_sol: nil, type: :all, yes: false)
255
259
  n_deleted += 1
256
260
  # Clear the ID from the config.
257
261
  MrMurano::Config::CFG_SOLUTION_ID_KEYS.each do |keyn|
258
- $cfg.set(keyn, nil) if $cfg[keyn] == sol.sid
262
+ $cfg.set(keyn, nil) if $cfg[keyn] == sol.api_id
259
263
  end
260
264
  end
261
265
  end
@@ -386,30 +390,32 @@ end
386
390
 
387
391
  def cmd_solution_output_solutions(biz, solz, options)
388
392
  if options.idonly
389
- headers = %i[apiId]
390
- solz = solz.map { |row| [row.apiId] }
393
+ headers = %i[api_id]
394
+ solz = solz.map { |row| [row.api_id] }
391
395
  elsif options.brief
392
- #headers = %i[apiId domain]
393
- #solz = solz.map { |row| [row.apiId, row.domain] }
394
- headers = %i[apiId domain name]
395
- solz = solz.map { |row| [row.apiId, row.domain, row.name] }
396
+ #headers = %i[api_id domain]
397
+ #solz = solz.map { |row| [row.api_id, row.domain] }
398
+ headers = %i[api_id sid domain name]
399
+ solz = solz.map { |row| [row.api_id, row.sid, row.domain, row.name] }
396
400
  else
397
401
  headers = (solz.first && solz.first.meta || {}).keys
398
- headers.delete(:sid) if headers.include?(:apiId) && headers.include?(:sid)
402
+ #headers.delete(:sid) if headers.include?(:api_id) && headers.include?(:sid)
399
403
  headers.sort_by! do |hdr|
400
404
  case hdr
401
405
  when :bizid
402
406
  0
403
407
  when :type
404
408
  1
405
- when :apiId
409
+ when :api_id
406
410
  2
407
- when :domain
411
+ when :sid
408
412
  3
409
- when :name
413
+ when :domain
410
414
  4
411
- else
415
+ when :name
412
416
  5
417
+ else
418
+ 6
413
419
  end
414
420
  end
415
421
  solz = solz.map { |row| headers.map { |hdr| row.meta[hdr] } }
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.23 /coding: utf-8
1
+ # Last Modified: 2017.09.11 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -99,18 +99,18 @@ def must_fetch_solutions!(options, args=[], biz=nil)
99
99
  if args.any?
100
100
  #raise 'Cannot use options.all and solution pickers' unless options.all.nil?
101
101
  flattened = args.map { |cell| cell.split(',') }.flatten
102
- sid = []
102
+ api_id = []
103
103
  name = []
104
104
  fuzzy = []
105
105
  if options.id
106
- sid = flattened
106
+ api_id = flattened
107
107
  elsif options.name
108
108
  name = flattened
109
109
  else
110
110
  fuzzy = flattened
111
111
  end
112
112
  solz += solution_get_solutions(
113
- biz, options.type, sid: sid, name: name, fuzzy: fuzzy
113
+ biz, options.type, api_id: api_id, name: name, fuzzy: fuzzy
114
114
  )
115
115
  end
116
116
 
@@ -120,35 +120,35 @@ def must_fetch_solutions!(options, args=[], biz=nil)
120
120
  # MAYBE: DRY this code. Rather than copy-paste-find-replace block of code.
121
121
  # See also: any_business_pickers?
122
122
  #
123
- sid = []
123
+ api_id = []
124
124
  name = []
125
125
  fuzzy = []
126
126
  if options.application_id
127
- sid = [options.application_id]
127
+ api_id = [options.application_id]
128
128
  elsif options.application_name
129
129
  name = [options.application_name]
130
130
  elsif options.application
131
131
  fuzzy = [options.application]
132
132
  end
133
- if !sid.empty? || !name.empty? || !fuzzy.empty?
133
+ if !api_id.empty? || !name.empty? || !fuzzy.empty?
134
134
  solz += solution_get_solutions(
135
- biz, :application, sid: sid, name: name, fuzzy: fuzzy
135
+ biz, :application, api_id: api_id, name: name, fuzzy: fuzzy
136
136
  )
137
137
  end
138
138
  #
139
- sid = []
139
+ api_id = []
140
140
  name = []
141
141
  fuzzy = []
142
142
  if options.product_id
143
- sid = [options.product_id]
143
+ api_id = [options.product_id]
144
144
  elsif options.product_name
145
145
  name = [options.product_name]
146
146
  elsif options.product
147
147
  fuzzy = [options.product]
148
148
  end
149
- if !sid.empty? || !name.empty? || !fuzzy.empty?
149
+ if !api_id.empty? || !name.empty? || !fuzzy.empty?
150
150
  solz += solution_get_solutions(
151
- biz, :product, sid: sid, name: name, fuzzy: fuzzy
151
+ biz, :product, api_id: api_id, name: name, fuzzy: fuzzy
152
152
  )
153
153
  end
154
154
  #
@@ -158,12 +158,12 @@ def must_fetch_solutions!(options, args=[], biz=nil)
158
158
  if !options.all
159
159
  if %i[all application].include?(options.type) && $cfg['application.id']
160
160
  solz += solution_get_solutions(
161
- biz, :application, sid: $cfg['application.id']
161
+ biz, :application, api_id: $cfg['application.id']
162
162
  )
163
163
  end
164
164
  if %i[all product].include?(options.type) && $cfg['product.id']
165
165
  solz += solution_get_solutions(
166
- biz, :product, sid: $cfg['product.id']
166
+ biz, :product, api_id: $cfg['product.id']
167
167
  )
168
168
  end
169
169
  else
@@ -173,10 +173,10 @@ def must_fetch_solutions!(options, args=[], biz=nil)
173
173
 
174
174
  culled = {}
175
175
  solz.select! do |sol|
176
- if culled[sol.sid]
176
+ if culled[sol.api_id]
177
177
  false
178
178
  else
179
- culled[sol.sid] = true
179
+ culled[sol.api_id] = true
180
180
  true
181
181
  end
182
182
  end
@@ -238,7 +238,7 @@ def any_product_pickers!(options)
238
238
  num_ways > 0
239
239
  end
240
240
 
241
- def solution_get_solutions(biz, type, sid: nil, name: nil, fuzzy: nil)
241
+ def solution_get_solutions(biz, type, api_id: nil, name: nil, fuzzy: nil)
242
242
  if type == :all
243
243
  inflection = 'solutions'
244
244
  else
@@ -246,7 +246,7 @@ def solution_get_solutions(biz, type, sid: nil, name: nil, fuzzy: nil)
246
246
  end
247
247
  MrMurano::Verbose.whirly_start("Fetching #{inflection}...")
248
248
  solz = biz.solutions(
249
- type: type, sid: sid, name: name, fuzzy: fuzzy, invalidate: false
249
+ type: type, api_id: api_id, name: name, fuzzy: fuzzy, invalidate: false
250
250
  )
251
251
  MrMurano::Verbose.whirly_stop
252
252
  solz
@@ -275,6 +275,11 @@ def solution_ask_for_name(sol)
275
275
  end
276
276
  end
277
277
  sol.name
278
+ rescue EOFError
279
+ # E.g., the user pressed Ctrl-D.
280
+ # "error: The input stream is exhausted."
281
+ MrMurano::Verbose.error('murano out!')
282
+ exit 2
278
283
  end
279
284
 
280
285
  # *** Interact with the user to identify the solution.
@@ -289,21 +294,21 @@ def get_two_solutions!(sol_a_id=nil, sol_b_id=nil, **options)
289
294
  app_srchs = []
290
295
  prd_srchs = []
291
296
 
292
- #app_srchs += [[:application, :sid, sol_a_id]] unless sol_a_id.to_s.empty?
293
- #prd_srchs += [[:product, :sid, sol_b_id]] unless sol_b_id.to_s.empty?
294
- app_srchs += [[nil, :sid, sol_a_id]] unless sol_a_id.to_s.empty?
295
- prd_srchs += [[nil, :sid, sol_b_id]] unless sol_b_id.to_s.empty?
297
+ #app_srchs += [[:application, :api_id, sol_a_id]] unless sol_a_id.to_s.empty?
298
+ #prd_srchs += [[:product, :api_id, sol_b_id]] unless sol_b_id.to_s.empty?
299
+ app_srchs += [[nil, :api_id, sol_a_id]] unless sol_a_id.to_s.empty?
300
+ prd_srchs += [[nil, :api_id, sol_b_id]] unless sol_b_id.to_s.empty?
296
301
 
297
302
  app_srchs += get_soln_searches(:application, options)
298
303
  prd_srchs += get_soln_searches(:product, options)
299
304
 
300
305
  if app_srchs.length.zero? && prd_srchs.length < 2
301
306
  # TEST/2017-08-16: Clear application.id and test.
302
- app_srchs = [[:application, :sid, $cfg['application.id']]]
307
+ app_srchs = [[:application, :api_id, $cfg['application.id']]]
303
308
  end
304
309
  if prd_srchs.length.zero? && app_srchs.length < 2
305
310
  # TEST/2017-08-16: Clear product.id and test.
306
- prd_srchs = [[:product, :sid, $cfg['product.id']]]
311
+ prd_srchs = [[:product, :api_id, $cfg['product.id']]]
307
312
  end
308
313
 
309
314
  sol_srchs = app_srchs + prd_srchs
@@ -318,8 +323,8 @@ def get_two_solutions!(sol_a_id=nil, sol_b_id=nil, **options)
318
323
  sol_srchs.each do |type, desc, value|
319
324
  sol_opts = {}
320
325
  case desc
321
- when :sid
322
- sol_opts[:match_sid] = value
326
+ when :api_id
327
+ sol_opts[:match_api_id] = value
323
328
  when :name
324
329
  sol_opts[:match_name] = value
325
330
  when :term
@@ -340,7 +345,7 @@ def get_soln_searches(sol_type, options)
340
345
  # E.g., :application_id
341
346
  if options["#{sol_type}_id".to_sym]
342
347
  app_ids = options["#{sol_type}_id".to_sym].split(',')
343
- app_ids.each { |sid| sol_srchs += [[sol_type, :sid, sid]] }
348
+ app_ids.each { |api_id| sol_srchs += [[sol_type, :api_id, api_id]] }
344
349
  end
345
350
  # E.g., :application_name
346
351
  if options["#{sol_type}_name".to_sym]
@@ -374,7 +379,7 @@ module MrMurano
374
379
  ignore_cfg: false,
375
380
  verbose: false,
376
381
  match_enable: false,
377
- match_sid: nil,
382
+ match_api_id: nil,
378
383
  match_name: nil,
379
384
  match_fuzzy: nil
380
385
  )
@@ -384,23 +389,23 @@ module MrMurano
384
389
  @ignore_cfg = ignore_cfg
385
390
  @verbose = verbose
386
391
  @match_enable = match_enable
387
- @match_sid = match_sid
392
+ @match_api_id = match_api_id
388
393
  @match_name = match_name
389
394
  @match_fuzzy = match_fuzzy
390
- @match_sid = nil if @match_sid.to_s.empty?
395
+ @match_api_id = nil if @match_api_id.to_s.empty?
391
396
  @match_name = nil if @match_name.to_s.empty?
392
397
  @match_fuzzy = nil if @match_fuzzy.to_s.empty?
393
- @searching = @match_enable && (@match_sid || @match_name || @match_fuzzy)
398
+ @searching = @match_enable && (@match_api_id || @match_name || @match_fuzzy)
394
399
  end
395
400
 
396
401
  def find_or_create(model)
397
402
  # First, try to find the solution by solution ID.
398
- sol = solution_find_by_sid(model)
403
+ sol = solution_find_by_api_id(model)
399
404
  # If not found, search existing solutions, and maybe ask user.
400
405
  if sol.nil?
401
406
  if @searching
402
407
  sol = solution_search_by_term(model)
403
- sol = solution_create_new_solution(model) if sol.nil? && @create_ok && @match_sid.nil?
408
+ sol = solution_create_new_solution(model) if sol.nil? && @create_ok && @match_api_id.nil?
404
409
  else
405
410
  sol = solution_lookup_or_ask(model)
406
411
  end
@@ -408,26 +413,26 @@ module MrMurano
408
413
  # Finally, if asked, update the config.
409
414
  if @update_cfg && !sol.nil?
410
415
  # Update the config in memory and on disk/file.
411
- $cfg.set(sol.cfg_key_id, sol.sid, :project)
416
+ $cfg.set(sol.cfg_key_id, sol.api_id, :project)
412
417
  $cfg.set(sol.cfg_key_name, sol.name, :project)
413
418
  end
414
419
  sol
415
420
  end
416
421
 
417
- def solution_find_by_sid(sol)
422
+ def solution_find_by_api_id(sol)
418
423
  exists = false
419
424
  if @searching || @ignore_cfg
420
- sol.sid = @match_sid || @match_fuzzy
425
+ sol.api_id = @match_api_id || @match_fuzzy
421
426
  else
422
427
  # Note that we verify the solution ID we find in the config,
423
428
  # since the user could've, e.g., deleted it via the web UI.
424
429
  # LATER: This only works so long as there's only one Product
425
430
  # or one Application. Eventually we'll add support for more.
426
- sol.sid = $cfg[sol.cfg_key_id].to_s
431
+ sol.api_id = $cfg[sol.cfg_key_id].to_s
427
432
  return sol if @skip_verify
428
433
  end
429
- if sol.sid?
430
- tried_sid = sol.sid
434
+ if sol.api_id?
435
+ tried_api_id = sol.api_id
431
436
  if @searching
432
437
  whirly_msg = "Searching #{sol.type_name} by ID..."
433
438
  else
@@ -435,12 +440,12 @@ module MrMurano
435
440
  end
436
441
  MrMurano::Verbose.whirly_start(whirly_msg)
437
442
  sol.info_safe
438
- if sol.valid_sid
443
+ if sol.valid_api_id
439
444
  exists = true
440
445
  # Convert from Solution to proper subclass, perhaps.
441
446
  sol = solution_factory_reset(sol)
442
447
  else
443
- sol.sid = nil
448
+ sol.api_id = nil
444
449
  end
445
450
  MrMurano::Verbose.whirly_stop
446
451
  # Spit out some messages, maybe.
@@ -449,8 +454,8 @@ module MrMurano
449
454
  say "Found #{sol.type_name} #{sol.pretty_desc}"
450
455
  elsif !@searching
451
456
  # The solution ID in the config was not found for this business.
452
- tried_sid = MrMurano::Verbose.fancy_ticks(tried_sid)
453
- say "The #{sol.type_name} ID #{tried_sid} from the config was not found"
457
+ tried_api_id = MrMurano::Verbose.fancy_ticks(tried_api_id)
458
+ say "The #{sol.type_name} ID #{tried_api_id} from the config was not found"
454
459
  end
455
460
  puts ''
456
461
  end
@@ -519,7 +524,7 @@ module MrMurano
519
524
 
520
525
  def solution_search_by_term(sol)
521
526
  solz = solution_get_solutions(
522
- sol.biz, sol.type, sid: @match_sid, name: @match_name, fuzzy: @match_fuzzy
527
+ sol.biz, sol.type, api_id: @match_api_id, name: @match_name, fuzzy: @match_fuzzy
523
528
  )
524
529
  if solz.length > 1
525
530
  sol.error("More than one matching #{sol.type_name} found. Please be more specific")