vmc-IronFoundry 0.3.16.IF.1 → 0.3.16.IF.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -30,6 +30,8 @@ TESTS_TO_BUILD = ["#{TESTS_PATH}/java_web/java_tiny_app",
30
30
  "#{TESTS_PATH}/lift/hello_lift",
31
31
  "#{TESTS_PATH}/spring/roo-guestbook",
32
32
  "#{TESTS_PATH}/spring/spring-osgi-hello",
33
+ "#{TESTS_PATH}/standalone/java_app",
34
+ "#{TESTS_PATH}/standalone/python_app"
33
35
  ]
34
36
 
35
37
  desc "Build the tests. If the git hash associated with the test assets has not changed, nothing is built. To force a build, invoke 'rake build[--force]'"
@@ -371,7 +371,6 @@ module VMC::Cli::Command
371
371
 
372
372
  def check_deploy_directory(path)
373
373
  err 'Deployment path does not exist' unless File.exists? path
374
- err 'Deployment path is not a directory' unless File.directory? path
375
374
  return if File.expand_path(Dir.tmpdir) != File.expand_path(path)
376
375
  err "Can't deploy applications from staging directory: [#{Dir.tmpdir}]"
377
376
  end
@@ -410,101 +409,112 @@ module VMC::Cli::Command
410
409
  explode_dir = "#{Dir.tmpdir}/.vmc_#{appname}_files"
411
410
  FileUtils.rm_rf(explode_dir) # Make sure we didn't have anything left over..
412
411
 
413
- Dir.chdir(path) do
414
- # Stage the app appropriately and do the appropriate fingerprinting, etc.
415
- if war_file = Dir.glob('*.war').first
416
- VMC::Cli::ZipUtil.unpack(war_file, explode_dir)
417
- else
418
- check_unreachable_links(path)
419
- FileUtils.mkdir(explode_dir)
412
+ if path =~ /\.(war|zip)$/
413
+ #single file that needs unpacking
414
+ VMC::Cli::ZipUtil.unpack(path, explode_dir)
415
+ elsif !File.directory? path
416
+ #single file that doesn't need unpacking
417
+ FileUtils.mkdir(explode_dir)
418
+ FileUtils.cp(path,explode_dir)
419
+ else
420
+ Dir.chdir(path) do
421
+ # Stage the app appropriately and do the appropriate fingerprinting, etc.
422
+ if war_file = Dir.glob('*.war').first
423
+ VMC::Cli::ZipUtil.unpack(war_file, explode_dir)
424
+ elsif zip_file = Dir.glob('*.zip').first
425
+ VMC::Cli::ZipUtil.unpack(zip_file, explode_dir)
426
+ else
427
+ check_unreachable_links(path)
428
+ FileUtils.mkdir(explode_dir)
420
429
 
421
- files = Dir.glob('{*,.[^\.]*}')
430
+ files = Dir.glob('{*,.[^\.]*}')
422
431
 
423
- # Do not process .git files
424
- files.delete('.git') if files
432
+ # Do not process .git files
433
+ files.delete('.git') if files
425
434
 
426
- FileUtils.cp_r(files, explode_dir)
435
+ FileUtils.cp_r(files, explode_dir)
427
436
 
428
- find_sockets(explode_dir).each do |s|
429
- File.delete s
437
+ find_sockets(explode_dir).each do |s|
438
+ File.delete s
439
+ end
430
440
  end
431
441
  end
442
+ end
432
443
 
433
- # Send the resource list to the cloudcontroller, the response will tell us what it already has..
434
- unless @options[:noresources]
435
- display ' Checking for available resources: ', false
436
- fingerprints = []
437
- total_size = 0
438
- resource_files = Dir.glob("#{explode_dir}/**/*", File::FNM_DOTMATCH)
439
- resource_files.each do |filename|
440
- next if (File.directory?(filename) || !File.exists?(filename))
441
- fingerprints << {
442
- :size => File.size(filename),
443
- :sha1 => Digest::SHA1.file(filename).hexdigest,
444
- :fn => filename
445
- }
446
- total_size += File.size(filename)
447
- end
448
-
449
- # Check to see if the resource check is worth the round trip
450
- if (total_size > (64*1024)) # 64k for now
451
- # Send resource fingerprints to the cloud controller
452
- appcloud_resources = client.check_resources(fingerprints)
453
- end
454
- display 'OK'.green
455
-
456
- if appcloud_resources
457
- display ' Processing resources: ', false
458
- # We can then delete what we do not need to send.
459
- appcloud_resources.each do |resource|
460
- FileUtils.rm_f resource[:fn]
461
- # adjust filenames sans the explode_dir prefix
462
- resource[:fn].sub!("#{explode_dir}/", '')
463
- end
464
- display 'OK'.green
465
- end
444
+ # Send the resource list to the cloudcontroller, the response will tell us what it already has..
445
+ unless @options[:noresources]
446
+ display ' Checking for available resources: ', false
447
+ fingerprints = []
448
+ total_size = 0
449
+ resource_files = Dir.glob("#{explode_dir}/**/*", File::FNM_DOTMATCH)
450
+ resource_files.each do |filename|
451
+ next if (File.directory?(filename) || !File.exists?(filename))
452
+ fingerprints << {
453
+ :size => File.size(filename),
454
+ :sha1 => Digest::SHA1.file(filename).hexdigest,
455
+ :fn => filename
456
+ }
457
+ total_size += File.size(filename)
458
+ end
466
459
 
460
+ # Check to see if the resource check is worth the round trip
461
+ if (total_size > (64*1024)) # 64k for now
462
+ # Send resource fingerprints to the cloud controller
463
+ appcloud_resources = client.check_resources(fingerprints)
467
464
  end
465
+ display 'OK'.green
468
466
 
469
- # If no resource needs to be sent, add an empty file to ensure we have
470
- # a multi-part request that is expected by nginx fronting the CC.
471
- if VMC::Cli::ZipUtil.get_files_to_pack(explode_dir).empty?
472
- Dir.chdir(explode_dir) do
473
- File.new(".__empty__", "w")
467
+ if appcloud_resources
468
+ display ' Processing resources: ', false
469
+ # We can then delete what we do not need to send.
470
+ appcloud_resources.each do |resource|
471
+ FileUtils.rm_f resource[:fn]
472
+ # adjust filenames sans the explode_dir prefix
473
+ resource[:fn].sub!("#{explode_dir}/", '')
474
474
  end
475
+ display 'OK'.green
475
476
  end
476
- # Perform Packing of the upload bits here.
477
- display ' Packing application: ', false
478
- VMC::Cli::ZipUtil.pack(explode_dir, upload_file)
479
- display 'OK'.green
480
477
 
481
- upload_size = File.size(upload_file);
482
- if upload_size > 1024*1024
483
- upload_size = (upload_size/(1024.0*1024.0)).round.to_s + 'M'
484
- elsif upload_size > 0
485
- upload_size = (upload_size/1024.0).round.to_s + 'K'
486
- else
487
- upload_size = '0K'
478
+ end
479
+
480
+ # If no resource needs to be sent, add an empty file to ensure we have
481
+ # a multi-part request that is expected by nginx fronting the CC.
482
+ if VMC::Cli::ZipUtil.get_files_to_pack(explode_dir).empty?
483
+ Dir.chdir(explode_dir) do
484
+ File.new(".__empty__", "w")
488
485
  end
486
+ end
487
+ # Perform Packing of the upload bits here.
488
+ display ' Packing application: ', false
489
+ VMC::Cli::ZipUtil.pack(explode_dir, upload_file)
490
+ display 'OK'.green
489
491
 
490
- upload_str = " Uploading (#{upload_size}): "
491
- display upload_str, false
492
+ upload_size = File.size(upload_file);
493
+ if upload_size > 1024*1024
494
+ upload_size = (upload_size/(1024.0*1024.0)).round.to_s + 'M'
495
+ elsif upload_size > 0
496
+ upload_size = (upload_size/1024.0).round.to_s + 'K'
497
+ else
498
+ upload_size = '0K'
499
+ end
492
500
 
493
- FileWithPercentOutput.display_str = upload_str
494
- FileWithPercentOutput.upload_size = File.size(upload_file);
495
- file = FileWithPercentOutput.open(upload_file, 'rb')
501
+ upload_str = " Uploading (#{upload_size}): "
502
+ display upload_str, false
496
503
 
497
- client.upload_app(appname, file, appcloud_resources)
498
- display 'OK'.green if VMC::Cli::ZipUtil.get_files_to_pack(explode_dir).empty?
504
+ FileWithPercentOutput.display_str = upload_str
505
+ FileWithPercentOutput.upload_size = File.size(upload_file);
506
+ file = FileWithPercentOutput.open(upload_file, 'rb')
499
507
 
500
- display 'Push Status: ', false
501
- display 'OK'.green
502
- end
508
+ client.upload_app(appname, file, appcloud_resources)
509
+ display 'OK'.green if VMC::Cli::ZipUtil.get_files_to_pack(explode_dir).empty?
503
510
 
504
- ensure
505
- # Cleanup if we created an exploded directory.
506
- FileUtils.rm_f(upload_file) if upload_file
507
- FileUtils.rm_rf(explode_dir) if explode_dir
511
+ display 'Push Status: ', false
512
+ display 'OK'.green
513
+
514
+ ensure
515
+ # Cleanup if we created an exploded directory.
516
+ FileUtils.rm_f(upload_file) if upload_file
517
+ FileUtils.rm_rf(explode_dir) if explode_dir
508
518
  end
509
519
 
510
520
  def check_app_limit
@@ -908,6 +918,8 @@ module VMC::Cli::Command
908
918
  url = info(:url) || info(:urls)
909
919
  mem, memswitch = nil, info(:mem)
910
920
  memswitch = normalize_mem(memswitch) if memswitch
921
+ command = info(:command)
922
+ runtime = info(:runtime)
911
923
 
912
924
  # Check app existing upfront if we have appname
913
925
  app_checked = false
@@ -934,9 +946,30 @@ module VMC::Cli::Command
934
946
  err "Application '#{appname}' already exists, use update or delete."
935
947
  end
936
948
 
937
- default_url = "#{appname}.#{target_base}"
949
+ if ignore_framework
950
+ framework = VMC::Cli::Framework.new
951
+ elsif f = info(:framework)
952
+ info = Hash[f["info"].collect { |k, v| [k.to_sym, v] }]
953
+
954
+ framework = VMC::Cli::Framework.create(f["name"], info)
955
+ exec = framework.exec if framework && framework.exec
956
+ else
957
+ framework = detect_framework(prompt_ok)
958
+ end
959
+
960
+ err "Application Type undetermined for path '#{@application}'" unless framework
961
+
962
+ if not runtime
963
+ default_runtime = framework.default_runtime @application
964
+ runtime = detect_runtime(default_runtime, !no_prompt) if framework.prompt_for_runtime?
965
+ end
966
+ command = ask("Start Command") if !command && framework.require_start_command?
967
+
968
+ default_url = "None"
969
+ default_url = "#{appname}.#{VMC::Cli::Config.suggest_url}" if framework.require_url?
970
+
938
971
 
939
- unless no_prompt || url
972
+ unless no_prompt || url || !framework.require_url?
940
973
  url = ask(
941
974
  "Application Deployed URL",
942
975
  :default => default_url
@@ -947,29 +980,18 @@ module VMC::Cli::Command
947
980
  # this common error
948
981
  url = nil if YES_SET.member? url
949
982
  end
950
-
983
+ url = nil if url == "None"
984
+ default_url = nil if default_url == "None"
951
985
  url ||= default_url
952
986
 
953
- if ignore_framework
954
- framework = VMC::Cli::Framework.new
955
- elsif f = info(:framework)
956
- info = Hash[f["info"].collect { |k, v| [k.to_sym, v] }]
957
-
958
- framework = VMC::Cli::Framework.new(f["name"], info)
959
- exec = framework.exec if framework && framework.exec
960
- else
961
- framework = detect_framework(prompt_ok)
962
- end
963
-
964
- err "Application Type undetermined for path '#{@application}'" unless framework
965
-
966
987
  if memswitch
967
988
  mem = memswitch
968
989
  elsif prompt_ok
969
990
  mem = ask("Memory Reservation",
970
- :default => framework.memory, :choices => mem_choices)
991
+ :default => framework.memory(runtime),
992
+ :choices => mem_choices)
971
993
  else
972
- mem = framework.memory
994
+ mem = framework.memory runtime
973
995
  end
974
996
 
975
997
  # Set to MB number
@@ -984,14 +1006,15 @@ module VMC::Cli::Command
984
1006
  :name => "#{appname}",
985
1007
  :staging => {
986
1008
  :framework => framework.name,
987
- :runtime => info(:runtime)
1009
+ :runtime => runtime
988
1010
  },
989
1011
  :uris => Array(url),
990
1012
  :instances => instances,
991
1013
  :resources => {
992
1014
  :memory => mem_quota
993
- },
1015
+ }
994
1016
  }
1017
+ manifest[:staging][:command] = command if command
995
1018
 
996
1019
  # Send the manifest to the cloud controller
997
1020
  client.create_app(appname, manifest)
@@ -11,6 +11,7 @@ module VMC::Cli
11
11
  'Grails' => ['grails', { :mem => '512M', :description => 'Java SpringSource Grails Application'}],
12
12
  'Lift' => ['lift', { :mem => '512M', :description => 'Scala Lift Application'}],
13
13
  'JavaWeb' => ['java_web',{ :mem => '512M', :description => 'Java Web Application'}],
14
+ 'Standalone' => ['standalone', { :mem => '64M', :description => 'Standalone Application'}],
14
15
  'Sinatra' => ['sinatra', { :mem => '128M', :description => 'Sinatra Application'}],
15
16
  'Node' => ['node', { :mem => '64M', :description => 'Node.js Application'}],
16
17
  'PHP' => ['php', { :mem => '128M', :description => 'PHP Application'}],
@@ -28,16 +29,33 @@ module VMC::Cli
28
29
  end
29
30
 
30
31
  def lookup(name)
31
- return Framework.new(*FRAMEWORKS[name])
32
+ return create(*FRAMEWORKS[name])
32
33
  end
33
34
 
34
35
  def lookup_by_framework(name)
35
36
  FRAMEWORKS.each do |key,fw|
36
- return Framework.new(fw[0], fw[1]) if fw[0] == name
37
+ return create(fw[0],fw[1]) if fw[0] == name
38
+ end
39
+ end
40
+
41
+ def create(name,opts)
42
+ if name == "standalone"
43
+ return StandaloneFramework.new(name, opts)
44
+ else
45
+ return Framework.new(name,opts)
37
46
  end
38
47
  end
39
48
 
40
49
  def detect(path, available_frameworks)
50
+ if !File.directory? path
51
+ if path.end_with?('.war')
52
+ return detect_framework_from_war path
53
+ elsif available_frameworks.include?(["standalone"])
54
+ return Framework.lookup('Standalone')
55
+ else
56
+ return nil
57
+ end
58
+ end
41
59
  Dir.chdir(path) do
42
60
  # Rails
43
61
  if File.exist?('config/environment.rb')
@@ -47,30 +65,13 @@ module VMC::Cli
47
65
  elsif File.exist?('config.ru') && available_frameworks.include?(["rack"])
48
66
  return Framework.lookup('Rack')
49
67
 
50
- # Java
51
- elsif Dir.glob('*.war').first || File.exist?('WEB-INF/web.xml')
52
- war_file = Dir.glob('*.war').first
68
+ # Java Web Apps
69
+ elsif Dir.glob('*.war').first
70
+ return detect_framework_from_war(Dir.glob('*.war').first)
53
71
 
54
- if war_file
55
- contents = ZipUtil.entry_lines(war_file)
56
- else
57
- contents = Dir['**/*'].join("\n")
58
- end
72
+ elsif File.exist?('WEB-INF/web.xml')
73
+ return detect_framework_from_war
59
74
 
60
- # Spring/Lift Variations
61
- if contents =~ /WEB-INF\/lib\/grails-web.*\.jar/
62
- return Framework.lookup('Grails')
63
- elsif contents =~ /WEB-INF\/lib\/lift-webkit.*\.jar/
64
- return Framework.lookup('Lift')
65
- elsif contents =~ /WEB-INF\/classes\/org\/springframework/
66
- return Framework.lookup('Spring')
67
- elsif contents =~ /WEB-INF\/lib\/spring-core.*\.jar/
68
- return Framework.lookup('Spring')
69
- elsif contents =~ /WEB-INF\/lib\/org\.springframework\.core.*\.jar/
70
- return Framework.lookup('Spring')
71
- else
72
- return Framework.lookup('JavaWeb')
73
- end
74
75
  # Simple Ruby Apps
75
76
  elsif !Dir.glob('*.rb').empty?
76
77
  matched_file = nil
@@ -82,11 +83,11 @@ module VMC::Cli
82
83
  end
83
84
  end
84
85
  if matched_file
86
+ # Sinatra apps
85
87
  f = Framework.lookup('Sinatra')
86
88
  f.exec = "ruby #{matched_file}"
87
89
  return f
88
90
  end
89
-
90
91
  # Node.js
91
92
  elsif !Dir.glob('*.js').empty?
92
93
  if File.exist?('server.js') || File.exist?('app.js') || File.exist?('index.js') || File.exist?('main.js')
@@ -98,7 +99,6 @@ module VMC::Cli
98
99
  if File.exist?('web.config')
99
100
  return Framework.lookup('ASP.NET 4.0')
100
101
  end
101
-
102
102
  # PHP
103
103
  elsif !Dir.glob('*.php').empty?
104
104
  return Framework.lookup('PHP')
@@ -115,19 +115,42 @@ module VMC::Cli
115
115
  # Python
116
116
  elsif !Dir.glob('wsgi.py').empty?
117
117
  return Framework.lookup('WSGI')
118
-
119
118
  end
119
+
120
+ # Default to Standalone if no other match was made
121
+ return Framework.lookup('Standalone') if available_frameworks.include?(["standalone"])
120
122
  end
121
- nil
122
123
  end
123
124
 
125
+ private
126
+ def detect_framework_from_war(war_file=nil)
127
+ if war_file
128
+ contents = ZipUtil.entry_lines(war_file)
129
+ else
130
+ #assume we are working with current dir
131
+ contents = Dir['**/*'].join("\n")
132
+ end
133
+
134
+ # Spring/Lift Variations
135
+ if contents =~ /WEB-INF\/lib\/grails-web.*\.jar/
136
+ return Framework.lookup('Grails')
137
+ elsif contents =~ /WEB-INF\/lib\/lift-webkit.*\.jar/
138
+ return Framework.lookup('Lift')
139
+ elsif contents =~ /WEB-INF\/classes\/org\/springframework/
140
+ return Framework.lookup('Spring')
141
+ elsif contents =~ /WEB-INF\/lib\/spring-core.*\.jar/
142
+ return Framework.lookup('Spring')
143
+ elsif contents =~ /WEB-INF\/lib\/org\.springframework\.core.*\.jar/
144
+ return Framework.lookup('Spring')
145
+ else
146
+ return Framework.lookup('JavaWeb')
147
+ end
148
+ end
124
149
  end
125
150
 
126
- attr_reader :name, :description, :memory, :console
151
+ attr_reader :name, :description, :console
127
152
  attr_accessor :exec
128
153
 
129
- alias :mem :memory
130
-
131
154
  def initialize(framework=nil, opts={})
132
155
  @name = framework || DEFAULT_FRAMEWORK
133
156
  @memory = opts[:mem] || DEFAULT_MEM
@@ -139,6 +162,80 @@ module VMC::Cli
139
162
  def to_s
140
163
  description
141
164
  end
165
+
166
+ def require_url?
167
+ true
168
+ end
169
+
170
+ def require_start_command?
171
+ false
172
+ end
173
+
174
+ def prompt_for_runtime?
175
+ false
176
+ end
177
+
178
+ def default_runtime(path)
179
+ nil
180
+ end
181
+
182
+ def memory(runtime=nil)
183
+ @memory
184
+ end
185
+
186
+ alias :mem :memory
187
+ end
188
+
189
+ class StandaloneFramework < Framework
190
+ def require_url?
191
+ false
192
+ end
193
+
194
+ def require_start_command?
195
+ true
196
+ end
197
+
198
+ def prompt_for_runtime?
199
+ true
200
+ end
201
+
202
+ def default_runtime(path)
203
+ if !File.directory? path
204
+ if path =~ /\.(jar|class)$/
205
+ return "java"
206
+ elsif path =~ /\.(rb)$/
207
+ return "ruby18"
208
+ elsif path =~ /\.(zip)$/
209
+ return detect_runtime_from_zip path
210
+ end
211
+ else
212
+ Dir.chdir(path) do
213
+ return "ruby18" if not Dir.glob('**/*.rb').empty?
214
+ if !Dir.glob('**/*.class').empty? || !Dir.glob('**/*.jar').empty?
215
+ return "java"
216
+ elsif Dir.glob('*.zip').first
217
+ zip_file = Dir.glob('*.zip').first
218
+ return detect_runtime_from_zip zip_file
219
+ end
220
+ end
221
+ end
222
+ return nil
223
+ end
224
+
225
+ def memory(runtime=nil)
226
+ default_mem = @memory
227
+ default_mem = '128M' if runtime =~ /\Aruby/ || runtime == "php"
228
+ default_mem = '512M' if runtime == "java"
229
+ default_mem
230
+ end
231
+
232
+ private
233
+ def detect_runtime_from_zip(zip_file)
234
+ contents = ZipUtil.entry_lines(zip_file)
235
+ if contents =~ /\.(jar)$/
236
+ return "java"
237
+ end
238
+ end
142
239
  end
143
240
 
144
241
  end
@@ -82,22 +82,11 @@ module VMC::Cli::ManifestHelper
82
82
  name = manifest("name") ||
83
83
  set(ask("Application Name", :default => manifest("name")), "name")
84
84
 
85
- url_template = manifest("url") || DEFAULTS["url"]
86
- url_resolved = url_template.dup
87
- resolve_lexically(url_resolved)
88
-
89
- url = ask("Application Deployed URL", :default => url_resolved)
90
-
91
- url = url_template if url == url_resolved
92
-
93
- # common error case is for prompted users to answer y or Y or yes or
94
- # YES to this ask() resulting in an unintended URL of y. Special
95
- # case this common error
96
- url = DEFAULTS["url"] if YES_SET.member? url
97
85
 
98
- set url, "url"
99
86
 
100
- unless manifest "framework"
87
+ if manifest "framework"
88
+ framework = VMC::Cli::Framework.lookup_by_framework manifest("framework","name")
89
+ else
101
90
  framework = detect_framework
102
91
  set framework.name, "framework", "name"
103
92
  set(
@@ -110,11 +99,44 @@ module VMC::Cli::ManifestHelper
110
99
  )
111
100
  end
112
101
 
102
+ default_runtime = manifest "runtime"
103
+ if not default_runtime
104
+ default_runtime = framework.default_runtime(@application)
105
+ set(detect_runtime(default_runtime), "runtime") if framework.prompt_for_runtime?
106
+ end
107
+ default_command = manifest "command"
108
+ set ask("Start Command", :default => default_command), "command" if framework.require_start_command?
109
+
110
+ url_template = manifest("url") || DEFAULTS["url"]
111
+ url_resolved = url_template.dup
112
+ resolve_lexically(url_resolved)
113
+
114
+ if !framework.require_url?
115
+ url_resolved = "None"
116
+ end
117
+ url = ask("Application Deployed URL", :default => url_resolved)
118
+
119
+ if url == url_resolved && url != "None"
120
+ url = url_template
121
+ end
122
+
123
+ # common error case is for prompted users to answer y or Y or yes or
124
+ # YES to this ask() resulting in an unintended URL of y. Special
125
+ # case this common error
126
+ url = url_resolved if YES_SET.member? url
127
+
128
+ if(url == "None")
129
+ url = nil
130
+ end
131
+
132
+ set url, "url"
133
+
134
+ default_mem = manifest("mem")
135
+ default_mem = framework.memory(manifest("runtime")) if not default_mem
113
136
  set ask(
114
137
  "Memory reservation",
115
138
  :default =>
116
- manifest("mem") ||
117
- manifest("framework", "info", "mem") ||
139
+ default_mem ||
118
140
  DEFAULTS["mem"],
119
141
  :choices => ["128M", "256M", "512M", "1G", "2G"]
120
142
  ), "mem"
@@ -184,6 +206,24 @@ module VMC::Cli::ManifestHelper
184
206
  framework
185
207
  end
186
208
 
209
+ # Detect the appropriate runtime.
210
+ def detect_runtime(default, prompt_ok=true)
211
+ runtime = nil
212
+ runtime_keys=[]
213
+ runtimes_info.keys.each {|runtime_key| runtime_keys << runtime_key.dup }
214
+ runtime_keys.sort!
215
+ if prompt_ok
216
+ runtime = ask(
217
+ "Select Runtime",
218
+ :indexed => true,
219
+ :default => default,
220
+ :choices => runtime_keys
221
+ )
222
+ display "Selected #{runtime}"
223
+ end
224
+ runtime
225
+ end
226
+
187
227
  def bind_services(user_services, chosen = 0)
188
228
  svcname = ask(
189
229
  "Which one?",
data/lib/cli/runner.rb CHANGED
@@ -289,7 +289,7 @@ class VMC::Cli::Runner
289
289
  set_cmd(:apps, :instances, 2)
290
290
  else
291
291
  usage('vmc instances <appname>')
292
- set_cmd(:apps, :instances, @args.size == 1 ? 1 : 0)
292
+ set_cmd(:apps, :instances, 1)
293
293
  end
294
294
 
295
295
  when 'crashes'
@@ -489,7 +489,6 @@ class VMC::Cli::Runner
489
489
  @exit_status = false
490
490
  rescue VMC::Client::TargetError, VMC::Client::NotFound, VMC::Client::BadTarget => e
491
491
  puts e.message.red
492
- puts e.backtrace
493
492
  @exit_status = false
494
493
  rescue VMC::Client::HTTPException => e
495
494
  puts e.message.red
data/lib/cli/version.rb CHANGED
@@ -2,6 +2,6 @@ module VMC
2
2
  module Cli
3
3
  # This version number is used as the RubyGem release version.
4
4
  # The internal VMC version number is VMC::VERSION.
5
- VERSION = '0.3.16.IF.1'
5
+ VERSION = '0.3.16.IF.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmc-IronFoundry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.16.IF.1
4
+ version: 0.3.16.IF.2
5
5
  prerelease: 7
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-05 00:00:00.000000000 Z
12
+ date: 2012-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json_pure
16
- requirement: &26890464 !ruby/object:Gem::Requirement
16
+ requirement: &26653476 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: 1.7.0
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *26890464
27
+ version_requirements: *26653476
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rubyzip
30
- requirement: &26890008 !ruby/object:Gem::Requirement
30
+ requirement: &26652336 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ~>
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: 0.9.4
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *26890008
38
+ version_requirements: *26652336
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: rest-client
41
- requirement: &26889612 !ruby/object:Gem::Requirement
41
+ requirement: &26687004 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -49,10 +49,10 @@ dependencies:
49
49
  version: 1.7.0
50
50
  type: :runtime
51
51
  prerelease: false
52
- version_requirements: *26889612
52
+ version_requirements: *26687004
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: terminal-table
55
- requirement: &26888916 !ruby/object:Gem::Requirement
55
+ requirement: &26685744 !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
58
58
  - - ~>
@@ -60,10 +60,10 @@ dependencies:
60
60
  version: 1.4.2
61
61
  type: :runtime
62
62
  prerelease: false
63
- version_requirements: *26888916
63
+ version_requirements: *26685744
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: interact
66
- requirement: &26888592 !ruby/object:Gem::Requirement
66
+ requirement: &26685108 !ruby/object:Gem::Requirement
67
67
  none: false
68
68
  requirements:
69
69
  - - ~>
@@ -71,10 +71,10 @@ dependencies:
71
71
  version: 0.4.0
72
72
  type: :runtime
73
73
  prerelease: false
74
- version_requirements: *26888592
74
+ version_requirements: *26685108
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: addressable
77
- requirement: &26888268 !ruby/object:Gem::Requirement
77
+ requirement: &26684808 !ruby/object:Gem::Requirement
78
78
  none: false
79
79
  requirements:
80
80
  - - ~>
@@ -82,10 +82,10 @@ dependencies:
82
82
  version: 2.2.6
83
83
  type: :runtime
84
84
  prerelease: false
85
- version_requirements: *26888268
85
+ version_requirements: *26684808
86
86
  - !ruby/object:Gem::Dependency
87
87
  name: uuidtools
88
- requirement: &26887908 !ruby/object:Gem::Requirement
88
+ requirement: &26683728 !ruby/object:Gem::Requirement
89
89
  none: false
90
90
  requirements:
91
91
  - - ~>
@@ -93,10 +93,10 @@ dependencies:
93
93
  version: 2.1.0
94
94
  type: :runtime
95
95
  prerelease: false
96
- version_requirements: *26887908
96
+ version_requirements: *26683728
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
- requirement: &26887548 !ruby/object:Gem::Requirement
99
+ requirement: &26683392 !ruby/object:Gem::Requirement
100
100
  none: false
101
101
  requirements:
102
102
  - - ! '>='
@@ -104,10 +104,10 @@ dependencies:
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
- version_requirements: *26887548
107
+ version_requirements: *26683392
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: rspec
110
- requirement: &26886960 !ruby/object:Gem::Requirement
110
+ requirement: &26682936 !ruby/object:Gem::Requirement
111
111
  none: false
112
112
  requirements:
113
113
  - - ~>
@@ -115,10 +115,10 @@ dependencies:
115
115
  version: 1.3.0
116
116
  type: :development
117
117
  prerelease: false
118
- version_requirements: *26886960
118
+ version_requirements: *26682936
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: webmock
121
- requirement: &26886648 !ruby/object:Gem::Requirement
121
+ requirement: &26682372 !ruby/object:Gem::Requirement
122
122
  none: false
123
123
  requirements:
124
124
  - - =
@@ -126,7 +126,7 @@ dependencies:
126
126
  version: 1.5.0
127
127
  type: :development
128
128
  prerelease: false
129
- version_requirements: *26886648
129
+ version_requirements: *26682372
130
130
  description: Client library and CLI that provides access to the VMware Cloud Application
131
131
  Platform.
132
132
  email: help@ironfoundry.org