vmc 0.3.16.beta.5 → 0.3.16.beta.6

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'}],
@@ -27,16 +28,33 @@ module VMC::Cli
27
28
  end
28
29
 
29
30
  def lookup(name)
30
- return Framework.new(*FRAMEWORKS[name])
31
+ return create(*FRAMEWORKS[name])
31
32
  end
32
33
 
33
34
  def lookup_by_framework(name)
34
35
  FRAMEWORKS.each do |key,fw|
35
- return Framework.new(fw[0], fw[1]) if fw[0] == name
36
+ return create(fw[0],fw[1]) if fw[0] == name
37
+ end
38
+ end
39
+
40
+ def create(name,opts)
41
+ if name == "standalone"
42
+ return StandaloneFramework.new(name, opts)
43
+ else
44
+ return Framework.new(name,opts)
36
45
  end
37
46
  end
38
47
 
39
48
  def detect(path, available_frameworks)
49
+ if !File.directory? path
50
+ if path.end_with?('.war')
51
+ return detect_framework_from_war path
52
+ elsif available_frameworks.include?(["standalone"])
53
+ return Framework.lookup('Standalone')
54
+ else
55
+ return nil
56
+ end
57
+ end
40
58
  Dir.chdir(path) do
41
59
  # Rails
42
60
  if File.exist?('config/environment.rb')
@@ -46,30 +64,13 @@ module VMC::Cli
46
64
  elsif File.exist?('config.ru') && available_frameworks.include?(["rack"])
47
65
  return Framework.lookup('Rack')
48
66
 
49
- # Java
50
- elsif Dir.glob('*.war').first || File.exist?('WEB-INF/web.xml')
51
- war_file = Dir.glob('*.war').first
67
+ # Java Web Apps
68
+ elsif Dir.glob('*.war').first
69
+ return detect_framework_from_war(Dir.glob('*.war').first)
52
70
 
53
- if war_file
54
- contents = ZipUtil.entry_lines(war_file)
55
- else
56
- contents = Dir['**/*'].join("\n")
57
- end
71
+ elsif File.exist?('WEB-INF/web.xml')
72
+ return detect_framework_from_war
58
73
 
59
- # Spring/Lift Variations
60
- if contents =~ /WEB-INF\/lib\/grails-web.*\.jar/
61
- return Framework.lookup('Grails')
62
- elsif contents =~ /WEB-INF\/lib\/lift-webkit.*\.jar/
63
- return Framework.lookup('Lift')
64
- elsif contents =~ /WEB-INF\/classes\/org\/springframework/
65
- return Framework.lookup('Spring')
66
- elsif contents =~ /WEB-INF\/lib\/spring-core.*\.jar/
67
- return Framework.lookup('Spring')
68
- elsif contents =~ /WEB-INF\/lib\/org\.springframework\.core.*\.jar/
69
- return Framework.lookup('Spring')
70
- else
71
- return Framework.lookup('JavaWeb')
72
- end
73
74
  # Simple Ruby Apps
74
75
  elsif !Dir.glob('*.rb').empty?
75
76
  matched_file = nil
@@ -81,17 +82,16 @@ module VMC::Cli
81
82
  end
82
83
  end
83
84
  if matched_file
85
+ # Sinatra apps
84
86
  f = Framework.lookup('Sinatra')
85
87
  f.exec = "ruby #{matched_file}"
86
88
  return f
87
89
  end
88
-
89
90
  # Node.js
90
91
  elsif !Dir.glob('*.js').empty?
91
92
  if File.exist?('server.js') || File.exist?('app.js') || File.exist?('index.js') || File.exist?('main.js')
92
93
  return Framework.lookup('Node')
93
94
  end
94
-
95
95
  # PHP
96
96
  elsif !Dir.glob('*.php').empty?
97
97
  return Framework.lookup('PHP')
@@ -108,19 +108,42 @@ module VMC::Cli
108
108
  # Python
109
109
  elsif !Dir.glob('wsgi.py').empty?
110
110
  return Framework.lookup('WSGI')
111
-
112
111
  end
112
+
113
+ # Default to Standalone if no other match was made
114
+ return Framework.lookup('Standalone') if available_frameworks.include?(["standalone"])
113
115
  end
114
- nil
115
116
  end
116
117
 
118
+ private
119
+ def detect_framework_from_war(war_file=nil)
120
+ if war_file
121
+ contents = ZipUtil.entry_lines(war_file)
122
+ else
123
+ #assume we are working with current dir
124
+ contents = Dir['**/*'].join("\n")
125
+ end
126
+
127
+ # Spring/Lift Variations
128
+ if contents =~ /WEB-INF\/lib\/grails-web.*\.jar/
129
+ return Framework.lookup('Grails')
130
+ elsif contents =~ /WEB-INF\/lib\/lift-webkit.*\.jar/
131
+ return Framework.lookup('Lift')
132
+ elsif contents =~ /WEB-INF\/classes\/org\/springframework/
133
+ return Framework.lookup('Spring')
134
+ elsif contents =~ /WEB-INF\/lib\/spring-core.*\.jar/
135
+ return Framework.lookup('Spring')
136
+ elsif contents =~ /WEB-INF\/lib\/org\.springframework\.core.*\.jar/
137
+ return Framework.lookup('Spring')
138
+ else
139
+ return Framework.lookup('JavaWeb')
140
+ end
141
+ end
117
142
  end
118
143
 
119
- attr_reader :name, :description, :memory, :console
144
+ attr_reader :name, :description, :console
120
145
  attr_accessor :exec
121
146
 
122
- alias :mem :memory
123
-
124
147
  def initialize(framework=nil, opts={})
125
148
  @name = framework || DEFAULT_FRAMEWORK
126
149
  @memory = opts[:mem] || DEFAULT_MEM
@@ -132,6 +155,80 @@ module VMC::Cli
132
155
  def to_s
133
156
  description
134
157
  end
158
+
159
+ def require_url?
160
+ true
161
+ end
162
+
163
+ def require_start_command?
164
+ false
165
+ end
166
+
167
+ def prompt_for_runtime?
168
+ false
169
+ end
170
+
171
+ def default_runtime(path)
172
+ nil
173
+ end
174
+
175
+ def memory(runtime=nil)
176
+ @memory
177
+ end
178
+
179
+ alias :mem :memory
180
+ end
181
+
182
+ class StandaloneFramework < Framework
183
+ def require_url?
184
+ false
185
+ end
186
+
187
+ def require_start_command?
188
+ true
189
+ end
190
+
191
+ def prompt_for_runtime?
192
+ true
193
+ end
194
+
195
+ def default_runtime(path)
196
+ if !File.directory? path
197
+ if path =~ /\.(jar|class)$/
198
+ return "java"
199
+ elsif path =~ /\.(rb)$/
200
+ return "ruby18"
201
+ elsif path =~ /\.(zip)$/
202
+ return detect_runtime_from_zip path
203
+ end
204
+ else
205
+ Dir.chdir(path) do
206
+ return "ruby18" if not Dir.glob('**/*.rb').empty?
207
+ if !Dir.glob('**/*.class').empty? || !Dir.glob('**/*.jar').empty?
208
+ return "java"
209
+ elsif Dir.glob('*.zip').first
210
+ zip_file = Dir.glob('*.zip').first
211
+ return detect_runtime_from_zip zip_file
212
+ end
213
+ end
214
+ end
215
+ return nil
216
+ end
217
+
218
+ def memory(runtime=nil)
219
+ default_mem = @memory
220
+ default_mem = '128M' if runtime =~ /\Aruby/ || runtime == "php"
221
+ default_mem = '512M' if runtime == "java"
222
+ default_mem
223
+ end
224
+
225
+ private
226
+ def detect_runtime_from_zip(zip_file)
227
+ contents = ZipUtil.entry_lines(zip_file)
228
+ if contents =~ /\.(jar)$/
229
+ return "java"
230
+ end
231
+ end
135
232
  end
136
233
 
137
234
  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'
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.beta.5'
5
+ VERSION = '0.3.16.beta.6'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,144 +1,142 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: vmc
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.16.beta.6
4
5
  prerelease: 7
5
- version: 0.3.16.beta.5
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - VMware
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-03-02 00:00:00 -08:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-09 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: json_pure
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70220526276780 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
24
21
  version: 1.5.1
25
22
  - - <
26
- - !ruby/object:Gem::Version
23
+ - !ruby/object:Gem::Version
27
24
  version: 1.7.0
28
25
  type: :runtime
29
- version_requirements: *id001
30
- - !ruby/object:Gem::Dependency
31
- name: rubyzip
32
26
  prerelease: false
33
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ version_requirements: *70220526276780
28
+ - !ruby/object:Gem::Dependency
29
+ name: rubyzip
30
+ requirement: &70220526276020 !ruby/object:Gem::Requirement
34
31
  none: false
35
- requirements:
32
+ requirements:
36
33
  - - ~>
37
- - !ruby/object:Gem::Version
34
+ - !ruby/object:Gem::Version
38
35
  version: 0.9.4
39
36
  type: :runtime
40
- version_requirements: *id002
41
- - !ruby/object:Gem::Dependency
42
- name: rest-client
43
37
  prerelease: false
44
- requirement: &id003 !ruby/object:Gem::Requirement
38
+ version_requirements: *70220526276020
39
+ - !ruby/object:Gem::Dependency
40
+ name: rest-client
41
+ requirement: &70220526275540 !ruby/object:Gem::Requirement
45
42
  none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
49
46
  version: 1.6.1
50
47
  - - <
51
- - !ruby/object:Gem::Version
48
+ - !ruby/object:Gem::Version
52
49
  version: 1.7.0
53
50
  type: :runtime
54
- version_requirements: *id003
55
- - !ruby/object:Gem::Dependency
56
- name: terminal-table
57
51
  prerelease: false
58
- requirement: &id004 !ruby/object:Gem::Requirement
52
+ version_requirements: *70220526275540
53
+ - !ruby/object:Gem::Dependency
54
+ name: terminal-table
55
+ requirement: &70220526274820 !ruby/object:Gem::Requirement
59
56
  none: false
60
- requirements:
57
+ requirements:
61
58
  - - ~>
62
- - !ruby/object:Gem::Version
59
+ - !ruby/object:Gem::Version
63
60
  version: 1.4.2
64
61
  type: :runtime
65
- version_requirements: *id004
66
- - !ruby/object:Gem::Dependency
67
- name: interact
68
62
  prerelease: false
69
- requirement: &id005 !ruby/object:Gem::Requirement
63
+ version_requirements: *70220526274820
64
+ - !ruby/object:Gem::Dependency
65
+ name: interact
66
+ requirement: &70220526274360 !ruby/object:Gem::Requirement
70
67
  none: false
71
- requirements:
68
+ requirements:
72
69
  - - ~>
73
- - !ruby/object:Gem::Version
70
+ - !ruby/object:Gem::Version
74
71
  version: 0.4.0
75
72
  type: :runtime
76
- version_requirements: *id005
77
- - !ruby/object:Gem::Dependency
78
- name: addressable
79
73
  prerelease: false
80
- requirement: &id006 !ruby/object:Gem::Requirement
74
+ version_requirements: *70220526274360
75
+ - !ruby/object:Gem::Dependency
76
+ name: addressable
77
+ requirement: &70220526273900 !ruby/object:Gem::Requirement
81
78
  none: false
82
- requirements:
79
+ requirements:
83
80
  - - ~>
84
- - !ruby/object:Gem::Version
81
+ - !ruby/object:Gem::Version
85
82
  version: 2.2.6
86
83
  type: :runtime
87
- version_requirements: *id006
88
- - !ruby/object:Gem::Dependency
89
- name: uuidtools
90
84
  prerelease: false
91
- requirement: &id007 !ruby/object:Gem::Requirement
85
+ version_requirements: *70220526273900
86
+ - !ruby/object:Gem::Dependency
87
+ name: uuidtools
88
+ requirement: &70220526273440 !ruby/object:Gem::Requirement
92
89
  none: false
93
- requirements:
90
+ requirements:
94
91
  - - ~>
95
- - !ruby/object:Gem::Version
92
+ - !ruby/object:Gem::Version
96
93
  version: 2.1.0
97
94
  type: :runtime
98
- version_requirements: *id007
99
- - !ruby/object:Gem::Dependency
100
- name: rake
101
95
  prerelease: false
102
- requirement: &id008 !ruby/object:Gem::Requirement
96
+ version_requirements: *70220526273440
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: &70220526273060 !ruby/object:Gem::Requirement
103
100
  none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- version: "0"
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
108
105
  type: :development
109
- version_requirements: *id008
110
- - !ruby/object:Gem::Dependency
111
- name: rspec
112
106
  prerelease: false
113
- requirement: &id009 !ruby/object:Gem::Requirement
107
+ version_requirements: *70220526273060
108
+ - !ruby/object:Gem::Dependency
109
+ name: rspec
110
+ requirement: &70220526272520 !ruby/object:Gem::Requirement
114
111
  none: false
115
- requirements:
112
+ requirements:
116
113
  - - ~>
117
- - !ruby/object:Gem::Version
114
+ - !ruby/object:Gem::Version
118
115
  version: 1.3.0
119
116
  type: :development
120
- version_requirements: *id009
121
- - !ruby/object:Gem::Dependency
122
- name: webmock
123
117
  prerelease: false
124
- requirement: &id010 !ruby/object:Gem::Requirement
118
+ version_requirements: *70220526272520
119
+ - !ruby/object:Gem::Dependency
120
+ name: webmock
121
+ requirement: &70220526272020 !ruby/object:Gem::Requirement
125
122
  none: false
126
- requirements:
127
- - - "="
128
- - !ruby/object:Gem::Version
123
+ requirements:
124
+ - - =
125
+ - !ruby/object:Gem::Version
129
126
  version: 1.5.0
130
127
  type: :development
131
- version_requirements: *id010
132
- description: Client library and CLI that provides access to the VMware Cloud Application Platform.
128
+ prerelease: false
129
+ version_requirements: *70220526272020
130
+ description: Client library and CLI that provides access to the VMware Cloud Application
131
+ Platform.
133
132
  email: support@vmware.com
134
- executables:
133
+ executables:
135
134
  - vmc
136
135
  extensions: []
137
-
138
- extra_rdoc_files:
136
+ extra_rdoc_files:
139
137
  - README.md
140
138
  - LICENSE
141
- files:
139
+ files:
142
140
  - LICENSE
143
141
  - README.md
144
142
  - Rakefile
@@ -181,33 +179,29 @@ files:
181
179
  - caldecott_helper/Gemfile.lock
182
180
  - caldecott_helper/server.rb
183
181
  - bin/vmc
184
- has_rdoc: true
185
182
  homepage: http://vmware.com
186
183
  licenses: []
187
-
188
184
  post_install_message:
189
185
  rdoc_options: []
190
-
191
- require_paths:
186
+ require_paths:
192
187
  - lib
193
- required_ruby_version: !ruby/object:Gem::Requirement
188
+ required_ruby_version: !ruby/object:Gem::Requirement
194
189
  none: false
195
- requirements:
196
- - - ">="
197
- - !ruby/object:Gem::Version
198
- version: "0"
199
- required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
200
195
  none: false
201
- requirements:
202
- - - ">"
203
- - !ruby/object:Gem::Version
196
+ requirements:
197
+ - - ! '>'
198
+ - !ruby/object:Gem::Version
204
199
  version: 1.3.1
205
200
  requirements: []
206
-
207
201
  rubyforge_project:
208
- rubygems_version: 1.6.2
202
+ rubygems_version: 1.8.15
209
203
  signing_key:
210
204
  specification_version: 3
211
- summary: Client library and CLI that provides access to the VMware Cloud Application Platform.
205
+ summary: Client library and CLI that provides access to the VMware Cloud Application
206
+ Platform.
212
207
  test_files: []
213
-