vmc 0.5.0.beta.7 → 0.5.0.beta.10
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 -746
- data/Rakefile +22 -23
- data/lib/vmc/cli.rb +21 -27
- data/lib/vmc/cli/app/push.rb +1 -0
- data/lib/vmc/cli/app/push/create.rb +3 -2
- data/lib/vmc/cli/app/push/sync.rb +11 -8
- data/lib/vmc/cli/app/scale.rb +19 -17
- data/lib/vmc/cli/domain/map.rb +55 -0
- data/lib/vmc/cli/domain/unmap.rb +56 -0
- data/lib/vmc/cli/route/map.rb +74 -0
- data/lib/vmc/cli/route/unmap.rb +94 -0
- data/lib/vmc/cli/service/create.rb +4 -1
- data/lib/vmc/cli/start/base.rb +2 -2
- data/lib/vmc/cli/start/login.rb +5 -2
- data/lib/vmc/cli/start/target.rb +4 -3
- data/lib/vmc/cli/user/base.rb +19 -0
- data/lib/vmc/cli/user/passwd.rb +7 -19
- data/lib/vmc/cli/{start → user}/register.rb +12 -23
- data/lib/vmc/constants.rb +1 -1
- data/lib/vmc/test_support.rb +4 -0
- data/lib/vmc/test_support/command_helper.rb +38 -0
- data/{spec/support → lib/vmc/test_support}/common_input_examples.rb +0 -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 +1 -1
- data/spec/features/new_user_flow_spec.rb +43 -51
- data/spec/spec_helper.rb +24 -12
- data/spec/vmc/cli/app/instances_spec.rb +3 -8
- data/spec/vmc/cli/app/push/create_spec.rb +10 -7
- data/spec/vmc/cli/app/push_spec.rb +1 -1
- data/spec/vmc/cli/app/rename_spec.rb +1 -1
- data/spec/vmc/cli/app/scale_spec.rb +81 -0
- data/spec/vmc/cli/app/stats_spec.rb +3 -7
- 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 +13 -16
- data/spec/vmc/cli/organization/rename_spec.rb +1 -1
- data/spec/vmc/cli/route/map_spec.rb +142 -0
- data/spec/vmc/cli/route/unmap_spec.rb +215 -0
- data/spec/vmc/cli/service/rename_spec.rb +1 -1
- data/spec/vmc/cli/space/rename_spec.rb +15 -18
- data/spec/vmc/cli/space/spaces_spec.rb +18 -25
- data/spec/vmc/cli/start/info_spec.rb +44 -46
- data/spec/vmc/cli/start/login_spec.rb +40 -0
- data/spec/vmc/cli/user/create_spec.rb +54 -0
- data/spec/vmc/cli/user/passwd_spec.rb +7 -14
- data/spec/vmc/cli/{start → user}/register_spec.rb +26 -22
- data/spec/vmc/cli_spec.rb +164 -6
- metadata +46 -39
- data/lib/vmc/cli/app/routes.rb +0 -100
- data/lib/vmc/cli/domain/add_domain.rb +0 -25
- data/lib/vmc/cli/domain/create_domain.rb +0 -28
- data/lib/vmc/cli/domain/delete_domain.rb +0 -56
- data/lib/vmc/cli/domain/remove_domain.rb +0 -28
- data/lib/vmc/cli/route/create_route.rb +0 -49
- data/lib/vmc/cli/route/delete.rb +0 -47
- data/spec/support/feature_helpers.rb +0 -16
- data/spec/support/interact_helpers.rb +0 -27
- data/spec/vmc/cli/route/delete_route_spec.rb +0 -162
@@ -1,25 +0,0 @@
|
|
1
|
-
require "vmc/cli/domain/base"
|
2
|
-
|
3
|
-
module VMC::Domain
|
4
|
-
class AddDomain < Base
|
5
|
-
desc "Add a domain to a space"
|
6
|
-
group :domains
|
7
|
-
input :name, :desc => "Domain to add", :argument => :required
|
8
|
-
input :space, :desc => "Space to add the domain to",
|
9
|
-
:default => proc { client.current_space },
|
10
|
-
:from_given => by_name(:space)
|
11
|
-
def add_domain
|
12
|
-
space = input[:space]
|
13
|
-
name = input[:name].sub(/^\*\./, "")
|
14
|
-
|
15
|
-
org = space.organization
|
16
|
-
|
17
|
-
domain = org.domains.find { |d| d.name == name } ||
|
18
|
-
invoke(:create_domain, :org => org, :name => name)
|
19
|
-
|
20
|
-
with_progress("Adding #{c(domain.name, :name)} to #{c(space.name, :name)}") do
|
21
|
-
space.add_domain(domain)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require "vmc/cli/domain/base"
|
2
|
-
|
3
|
-
module VMC::Domain
|
4
|
-
class CreateDomain < Base
|
5
|
-
desc "Create a domain"
|
6
|
-
group :domains
|
7
|
-
input :name, :desc => "Domain name to create", :argument => :required
|
8
|
-
input :organization, :desc => "Organization to add the domain to",
|
9
|
-
:aliases => %w{--org -o},
|
10
|
-
:default => proc { client.current_organization },
|
11
|
-
:from_given => by_name(:organization)
|
12
|
-
input :shared, :desc => "Create a shared domain", :default => false
|
13
|
-
def create_domain
|
14
|
-
org = input[:organization]
|
15
|
-
name = input[:name].sub(/^\*\./, "")
|
16
|
-
|
17
|
-
domain = client.domain
|
18
|
-
domain.name = name
|
19
|
-
domain.owning_organization = org unless input[:shared]
|
20
|
-
|
21
|
-
with_progress("Creating domain #{c(name, :name)}") do
|
22
|
-
domain.create!
|
23
|
-
end
|
24
|
-
|
25
|
-
domain
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require "vmc/cli/domain/base"
|
2
|
-
|
3
|
-
module VMC::Domain
|
4
|
-
class DeleteDomain < Base
|
5
|
-
# TODO: refactor; using find_by_name, and target cycling between
|
6
|
-
# org/client, is awkward
|
7
|
-
|
8
|
-
desc "Delete a domain"
|
9
|
-
group :domains
|
10
|
-
input :domain, :desc => "URL to map to the application",
|
11
|
-
:argument => :optional, :from_given => find_by_name("domain")
|
12
|
-
input :organization, :desc => "Organization to delete the domain from",
|
13
|
-
:aliases => %w{--org -o}, :from_given => by_name(:organization)
|
14
|
-
input :all, :desc => "Delete all domains", :default => false
|
15
|
-
input :really, :type => :boolean, :forget => true, :hidden => true,
|
16
|
-
:default => proc { force? || interact }
|
17
|
-
def delete_domain
|
18
|
-
target = input[:organization] || client
|
19
|
-
|
20
|
-
if input[:all]
|
21
|
-
return unless input[:really, "ALL DOMAINS", :bad]
|
22
|
-
|
23
|
-
target.domains.each do |r|
|
24
|
-
begin
|
25
|
-
invoke :delete_domain, :domain => r, :really => true
|
26
|
-
rescue CFoundry::APIError => e
|
27
|
-
err "#{e.class}: #{e.message}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
return
|
32
|
-
end
|
33
|
-
|
34
|
-
domain = input[:domain, target.domains]
|
35
|
-
|
36
|
-
return unless input[:really, domain.name, :name]
|
37
|
-
|
38
|
-
with_progress("Deleting domain #{c(domain.name, :name)}") do
|
39
|
-
domain.delete!
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def ask_domain(domains)
|
46
|
-
fail "No domains." if domains.empty?
|
47
|
-
|
48
|
-
ask "Which domain?", :choices => domains.sort_by(&:name),
|
49
|
-
:display => proc(&:name)
|
50
|
-
end
|
51
|
-
|
52
|
-
def ask_really(name, color)
|
53
|
-
ask("Really delete #{c(name, color)}?", :default => false)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require "vmc/cli/domain/base"
|
2
|
-
|
3
|
-
module VMC::Domain
|
4
|
-
class RemoveDomain < Base
|
5
|
-
desc "Remove a domain from a space"
|
6
|
-
group :domains
|
7
|
-
input :domain, :desc => "Domain to add", :argument => :optional,
|
8
|
-
:from_given => by_name(:domain)
|
9
|
-
input :space, :desc => "Space to add the domain to",
|
10
|
-
:from_given => by_name(:space),
|
11
|
-
:default => proc { client.current_space }
|
12
|
-
def remove_domain
|
13
|
-
space = input[:space]
|
14
|
-
domain = input[:domain, space]
|
15
|
-
|
16
|
-
with_progress("Removing #{c(domain.name, :name)} from #{c(space.name, :name)}") do
|
17
|
-
space.remove_domain(domain)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def ask_domain(space)
|
24
|
-
ask "Which domain?", :choices => space.domains,
|
25
|
-
:display => proc(&:name)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require "vmc/cli/route/base"
|
2
|
-
|
3
|
-
module VMC::Route
|
4
|
-
class CreateRoute < Base
|
5
|
-
desc "Create a route"
|
6
|
-
group :routes
|
7
|
-
input :url, :desc => "Full route in URL form", :argument => :optional
|
8
|
-
input :host, :desc => "Host name"
|
9
|
-
input :domain, :desc => "Domain to add the route to",
|
10
|
-
:from_given => by_name(:domain)
|
11
|
-
def create_route
|
12
|
-
if url = input[:url]
|
13
|
-
host, domain_name = url.split(".", 2)
|
14
|
-
return invoke :create_route, {}, :host => host, :domain => domain_name
|
15
|
-
end
|
16
|
-
|
17
|
-
domain = input[:domain]
|
18
|
-
host = input[:host]
|
19
|
-
|
20
|
-
route = client.route
|
21
|
-
route.host = host
|
22
|
-
route.domain = domain
|
23
|
-
route.space = client.current_space
|
24
|
-
|
25
|
-
with_progress("Creating route #{c("#{host}.#{domain.name}", :name)}") do
|
26
|
-
route.create!
|
27
|
-
end
|
28
|
-
rescue CFoundry::RouteHostTaken => e
|
29
|
-
line c(e.description, :error)
|
30
|
-
line
|
31
|
-
input.forget(:host)
|
32
|
-
retry
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def ask_host
|
38
|
-
ask("Host name?")
|
39
|
-
end
|
40
|
-
|
41
|
-
def ask_domain
|
42
|
-
domains = client.current_organization.domains
|
43
|
-
fail "No domains!" if domains.empty?
|
44
|
-
|
45
|
-
ask "Which domain?", :choices => domains,
|
46
|
-
:display => proc(&:name)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/vmc/cli/route/delete.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require "vmc/cli/route/base"
|
2
|
-
|
3
|
-
module VMC::Route
|
4
|
-
class Delete < Base
|
5
|
-
desc "Delete a route"
|
6
|
-
group :routes
|
7
|
-
input :route, :desc => "Route to delete", :argument => :optional,
|
8
|
-
:from_given => find_by_name("route") { client.routes },
|
9
|
-
:default => proc { force? || interact }
|
10
|
-
input :all, :desc => "Delete all routes", :default => false
|
11
|
-
input :really, :type => :boolean, :forget => true, :hidden => true,
|
12
|
-
:default => proc { force? || interact }
|
13
|
-
def delete_route
|
14
|
-
if input[:all]
|
15
|
-
return unless input[:really, "ALL ROUTES", :bad]
|
16
|
-
|
17
|
-
client.routes.each do |r|
|
18
|
-
invoke :delete_route, :route => r, :really => true
|
19
|
-
end
|
20
|
-
|
21
|
-
return
|
22
|
-
end
|
23
|
-
|
24
|
-
route = input[:route]
|
25
|
-
|
26
|
-
return unless input[:really, route.name, :name]
|
27
|
-
|
28
|
-
with_progress("Deleting route #{c(route.name, :name)}") do
|
29
|
-
route.delete!
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def ask_route
|
36
|
-
routes = client.routes
|
37
|
-
fail "No routes." if routes.empty?
|
38
|
-
|
39
|
-
ask "Which route?", :choices => routes.sort_by(&:name),
|
40
|
-
:display => proc(&:name)
|
41
|
-
end
|
42
|
-
|
43
|
-
def ask_really(name, color)
|
44
|
-
ask("Really delete #{c(name, color)}?", :default => false)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
def vmc_ok(argv)
|
2
|
-
with_output_to do |out|
|
3
|
-
Mothership.new.exit_status 0
|
4
|
-
code = VMC::CLI.start(argv + ["--no-script"])
|
5
|
-
yield out.string.strip_progress_dots if block_given?
|
6
|
-
expect(code).to eq 0
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def vmc_fail(argv)
|
11
|
-
with_output_to do |out|
|
12
|
-
code = VMC::CLI.start(argv + ["--no-script"])
|
13
|
-
yield out.string.strip_progress_dots if block_given?
|
14
|
-
expect(code).to eq 1
|
15
|
-
end
|
16
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
def stub_ask(*args, &block)
|
2
|
-
a_stub = nil
|
3
|
-
any_instance_of VMC::CLI do |interactive|
|
4
|
-
a_stub = stub(interactive).ask(*args, &block)
|
5
|
-
end
|
6
|
-
a_stub
|
7
|
-
end
|
8
|
-
|
9
|
-
def mock_ask(*args, &block)
|
10
|
-
a_mock = nil
|
11
|
-
any_instance_of VMC::CLI do |interactive|
|
12
|
-
a_mock = mock(interactive).ask(*args, &block)
|
13
|
-
end
|
14
|
-
a_mock
|
15
|
-
end
|
16
|
-
|
17
|
-
def dont_allow_ask(*args)
|
18
|
-
any_instance_of VMC::CLI do |interactive|
|
19
|
-
dont_allow(interactive).ask(*args)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def mock_with_progress(message)
|
24
|
-
any_instance_of VMC::CLI do |interactive|
|
25
|
-
mock(interactive).with_progress(message) { |_, block| block.call }
|
26
|
-
end
|
27
|
-
end
|
@@ -1,162 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require "vmc/cli/route/delete"
|
3
|
-
|
4
|
-
describe VMC::Route::Delete do
|
5
|
-
let(:global) { { :color => false, :quiet => true } }
|
6
|
-
let(:inputs) { {} }
|
7
|
-
let(:given) { {} }
|
8
|
-
let(:client) { fake_client }
|
9
|
-
|
10
|
-
before do
|
11
|
-
any_instance_of(VMC::CLI) do |cli|
|
12
|
-
stub(cli).client { client }
|
13
|
-
stub(cli).precondition { nil }
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
subject { Mothership.new.invoke(:delete_route, inputs, given, global) }
|
18
|
-
|
19
|
-
describe 'metadata' do
|
20
|
-
let(:command) { Mothership.commands[:delete_route] }
|
21
|
-
|
22
|
-
describe 'command' do
|
23
|
-
subject { command }
|
24
|
-
its(:description) { should eq "Delete a route" }
|
25
|
-
it { expect(Mothership::Help.group(:routes)).to include(subject) }
|
26
|
-
end
|
27
|
-
|
28
|
-
include_examples 'inputs must have descriptions'
|
29
|
-
|
30
|
-
describe 'inputs' do
|
31
|
-
subject { command.inputs }
|
32
|
-
it { expect(subject[:route][:description]).to eq "Route to delete" }
|
33
|
-
it { expect(subject[:really][:hidden]).to be_true }
|
34
|
-
it { expect(subject[:all][:description]).to eq "Delete all routes" }
|
35
|
-
end
|
36
|
-
|
37
|
-
describe 'arguments' do
|
38
|
-
subject { command.arguments }
|
39
|
-
it 'has the correct argument order' do
|
40
|
-
should eq([
|
41
|
-
{ :type => :optional, :value => nil, :name => :route }
|
42
|
-
])
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'when there are no routes' do
|
48
|
-
context 'and a name is given' do
|
49
|
-
let(:given) { { :route => "some-route" } }
|
50
|
-
it { expect { subject }.to raise_error(VMC::UserError, "Unknown route 'some-route'.") }
|
51
|
-
end
|
52
|
-
|
53
|
-
context 'and a name is not given' do
|
54
|
-
it { expect { subject }.to raise_error(VMC::UserError, "No routes.") }
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context "when there are routes" do
|
59
|
-
let(:client) { fake_client(:routes => routes) }
|
60
|
-
let(:routes) { fake_list(:route, 2) }
|
61
|
-
let(:deleted_route) { routes.first }
|
62
|
-
|
63
|
-
context 'when the defaults are used' do
|
64
|
-
it 'asks for the route and confirmation' do
|
65
|
-
mock_ask('Which route?', anything) { deleted_route }
|
66
|
-
mock_ask("Really delete #{deleted_route.name}?", :default => false) { true }
|
67
|
-
stub(deleted_route).delete!
|
68
|
-
subject
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'does not try to delete all routes' do
|
72
|
-
stub_ask("Which route?", anything) { deleted_route }
|
73
|
-
stub_ask(/Really delete/, anything) { true }
|
74
|
-
mock(deleted_route).delete!
|
75
|
-
dont_allow(routes.last).delete!
|
76
|
-
subject
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context 'when the route is inputted' do
|
81
|
-
let(:inputs) { { :route => deleted_route } }
|
82
|
-
|
83
|
-
it 'does not ask which route but still asks for confirmation' do
|
84
|
-
dont_allow_ask('Which route?', anything)
|
85
|
-
mock_ask("Really delete #{deleted_route.name}?", :default => false) { true }
|
86
|
-
stub(deleted_route).delete!
|
87
|
-
subject
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'deletes the route' do
|
91
|
-
dont_allow_ask("Which route?", anything)
|
92
|
-
stub_ask(/Really delete/, anything) { true }
|
93
|
-
mock(deleted_route).delete!
|
94
|
-
subject
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'when the all flag is provided' do
|
99
|
-
let(:inputs) { { :all => true } }
|
100
|
-
|
101
|
-
it 'deletes the route' do
|
102
|
-
stub_ask { true }
|
103
|
-
routes.each do |route|
|
104
|
-
mock(route).delete!
|
105
|
-
end
|
106
|
-
subject
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'asks to delete the routes' do
|
110
|
-
mock_ask("Really delete ALL ROUTES?", :default => false) { true }
|
111
|
-
dont_allow_ask('Which route?', anything)
|
112
|
-
routes.each do |route|
|
113
|
-
stub(route).delete!
|
114
|
-
end
|
115
|
-
subject
|
116
|
-
end
|
117
|
-
|
118
|
-
context 'and also with the really flag' do
|
119
|
-
let(:inputs) { { :all => true, :really => true } }
|
120
|
-
|
121
|
-
it 'does not ask' do
|
122
|
-
dont_allow_ask("Really delete ALL ROUTES?", :default => false)
|
123
|
-
routes.each do |route|
|
124
|
-
stub(route).delete!
|
125
|
-
end
|
126
|
-
subject
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
context 'when the really flag is provided' do
|
132
|
-
context 'when no route given' do
|
133
|
-
let(:inputs) { { :really => true } }
|
134
|
-
|
135
|
-
it 'asks for the route, and does not confirm deletion' do
|
136
|
-
dont_allow_ask("Really delete ALL ROUTES?", :default => false)
|
137
|
-
mock_ask('Which route?', anything) { deleted_route }
|
138
|
-
mock(deleted_route).delete!
|
139
|
-
subject
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
context 'when a route is given' do
|
144
|
-
let(:inputs) { { :route => deleted_route, :really => true } }
|
145
|
-
|
146
|
-
it 'asks for the route, and does not confirm deletion' do
|
147
|
-
dont_allow_ask("Really delete ALL ROUTES?", :default => false)
|
148
|
-
dont_allow_ask('Which route?', anything)
|
149
|
-
mock(deleted_route).delete!
|
150
|
-
subject
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'displays the progress' do
|
154
|
-
mock_with_progress("Deleting route #{deleted_route.name}")
|
155
|
-
mock(deleted_route).delete!
|
156
|
-
|
157
|
-
subject
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|