jdc 0.1.2 → 0.2.0
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/LICENSE +1277 -24
- data/Rakefile +13 -0
- data/bin/jdc +12 -2
- data/lib/admin/README.md +15 -0
- data/lib/admin/curl.rb +60 -0
- data/lib/admin/guid.rb +89 -0
- data/lib/admin/plugin.rb +6 -0
- data/lib/admin/service_auth_token.rb +94 -0
- data/lib/admin/service_broker/add.rb +47 -0
- data/lib/admin/service_broker/service_brokers.rb +24 -0
- data/lib/admin/set_quota.rb +44 -0
- data/lib/console/README.md +8 -0
- data/lib/console/console.rb +187 -0
- data/lib/console/plugin.rb +33 -0
- data/lib/jdc/cli/app/app.rb +43 -0
- data/lib/jdc/cli/app/apps.rb +87 -0
- data/lib/jdc/cli/app/base.rb +72 -0
- data/lib/jdc/cli/app/delete.rb +95 -0
- data/lib/jdc/cli/app/deprecated.rb +11 -0
- data/lib/jdc/cli/app/env.rb +78 -0
- data/lib/jdc/cli/app/events.rb +45 -0
- data/lib/jdc/cli/app/files.rb +137 -0
- data/lib/jdc/cli/app/health.rb +26 -0
- data/lib/jdc/cli/app/instances.rb +53 -0
- data/lib/jdc/cli/app/logs.rb +76 -0
- data/lib/jdc/cli/app/push/create.rb +108 -0
- data/lib/jdc/cli/app/push/interactions.rb +86 -0
- data/lib/jdc/cli/app/push/sync.rb +57 -0
- data/lib/jdc/cli/app/push.rb +103 -0
- data/lib/jdc/cli/app/rename.rb +35 -0
- data/lib/jdc/cli/app/restart.rb +31 -0
- data/lib/jdc/cli/app/scale.rb +63 -0
- data/lib/jdc/cli/app/start.rb +161 -0
- data/lib/jdc/cli/app/stats.rb +67 -0
- data/lib/jdc/cli/app/stop.rb +27 -0
- data/lib/jdc/cli/domain/base.rb +9 -0
- data/lib/jdc/cli/domain/domains.rb +40 -0
- data/lib/jdc/cli/domain/map.rb +55 -0
- data/lib/jdc/cli/domain/unmap.rb +56 -0
- data/lib/jdc/cli/help.rb +15 -0
- data/lib/jdc/cli/interactive.rb +105 -0
- data/lib/jdc/cli/login_requirements.rb +15 -0
- data/lib/jdc/cli/organization/base.rb +14 -0
- data/lib/jdc/cli/organization/create.rb +37 -0
- data/lib/jdc/cli/organization/delete.rb +63 -0
- data/lib/jdc/cli/organization/org.rb +45 -0
- data/lib/jdc/cli/organization/orgs.rb +30 -0
- data/lib/jdc/cli/organization/rename.rb +37 -0
- data/lib/jdc/cli/populators/base.rb +16 -0
- data/lib/jdc/cli/populators/organization.rb +32 -0
- data/lib/jdc/cli/populators/populator_methods.rb +64 -0
- data/lib/jdc/cli/populators/space.rb +33 -0
- data/lib/jdc/cli/populators/target.rb +13 -0
- data/lib/jdc/cli/route/base.rb +9 -0
- data/lib/jdc/cli/route/delete.rb +28 -0
- data/lib/jdc/cli/route/map.rb +68 -0
- data/lib/jdc/cli/route/routes.rb +26 -0
- data/lib/jdc/cli/route/unmap.rb +56 -0
- data/lib/jdc/cli/service/base.rb +9 -0
- data/lib/jdc/cli/service/bind.rb +44 -0
- data/lib/jdc/cli/service/create.rb +159 -0
- data/lib/jdc/cli/service/delete.rb +83 -0
- data/lib/jdc/cli/service/rename.rb +36 -0
- data/lib/jdc/cli/service/service.rb +42 -0
- data/lib/jdc/cli/service/service_instance_helper.rb +99 -0
- data/lib/jdc/cli/service/services.rb +111 -0
- data/lib/jdc/cli/service/unbind.rb +37 -0
- data/lib/jdc/cli/space/base.rb +29 -0
- data/lib/jdc/cli/space/create.rb +67 -0
- data/lib/jdc/cli/space/delete.rb +56 -0
- data/lib/jdc/cli/space/rename.rb +38 -0
- data/lib/jdc/cli/space/space.rb +66 -0
- data/lib/jdc/cli/space/spaces.rb +57 -0
- data/lib/jdc/cli/space/switch.rb +19 -0
- data/lib/jdc/cli/start/base.rb +41 -0
- data/lib/jdc/cli/start/colors.rb +13 -0
- data/lib/jdc/cli/start/target.rb +50 -0
- data/lib/jdc/cli/start/target_prettifier.rb +17 -0
- data/lib/jdc/cli/start/targets.rb +16 -0
- data/lib/jdc/cli/user/base.rb +30 -0
- data/lib/jdc/cli/user/create.rb +52 -0
- data/lib/jdc/cli/user/passwd.rb +37 -0
- data/lib/jdc/cli/user/register.rb +43 -0
- data/lib/jdc/cli/user/users.rb +32 -0
- data/lib/jdc/cli.rb +544 -0
- data/lib/jdc/constants.rb +11 -0
- data/lib/jdc/errors.rb +19 -0
- data/lib/jdc/object_extensions.rb +15 -0
- data/lib/jdc/plugin.rb +56 -0
- data/lib/jdc/spacing.rb +89 -0
- data/lib/jdc/spec_helper.rb +1 -0
- data/lib/jdc/test_support.rb +6 -0
- data/lib/jdc/version.rb +3 -0
- data/lib/jdc.rb +15 -2
- data/lib/manifests/errors.rb +35 -0
- data/lib/manifests/loader/builder.rb +39 -0
- data/lib/manifests/loader/normalizer.rb +145 -0
- data/lib/manifests/loader/resolver.rb +79 -0
- data/lib/manifests/loader.rb +31 -0
- data/lib/manifests/manifests.rb +344 -0
- data/lib/manifests/plugin.rb +140 -0
- data/lib/micro/README.md +9 -0
- data/lib/micro/errors.rb +4 -0
- data/lib/{jdc → micro}/micro.rb +15 -15
- data/lib/micro/plugin.rb +197 -0
- data/lib/micro/switcher/base.rb +79 -0
- data/lib/{jdc/micro → micro}/switcher/darwin.rb +5 -3
- data/lib/{jdc/micro → micro}/switcher/dummy.rb +1 -1
- data/lib/micro/switcher/linux.rb +16 -0
- data/lib/{jdc/micro → micro}/switcher/windows.rb +5 -5
- data/lib/{jdc/micro → micro}/vmrun.rb +26 -19
- data/lib/tasks/gem_release.rake +42 -0
- data/lib/tunnel/README.md +29 -0
- data/{config → lib/tunnel/config}/clients.yml +2 -2
- data/lib/tunnel/helper-app/Gemfile +10 -0
- data/lib/tunnel/helper-app/Gemfile.lock +48 -0
- data/{caldecott_helper → lib/tunnel/helper-app}/server.rb +5 -5
- data/lib/tunnel/plugin.rb +183 -0
- data/lib/tunnel/tunnel.rb +295 -0
- metadata +319 -89
- data/README.md +0 -102
- data/config/micro/paths.yml +0 -22
- data/config/micro/refresh_ip.rb +0 -20
- data/lib/cli/commands/admin.rb +0 -58
- data/lib/cli/commands/apps.rb +0 -1129
- data/lib/cli/commands/base.rb +0 -228
- data/lib/cli/commands/manifest.rb +0 -56
- data/lib/cli/commands/micro.rb +0 -115
- data/lib/cli/commands/misc.rb +0 -126
- data/lib/cli/commands/services.rb +0 -178
- data/lib/cli/commands/user.rb +0 -14
- data/lib/cli/config.rb +0 -173
- data/lib/cli/console_helper.rb +0 -170
- data/lib/cli/core_ext.rb +0 -122
- data/lib/cli/errors.rb +0 -19
- data/lib/cli/frameworks.rb +0 -265
- data/lib/cli/manifest_helper.rb +0 -302
- data/lib/cli/runner.rb +0 -505
- data/lib/cli/services_helper.rb +0 -84
- data/lib/cli/tunnel_helper.rb +0 -332
- data/lib/cli/usage.rb +0 -86
- data/lib/cli/version.rb +0 -7
- data/lib/cli/zip_util.rb +0 -77
- data/lib/cli.rb +0 -53
- data/lib/jdc/client.rb +0 -457
- data/lib/jdc/const.rb +0 -25
- data/lib/jdc/micro/switcher/base.rb +0 -97
- data/lib/jdc/micro/switcher/linux.rb +0 -16
- data/lib/jdc/signature/version.rb +0 -27
- data/lib/jdc/signer.rb +0 -13
- data/lib/jdc/timer.rb +0 -12
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
require "yaml"
|
|
2
|
+
require "set"
|
|
3
|
+
require "jdc/cli/service/create"
|
|
4
|
+
|
|
5
|
+
require "manifests/loader"
|
|
6
|
+
|
|
7
|
+
module JDCManifests
|
|
8
|
+
MANIFEST_FILE = "manifest.yml"
|
|
9
|
+
|
|
10
|
+
@@showed_manifest_usage = false
|
|
11
|
+
@@manifest = nil
|
|
12
|
+
|
|
13
|
+
def manifest
|
|
14
|
+
return @@manifest if @@manifest
|
|
15
|
+
|
|
16
|
+
if manifest_file && File.exists?(manifest_file)
|
|
17
|
+
@@manifest = load_manifest(manifest_file)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def save_manifest(save_to = manifest_file)
|
|
22
|
+
fail "No manifest to save!" unless @@manifest
|
|
23
|
+
|
|
24
|
+
File.open(save_to, "w") do |io|
|
|
25
|
+
YAML.dump(@@manifest, io)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# find the manifest file to work with
|
|
30
|
+
def manifest_file
|
|
31
|
+
return @manifest_file if @manifest_file
|
|
32
|
+
|
|
33
|
+
unless path = input[:manifest]
|
|
34
|
+
where = Dir.pwd
|
|
35
|
+
while true
|
|
36
|
+
if File.exists?(File.join(where, MANIFEST_FILE))
|
|
37
|
+
path = File.join(where, MANIFEST_FILE)
|
|
38
|
+
break
|
|
39
|
+
elsif File.basename(where) == "/"
|
|
40
|
+
path = nil
|
|
41
|
+
break
|
|
42
|
+
else
|
|
43
|
+
where = File.expand_path("../", where)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
return unless path
|
|
49
|
+
|
|
50
|
+
@manifest_file = File.expand_path(path)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# load and resolve a given manifest file
|
|
54
|
+
def load_manifest(file)
|
|
55
|
+
check_manifest! Loader.new(file, self).manifest
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def check_manifest!(manifest_hash, output = $stdout)
|
|
59
|
+
manifest_hash[:applications].each{ |app| check_attributes!(app, output) }
|
|
60
|
+
manifest_hash
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def check_attributes!(app, output = $stdout)
|
|
64
|
+
app.each do |k, v|
|
|
65
|
+
output.puts error_message_for_attribute(k) unless known_manifest_attributes.include? k
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def error_message_for_attribute(attribute)
|
|
70
|
+
"\e[31mWarning: #{attribute} is not a valid manifest attribute. Please " +
|
|
71
|
+
"remove this attribute from your manifest to get rid of this warning\e[0m"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def known_manifest_attributes
|
|
75
|
+
[:applications, :buildpack, :command, :disk, :domain, :env,
|
|
76
|
+
:host, :inherit, :instances, :mem, :memory, :name,
|
|
77
|
+
:path, :properties, :runtime, :services, :stack]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# dynamic symbol resolution
|
|
81
|
+
def resolve_symbol(sym)
|
|
82
|
+
case sym
|
|
83
|
+
when "target-url"
|
|
84
|
+
client_target
|
|
85
|
+
|
|
86
|
+
when "target-base"
|
|
87
|
+
target_base
|
|
88
|
+
|
|
89
|
+
when "random-word"
|
|
90
|
+
sprintf("%04x", rand(0x0100000))
|
|
91
|
+
|
|
92
|
+
when /^ask (.+)/
|
|
93
|
+
ask($1)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# find apps by an identifier, which may be either a tag, a name, or a path
|
|
98
|
+
def find_apps(identifier)
|
|
99
|
+
return [] unless manifest
|
|
100
|
+
|
|
101
|
+
apps = apps_by(:name, identifier)
|
|
102
|
+
|
|
103
|
+
if apps.empty?
|
|
104
|
+
apps = apps_by(:path, from_manifest(identifier))
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
apps
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# return all the apps described by the manifest
|
|
111
|
+
def all_apps
|
|
112
|
+
manifest[:applications]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def current_apps
|
|
116
|
+
manifest[:applications].select do |app|
|
|
117
|
+
next unless app[:path]
|
|
118
|
+
from_manifest(app[:path]) == Dir.pwd
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# splits the user's input, resolving paths with the manifest,
|
|
123
|
+
# into internal/external apps
|
|
124
|
+
#
|
|
125
|
+
# internal apps are returned as their data in the manifest
|
|
126
|
+
#
|
|
127
|
+
# external apps are the strings that the user gave, to be
|
|
128
|
+
# passed along wholesale to the wrapped command
|
|
129
|
+
def apps_in_manifest(input = nil, use_name = true, &blk)
|
|
130
|
+
names_or_paths =
|
|
131
|
+
if input.has?(:apps)
|
|
132
|
+
# names may be given but be [], which will still cause
|
|
133
|
+
# interaction, so use #direct instead of #[] here
|
|
134
|
+
input.direct(:apps)
|
|
135
|
+
elsif input.has?(:app)
|
|
136
|
+
[input.direct(:app)]
|
|
137
|
+
elsif input.has?(:name)
|
|
138
|
+
[input.direct(:name)]
|
|
139
|
+
else
|
|
140
|
+
[]
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
internal = []
|
|
144
|
+
external = []
|
|
145
|
+
|
|
146
|
+
names_or_paths.each do |x|
|
|
147
|
+
if x.is_a?(String)
|
|
148
|
+
if x =~ %r([/\\])
|
|
149
|
+
apps = find_apps(File.expand_path(x))
|
|
150
|
+
|
|
151
|
+
if apps.empty?
|
|
152
|
+
fail("Path #{b(x)} is not present in manifest #{b(relative_manifest_file)}.")
|
|
153
|
+
end
|
|
154
|
+
else
|
|
155
|
+
apps = find_apps(x)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
if !apps.empty?
|
|
159
|
+
internal += apps
|
|
160
|
+
else
|
|
161
|
+
external << x
|
|
162
|
+
end
|
|
163
|
+
else
|
|
164
|
+
external << x
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
[internal, external]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def create_manifest_for(app, path)
|
|
172
|
+
meta = {
|
|
173
|
+
"name" => app.name,
|
|
174
|
+
"memory" => human_size(app.memory * 1024 * 1024, 0),
|
|
175
|
+
"instances" => app.total_instances,
|
|
176
|
+
"host" => app.host || "none",
|
|
177
|
+
"domain" => app.domain ? app.domain : "none",
|
|
178
|
+
"path" => path
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
services = app.services
|
|
182
|
+
|
|
183
|
+
unless services.empty?
|
|
184
|
+
meta["services"] = {}
|
|
185
|
+
|
|
186
|
+
services.each do |service_instance|
|
|
187
|
+
if service_instance.is_a?(JFoundry::V2::UserProvidedServiceInstance)
|
|
188
|
+
meta["services"][service_instance.name] = {
|
|
189
|
+
"label" => "user-provided",
|
|
190
|
+
"credentials" => service_instance.credentials.stringify_keys,
|
|
191
|
+
}
|
|
192
|
+
else
|
|
193
|
+
service_plan = service_instance.service_plan
|
|
194
|
+
service = service_plan.service
|
|
195
|
+
|
|
196
|
+
meta["services"][service_instance.name] = {
|
|
197
|
+
"label" => service.label,
|
|
198
|
+
"provider" => service.provider,
|
|
199
|
+
"version" => service.version,
|
|
200
|
+
"plan" => service_plan.name
|
|
201
|
+
}
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
if cmd = app.command
|
|
207
|
+
meta["command"] = cmd
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
if buildpack = app.buildpack
|
|
211
|
+
meta["buildpack"] = buildpack
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
meta
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
private
|
|
218
|
+
|
|
219
|
+
def relative_manifest_file
|
|
220
|
+
Pathname.new(manifest_file).relative_path_from(Pathname.pwd)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def show_manifest_usage
|
|
224
|
+
return if @@showed_manifest_usage
|
|
225
|
+
|
|
226
|
+
path = relative_manifest_file
|
|
227
|
+
line "Using manifest file #{c(path, :name)}"
|
|
228
|
+
line
|
|
229
|
+
|
|
230
|
+
@@showed_manifest_usage = true
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def no_apps
|
|
234
|
+
fail "No applications or manifest to operate on."
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def warn_reset_changes
|
|
238
|
+
line c("Not applying manifest changes without --reset", :warning)
|
|
239
|
+
line "See `jdc diff` for more details."
|
|
240
|
+
line
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def apps_by(attr, val)
|
|
244
|
+
manifest[:applications].select do |info|
|
|
245
|
+
info[attr] == val
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# expand a path relative to the manifest file's directory
|
|
250
|
+
def from_manifest(path)
|
|
251
|
+
File.expand_path(path, File.dirname(manifest_file))
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def ask_to_save(input, app)
|
|
256
|
+
return if manifest_file
|
|
257
|
+
return unless ask("Save configuration?", :default => false)
|
|
258
|
+
|
|
259
|
+
manifest = create_manifest_for(app, input[:path])
|
|
260
|
+
|
|
261
|
+
with_progress("Saving to #{c("manifest.yml", :name)}") do
|
|
262
|
+
File.open("manifest.yml", "w") do |io|
|
|
263
|
+
YAML.dump(
|
|
264
|
+
{ "applications" => [manifest] },
|
|
265
|
+
io)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def env_hash(val)
|
|
271
|
+
if val.is_a?(Hash)
|
|
272
|
+
val
|
|
273
|
+
else
|
|
274
|
+
hash = {}
|
|
275
|
+
|
|
276
|
+
val.each do |pair|
|
|
277
|
+
name, val = pair.split("=", 2)
|
|
278
|
+
hash[name] = val
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
hash
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def setup_env(app, info)
|
|
286
|
+
return unless info[:env]
|
|
287
|
+
app.env = env_hash(info[:env])
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def setup_services(app, info)
|
|
291
|
+
return if !info[:services] || info[:services].empty?
|
|
292
|
+
|
|
293
|
+
offerings = client.services
|
|
294
|
+
|
|
295
|
+
to_bind = []
|
|
296
|
+
|
|
297
|
+
info[:services].each do |name, svc|
|
|
298
|
+
name = name.to_s
|
|
299
|
+
|
|
300
|
+
if instance = client.service_instance_by_name(name)
|
|
301
|
+
to_bind << instance
|
|
302
|
+
else
|
|
303
|
+
if svc[:label] == "user-provided"
|
|
304
|
+
invoke :create_service,
|
|
305
|
+
name: name,
|
|
306
|
+
offering: JDC::Service::UPDummy.new,
|
|
307
|
+
app: app,
|
|
308
|
+
credentials: svc[:credentials]
|
|
309
|
+
else
|
|
310
|
+
offering = offerings.find { |o|
|
|
311
|
+
o.label == (svc[:label] || svc[:type] || svc[:vendor]) &&
|
|
312
|
+
(!svc[:version] || o.version == svc[:version]) &&
|
|
313
|
+
(o.provider == (svc[:provider] || "core"))
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
fail "Unknown service offering: #{svc.inspect}." unless offering
|
|
317
|
+
|
|
318
|
+
plan = offering.service_plans.find { |p|
|
|
319
|
+
p.name == (svc[:plan] || "D100")
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
fail "Unknown service plan: #{svc[:plan]}." unless plan
|
|
323
|
+
|
|
324
|
+
invoke :create_service,
|
|
325
|
+
:name => name,
|
|
326
|
+
:offering => offering,
|
|
327
|
+
:plan => plan,
|
|
328
|
+
:app => app
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
to_bind.each do |s|
|
|
334
|
+
next if app.binds?(s)
|
|
335
|
+
|
|
336
|
+
# TODO: splat
|
|
337
|
+
invoke :bind_service, :app => app, :service => s
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def target_base
|
|
342
|
+
client_target.sub(/^[^\.]+\./, "")
|
|
343
|
+
end
|
|
344
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
require "pathname"
|
|
2
|
+
require "jdc/plugin"
|
|
3
|
+
require "manifests/manifests"
|
|
4
|
+
|
|
5
|
+
class ManifestsPlugin < JDC::App::Base
|
|
6
|
+
include JDCManifests
|
|
7
|
+
|
|
8
|
+
def self.default_to_app_from_manifest(command, fail_without_app)
|
|
9
|
+
name_made_optional = change_argument(command, :app, :optional)
|
|
10
|
+
around(command) do |cmd, input|
|
|
11
|
+
wrap_with_optional_name(name_made_optional, cmd, input, fail_without_app)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
option :manifest, :aliases => "-m", :value => :file, :desc => "Path to manifest file to use"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
[:start, :restart, :instances, :logs, :env, :health, :stats, :scale, :app, :stop, :delete, :events].each do |command|
|
|
19
|
+
::ManifestsPlugin.default_to_app_from_manifest command, true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
add_input :push, :reset, :desc => "Reset to values in the manifest", :default => false
|
|
23
|
+
|
|
24
|
+
around(:push) do |push, input|
|
|
25
|
+
wrap_push(push, input)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def wrap_with_optional_name(name_made_optional, cmd, input, fail_without_app)
|
|
31
|
+
return cmd.call if input[:all]
|
|
32
|
+
|
|
33
|
+
unless manifest
|
|
34
|
+
# if the command knows how to handle this
|
|
35
|
+
if input.has?(:app) || !name_made_optional || !fail_without_app
|
|
36
|
+
return cmd.call
|
|
37
|
+
else
|
|
38
|
+
return no_apps
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
internal, external = apps_in_manifest(input)
|
|
43
|
+
|
|
44
|
+
return cmd.call if internal.empty? && !external.empty?
|
|
45
|
+
|
|
46
|
+
show_manifest_usage
|
|
47
|
+
|
|
48
|
+
if internal.empty? && external.empty?
|
|
49
|
+
internal = current_apps if internal.empty?
|
|
50
|
+
internal = all_apps if internal.empty?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
internal = internal.collect { |app| app[:name] }
|
|
54
|
+
|
|
55
|
+
apps = internal + external
|
|
56
|
+
return no_apps if fail_without_app && apps.empty?
|
|
57
|
+
|
|
58
|
+
apps.each.with_index do |app, num|
|
|
59
|
+
line unless quiet? || num == 0
|
|
60
|
+
cmd.call(input.without(:apps).merge_given(:app => app))
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def apply_changes(app, input)
|
|
65
|
+
app.memory = megabytes(input[:memory]) if input.has?(:memory)
|
|
66
|
+
app.total_instances = input[:instances] if input.has?(:instances)
|
|
67
|
+
app.command = input[:command] if input.has?(:command)
|
|
68
|
+
app.buildpack = input[:buildpack] if input.has?(:buildpack)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def wrap_push(push, input)
|
|
72
|
+
unless manifest
|
|
73
|
+
create_and_save_manifest(push, input)
|
|
74
|
+
return
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
line(c("--path is ignored when using a manifest. Please specify the path in the manifest.", :warning)) if input.has?(:path)
|
|
78
|
+
|
|
79
|
+
particular, external = apps_in_manifest(input)
|
|
80
|
+
|
|
81
|
+
unless external.empty?
|
|
82
|
+
fail "Could not find #{b(external.join(", "))}' in the manifest."
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
apps = particular.empty? ? all_apps : particular
|
|
86
|
+
|
|
87
|
+
show_manifest_usage
|
|
88
|
+
|
|
89
|
+
spaced(apps) do |app_manifest|
|
|
90
|
+
push_with_manifest(app_manifest, push, input)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def push_with_manifest(app_manifest, push, input)
|
|
95
|
+
with_filters(
|
|
96
|
+
:push => {
|
|
97
|
+
:create_app => proc { |a|
|
|
98
|
+
setup_env(a, app_manifest)
|
|
99
|
+
a
|
|
100
|
+
},
|
|
101
|
+
:push_app => proc { |a|
|
|
102
|
+
setup_services(a, app_manifest)
|
|
103
|
+
a
|
|
104
|
+
}
|
|
105
|
+
}) do
|
|
106
|
+
app_input = push_input_for(app_manifest, input)
|
|
107
|
+
|
|
108
|
+
push.call(app_input)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def push_input_for(app_manifest, input)
|
|
113
|
+
existing_app = client.app_by_name(app_manifest[:name])
|
|
114
|
+
rebased_input = input.rebase_given(app_manifest)
|
|
115
|
+
|
|
116
|
+
if !existing_app || input[:reset]
|
|
117
|
+
input = rebased_input
|
|
118
|
+
else
|
|
119
|
+
warn_reset_changes if manifest_differs?(existing_app, rebased_input)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
input.merge(
|
|
123
|
+
:path => from_manifest(app_manifest[:path]),
|
|
124
|
+
:name => app_manifest[:name],
|
|
125
|
+
:bind_services => false,
|
|
126
|
+
:create_services => false)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def manifest_differs?(app, input)
|
|
130
|
+
apply_changes(app, input)
|
|
131
|
+
app.changed?
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def create_and_save_manifest(push, input)
|
|
135
|
+
with_filters(
|
|
136
|
+
:push => { :push_app => proc { |a| ask_to_save(input, a); a } }) do
|
|
137
|
+
push.call
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
data/lib/micro/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
### Info
|
|
2
|
+
This plugin allows you to manage your Micro Jing Dong Foundry VM.
|
|
3
|
+
|
|
4
|
+
### Usage
|
|
5
|
+
```
|
|
6
|
+
micro-status VMX [PASSWORD] Display Micro Jing Dong Foundry VM status
|
|
7
|
+
micro-offline VMX [PASSWORD] Micro Jing Dong Foundry offline mode
|
|
8
|
+
micro-online VMX [PASSWORD] Micro Jing Dong Foundry online mode
|
|
9
|
+
```
|
data/lib/micro/errors.rb
ADDED
data/lib/{jdc → micro}/micro.rb
RENAMED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
require 'find'
|
|
2
|
+
require "micro/errors"
|
|
2
3
|
|
|
3
|
-
module
|
|
4
|
+
module JDCMicro
|
|
4
5
|
def config_file(file)
|
|
5
|
-
File.
|
|
6
|
+
File.expand_path("../../../../config/#{file}", __FILE__)
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def escape_path(path)
|
|
9
10
|
path = File.expand_path(path)
|
|
10
11
|
if RUBY_PLATFORM =~ /mingw|mswin32|cygwin/
|
|
11
12
|
if path.include?(' ')
|
|
12
|
-
|
|
13
|
+
'"' + path + '"'
|
|
13
14
|
else
|
|
14
|
-
|
|
15
|
+
path
|
|
15
16
|
end
|
|
16
17
|
else
|
|
17
|
-
|
|
18
|
+
path.gsub(' ', '\ ')
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def locate_file(file, directory, search_paths)
|
|
22
23
|
search_paths.each do |path|
|
|
23
24
|
expanded_path = File.expand_path(path)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
end
|
|
25
|
+
next unless File.exists?(expanded_path)
|
|
26
|
+
Find.find(expanded_path) do |current|
|
|
27
|
+
if File.directory?(current) && current.include?(directory)
|
|
28
|
+
full_path = File.join(current, file)
|
|
29
|
+
return escape_path(full_path) if File.exists?(full_path)
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -37,14 +37,14 @@ module JDC::Micro
|
|
|
37
37
|
def run_command(command, args=nil)
|
|
38
38
|
# TODO switch to using posix-spawn instead
|
|
39
39
|
result = %x{#{command} #{args} 2>&1}
|
|
40
|
-
|
|
40
|
+
if $?.exitstatus == 0
|
|
41
|
+
result.split(/\n/)
|
|
42
|
+
else
|
|
41
43
|
if block_given?
|
|
42
44
|
yield
|
|
43
45
|
else
|
|
44
|
-
raise "failed to execute #{command} #{args}:\n#{result}"
|
|
46
|
+
raise JDCMicro::MCFError, "failed to execute #{command} #{args}:\n#{result}"
|
|
45
47
|
end
|
|
46
|
-
else
|
|
47
|
-
result.split(/\n/)
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|