vmc 0.4.0.beta.55 → 0.4.0.beta.56
Sign up to get free protection for your applications and to get access to all the features.
- data/vmc-ng/lib/vmc/cli/app.rb +74 -67
- data/vmc-ng/lib/vmc/detect.rb +83 -60
- data/vmc-ng/lib/vmc/version.rb +1 -1
- metadata +34 -18
data/vmc-ng/lib/vmc/cli/app.rb
CHANGED
@@ -5,34 +5,6 @@ require "vmc/detect"
|
|
5
5
|
|
6
6
|
module VMC
|
7
7
|
class App < CLI
|
8
|
-
# TODO: don't hardcode; bring in from remote
|
9
|
-
MEM_DEFAULTS_FRAMEWORK = {
|
10
|
-
"rails3" => "256M",
|
11
|
-
"spring" => "512M",
|
12
|
-
"grails" => "512M",
|
13
|
-
"lift" => "512M",
|
14
|
-
"java_web" => "512M",
|
15
|
-
"standalone" => "64M",
|
16
|
-
"sinatra" => "128M",
|
17
|
-
"node" => "64M",
|
18
|
-
"php" => "128M",
|
19
|
-
"otp_rebar" => "64M",
|
20
|
-
"wsgi" => "64M",
|
21
|
-
"django" => "128M",
|
22
|
-
"dotNet" => "128M",
|
23
|
-
"rack" => "128M",
|
24
|
-
"play" => "256M"
|
25
|
-
}
|
26
|
-
|
27
|
-
MEM_DEFAULTS_RUNTIME = {
|
28
|
-
"java7" => "512M",
|
29
|
-
"java" => "512M",
|
30
|
-
"php" => "128M",
|
31
|
-
"ruby" => "128M",
|
32
|
-
"ruby19" => "128M"
|
33
|
-
}
|
34
|
-
|
35
|
-
|
36
8
|
desc "List your applications"
|
37
9
|
group :apps
|
38
10
|
input :space, :desc => "Show apps in given space",
|
@@ -110,42 +82,23 @@ module VMC
|
|
110
82
|
input(:url, :desc => "URL bound to app") { |default|
|
111
83
|
ask("URL", :default => default)
|
112
84
|
}
|
113
|
-
input(:memory, :desc => "Memory limit") { |
|
85
|
+
input(:memory, :desc => "Memory limit") { |default|
|
114
86
|
ask("Memory Limit",
|
115
87
|
:choices => memory_choices,
|
116
88
|
:allow_other => true,
|
117
|
-
:default =>
|
118
|
-
MEM_DEFAULTS_RUNTIME[runtime] ||
|
119
|
-
MEM_DEFAULTS_FRAMEWORK[framework] ||
|
120
|
-
"64M")
|
89
|
+
:default => default || "64M")
|
121
90
|
}
|
122
91
|
input(:instances, :type => :integer,
|
123
92
|
:desc => "Number of instances to run") {
|
124
93
|
ask("Instances", :default => 1)
|
125
94
|
}
|
126
95
|
input(:framework, :from_given => find_by_name("framework"),
|
127
|
-
:desc => "Framework to use") { |choices, default, other|
|
128
|
-
choices
|
129
|
-
choices << other if other
|
130
|
-
|
131
|
-
opts = {
|
132
|
-
:choices => choices,
|
133
|
-
:display => proc { |f|
|
134
|
-
if f == other
|
135
|
-
"other"
|
136
|
-
else
|
137
|
-
f.name
|
138
|
-
end
|
139
|
-
}
|
140
|
-
}
|
141
|
-
|
142
|
-
opts[:default] = default if default
|
143
|
-
|
144
|
-
ask("Framework", opts)
|
96
|
+
:desc => "Framework to use") { |choices, default, all, other|
|
97
|
+
ask_with_other("Framework", choices, default, all, other)
|
145
98
|
}
|
146
|
-
input(:runtime, :
|
147
|
-
:
|
148
|
-
|
99
|
+
input(:runtime, :from_given => find_by_name("runtime"),
|
100
|
+
:desc => "Runtime to use") { |choices, default, all, other|
|
101
|
+
ask_with_other("Runtime", choices, default, all, other)
|
149
102
|
}
|
150
103
|
input(:command, :desc => "Startup command for standalone app") {
|
151
104
|
ask("Startup command")
|
@@ -891,23 +844,50 @@ module VMC
|
|
891
844
|
app.production = !!(input[:plan] =~ /^p/i) if v2?
|
892
845
|
|
893
846
|
detector = Detector.new(client, path)
|
894
|
-
|
895
|
-
|
847
|
+
all_frameworks = detector.all_frameworks
|
848
|
+
all_runtimes = detector.all_runtimes
|
849
|
+
|
850
|
+
detected_frameworks = detector.detected_frameworks
|
851
|
+
|
852
|
+
if detected_frameworks.size == 1
|
853
|
+
default_framework = detected_frameworks.first
|
854
|
+
end
|
896
855
|
|
897
|
-
if
|
898
|
-
framework = input[:framework,
|
856
|
+
if detected_frameworks.empty?
|
857
|
+
framework = input[:framework, all_frameworks]
|
899
858
|
else
|
900
|
-
|
901
|
-
|
859
|
+
framework = input[
|
860
|
+
:framework,
|
861
|
+
detected_frameworks,
|
862
|
+
default_framework,
|
863
|
+
all_frameworks,
|
864
|
+
:other
|
865
|
+
]
|
866
|
+
end
|
902
867
|
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
868
|
+
|
869
|
+
if framework.name == "standalone"
|
870
|
+
detected_runtimes = detector.detected_runtimes
|
871
|
+
else
|
872
|
+
detected_runtimes = detector.runtimes(framework)
|
873
|
+
end
|
874
|
+
|
875
|
+
if detected_runtimes.size == 1
|
876
|
+
default_runtime = detected_runtimes.first
|
877
|
+
end
|
878
|
+
|
879
|
+
if detected_runtimes.empty?
|
880
|
+
runtime = input[:runtime, all_runtimes]
|
881
|
+
else
|
882
|
+
runtime = input[
|
883
|
+
:runtime,
|
884
|
+
detected_runtimes,
|
885
|
+
default_runtime,
|
886
|
+
all_runtimes,
|
887
|
+
:other
|
888
|
+
]
|
907
889
|
end
|
908
890
|
|
909
|
-
runtimes = framework.runtimes || client.runtimes
|
910
|
-
runtime = input[:runtime, runtimes]
|
911
891
|
|
912
892
|
fail "Invalid framework '#{input[:framework]}'" unless framework
|
913
893
|
fail "Invalid runtime '#{input[:runtime]}'" unless runtime
|
@@ -928,7 +908,8 @@ module VMC
|
|
928
908
|
|
929
909
|
app.urls = [url] if url && !v2?
|
930
910
|
|
931
|
-
|
911
|
+
default_memory = detector.suggested_memory(framework) || 64
|
912
|
+
app.memory = megabytes(input[:memory, human_mb(default_memory)])
|
932
913
|
|
933
914
|
app = filter(:create_app, app)
|
934
915
|
|
@@ -1105,6 +1086,32 @@ module VMC
|
|
1105
1086
|
end
|
1106
1087
|
end
|
1107
1088
|
|
1089
|
+
def ask_with_other(message, choices, default, all, other)
|
1090
|
+
choices = choices.sort_by(&:name)
|
1091
|
+
choices << other if other
|
1092
|
+
|
1093
|
+
opts = {
|
1094
|
+
:choices => choices,
|
1095
|
+
:display => proc { |x|
|
1096
|
+
if other && x == other
|
1097
|
+
"other"
|
1098
|
+
else
|
1099
|
+
x.name
|
1100
|
+
end
|
1101
|
+
}
|
1102
|
+
}
|
1103
|
+
|
1104
|
+
opts[:default] = default if default
|
1105
|
+
|
1106
|
+
res = ask(message, opts)
|
1107
|
+
|
1108
|
+
if other && res == other
|
1109
|
+
opts[:choices] = all
|
1110
|
+
res = ask(message, opts)
|
1111
|
+
end
|
1112
|
+
|
1113
|
+
res
|
1114
|
+
end
|
1108
1115
|
def usage(used, limit)
|
1109
1116
|
"#{b(human_size(used))} of #{b(human_size(limit, 0))}"
|
1110
1117
|
end
|
data/vmc-ng/lib/vmc/detect.rb
CHANGED
@@ -1,5 +1,36 @@
|
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
require "clouseau"
|
4
|
+
|
1
5
|
module VMC
|
2
6
|
class Detector
|
7
|
+
# "Basic" framework names for a detected language
|
8
|
+
PSEUDO_FRAMEWORKS = {
|
9
|
+
:node => "node",
|
10
|
+
:python => "wsgi",
|
11
|
+
:java => "java_web",
|
12
|
+
:php => "php",
|
13
|
+
:erlang => "otp_rebar",
|
14
|
+
:dotnet => "dotNet"
|
15
|
+
}
|
16
|
+
|
17
|
+
# Clouseau language symbol => matching runtime names
|
18
|
+
LANGUAGE_RUNTIMES = {
|
19
|
+
:ruby => /^ruby.*/,
|
20
|
+
:java => /^java.*/,
|
21
|
+
:node => /^node.*/,
|
22
|
+
:erlang => /^erlang.*/,
|
23
|
+
:dotnet => /^dotNet.*/,
|
24
|
+
:python => /^python.*/,
|
25
|
+
:php => /^php.*/
|
26
|
+
}
|
27
|
+
|
28
|
+
# [Framework]
|
29
|
+
attr_reader :matches
|
30
|
+
|
31
|
+
# Framework
|
32
|
+
attr_reader :default
|
33
|
+
|
3
34
|
def initialize(client, path)
|
4
35
|
@client = client
|
5
36
|
@path = path
|
@@ -10,89 +41,81 @@ module VMC
|
|
10
41
|
end
|
11
42
|
|
12
43
|
def all_runtimes
|
13
|
-
@
|
44
|
+
@all_runtimes ||= @client.runtimes
|
14
45
|
end
|
15
46
|
|
16
47
|
def all_frameworks
|
17
48
|
@all_frameworks ||= @client.frameworks
|
49
|
+
end
|
50
|
+
|
51
|
+
def matches
|
52
|
+
return @matches if @matches
|
18
53
|
|
19
|
-
|
20
|
-
next if f.detection && f.runtimes
|
54
|
+
frameworks = all_frameworks
|
21
55
|
|
22
|
-
|
23
|
-
f.detection = info[:detection]
|
56
|
+
@matches = {}
|
24
57
|
|
25
|
-
|
26
|
-
|
27
|
-
|
58
|
+
Clouseau.matches(@path).each do |detected|
|
59
|
+
if name = detected.framework_name
|
60
|
+
framework = frameworks.find { |f|
|
61
|
+
f.name == name.to_s
|
28
62
|
}
|
29
63
|
end
|
64
|
+
|
65
|
+
if !framework && lang = detected.language_name
|
66
|
+
framework = frameworks.find { |f|
|
67
|
+
f.name == PSEUDO_FRAMEWORKS[lang]
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
next unless framework
|
72
|
+
|
73
|
+
@matches[framework] = detected
|
30
74
|
end
|
31
75
|
|
32
|
-
@
|
76
|
+
@matches
|
33
77
|
end
|
34
78
|
|
35
|
-
def
|
36
|
-
matches
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
if File.file? @path
|
46
|
-
if File.fnmatch(file, @path)
|
47
|
-
[@path]
|
48
|
-
elsif @path =~ /\.(zip|jar|war)/
|
49
|
-
lines = CFoundry::Zip.entry_lines(@path)
|
50
|
-
top = find_top(lines)
|
51
|
-
|
52
|
-
lines.collect(&:name).select do |path|
|
53
|
-
File.fnmatch(file, path) ||
|
54
|
-
top && File.fnmatch(top + file, path)
|
55
|
-
end
|
56
|
-
else
|
57
|
-
[]
|
58
|
-
end
|
59
|
-
else
|
60
|
-
Dir.glob("#@path/#{file}")
|
61
|
-
end
|
62
|
-
|
63
|
-
unless files.empty?
|
64
|
-
if match == true
|
65
|
-
matched = true
|
66
|
-
elsif match == false
|
67
|
-
matched = false
|
68
|
-
break
|
69
|
-
else
|
70
|
-
begin
|
71
|
-
files.each do |f|
|
72
|
-
contents = File.open(f, &:read)
|
73
|
-
if contents =~ Regexp.new(match)
|
74
|
-
matched = true
|
75
|
-
end
|
76
|
-
end
|
77
|
-
rescue RegexpError
|
78
|
-
# some regexps may fail on 1.8 as the server runs 1.9
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
79
|
+
def detected_frameworks
|
80
|
+
matches.keys
|
81
|
+
end
|
82
|
+
|
83
|
+
def detected_runtimes
|
84
|
+
langs = Set.new
|
85
|
+
|
86
|
+
Clouseau.matches(@path).each do |detected|
|
87
|
+
if lang = detected.language_name
|
88
|
+
langs << lang
|
82
89
|
end
|
90
|
+
end
|
91
|
+
|
92
|
+
runtimes = []
|
83
93
|
|
84
|
-
|
94
|
+
langs.each do |lang|
|
95
|
+
runtimes += runtimes_for(lang)
|
85
96
|
end
|
86
97
|
|
87
|
-
|
88
|
-
|
98
|
+
runtimes
|
99
|
+
end
|
100
|
+
|
101
|
+
def runtimes(framework)
|
102
|
+
if matches[framework] && lang = matches[framework].language_name
|
103
|
+
runtimes_for(lang)
|
89
104
|
end
|
105
|
+
end
|
90
106
|
|
91
|
-
|
107
|
+
def suggested_memory(framework)
|
108
|
+
matches[framework] && mem = matches[framework].memory_suggestion
|
92
109
|
end
|
93
110
|
|
94
111
|
private
|
95
112
|
|
113
|
+
def runtimes_for(language)
|
114
|
+
all_runtimes.select do |r|
|
115
|
+
LANGUAGE_RUNTIMES[language] === r.name
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
96
119
|
def find_top(entries)
|
97
120
|
found = false
|
98
121
|
|
data/vmc-ng/lib/vmc/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: -
|
4
|
+
hash: -4198322296
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
9
|
- 0
|
10
10
|
- beta
|
11
|
-
-
|
12
|
-
version: 0.4.0.beta.
|
11
|
+
- 56
|
12
|
+
version: 0.4.0.beta.56
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- VMware
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2012-09-
|
20
|
+
date: 2012-09-26 00:00:00 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: json_pure
|
@@ -274,9 +274,25 @@ dependencies:
|
|
274
274
|
type: :runtime
|
275
275
|
version_requirements: *id015
|
276
276
|
- !ruby/object:Gem::Dependency
|
277
|
-
name:
|
277
|
+
name: clouseau
|
278
278
|
prerelease: false
|
279
279
|
requirement: &id016 !ruby/object:Gem::Requirement
|
280
|
+
none: false
|
281
|
+
requirements:
|
282
|
+
- - ~>
|
283
|
+
- !ruby/object:Gem::Version
|
284
|
+
hash: 29
|
285
|
+
segments:
|
286
|
+
- 0
|
287
|
+
- 0
|
288
|
+
- 1
|
289
|
+
version: 0.0.1
|
290
|
+
type: :runtime
|
291
|
+
version_requirements: *id016
|
292
|
+
- !ruby/object:Gem::Dependency
|
293
|
+
name: mothership
|
294
|
+
prerelease: false
|
295
|
+
requirement: &id017 !ruby/object:Gem::Requirement
|
280
296
|
none: false
|
281
297
|
requirements:
|
282
298
|
- - ~>
|
@@ -288,11 +304,11 @@ dependencies:
|
|
288
304
|
- 5
|
289
305
|
version: 0.1.5
|
290
306
|
type: :runtime
|
291
|
-
version_requirements: *
|
307
|
+
version_requirements: *id017
|
292
308
|
- !ruby/object:Gem::Dependency
|
293
309
|
name: manifests-vmc-plugin
|
294
310
|
prerelease: false
|
295
|
-
requirement: &
|
311
|
+
requirement: &id018 !ruby/object:Gem::Requirement
|
296
312
|
none: false
|
297
313
|
requirements:
|
298
314
|
- - ~>
|
@@ -304,11 +320,11 @@ dependencies:
|
|
304
320
|
- 7
|
305
321
|
version: 0.4.7
|
306
322
|
type: :runtime
|
307
|
-
version_requirements: *
|
323
|
+
version_requirements: *id018
|
308
324
|
- !ruby/object:Gem::Dependency
|
309
325
|
name: tunnel-dummy-vmc-plugin
|
310
326
|
prerelease: false
|
311
|
-
requirement: &
|
327
|
+
requirement: &id019 !ruby/object:Gem::Requirement
|
312
328
|
none: false
|
313
329
|
requirements:
|
314
330
|
- - ~>
|
@@ -320,11 +336,11 @@ dependencies:
|
|
320
336
|
- 1
|
321
337
|
version: 0.0.1
|
322
338
|
type: :runtime
|
323
|
-
version_requirements: *
|
339
|
+
version_requirements: *id019
|
324
340
|
- !ruby/object:Gem::Dependency
|
325
341
|
name: multi_json
|
326
342
|
prerelease: false
|
327
|
-
requirement: &
|
343
|
+
requirement: &id020 !ruby/object:Gem::Requirement
|
328
344
|
none: false
|
329
345
|
requirements:
|
330
346
|
- - ~>
|
@@ -336,11 +352,11 @@ dependencies:
|
|
336
352
|
- 6
|
337
353
|
version: 1.3.6
|
338
354
|
type: :runtime
|
339
|
-
version_requirements: *
|
355
|
+
version_requirements: *id020
|
340
356
|
- !ruby/object:Gem::Dependency
|
341
357
|
name: rake
|
342
358
|
prerelease: false
|
343
|
-
requirement: &
|
359
|
+
requirement: &id021 !ruby/object:Gem::Requirement
|
344
360
|
none: false
|
345
361
|
requirements:
|
346
362
|
- - ~>
|
@@ -353,11 +369,11 @@ dependencies:
|
|
353
369
|
- 2
|
354
370
|
version: 0.9.2.2
|
355
371
|
type: :development
|
356
|
-
version_requirements: *
|
372
|
+
version_requirements: *id021
|
357
373
|
- !ruby/object:Gem::Dependency
|
358
374
|
name: rspec
|
359
375
|
prerelease: false
|
360
|
-
requirement: &
|
376
|
+
requirement: &id022 !ruby/object:Gem::Requirement
|
361
377
|
none: false
|
362
378
|
requirements:
|
363
379
|
- - ~>
|
@@ -369,11 +385,11 @@ dependencies:
|
|
369
385
|
- 0
|
370
386
|
version: 2.11.0
|
371
387
|
type: :development
|
372
|
-
version_requirements: *
|
388
|
+
version_requirements: *id022
|
373
389
|
- !ruby/object:Gem::Dependency
|
374
390
|
name: simplecov
|
375
391
|
prerelease: false
|
376
|
-
requirement: &
|
392
|
+
requirement: &id023 !ruby/object:Gem::Requirement
|
377
393
|
none: false
|
378
394
|
requirements:
|
379
395
|
- - ~>
|
@@ -385,7 +401,7 @@ dependencies:
|
|
385
401
|
- 4
|
386
402
|
version: 0.6.4
|
387
403
|
type: :development
|
388
|
-
version_requirements: *
|
404
|
+
version_requirements: *id023
|
389
405
|
description:
|
390
406
|
email: support@vmware.com
|
391
407
|
executables:
|