af 0.3.22 → 0.5.0.beta.1
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.
- checksums.yaml +14 -6
- data/LICENSE +1277 -24
- data/Rakefile +24 -87
- data/bin/af +7 -2
- data/lib/af/version.rb +3 -0
- data/lib/vmc.rb +7 -2
- data/lib/vmc/cli.rb +475 -0
- data/lib/vmc/cli/app/app.rb +45 -0
- data/lib/vmc/cli/app/apps.rb +105 -0
- data/lib/vmc/cli/app/base.rb +82 -0
- data/lib/vmc/cli/app/crashes.rb +46 -0
- data/lib/vmc/cli/app/delete.rb +95 -0
- data/lib/vmc/cli/app/deprecated.rb +11 -0
- data/lib/vmc/cli/app/env.rb +78 -0
- data/lib/vmc/cli/app/files.rb +137 -0
- data/lib/vmc/cli/app/health.rb +26 -0
- data/lib/vmc/cli/app/instances.rb +53 -0
- data/lib/vmc/cli/app/logs.rb +76 -0
- data/lib/vmc/cli/app/push.rb +107 -0
- data/lib/vmc/cli/app/push/create.rb +150 -0
- data/lib/vmc/cli/app/push/interactions.rb +100 -0
- data/lib/vmc/cli/app/push/sync.rb +64 -0
- data/lib/vmc/cli/app/rename.rb +39 -0
- data/lib/vmc/cli/app/restart.rb +20 -0
- data/lib/vmc/cli/app/scale.rb +71 -0
- data/lib/vmc/cli/app/start.rb +93 -0
- data/lib/vmc/cli/app/stats.rb +67 -0
- data/lib/vmc/cli/app/stop.rb +27 -0
- data/lib/vmc/cli/domain/base.rb +12 -0
- data/lib/vmc/cli/domain/domains.rb +40 -0
- data/lib/vmc/cli/domain/map.rb +55 -0
- data/lib/vmc/cli/domain/unmap.rb +56 -0
- data/lib/vmc/cli/help.rb +16 -0
- data/lib/vmc/cli/interactive.rb +105 -0
- data/lib/vmc/cli/organization/base.rb +14 -0
- data/lib/vmc/cli/organization/create.rb +32 -0
- data/lib/vmc/cli/organization/delete.rb +73 -0
- data/lib/vmc/cli/organization/org.rb +45 -0
- data/lib/vmc/cli/organization/orgs.rb +35 -0
- data/lib/vmc/cli/organization/rename.rb +36 -0
- data/lib/vmc/cli/route/base.rb +12 -0
- data/lib/vmc/cli/route/map.rb +80 -0
- data/lib/vmc/cli/route/routes.rb +26 -0
- data/lib/vmc/cli/route/unmap.rb +94 -0
- data/lib/vmc/cli/service/base.rb +8 -0
- data/lib/vmc/cli/service/bind.rb +44 -0
- data/lib/vmc/cli/service/create.rb +126 -0
- data/lib/vmc/cli/service/delete.rb +86 -0
- data/lib/vmc/cli/service/rename.rb +35 -0
- data/lib/vmc/cli/service/service.rb +42 -0
- data/lib/vmc/cli/service/services.rb +115 -0
- data/lib/vmc/cli/service/unbind.rb +38 -0
- data/lib/vmc/cli/space/base.rb +21 -0
- data/lib/vmc/cli/space/create.rb +56 -0
- data/lib/vmc/cli/space/delete.rb +95 -0
- data/lib/vmc/cli/space/rename.rb +39 -0
- data/lib/vmc/cli/space/space.rb +64 -0
- data/lib/vmc/cli/space/spaces.rb +55 -0
- data/lib/vmc/cli/space/take.rb +16 -0
- data/lib/vmc/cli/start/base.rb +80 -0
- data/lib/vmc/cli/start/colors.rb +13 -0
- data/lib/vmc/cli/start/info.rb +122 -0
- data/lib/vmc/cli/start/login.rb +92 -0
- data/lib/vmc/cli/start/logout.rb +13 -0
- data/lib/vmc/cli/start/target.rb +64 -0
- data/lib/vmc/cli/start/target_interactions.rb +37 -0
- data/lib/vmc/cli/start/targets.rb +16 -0
- data/lib/vmc/cli/user/base.rb +29 -0
- data/lib/vmc/cli/user/create.rb +39 -0
- data/lib/vmc/cli/user/delete.rb +25 -0
- data/lib/vmc/cli/user/passwd.rb +50 -0
- data/lib/vmc/cli/user/register.rb +42 -0
- data/lib/vmc/cli/user/users.rb +32 -0
- data/lib/vmc/constants.rb +13 -0
- data/lib/vmc/detect.rb +134 -0
- data/lib/vmc/errors.rb +17 -0
- data/lib/vmc/plugin.rb +56 -0
- data/lib/vmc/spacing.rb +89 -0
- data/lib/vmc/spec_helper.rb +1 -0
- data/lib/vmc/test_support.rb +4 -0
- data/lib/vmc/test_support/command_helper.rb +32 -0
- data/lib/vmc/test_support/common_input_examples.rb +14 -0
- data/lib/vmc/test_support/fake_home_dir.rb +16 -0
- data/lib/vmc/test_support/interact_helper.rb +29 -0
- data/lib/vmc/version.rb +3 -0
- data/spec/assets/hello-sinatra/Gemfile +3 -0
- data/spec/assets/hello-sinatra/main.rb +6 -0
- data/spec/features/new_user_flow_spec.rb +71 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/vmc/cli/app/base_spec.rb +17 -0
- data/spec/vmc/cli/app/delete_spec.rb +188 -0
- data/spec/vmc/cli/app/instances_spec.rb +65 -0
- data/spec/vmc/cli/app/push/create_spec.rb +571 -0
- data/spec/vmc/cli/app/push_spec.rb +369 -0
- data/spec/vmc/cli/app/rename_spec.rb +104 -0
- data/spec/vmc/cli/app/scale_spec.rb +81 -0
- data/spec/vmc/cli/app/stats_spec.rb +62 -0
- data/spec/vmc/cli/domain/map_spec.rb +140 -0
- data/spec/vmc/cli/domain/unmap_spec.rb +73 -0
- data/spec/vmc/cli/organization/orgs_spec.rb +108 -0
- data/spec/vmc/cli/organization/rename_spec.rb +113 -0
- data/spec/vmc/cli/route/map_spec.rb +138 -0
- data/spec/vmc/cli/route/unmap_spec.rb +215 -0
- data/spec/vmc/cli/service/bind_spec.rb +25 -0
- data/spec/vmc/cli/service/delete_spec.rb +22 -0
- data/spec/vmc/cli/service/rename_spec.rb +105 -0
- data/spec/vmc/cli/service/service_spec.rb +23 -0
- data/spec/vmc/cli/service/unbind_spec.rb +25 -0
- data/spec/vmc/cli/space/rename_spec.rb +102 -0
- data/spec/vmc/cli/space/spaces_spec.rb +104 -0
- data/spec/vmc/cli/start/info_spec.rb +153 -0
- data/spec/vmc/cli/start/login_spec.rb +71 -0
- data/spec/vmc/cli/user/create_spec.rb +54 -0
- data/spec/vmc/cli/user/passwd_spec.rb +102 -0
- data/spec/vmc/cli/user/register_spec.rb +148 -0
- data/spec/vmc/cli_spec.rb +448 -0
- data/spec/vmc/detect_spec.rb +54 -0
- metadata +231 -124
- data/README.md +0 -155
- data/caldecott_helper/Gemfile +0 -10
- data/caldecott_helper/Gemfile.lock +0 -48
- data/caldecott_helper/server.rb +0 -43
- data/config/clients.yml +0 -17
- data/config/micro/offline.conf +0 -2
- data/config/micro/paths.yml +0 -22
- data/config/micro/refresh_ip.rb +0 -20
- data/lib/cli.rb +0 -48
- data/lib/cli/commands/admin.rb +0 -81
- data/lib/cli/commands/apps.rb +0 -1358
- data/lib/cli/commands/base.rb +0 -233
- data/lib/cli/commands/manifest.rb +0 -56
- data/lib/cli/commands/micro.rb +0 -115
- data/lib/cli/commands/misc.rb +0 -147
- data/lib/cli/commands/services.rb +0 -217
- data/lib/cli/commands/user.rb +0 -70
- data/lib/cli/config.rb +0 -176
- data/lib/cli/console_helper.rb +0 -163
- data/lib/cli/core_ext.rb +0 -122
- data/lib/cli/errors.rb +0 -19
- data/lib/cli/file_helper.rb +0 -123
- data/lib/cli/frameworks.rb +0 -265
- data/lib/cli/manifest_helper.rb +0 -316
- data/lib/cli/runner.rb +0 -633
- data/lib/cli/services_helper.rb +0 -104
- data/lib/cli/tunnel_helper.rb +0 -336
- data/lib/cli/usage.rb +0 -129
- data/lib/cli/version.rb +0 -7
- data/lib/cli/zip_util.rb +0 -102
- data/lib/vmc/client.rb +0 -574
- data/lib/vmc/const.rb +0 -27
- data/lib/vmc/micro.rb +0 -56
- data/lib/vmc/micro/switcher/base.rb +0 -97
- data/lib/vmc/micro/switcher/darwin.rb +0 -19
- data/lib/vmc/micro/switcher/dummy.rb +0 -15
- data/lib/vmc/micro/switcher/linux.rb +0 -16
- data/lib/vmc/micro/switcher/windows.rb +0 -31
- data/lib/vmc/micro/vmrun.rb +0 -158
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module VMC::App
|
|
2
|
+
module PushInteractions
|
|
3
|
+
def ask_name
|
|
4
|
+
ask("Name")
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def ask_host(name)
|
|
8
|
+
ask "Subdomain", :choices => [name, "none"],
|
|
9
|
+
:default => name,
|
|
10
|
+
:allow_other => true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def ask_domain(app)
|
|
14
|
+
choices = v2? ? app.space.domains : ["#{app.name}.#{target_base}"]
|
|
15
|
+
# =======
|
|
16
|
+
# def ask_url(name, infra)
|
|
17
|
+
# choices = url_choices(name, infra)
|
|
18
|
+
# >>>>>>> Added infra to url domain
|
|
19
|
+
|
|
20
|
+
options = {
|
|
21
|
+
:choices => choices + ["none"],
|
|
22
|
+
:display => proc { |d| d.is_a?(String) ? d : d.name },
|
|
23
|
+
:allow_other => true
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
options[:default] = choices.first if choices.size == 1
|
|
27
|
+
|
|
28
|
+
ask "Domain", options
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ask_memory(default)
|
|
32
|
+
ask("Memory Limit",
|
|
33
|
+
:choices => memory_choices,
|
|
34
|
+
:allow_other => true,
|
|
35
|
+
:default => default || "64M")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def ask_instances
|
|
39
|
+
ask("Instances", :default => 1)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def ask_framework(choices, default, other)
|
|
43
|
+
ask_with_other("Framework", client.frameworks, choices, default, other)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def ask_infra(choices, default, other)
|
|
47
|
+
ask_with_other("Infrastructure", client.infras, choices, default, other)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def ask_runtime(choices, default, other)
|
|
51
|
+
ask_with_other("Runtime", client.runtimes, choices, default, other)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def ask_command
|
|
55
|
+
if ask("Use custom startup command?", :default => false)
|
|
56
|
+
ask("Startup command")
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def ask_create_services
|
|
61
|
+
line unless quiet?
|
|
62
|
+
ask "Create services for application?", :default => false
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def ask_bind_services
|
|
66
|
+
return if all_instances.empty?
|
|
67
|
+
|
|
68
|
+
ask "Bind other services to application?", :default => false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def ask_with_other(message, all, choices, default, other)
|
|
74
|
+
choices = choices.sort_by(&:name)
|
|
75
|
+
choices << other if other
|
|
76
|
+
|
|
77
|
+
opts = {
|
|
78
|
+
:choices => choices,
|
|
79
|
+
:display => proc { |x|
|
|
80
|
+
if other && x == other
|
|
81
|
+
"other"
|
|
82
|
+
else
|
|
83
|
+
x.name
|
|
84
|
+
end
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
opts[:default] = default if default
|
|
89
|
+
|
|
90
|
+
res = ask(message, opts)
|
|
91
|
+
|
|
92
|
+
if other && res == other
|
|
93
|
+
opts[:choices] = all
|
|
94
|
+
res = ask(message, opts)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
res
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module VMC::App
|
|
2
|
+
module Sync
|
|
3
|
+
def apply_changes(app)
|
|
4
|
+
app.memory = megabytes(input[:memory]) if input.has?(:memory)
|
|
5
|
+
app.total_instances = input[:instances] if input.has?(:instances)
|
|
6
|
+
app.command = input[:command] if input.has?(:command)
|
|
7
|
+
app.production = input[:plan].upcase.start_with?("P") if input.has?(:plan)
|
|
8
|
+
app.framework = input[:framework] if input.has?(:framework)
|
|
9
|
+
app.runtime = input[:runtime] if input.has?(:runtime)
|
|
10
|
+
app.buildpack = input[:buildpack] if input.has?(:buildpack)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def display_changes(app)
|
|
14
|
+
return unless app.changed?
|
|
15
|
+
|
|
16
|
+
line "Changes:"
|
|
17
|
+
|
|
18
|
+
indented do
|
|
19
|
+
app.changes.each do |attr, (old, new)|
|
|
20
|
+
line "#{c(attr, :name)}: #{diff_str(attr, old)} -> #{diff_str(attr, new)}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def commit_changes(app)
|
|
26
|
+
if app.changed?
|
|
27
|
+
with_progress("Updating #{c(app.name, :name)}") do
|
|
28
|
+
wrap_message_format_errors do
|
|
29
|
+
app.update!
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if input[:restart] && app.started?
|
|
35
|
+
invoke :restart, :app => app
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def diff_str(attr, val)
|
|
42
|
+
case attr
|
|
43
|
+
when :memory
|
|
44
|
+
human_mb(val)
|
|
45
|
+
when :framework, :runtime
|
|
46
|
+
val.name
|
|
47
|
+
when :command, :buildpack
|
|
48
|
+
"'#{val}'"
|
|
49
|
+
when :production
|
|
50
|
+
bool(val)
|
|
51
|
+
else
|
|
52
|
+
val
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def bool(b)
|
|
57
|
+
if b
|
|
58
|
+
c("true", :yes)
|
|
59
|
+
else
|
|
60
|
+
c("false", :no)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require "vmc/cli/app/base"
|
|
2
|
+
|
|
3
|
+
module VMC::App
|
|
4
|
+
class Rename < Base
|
|
5
|
+
desc "Rename an application"
|
|
6
|
+
group :apps, :manage
|
|
7
|
+
input :app, :desc => "Application to rename", :argument => :optional,
|
|
8
|
+
:from_given => by_name(:app)
|
|
9
|
+
input :name, :desc => "New application name", :argument => :optional
|
|
10
|
+
def rename
|
|
11
|
+
app = input[:app]
|
|
12
|
+
name = input[:name]
|
|
13
|
+
|
|
14
|
+
original_name = app.guid
|
|
15
|
+
app.name = name
|
|
16
|
+
app.class.guid_name = "hack" # allows the guid to set to original name
|
|
17
|
+
app.guid = original_name
|
|
18
|
+
app.class.guid_name = "name" # restore guid name
|
|
19
|
+
|
|
20
|
+
with_progress("Renaming to #{c(name, :name)}") do
|
|
21
|
+
app.update!
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def ask_app
|
|
28
|
+
apps = client.apps
|
|
29
|
+
fail "No applications." if apps.empty?
|
|
30
|
+
|
|
31
|
+
ask("Rename which application?", :choices => apps.sort_by(&:name),
|
|
32
|
+
:display => proc(&:name))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def ask_name
|
|
36
|
+
ask("New name")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "vmc/cli/app/base"
|
|
2
|
+
|
|
3
|
+
module VMC::App
|
|
4
|
+
class Restart < Base
|
|
5
|
+
desc "Stop and start an application"
|
|
6
|
+
group :apps, :manage
|
|
7
|
+
input :apps, :desc => "Applications to start", :argument => :splat,
|
|
8
|
+
:singular => :app, :from_given => by_name(:app)
|
|
9
|
+
input :debug_mode, :desc => "Debug mode to start in", :aliases => "-d"
|
|
10
|
+
input :all, :desc => "Restart all applications", :default => false
|
|
11
|
+
def restart
|
|
12
|
+
invoke :stop, :all => input[:all], :apps => input[:apps]
|
|
13
|
+
|
|
14
|
+
line unless quiet?
|
|
15
|
+
|
|
16
|
+
invoke :start, :all => input[:all], :apps => input[:apps],
|
|
17
|
+
:debug_mode => input[:debug_mode]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require "vmc/cli/app/base"
|
|
2
|
+
|
|
3
|
+
module VMC::App
|
|
4
|
+
class Scale < Base
|
|
5
|
+
desc "Update the instances/memory limit for an application"
|
|
6
|
+
group :apps, :info, :hidden => true
|
|
7
|
+
input :app, :desc => "Application to update", :argument => true,
|
|
8
|
+
:from_given => by_name(:app)
|
|
9
|
+
input :instances, :desc => "Number of instances to run",
|
|
10
|
+
:type => :numeric
|
|
11
|
+
input :memory, :desc => "Memory limit"
|
|
12
|
+
input :disk, :desc => "Disk quota"
|
|
13
|
+
input :plan, :desc => "Application plan", :default => "D100"
|
|
14
|
+
input :restart, :desc => "Restart app after updating?", :default => true
|
|
15
|
+
def scale
|
|
16
|
+
app = input[:app]
|
|
17
|
+
|
|
18
|
+
if input.has?(:instances)
|
|
19
|
+
instances = input[:instances, app.total_instances]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if input.has?(:memory)
|
|
23
|
+
memory = input[:memory, app.memory]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
if input.has?(:disk)
|
|
27
|
+
disk = input[:disk, human_mb(app.disk_quota)]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if input.has?(:plan)
|
|
31
|
+
fail "Plans not supported on target cloud." unless v2?
|
|
32
|
+
|
|
33
|
+
plan_name = input[:plan]
|
|
34
|
+
production = !!(plan_name =~ /^p/i)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
unless instances || memory || disk || plan_name
|
|
38
|
+
instances = input[:instances, app.total_instances]
|
|
39
|
+
memory = input[:memory, app.memory]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
app.total_instances = instances if input.has?(:instances)
|
|
43
|
+
app.memory = megabytes(memory) if input.has?(:memory)
|
|
44
|
+
app.disk_quota = megabytes(disk) if input.has?(:disk)
|
|
45
|
+
app.production = production if input.has?(:plan)
|
|
46
|
+
|
|
47
|
+
fail "No changes!" unless app.changed?
|
|
48
|
+
|
|
49
|
+
with_progress("Scaling #{c(app.name, :name)}") do
|
|
50
|
+
app.update!
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
needs_restart = app.changes.key?(:memory) || app.changes.key?(:disk_quota)
|
|
54
|
+
|
|
55
|
+
if needs_restart && app.started? && input[:restart]
|
|
56
|
+
invoke :restart, :app => app
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def ask_instances(default)
|
|
63
|
+
ask("Instances", :default => default)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def ask_memory(default)
|
|
67
|
+
ask("Memory Limit", :choices => memory_choices(default),
|
|
68
|
+
:default => human_mb(default), :allow_other => true)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require "vmc/cli/app/base"
|
|
2
|
+
|
|
3
|
+
module VMC::App
|
|
4
|
+
class Start < Base
|
|
5
|
+
APP_CHECK_LIMIT = 60
|
|
6
|
+
|
|
7
|
+
desc "Start an application"
|
|
8
|
+
group :apps, :manage
|
|
9
|
+
input :apps, :desc => "Applications to start", :argument => :splat,
|
|
10
|
+
:singular => :app, :from_given => by_name(:app)
|
|
11
|
+
input :debug_mode, :desc => "Debug mode to start in", :aliases => "-d"
|
|
12
|
+
input :all, :desc => "Start all applications", :default => false
|
|
13
|
+
def start
|
|
14
|
+
apps = input[:all] ? client.apps : input[:apps]
|
|
15
|
+
fail "No applications given." if apps.empty?
|
|
16
|
+
|
|
17
|
+
spaced(apps) do |app|
|
|
18
|
+
app = filter(:start_app, app)
|
|
19
|
+
|
|
20
|
+
switch_mode(app, input[:debug_mode])
|
|
21
|
+
|
|
22
|
+
with_progress("Starting #{c(app.name, :name)}") do |s|
|
|
23
|
+
if app.started?
|
|
24
|
+
s.skip do
|
|
25
|
+
err "Already started."
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
app.start!
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
check_application(app)
|
|
33
|
+
|
|
34
|
+
if app.debug_mode && !quiet?
|
|
35
|
+
line
|
|
36
|
+
invoke :instances, :app => app
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# set app debug mode, ensuring it's valid, and shutting it down
|
|
42
|
+
def switch_mode(app, mode)
|
|
43
|
+
mode = nil if mode == "none"
|
|
44
|
+
mode = "run" if mode == "debug_mode" # no value given
|
|
45
|
+
|
|
46
|
+
return false if app.debug_mode == mode
|
|
47
|
+
|
|
48
|
+
if mode.nil?
|
|
49
|
+
with_progress("Removing debug mode") do
|
|
50
|
+
app.debug_mode = nil
|
|
51
|
+
app.stop! if app.started?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
return true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
with_progress("Switching mode to #{c(mode, :name)}") do |s|
|
|
58
|
+
runtime = client.runtimes.find { |r| r.name == app.runtime.name }
|
|
59
|
+
modes = runtime.debug_modes
|
|
60
|
+
|
|
61
|
+
if modes.include?(mode)
|
|
62
|
+
app.debug_mode = mode
|
|
63
|
+
app.stop! if app.started?
|
|
64
|
+
else
|
|
65
|
+
fail "Unknown mode '#{mode}'; available: #{modes.join ", "}"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def check_application(app)
|
|
71
|
+
with_progress("Checking #{c(app.name, :name)}") do |s|
|
|
72
|
+
if app.debug_mode == "suspend"
|
|
73
|
+
s.skip do
|
|
74
|
+
line "Application is in suspended debugging mode."
|
|
75
|
+
line "It will wait for you to attach to it before starting."
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
seconds = 0
|
|
80
|
+
until app.healthy?
|
|
81
|
+
sleep 1
|
|
82
|
+
seconds += 1
|
|
83
|
+
if seconds == APP_CHECK_LIMIT
|
|
84
|
+
s.give_up do
|
|
85
|
+
err "Application failed to start."
|
|
86
|
+
# TODO: print logs
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require "vmc/cli/app/base"
|
|
2
|
+
|
|
3
|
+
module VMC::App
|
|
4
|
+
class Stats < Base
|
|
5
|
+
desc "Display application instance status"
|
|
6
|
+
group :apps, :info, :hidden => true
|
|
7
|
+
input :app, :desc => "Application to get the stats for",
|
|
8
|
+
:argument => true, :from_given => by_name(:app)
|
|
9
|
+
def stats
|
|
10
|
+
app = input[:app]
|
|
11
|
+
|
|
12
|
+
stats =
|
|
13
|
+
with_progress("Getting stats for #{c(app.name, :name)}") do |s|
|
|
14
|
+
begin
|
|
15
|
+
app.stats
|
|
16
|
+
rescue CFoundry::StatsError
|
|
17
|
+
s.fail do
|
|
18
|
+
err "Application #{b(app.name)} is not running."
|
|
19
|
+
return
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
line unless quiet?
|
|
25
|
+
|
|
26
|
+
table(
|
|
27
|
+
%w{instance cpu memory disk},
|
|
28
|
+
stats.sort_by { |idx, _| idx.to_i }.collect { |idx, info|
|
|
29
|
+
idx = c("\##{idx}", :instance)
|
|
30
|
+
|
|
31
|
+
if info[:state] == "DOWN"
|
|
32
|
+
[idx, c("down", :bad)]
|
|
33
|
+
else
|
|
34
|
+
stats = info[:stats]
|
|
35
|
+
usage = stats[:usage]
|
|
36
|
+
|
|
37
|
+
if usage
|
|
38
|
+
[ idx,
|
|
39
|
+
"#{percentage(usage[:cpu])}",
|
|
40
|
+
"#{usage(usage[:mem], stats[:mem_quota])}",
|
|
41
|
+
"#{usage(usage[:disk], stats[:disk_quota])}"
|
|
42
|
+
]
|
|
43
|
+
else
|
|
44
|
+
[idx, c("n/a", :neutral)]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
})
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def percentage(num, low = 50, mid = 70)
|
|
51
|
+
color =
|
|
52
|
+
if num <= low
|
|
53
|
+
:good
|
|
54
|
+
elsif num <= mid
|
|
55
|
+
:warning
|
|
56
|
+
else
|
|
57
|
+
:bad
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
c(format("%.1f\%", num), color)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def usage(used, limit)
|
|
64
|
+
"#{b(human_size(used))} of #{b(human_size(limit, 0))}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|