vmc 0.2.4 → 0.2.6
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.
- data/Rakefile +1 -0
- data/lib/cli/commands/admin.rb +1 -1
- data/lib/cli/commands/apps.rb +28 -12
- data/lib/cli/commands/user.rb +1 -1
- data/lib/cli/frameworks.rb +9 -9
- data/lib/cli/runner.rb +20 -4
- data/lib/cli/usage.rb +1 -1
- data/lib/cli/version.rb +3 -1
- data/lib/cli/zip_util.rb +14 -7
- data/lib/vmc/client.rb +3 -3
- data/lib/vmc/const.rb +3 -1
- metadata +3 -57
data/Rakefile
CHANGED
data/lib/cli/commands/admin.rb
CHANGED
@@ -17,7 +17,7 @@ module VMC::Cli::Command
|
|
17
17
|
client.add_user(email, password)
|
18
18
|
display 'OK'.green
|
19
19
|
|
20
|
-
# if we are not logged in, log in as the new user
|
20
|
+
# if we are not logged in for the current target, log in as the new user
|
21
21
|
return unless VMC::Cli::Config.auth_token.nil?
|
22
22
|
@options[:password] = password
|
23
23
|
cmd = User.new(@options)
|
data/lib/cli/commands/apps.rb
CHANGED
@@ -160,10 +160,17 @@ module VMC::Cli::Command
|
|
160
160
|
|
161
161
|
end
|
162
162
|
|
163
|
-
def delete(appname=nil
|
163
|
+
def delete(appname=nil)
|
164
|
+
force = @options[:force]
|
164
165
|
if @options[:all]
|
165
|
-
|
166
|
-
|
166
|
+
should_delete = force && no_prompt ? 'Y' : 'N'
|
167
|
+
unless no_prompt || force
|
168
|
+
should_delete = ask 'Delete ALL Applications and Services? (y/N)? '
|
169
|
+
end
|
170
|
+
if should_delete.upcase == 'Y'
|
171
|
+
apps = client.apps
|
172
|
+
apps.each { |app| delete_app(app[:name], force) }
|
173
|
+
end
|
167
174
|
else
|
168
175
|
err 'No valid appname given' unless appname
|
169
176
|
delete_app(appname, force)
|
@@ -175,8 +182,7 @@ module VMC::Cli::Command
|
|
175
182
|
services_to_delete = []
|
176
183
|
app_services = app[:services]
|
177
184
|
app_services.each { |service|
|
178
|
-
del_service = 'Y'
|
179
|
-
del_service = 'N' if no_prompt
|
185
|
+
del_service = force && no_prompt ? 'Y' : 'N'
|
180
186
|
unless no_prompt || force
|
181
187
|
del_service = ask("Provisioned service [#{service}] detected, would you like to delete it? [Yn]: ")
|
182
188
|
end
|
@@ -301,13 +307,13 @@ module VMC::Cli::Command
|
|
301
307
|
end
|
302
308
|
|
303
309
|
def update(appname)
|
310
|
+
app = client.app_info(appname)
|
304
311
|
path = @options[:path] || '.'
|
305
312
|
upload_app_bits(appname, path)
|
306
313
|
display "Successfully updated Application: '#{appname}'".green
|
307
314
|
if @options[:canary]
|
308
315
|
display "[--canary] is deprecated and will be removed in a future version".yellow
|
309
316
|
end
|
310
|
-
app = client.app_info(appname)
|
311
317
|
restart appname if app[:state] == 'STARTED'
|
312
318
|
end
|
313
319
|
|
@@ -334,7 +340,7 @@ module VMC::Cli::Command
|
|
334
340
|
check_app_limit
|
335
341
|
|
336
342
|
# check memsize here for capacity
|
337
|
-
check_has_capacity_for(mem_choice_to_quota(memswitch)) if memswitch
|
343
|
+
check_has_capacity_for(mem_choice_to_quota(memswitch)) if memswitch && !no_start
|
338
344
|
|
339
345
|
unless no_prompt || @options[:path]
|
340
346
|
proceed = ask('Would you like to deploy from the current directory? [Yn]: ')
|
@@ -399,7 +405,7 @@ module VMC::Cli::Command
|
|
399
405
|
mem_quota = mem_choice_to_quota(mem)
|
400
406
|
|
401
407
|
# check memsize here for capacity
|
402
|
-
check_has_capacity_for(mem_quota)
|
408
|
+
check_has_capacity_for(mem_quota) unless no_start
|
403
409
|
|
404
410
|
display 'Creating Application: ', false
|
405
411
|
|
@@ -476,11 +482,12 @@ module VMC::Cli::Command
|
|
476
482
|
total_size = 0
|
477
483
|
resource_files = Dir.glob("#{explode_dir}/**/*", File::FNM_DOTMATCH)
|
478
484
|
resource_files.each do |filename|
|
485
|
+
next if (File.directory?(filename) || !File.exists?(filename))
|
479
486
|
fingerprints << {
|
480
487
|
:size => File.size(filename),
|
481
488
|
:sha1 => Digest::SHA1.file(filename).hexdigest,
|
482
489
|
:fn => filename
|
483
|
-
}
|
490
|
+
}
|
484
491
|
total_size += File.size(filename)
|
485
492
|
end
|
486
493
|
|
@@ -504,6 +511,15 @@ module VMC::Cli::Command
|
|
504
511
|
|
505
512
|
end
|
506
513
|
|
514
|
+
# It's possible the CC tells us that we don't need to pack anything.
|
515
|
+
# If so, exit early.
|
516
|
+
if VMC::Cli::ZipUtil.get_files_to_pack(explode_dir).empty?
|
517
|
+
display ' No resources need to be uploaded'
|
518
|
+
display 'Push Status: ', false
|
519
|
+
display 'OK'.green
|
520
|
+
return
|
521
|
+
end
|
522
|
+
|
507
523
|
# Perform Packing of the upload bits here.
|
508
524
|
display ' Packing application: ', false
|
509
525
|
VMC::Cli::ZipUtil.pack(explode_dir, upload_file)
|
@@ -768,7 +784,7 @@ module VMC::Cli::Command
|
|
768
784
|
map = VMC::Cli::Config.instances
|
769
785
|
instance = map[instance] if map[instance]
|
770
786
|
|
771
|
-
['/logs/err.log', 'logs/stderr.log', 'logs/stdout.log', 'logs/startup.log'].each do |path|
|
787
|
+
['/logs/err.log', '/logs/staging.log', 'logs/stderr.log', 'logs/stdout.log', 'logs/startup.log'].each do |path|
|
772
788
|
begin
|
773
789
|
content = client.app_files(appname, path, instance)
|
774
790
|
rescue
|
@@ -803,7 +819,7 @@ module VMC::Cli::Command
|
|
803
819
|
@read ||= 0
|
804
820
|
@read += rsize
|
805
821
|
p = (@read * 100 / FileWithPercentOutput.upload_size).to_i
|
806
|
-
unless VMC::Cli::Config.output.nil?
|
822
|
+
unless VMC::Cli::Config.output.nil? || !STDOUT.tty?
|
807
823
|
clear(FileWithPercentOutput.display_str.size + 5)
|
808
824
|
VMC::Cli::Config.output.print("#{FileWithPercentOutput.display_str} #{p}%")
|
809
825
|
VMC::Cli::Config.output.flush
|
@@ -815,7 +831,7 @@ module VMC::Cli::Command
|
|
815
831
|
if result && result.size > 0
|
816
832
|
update_display(result.size)
|
817
833
|
else
|
818
|
-
unless VMC::Cli::Config.output.nil?
|
834
|
+
unless VMC::Cli::Config.output.nil? || !STDOUT.tty?
|
819
835
|
clear(FileWithPercentOutput.display_str.size + 5)
|
820
836
|
VMC::Cli::Config.output.print(FileWithPercentOutput.display_str)
|
821
837
|
display('OK'.green)
|
data/lib/cli/commands/user.rb
CHANGED
@@ -21,7 +21,7 @@ module VMC::Cli::Command
|
|
21
21
|
say "Successfully logged into [#{target_url}]".green
|
22
22
|
rescue VMC::Client::TargetError
|
23
23
|
display "Problem with login, invalid account or password.".red
|
24
|
-
retry if (tries += 1) < 3 && prompt_ok
|
24
|
+
retry if (tries += 1) < 3 && prompt_ok && !@options[:password]
|
25
25
|
exit 1
|
26
26
|
rescue => e
|
27
27
|
display "Problem with login, #{e}, try again or register for an account.".red
|
data/lib/cli/frameworks.rb
CHANGED
@@ -6,13 +6,13 @@ module VMC::Cli
|
|
6
6
|
DEFAULT_MEM = '256M'
|
7
7
|
|
8
8
|
FRAMEWORKS = {
|
9
|
-
'Rails' => ['rails/1.0',
|
10
|
-
'Spring' => ['spring_web/1.0',
|
11
|
-
'Grails' => ['grails/1.0',
|
12
|
-
'Roo' => ['spring_web/1.0',
|
13
|
-
'JavaWeb' => ['spring_web/1.0',
|
9
|
+
'Rails' => ['rails/1.0', { :mem => '256M', :description => 'Rails Application'}],
|
10
|
+
'Spring' => ['spring_web/1.0', { :mem => '512M', :description => 'Java SpringSource Spring Application'}],
|
11
|
+
'Grails' => ['grails/1.0', { :mem => '512M', :description => 'Java SpringSource Grails Application'}],
|
12
|
+
'Roo' => ['spring_web/1.0', { :mem => '512M', :description => 'Java SpringSource Roo Application'}],
|
13
|
+
'JavaWeb' => ['spring_web/1.0', { :mem => '512M', :description => 'Java Web Application'}],
|
14
14
|
'Sinatra' => [DEFAULT_FRAMEWORK, { :mem => '128M', :description => 'Sinatra Application'}],
|
15
|
-
'Node' => ['nodejs/1.0',
|
15
|
+
'Node' => ['nodejs/1.0', { :mem => '64M', :description => 'Node.js Application'}],
|
16
16
|
}
|
17
17
|
|
18
18
|
class << self
|
@@ -38,7 +38,7 @@ module VMC::Cli
|
|
38
38
|
contents = ZipUtil.entry_lines(war_file)
|
39
39
|
|
40
40
|
# Spring Variations
|
41
|
-
if contents =~ /WEB-INF\/grails-
|
41
|
+
if contents =~ /WEB-INF\/lib\/grails-web.*\.jar/
|
42
42
|
return Framework.lookup('Grails')
|
43
43
|
elsif contents =~ /WEB-INF\/classes\/org\/springframework/
|
44
44
|
return Framework.lookup('Spring')
|
@@ -58,13 +58,13 @@ module VMC::Cli
|
|
58
58
|
matched_file = fname if (str && str.match(/^\s*require\s*'sinatra'/))
|
59
59
|
end
|
60
60
|
end
|
61
|
-
if matched_file
|
61
|
+
if matched_file
|
62
62
|
f = Framework.lookup('Sinatra')
|
63
63
|
f.exec = "ruby #{matched_file}"
|
64
64
|
return f
|
65
65
|
end
|
66
66
|
|
67
|
-
# Node.
|
67
|
+
# Node.js
|
68
68
|
elsif !Dir.glob('*.js').empty?
|
69
69
|
# Fixme, make other files work too..
|
70
70
|
if File.exist?('app.js') || File.exist?('index.js') || File.exist?('main.js')
|
data/lib/cli/runner.rb
CHANGED
@@ -81,11 +81,20 @@ class VMC::Cli::Runner
|
|
81
81
|
|
82
82
|
opts.on_tail('--options') { puts "#{opts}\n"; exit }
|
83
83
|
end
|
84
|
+
instances_delta_arg = check_instances_delta!
|
84
85
|
@args = opts_parser.parse!(@args)
|
86
|
+
@args.concat instances_delta_arg
|
85
87
|
convert_options!
|
86
88
|
self
|
87
89
|
end
|
88
90
|
|
91
|
+
def check_instances_delta!
|
92
|
+
return unless @args
|
93
|
+
instance_args = @args.select { |arg| /[-]\d+/ =~ arg } || []
|
94
|
+
@args.delete_if { |arg| instance_args.include? arg}
|
95
|
+
instance_args
|
96
|
+
end
|
97
|
+
|
89
98
|
def display_help
|
90
99
|
puts command_usage
|
91
100
|
exit
|
@@ -349,9 +358,12 @@ class VMC::Cli::Runner
|
|
349
358
|
def process_aliases!
|
350
359
|
return if @args.empty?
|
351
360
|
aliases = VMC::Cli::Config.aliases
|
352
|
-
|
353
|
-
|
354
|
-
|
361
|
+
aliases.each_pair do |k,v|
|
362
|
+
if @args[0] == k
|
363
|
+
display "[#{@args[0]} aliased to #{aliases.invert[key]}]" if @options[:verbose]
|
364
|
+
@args[0] = v
|
365
|
+
break;
|
366
|
+
end
|
355
367
|
end
|
356
368
|
end
|
357
369
|
|
@@ -366,8 +378,9 @@ class VMC::Cli::Runner
|
|
366
378
|
end
|
367
379
|
|
368
380
|
def run
|
381
|
+
|
369
382
|
trap('TERM') { print "\nInterupted\n"; exit(false)}
|
370
|
-
trap(
|
383
|
+
trap('INT') { print "\nInterupted\n"; exit(false)}
|
371
384
|
|
372
385
|
parse_options!
|
373
386
|
|
@@ -406,6 +419,9 @@ class VMC::Cli::Runner
|
|
406
419
|
rescue VMC::Client::TargetError, VMC::Client::NotFound, VMC::Client::BadTarget => e
|
407
420
|
puts e.message.red
|
408
421
|
@exit_status = false
|
422
|
+
rescue VMC::Client::HTTPException => e
|
423
|
+
puts e.message.red
|
424
|
+
@exit_status = false
|
409
425
|
rescue VMC::Cli::GracefulExit => e
|
410
426
|
# Redirected commands end up generating this exception (kind of goto)
|
411
427
|
rescue VMC::Cli::CliExit => e
|
data/lib/cli/usage.rb
CHANGED
data/lib/cli/version.rb
CHANGED
data/lib/cli/zip_util.rb
CHANGED
@@ -5,6 +5,8 @@ module VMC::Cli
|
|
5
5
|
|
6
6
|
class ZipUtil
|
7
7
|
|
8
|
+
PACK_EXCLUSION_GLOBS = ['..', '.', '*~', '#*#', '*.log']
|
9
|
+
|
8
10
|
class << self
|
9
11
|
def entry_lines(file)
|
10
12
|
contents = nil
|
@@ -36,22 +38,27 @@ module VMC::Cli
|
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
41
|
+
def get_files_to_pack(dir)
|
42
|
+
Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH).select do |f|
|
43
|
+
process = true
|
44
|
+
PACK_EXCLUSION_GLOBS.each { |e| process = false if File.fnmatch(e, File.basename(f)) }
|
45
|
+
process && File.exists?(f)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
39
49
|
def pack(dir, zipfile)
|
40
|
-
exclude = ['..', '.', '*~', '#*#', '*.log']
|
41
50
|
unless VMC::Cli::Config.nozip
|
42
|
-
excludes =
|
51
|
+
excludes = PACK_EXCLUSION_GLOBS.map { |e| "\\#{e}" }
|
43
52
|
excludes = excludes.join(' ')
|
44
53
|
Dir.chdir(dir) do
|
45
|
-
`zip -q -r -x #{excludes}
|
54
|
+
`zip -q -r #{zipfile} . -x #{excludes} 2> /dev/null`
|
46
55
|
return unless $? != 0
|
47
56
|
end
|
48
57
|
end
|
49
58
|
# Do Ruby version if told to or native version failed
|
50
59
|
Zip::ZipFile::open(zipfile, true) do |zf|
|
51
|
-
|
52
|
-
|
53
|
-
exclude.each { |e| process = false if File.fnmatch(e, File.basename(f)) }
|
54
|
-
zf.add(f.sub("#{dir}/",''), f) if (process && File.exists?(f))
|
60
|
+
get_files_to_pack(dir).each do |f|
|
61
|
+
zf.add(f.sub("#{dir}/",''), f)
|
55
62
|
end
|
56
63
|
end
|
57
64
|
end
|
data/lib/vmc/client.rb
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
require 'rubygems'
|
13
13
|
require 'json/pure'
|
14
14
|
|
15
|
-
require File.
|
15
|
+
require File.expand_path('../const', __FILE__)
|
16
16
|
|
17
17
|
class VMC::Client
|
18
18
|
|
@@ -378,8 +378,8 @@ class VMC::Client
|
|
378
378
|
result
|
379
379
|
rescue Net::HTTPBadResponse => e
|
380
380
|
raise BadTarget "Received bad HTTP response from target: #{e}"
|
381
|
-
rescue RestClient::Exception => e
|
382
|
-
raise HTTPException, "HTTP exception: #{e}"
|
381
|
+
rescue SystemCallError, RestClient::Exception => e
|
382
|
+
raise HTTPException, "HTTP exception: #{e.class}:#{e}"
|
383
383
|
end
|
384
384
|
|
385
385
|
def truncate(str, limit = 30)
|
data/lib/vmc/const.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 31
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 4
|
10
|
-
version: 0.2.4
|
5
|
+
version: 0.2.6
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- VMware
|
@@ -15,7 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-
|
13
|
+
date: 2011-04-02 00:00:00 -05:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
@@ -26,11 +21,6 @@ dependencies:
|
|
26
21
|
requirements:
|
27
22
|
- - ~>
|
28
23
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 1
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 5
|
33
|
-
- 1
|
34
24
|
version: 1.5.1
|
35
25
|
type: :runtime
|
36
26
|
version_requirements: *id001
|
@@ -42,11 +32,6 @@ dependencies:
|
|
42
32
|
requirements:
|
43
33
|
- - ~>
|
44
34
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 13
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 0
|
49
|
-
- 1
|
50
35
|
version: 2.0.1
|
51
36
|
type: :runtime
|
52
37
|
version_requirements: *id002
|
@@ -58,11 +43,6 @@ dependencies:
|
|
58
43
|
requirements:
|
59
44
|
- - ~>
|
60
45
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 13
|
62
|
-
segments:
|
63
|
-
- 1
|
64
|
-
- 6
|
65
|
-
- 1
|
66
46
|
version: 1.6.1
|
67
47
|
type: :runtime
|
68
48
|
version_requirements: *id003
|
@@ -74,19 +54,9 @@ dependencies:
|
|
74
54
|
requirements:
|
75
55
|
- - ">="
|
76
56
|
- !ruby/object:Gem::Version
|
77
|
-
hash: 13
|
78
|
-
segments:
|
79
|
-
- 1
|
80
|
-
- 6
|
81
|
-
- 1
|
82
57
|
version: 1.6.1
|
83
58
|
- - <
|
84
59
|
- !ruby/object:Gem::Version
|
85
|
-
hash: 11
|
86
|
-
segments:
|
87
|
-
- 1
|
88
|
-
- 7
|
89
|
-
- 0
|
90
60
|
version: 1.7.0
|
91
61
|
type: :runtime
|
92
62
|
version_requirements: *id004
|
@@ -98,11 +68,6 @@ dependencies:
|
|
98
68
|
requirements:
|
99
69
|
- - ~>
|
100
70
|
- !ruby/object:Gem::Version
|
101
|
-
hash: 3
|
102
|
-
segments:
|
103
|
-
- 1
|
104
|
-
- 4
|
105
|
-
- 2
|
106
71
|
version: 1.4.2
|
107
72
|
type: :runtime
|
108
73
|
version_requirements: *id005
|
@@ -114,9 +79,6 @@ dependencies:
|
|
114
79
|
requirements:
|
115
80
|
- - ">="
|
116
81
|
- !ruby/object:Gem::Version
|
117
|
-
hash: 3
|
118
|
-
segments:
|
119
|
-
- 0
|
120
82
|
version: "0"
|
121
83
|
type: :development
|
122
84
|
version_requirements: *id006
|
@@ -128,11 +90,6 @@ dependencies:
|
|
128
90
|
requirements:
|
129
91
|
- - ~>
|
130
92
|
- !ruby/object:Gem::Version
|
131
|
-
hash: 27
|
132
|
-
segments:
|
133
|
-
- 1
|
134
|
-
- 3
|
135
|
-
- 0
|
136
93
|
version: 1.3.0
|
137
94
|
type: :development
|
138
95
|
version_requirements: *id007
|
@@ -144,11 +101,6 @@ dependencies:
|
|
144
101
|
requirements:
|
145
102
|
- - ~>
|
146
103
|
- !ruby/object:Gem::Version
|
147
|
-
hash: 3
|
148
|
-
segments:
|
149
|
-
- 1
|
150
|
-
- 5
|
151
|
-
- 0
|
152
104
|
version: 1.5.0
|
153
105
|
type: :development
|
154
106
|
version_requirements: *id008
|
@@ -219,23 +171,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
219
171
|
requirements:
|
220
172
|
- - ">="
|
221
173
|
- !ruby/object:Gem::Version
|
222
|
-
hash: 3
|
223
|
-
segments:
|
224
|
-
- 0
|
225
174
|
version: "0"
|
226
175
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
176
|
none: false
|
228
177
|
requirements:
|
229
178
|
- - ">="
|
230
179
|
- !ruby/object:Gem::Version
|
231
|
-
hash: 3
|
232
|
-
segments:
|
233
|
-
- 0
|
234
180
|
version: "0"
|
235
181
|
requirements: []
|
236
182
|
|
237
183
|
rubyforge_project:
|
238
|
-
rubygems_version: 1.
|
184
|
+
rubygems_version: 1.6.2
|
239
185
|
signing_key:
|
240
186
|
specification_version: 3
|
241
187
|
summary: Client library and CLI that provides access to the VMware Cloud Application Platform.
|