cf_script 0.0.1.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 +7 -0
- data/.gitignore +15 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +12 -0
- data/LICENSE +22 -0
- data/README.md +84 -0
- data/Rakefile +33 -0
- data/cf_script.gemspec +34 -0
- data/lib/cf_script/callbacks.rb +43 -0
- data/lib/cf_script/command/base.rb +57 -0
- data/lib/cf_script/command/cf/apps/app.rb +19 -0
- data/lib/cf_script/command/cf/apps/apps.rb +44 -0
- data/lib/cf_script/command/cf/apps/env.rb +20 -0
- data/lib/cf_script/command/cf/apps/push.rb +47 -0
- data/lib/cf_script/command/cf/apps/restage.rb +19 -0
- data/lib/cf_script/command/cf/apps/restart.rb +19 -0
- data/lib/cf_script/command/cf/apps/set_env.rb +18 -0
- data/lib/cf_script/command/cf/apps/start.rb +19 -0
- data/lib/cf_script/command/cf/apps/stop.rb +19 -0
- data/lib/cf_script/command/cf/apps/unset_env.rb +18 -0
- data/lib/cf_script/command/cf/apps.rb +55 -0
- data/lib/cf_script/command/cf/general/api.rb +36 -0
- data/lib/cf_script/command/cf/general/auth.rb +28 -0
- data/lib/cf_script/command/cf/general/login.rb +42 -0
- data/lib/cf_script/command/cf/general/logout.rb +15 -0
- data/lib/cf_script/command/cf/general/target.rb +64 -0
- data/lib/cf_script/command/cf/general.rb +15 -0
- data/lib/cf_script/command/cf/routes/check_route.rb +17 -0
- data/lib/cf_script/command/cf/routes/create_route.rb +19 -0
- data/lib/cf_script/command/cf/routes/delete_route.rb +19 -0
- data/lib/cf_script/command/cf/routes/map_route.rb +30 -0
- data/lib/cf_script/command/cf/routes/routes.rb +40 -0
- data/lib/cf_script/command/cf/routes/unmap_route.rb +30 -0
- data/lib/cf_script/command/cf/routes.rb +17 -0
- data/lib/cf_script/command/cf/spaces/space.rb +36 -0
- data/lib/cf_script/command/cf/spaces/spaces.rb +23 -0
- data/lib/cf_script/command/cf/spaces.rb +9 -0
- data/lib/cf_script/command/error.rb +5 -0
- data/lib/cf_script/command/line.rb +105 -0
- data/lib/cf_script/command/registry.rb +50 -0
- data/lib/cf_script/command/runner.rb +97 -0
- data/lib/cf_script/command.rb +44 -0
- data/lib/cf_script/config.rb +60 -0
- data/lib/cf_script/executor/non_blocking.rb +107 -0
- data/lib/cf_script/executor/recorder.rb +16 -0
- data/lib/cf_script/executor/simple.rb +17 -0
- data/lib/cf_script/executor.rb +5 -0
- data/lib/cf_script/manifest.rb +38 -0
- data/lib/cf_script/object/api_endpoint.rb +10 -0
- data/lib/cf_script/object/app_info.rb +69 -0
- data/lib/cf_script/object/app_list.rb +24 -0
- data/lib/cf_script/object/app_spec.rb +55 -0
- data/lib/cf_script/object/attribute.rb +18 -0
- data/lib/cf_script/object/attribute_list.rb +40 -0
- data/lib/cf_script/object/instance_status.rb +29 -0
- data/lib/cf_script/object/route_info.rb +14 -0
- data/lib/cf_script/object/space.rb +17 -0
- data/lib/cf_script/object/target.rb +23 -0
- data/lib/cf_script/object.rb +24 -0
- data/lib/cf_script/output/buffer.rb +74 -0
- data/lib/cf_script/output/parser/attributes.rb +44 -0
- data/lib/cf_script/output/parser/section.rb +15 -0
- data/lib/cf_script/output/parser/table.rb +46 -0
- data/lib/cf_script/output/parser.rb +15 -0
- data/lib/cf_script/output/tests.rb +51 -0
- data/lib/cf_script/output/utils.rb +13 -0
- data/lib/cf_script/output.rb +62 -0
- data/lib/cf_script/scope/app/env.rb +15 -0
- data/lib/cf_script/scope/app/routes.rb +21 -0
- data/lib/cf_script/scope/app/state.rb +33 -0
- data/lib/cf_script/scope/app/utils.rb +32 -0
- data/lib/cf_script/scope/app.rb +94 -0
- data/lib/cf_script/scope/proxy.rb +36 -0
- data/lib/cf_script/scope/script.rb +59 -0
- data/lib/cf_script/scope/space.rb +9 -0
- data/lib/cf_script/scope/target.rb +90 -0
- data/lib/cf_script/scope.rb +68 -0
- data/lib/cf_script/ui.rb +261 -0
- data/lib/cf_script/utils.rb +19 -0
- data/lib/cf_script/version.rb +3 -0
- data/lib/cf_script.rb +105 -0
- data/test/fixtures/commands/apps/app/good.yml +18 -0
- data/test/fixtures/commands/apps/app/not_found.yml +8 -0
- data/test/fixtures/commands/apps/app/running.yml +19 -0
- data/test/fixtures/commands/apps/apps/good.yml +14 -0
- data/test/fixtures/commands/apps/apps/no_apps.yml +10 -0
- data/test/fixtures/commands/apps/env/empty.yml +37 -0
- data/test/fixtures/commands/apps/env/good.yml +41 -0
- data/test/fixtures/commands/apps/push/good.yml +60 -0
- data/test/fixtures/commands/apps/restage/good.yml +48 -0
- data/test/fixtures/commands/apps/restage/not_found.yml +8 -0
- data/test/fixtures/commands/apps/restart/good.yml +35 -0
- data/test/fixtures/commands/apps/restart/not_found.yml +8 -0
- data/test/fixtures/commands/apps/set_env/empty.yml +5 -0
- data/test/fixtures/commands/apps/set_env/good.yml +9 -0
- data/test/fixtures/commands/apps/set_env/not_found.yml +8 -0
- data/test/fixtures/commands/apps/start/good.yml +32 -0
- data/test/fixtures/commands/apps/start/not_found.yml +8 -0
- data/test/fixtures/commands/apps/start/with_container.yml +98 -0
- data/test/fixtures/commands/apps/stop/good.yml +8 -0
- data/test/fixtures/commands/apps/stop/not_found.yml +8 -0
- data/test/fixtures/commands/apps/unset_env/empty.yml +5 -0
- data/test/fixtures/commands/apps/unset_env/good.yml +9 -0
- data/test/fixtures/commands/apps/unset_env/not_found.yml +8 -0
- data/test/fixtures/commands/common/fail.yml +5 -0
- data/test/fixtures/commands/common/no_endpoint.yml +11 -0
- data/test/fixtures/commands/common/no_login.yml +8 -0
- data/test/fixtures/commands/general/api/bad_argument.yml +9 -0
- data/test/fixtures/commands/general/api/bad_endpoint.yml +9 -0
- data/test/fixtures/commands/general/api/good.yml +7 -0
- data/test/fixtures/commands/general/api/not_set.yml +7 -0
- data/test/fixtures/commands/general/api/set.yml +7 -0
- data/test/fixtures/commands/general/auth/empty.yml +5 -0
- data/test/fixtures/commands/general/auth/good.yml +10 -0
- data/test/fixtures/commands/general/auth/rejected.yml +10 -0
- data/test/fixtures/commands/general/login/good.yml +8 -0
- data/test/fixtures/commands/general/login/rejected.yml +23 -0
- data/test/fixtures/commands/general/logout/good.yml +8 -0
- data/test/fixtures/commands/general/target/empty.yml +5 -0
- data/test/fixtures/commands/general/target/good.yml +11 -0
- data/test/fixtures/commands/general/target/no_space.yml +10 -0
- data/test/fixtures/commands/general/target/not_found.yml +9 -0
- data/test/fixtures/commands/general/target/production.yml +11 -0
- data/test/fixtures/commands/general/target/staging.yml +11 -0
- data/test/fixtures/commands/general/target/staging_org.yml +11 -0
- data/test/fixtures/commands/general/target/test.yml +11 -0
- data/test/fixtures/commands/routes/check_route/good.yml +9 -0
- data/test/fixtures/commands/routes/check_route/no_domain.yml +9 -0
- data/test/fixtures/commands/routes/check_route/no_route.yml +9 -0
- data/test/fixtures/commands/routes/create_route/exists.yml +9 -0
- data/test/fixtures/commands/routes/create_route/good.yml +8 -0
- data/test/fixtures/commands/routes/delete_route/good.yml +8 -0
- data/test/fixtures/commands/routes/delete_route/not_exist.yml +8 -0
- data/test/fixtures/commands/routes/map_route/good.yml +10 -0
- data/test/fixtures/commands/routes/map_route/host_taken.yml +10 -0
- data/test/fixtures/commands/routes/map_route/invalid.yml +9 -0
- data/test/fixtures/commands/routes/map_route/no_app.yml +8 -0
- data/test/fixtures/commands/routes/map_route/no_domain.yml +9 -0
- data/test/fixtures/commands/routes/routes/good.yml +14 -0
- data/test/fixtures/commands/routes/unmap_route/good.yml +8 -0
- data/test/fixtures/commands/routes/unmap_route/no_app.yml +8 -0
- data/test/fixtures/commands/routes/unmap_route/no_domain.yml +9 -0
- data/test/fixtures/commands/spaces/space/empty.yml +5 -0
- data/test/fixtures/commands/spaces/space/good.yml +16 -0
- data/test/fixtures/commands/spaces/space/staging.yml +16 -0
- data/test/fixtures/commands/spaces/spaces/empty.yml +5 -0
- data/test/fixtures/commands/spaces/spaces/good.yml +12 -0
- data/test/lib/cf_script/command/base_test.rb +21 -0
- data/test/lib/cf_script/command/cf/apps/app_test.rb +56 -0
- data/test/lib/cf_script/command/cf/apps/apps_test.rb +81 -0
- data/test/lib/cf_script/command/cf/apps/env_test.rb +55 -0
- data/test/lib/cf_script/command/cf/apps/push_test.rb +46 -0
- data/test/lib/cf_script/command/cf/apps/restage_test.rb +47 -0
- data/test/lib/cf_script/command/cf/apps/restart_test.rb +47 -0
- data/test/lib/cf_script/command/cf/apps/set_env_test.rb +38 -0
- data/test/lib/cf_script/command/cf/apps/start_test.rb +55 -0
- data/test/lib/cf_script/command/cf/apps/stop_test.rb +35 -0
- data/test/lib/cf_script/command/cf/apps/unset_env_test.rb +38 -0
- data/test/lib/cf_script/command/cf/general/api_test.rb +55 -0
- data/test/lib/cf_script/command/cf/general/auth_test.rb +76 -0
- data/test/lib/cf_script/command/cf/general/login_test.rb +80 -0
- data/test/lib/cf_script/command/cf/general/logout_test.rb +34 -0
- data/test/lib/cf_script/command/cf/general/target_test.rb +110 -0
- data/test/lib/cf_script/command/cf/routes/check_route_test.rb +31 -0
- data/test/lib/cf_script/command/cf/routes/create_route_test.rb +19 -0
- data/test/lib/cf_script/command/cf/routes/delete_route_test.rb +19 -0
- data/test/lib/cf_script/command/cf/routes/map_route_test.rb +56 -0
- data/test/lib/cf_script/command/cf/routes/routes_test.rb +24 -0
- data/test/lib/cf_script/command/cf/routes/unmap_route_test.rb +36 -0
- data/test/lib/cf_script/command/cf/spaces/space_test.rb +55 -0
- data/test/lib/cf_script/command/cf/spaces/spaces_test.rb +47 -0
- data/test/lib/cf_script/command/line_test.rb +59 -0
- data/test/lib/cf_script/object/api_endpoint_test.rb +19 -0
- data/test/lib/cf_script/object/app_info_test.rb +127 -0
- data/test/lib/cf_script/object/app_list_test.rb +51 -0
- data/test/lib/cf_script/object/attribute_list_test.rb +42 -0
- data/test/lib/cf_script/object/attribute_test.rb +29 -0
- data/test/lib/cf_script/object/instance_status_test.rb +37 -0
- data/test/lib/cf_script/object/space_test.rb +31 -0
- data/test/lib/cf_script/object/target_test.rb +41 -0
- data/test/lib/cf_script/output/buffer_test.rb +73 -0
- data/test/lib/cf_script/output/parser/attributes_test.rb +102 -0
- data/test/lib/cf_script/output/parser/section_test.rb +60 -0
- data/test/lib/cf_script/output/parser/table_test.rb +108 -0
- data/test/lib/cf_script/output/tests_test.rb +91 -0
- data/test/lib/cf_script/output_test.rb +134 -0
- data/test/lib/cf_script/scope/app/state_test.rb +61 -0
- data/test/lib/cf_script/scope/app_test.rb +101 -0
- data/test/lib/cf_script/scope/script_test.rb +88 -0
- data/test/lib/cf_script/scope/space_test.rb +27 -0
- data/test/lib/cf_script/scope/target_test.rb +158 -0
- data/test/lib/cf_script/scope_test.rb +41 -0
- data/test/lib/cf_script/utils_test.rb +20 -0
- data/test/lib/cf_script_test.rb +73 -0
- data/test/support/assertions.rb +14 -0
- data/test/support/helpers/config_context.rb +19 -0
- data/test/support/helpers/fixture_executor.rb +79 -0
- data/test/support/helpers/mock_execution.rb +58 -0
- data/test/support/helpers/object_helpers.rb +29 -0
- data/test/support/helpers/output_sink.rb +25 -0
- data/test/support/helpers.rb +3 -0
- data/test/support/shared_examples/command_object.rb +38 -0
- data/test/support/shared_examples.rb +30 -0
- data/test/test_helper.rb +34 -0
- metadata +321 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module CfScript::Command::General
|
|
2
|
+
class AuthCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:general, :auth)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(username, password, &block)
|
|
8
|
+
run_cf self, username, password do |output|
|
|
9
|
+
unless can_run?(output, check_failed: false)
|
|
10
|
+
if output.credentials_rejected?
|
|
11
|
+
error 'Credentials were rejected'
|
|
12
|
+
else
|
|
13
|
+
output.dump
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
return false
|
|
17
|
+
else
|
|
18
|
+
if logged_in = output.authenticated?
|
|
19
|
+
block_given? ? yield(logged_in) : logged_in
|
|
20
|
+
else
|
|
21
|
+
error 'Not logged in'
|
|
22
|
+
return false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module CfScript::Command::General
|
|
2
|
+
class LoginCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:general, :login)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(username, password, options = {}, &block)
|
|
8
|
+
args = [{ u: username, p: password }]
|
|
9
|
+
|
|
10
|
+
if options[:api]
|
|
11
|
+
args.last[:a] = options[:api]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
if options[:org]
|
|
15
|
+
args.last[:o] = options[:org]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
if options[:space]
|
|
19
|
+
args.last[:s] = options[:space]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
run_cf self, *args do |output|
|
|
23
|
+
unless can_run?(output, check_failed: false)
|
|
24
|
+
if output.credentials_rejected?
|
|
25
|
+
error 'Credentials were rejected'
|
|
26
|
+
else
|
|
27
|
+
output.dump
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
return false
|
|
31
|
+
else
|
|
32
|
+
if logged_in = output.authenticated?
|
|
33
|
+
block_given? ? yield(logged_in) : logged_in
|
|
34
|
+
else
|
|
35
|
+
error 'Not logged in'
|
|
36
|
+
return false
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module CfScript::Command::General
|
|
2
|
+
class LogoutCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:general, :logout)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(*args, &block)
|
|
8
|
+
run_cf self, *args do |output|
|
|
9
|
+
return false unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
block_given? ? yield(output.ok?) : output.ok?
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class General::TargetCommand < CfScript::Command::Base
|
|
3
|
+
NOT_LOGGED_IN = 'Not logged in'
|
|
4
|
+
|
|
5
|
+
def initialize
|
|
6
|
+
super(:general, :target)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def run(space_name_or_target = nil, &block)
|
|
10
|
+
args = build_args(space_name_or_target)
|
|
11
|
+
space = args.first && args.first.key?(:s) ? args.first[:s] : ''
|
|
12
|
+
|
|
13
|
+
run_cf self, *args do |output|
|
|
14
|
+
return nil unless can_run?(output, check_failed: false)
|
|
15
|
+
|
|
16
|
+
# TODO: check org not found too
|
|
17
|
+
|
|
18
|
+
if output.not_found?('Space', space)
|
|
19
|
+
error "Space #{space} not found"
|
|
20
|
+
return
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
if target = build_target(output)
|
|
24
|
+
block ? yield(target) : target
|
|
25
|
+
else
|
|
26
|
+
error 'object is nil'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def build_args(name_or_target)
|
|
34
|
+
case name_or_target
|
|
35
|
+
when String, Symbol
|
|
36
|
+
# TODO: add org if present
|
|
37
|
+
[{ s: name_or_target }]
|
|
38
|
+
when CfScript::Target
|
|
39
|
+
[name_or_target.to_options]
|
|
40
|
+
else
|
|
41
|
+
[]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def build_target(output)
|
|
46
|
+
attrs = output.attributes
|
|
47
|
+
|
|
48
|
+
unless attrs.empty?
|
|
49
|
+
target = CfScript::Target.new(
|
|
50
|
+
attrs[:api_endpoint].value,
|
|
51
|
+
attrs[:org].value,
|
|
52
|
+
attrs[:space].value,
|
|
53
|
+
attrs[:user].value
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if target.space =~ /No space targeted/
|
|
57
|
+
target.space = ''
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
target
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
CfScript::Command.const_set(:General, Module.new)
|
|
2
|
+
|
|
3
|
+
require 'cf_script/command/cf/general/api'
|
|
4
|
+
require 'cf_script/command/cf/general/auth'
|
|
5
|
+
require 'cf_script/command/cf/general/login'
|
|
6
|
+
require 'cf_script/command/cf/general/logout'
|
|
7
|
+
require 'cf_script/command/cf/general/target'
|
|
8
|
+
|
|
9
|
+
module CfScript::Command::General
|
|
10
|
+
CfScript::Command.register ApiCommand
|
|
11
|
+
CfScript::Command.register AuthCommand
|
|
12
|
+
CfScript::Command.register LoginCommand
|
|
13
|
+
CfScript::Command.register LogoutCommand
|
|
14
|
+
CfScript::Command.register TargetCommand
|
|
15
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Routes::CheckRouteCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:routes, :check_route)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(host, domain, &block)
|
|
8
|
+
run_cf self, host, domain do |output|
|
|
9
|
+
return false unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
exists = output.matches? /^Route #{host}.#{domain} does exist/
|
|
12
|
+
|
|
13
|
+
block_given? ? yield(exists) : exists
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Routes::CreateRouteCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:routes, :create_route)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(space, domain, host = nil, &block)
|
|
8
|
+
options = host ? { n: host } : {}
|
|
9
|
+
|
|
10
|
+
run_cf self, space, domain, options do |output|
|
|
11
|
+
return false unless can_run?(output)
|
|
12
|
+
|
|
13
|
+
if exists = output.contains?(/^OK$/)
|
|
14
|
+
block_given? ? yield(exists) : exists
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Routes::DeleteRouteCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:routes, :delete_route)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(domain, host = nil, force = true, &block)
|
|
8
|
+
options = host ? { n: host, flags: [:f] } : { flags: [:f] }
|
|
9
|
+
|
|
10
|
+
run_cf self, domain, options do |output|
|
|
11
|
+
return false unless can_run?(output)
|
|
12
|
+
|
|
13
|
+
if deleted = output.ok?
|
|
14
|
+
block_given? ? yield(deleted) : deleted
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Routes::MapRouteCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:routes, :map_route)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, domain, host = nil, &block)
|
|
8
|
+
options = host ? { n: host } : {}
|
|
9
|
+
|
|
10
|
+
run_cf self, app_name, domain, options do |output|
|
|
11
|
+
return false unless can_run?(output,
|
|
12
|
+
check_status: false,
|
|
13
|
+
check_failed: false,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
if output.good? and mapped = output.ok?
|
|
17
|
+
block_given? ? yield(mapped) : mapped
|
|
18
|
+
else
|
|
19
|
+
if output.failed?
|
|
20
|
+
error output.last_line
|
|
21
|
+
else
|
|
22
|
+
error 'failed to map route'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
return false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Routes::RoutesCommand < CfScript::Command::Base
|
|
3
|
+
ROUTES_TABLE = ['space', 'host', 'domain', 'apps']
|
|
4
|
+
|
|
5
|
+
def initialize
|
|
6
|
+
super(:routes, :routes)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def run(*args, &block)
|
|
10
|
+
run_cf self do |output|
|
|
11
|
+
return unless can_run?(output)
|
|
12
|
+
|
|
13
|
+
if rows = output.table(ROUTES_TABLE)
|
|
14
|
+
routes = build_route_info(rows)
|
|
15
|
+
|
|
16
|
+
block_given? ? yield(routes) : routes
|
|
17
|
+
else
|
|
18
|
+
error "Routes table was not found"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def build_route_info(rows)
|
|
26
|
+
routes = []
|
|
27
|
+
|
|
28
|
+
rows.each do |row|
|
|
29
|
+
routes << CfScript::RouteInfo.new(
|
|
30
|
+
row[:space].value,
|
|
31
|
+
row[:host].value,
|
|
32
|
+
row[:domain].value,
|
|
33
|
+
row[:apps].to_a
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
routes
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Routes::UnmapRouteCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:routes, :unmap_route)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, domain, host = nil, &block)
|
|
8
|
+
options = host ? { n: host } : {}
|
|
9
|
+
|
|
10
|
+
run_cf self, app_name, domain, options do |output|
|
|
11
|
+
return false unless can_run?(output,
|
|
12
|
+
check_status: false,
|
|
13
|
+
check_failed: false,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
if output.good? and unmapped = output.ok?
|
|
17
|
+
block_given? ? yield(unmapped) : unmapped
|
|
18
|
+
else
|
|
19
|
+
if output.failed?
|
|
20
|
+
error output.last_line
|
|
21
|
+
else
|
|
22
|
+
error 'failed to unmap route'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
return false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
CfScript::Command.const_set(:Routes, Module.new)
|
|
2
|
+
|
|
3
|
+
require 'cf_script/command/cf/routes/routes'
|
|
4
|
+
require 'cf_script/command/cf/routes/check_route'
|
|
5
|
+
require 'cf_script/command/cf/routes/create_route'
|
|
6
|
+
require 'cf_script/command/cf/routes/delete_route'
|
|
7
|
+
require 'cf_script/command/cf/routes/map_route'
|
|
8
|
+
require 'cf_script/command/cf/routes/unmap_route'
|
|
9
|
+
|
|
10
|
+
module CfScript::Command::Routes
|
|
11
|
+
CfScript::Command.register RoutesCommand
|
|
12
|
+
CfScript::Command.register CheckRouteCommand
|
|
13
|
+
CfScript::Command.register CreateRouteCommand
|
|
14
|
+
CfScript::Command.register DeleteRouteCommand
|
|
15
|
+
CfScript::Command.register MapRouteCommand
|
|
16
|
+
CfScript::Command.register UnmapRouteCommand
|
|
17
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Spaces::SpaceCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:spaces, :space)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(space_name, &block)
|
|
8
|
+
run_cf self, space_name do |output|
|
|
9
|
+
return unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
if space = build_space(space_name, output)
|
|
12
|
+
block_given? ? yield(space) : space
|
|
13
|
+
else
|
|
14
|
+
error 'object is nil'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def build_space(space_name, output)
|
|
22
|
+
attrs = output.attributes
|
|
23
|
+
|
|
24
|
+
unless attrs.empty?
|
|
25
|
+
space = CfScript::Space.new(
|
|
26
|
+
space_name,
|
|
27
|
+
attrs[:org].value,
|
|
28
|
+
attrs[:apps].to_a,
|
|
29
|
+
attrs[:domains].to_a,
|
|
30
|
+
attrs[:services].to_a,
|
|
31
|
+
attrs[:security_groups].to_a
|
|
32
|
+
)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Spaces::SpacesCommand < CfScript::Command::Base
|
|
3
|
+
SPACES_TABLE = ['name']
|
|
4
|
+
|
|
5
|
+
def initialize
|
|
6
|
+
super(:spaces, :spaces)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def run(*args, &block)
|
|
10
|
+
run_cf self, *args do |output|
|
|
11
|
+
return unless can_run?(output)
|
|
12
|
+
|
|
13
|
+
if rows = output.table(SPACES_TABLE)
|
|
14
|
+
spaces = rows.map { |row| row[:name].value }
|
|
15
|
+
|
|
16
|
+
block_given? ? yield(spaces) : spaces
|
|
17
|
+
else
|
|
18
|
+
error "Spaces table was not found"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
CfScript::Command.const_set(:Spaces, Module.new)
|
|
2
|
+
|
|
3
|
+
require 'cf_script/command/cf/spaces/spaces'
|
|
4
|
+
require 'cf_script/command/cf/spaces/space'
|
|
5
|
+
|
|
6
|
+
module CfScript::Command::Spaces
|
|
7
|
+
CfScript::Command.register SpacesCommand
|
|
8
|
+
CfScript::Command.register SpaceCommand
|
|
9
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
|
|
3
|
+
class CfScript::Command::Line
|
|
4
|
+
attr_reader :env
|
|
5
|
+
attr_reader :bin
|
|
6
|
+
attr_reader :type
|
|
7
|
+
attr_reader :name
|
|
8
|
+
attr_reader :args
|
|
9
|
+
attr_reader :options
|
|
10
|
+
attr_reader :flags
|
|
11
|
+
|
|
12
|
+
def initialize(env, bin, type, name, args = [])
|
|
13
|
+
@env = env
|
|
14
|
+
@bin = bin
|
|
15
|
+
|
|
16
|
+
@type = type
|
|
17
|
+
@name = name
|
|
18
|
+
@options = args.last.is_a?(Hash) ? args.pop : {}
|
|
19
|
+
@flags = options.delete(:flags) || []
|
|
20
|
+
@args = args
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def line
|
|
24
|
+
@line ||= format
|
|
25
|
+
end
|
|
26
|
+
alias :to_s :line
|
|
27
|
+
|
|
28
|
+
def hide_sensitive
|
|
29
|
+
case name
|
|
30
|
+
when :auth
|
|
31
|
+
hide_parts(-1, 'PASSWORD HIDDEN')
|
|
32
|
+
when :login
|
|
33
|
+
hide_option('-p', 'PASSWORD HIDDEN')
|
|
34
|
+
else
|
|
35
|
+
line
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def format
|
|
42
|
+
list = [bin]
|
|
43
|
+
|
|
44
|
+
list << format_name
|
|
45
|
+
list << format_args
|
|
46
|
+
list << format_options
|
|
47
|
+
list << format_flags
|
|
48
|
+
|
|
49
|
+
list.compact.reject(&:empty?).join(' ').gsub(/\s+/, ' ')
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def format_name
|
|
53
|
+
name.to_s.gsub(/_/, '-')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def format_args
|
|
57
|
+
list = []
|
|
58
|
+
|
|
59
|
+
args.compact.each do |arg|
|
|
60
|
+
list << arg.to_s.shellescape
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
list.join(' ')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def format_options
|
|
67
|
+
list = []
|
|
68
|
+
|
|
69
|
+
options.each do |name, value|
|
|
70
|
+
list << "-#{name} #{value.to_s.shellescape}" unless value.nil?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
list.join(' ')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def format_flags
|
|
77
|
+
list = []
|
|
78
|
+
|
|
79
|
+
flags.each do |name|
|
|
80
|
+
flag = name.to_s.gsub('_', '-')
|
|
81
|
+
|
|
82
|
+
list << unless flag =~ /\A(--|-[[:alnum:]])/
|
|
83
|
+
if flag.length == 1
|
|
84
|
+
"-#{flag}"
|
|
85
|
+
else
|
|
86
|
+
"--#{flag}"
|
|
87
|
+
end
|
|
88
|
+
else
|
|
89
|
+
flag
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
list.join(' ')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def hide_parts(parts, with = 'HIDDEN')
|
|
97
|
+
bits = line.split(/\s+(?=(?:[^"']|"[^"]*"|'[^']*')*$)/)
|
|
98
|
+
bits[parts] = "[#{with}]"
|
|
99
|
+
bits.join(' ')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def hide_option(option, with = 'HIDDEN')
|
|
103
|
+
line.gsub(/#{option}\s+(['"][^'"]+['"]|[\S]+)/, "#{option} [#{with}]")
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Registry
|
|
3
|
+
attr_reader :commands
|
|
4
|
+
|
|
5
|
+
DuplicateCommand = Class.new(StandardError)
|
|
6
|
+
UnimplementedCommand = Class.new(StandardError)
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
@commands = {}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def catalog
|
|
13
|
+
catalog = Hash.new{ |types, type| types[type] = [] }
|
|
14
|
+
|
|
15
|
+
commands.each do |name, command|
|
|
16
|
+
catalog[command.type] << name
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
catalog
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add!(command_class)
|
|
23
|
+
instance = command_class.instance
|
|
24
|
+
|
|
25
|
+
if known?(instance.name)
|
|
26
|
+
raise DuplicateCommand.new(
|
|
27
|
+
"The '#{instance.name}' command is already registered"
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
commands[instance.name] = instance
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def known?(command_name)
|
|
35
|
+
commands.key?(command_name)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def check!(command_name)
|
|
39
|
+
unless known?(command_name)
|
|
40
|
+
raise UnimplementedCommand.new(
|
|
41
|
+
"The #{command_name} command is not implemented, yet"
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def [](command_name)
|
|
47
|
+
commands[command_name]
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
module Runner
|
|
3
|
+
module_function
|
|
4
|
+
|
|
5
|
+
def run_cf(command, *args, &block)
|
|
6
|
+
run_command(command, *args, &block)
|
|
7
|
+
rescue CfScript::Command::Error => exception
|
|
8
|
+
error command.name, exception.message
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def cf_id
|
|
12
|
+
"#{cf_version} (path: #{cf_path})"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def cf_version
|
|
16
|
+
`#{cf_bin} --version`.chomp.split(' ')[1..-1].join(': ')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def cf_bin
|
|
20
|
+
@cf_bin ||= cf_in_path? && !cf_in_env? ? 'cf' : cf_path
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def which_cf
|
|
24
|
+
`which cf`.chomp
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def cf_in_path?
|
|
28
|
+
!which_cf.empty?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def cf_in_env?
|
|
32
|
+
!ENV['CF_BINARY'].nil?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def cf_path
|
|
36
|
+
unless @cf_path
|
|
37
|
+
@cf_path = ENV['CF_BINARY'] || which_cf
|
|
38
|
+
|
|
39
|
+
if @cf_path.nil? || @cf_path.empty?
|
|
40
|
+
puts "Could not find the cf binary".colorize(:red)
|
|
41
|
+
puts
|
|
42
|
+
puts "If it isn't installed you need to install it first. You can find"
|
|
43
|
+
puts "the latest release at:"
|
|
44
|
+
puts
|
|
45
|
+
puts " https://github.com/cloudfoundry/cli/releases".colorize(:cyan)
|
|
46
|
+
puts
|
|
47
|
+
puts "If cf is already installed, make sure its location is included "
|
|
48
|
+
puts "in $PATH."
|
|
49
|
+
|
|
50
|
+
raise "Could not find the cf binary"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
@cf_path
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def cf_env
|
|
58
|
+
# When things go wrong dump the output of cf to the terminal, and the
|
|
59
|
+
# colors make it easier to read.
|
|
60
|
+
ENV['CF_COLOR'] ||= CfScript.config.runtime.color ? 'true' : 'false'
|
|
61
|
+
ENV['CF_TRACE'] ||= ENV['DEBUG'] ? 'true' : 'false'
|
|
62
|
+
ENV
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def cf_executor
|
|
68
|
+
CfScript.config.runtime.executor
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def run_command(command, *args, &block)
|
|
72
|
+
command_line = command.line(cf_env, cf_bin, args)
|
|
73
|
+
|
|
74
|
+
trace(:running, command_line.hide_sensitive, true)
|
|
75
|
+
|
|
76
|
+
stdout, stderr, status = cf_executor.execute(cf_env, command_line)
|
|
77
|
+
|
|
78
|
+
output = CfScript::Output.new(command_line, stdout, stderr, status)
|
|
79
|
+
|
|
80
|
+
unless output.good?
|
|
81
|
+
run_error!(command_line, output)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
block_given? ? yield(output) : output
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def run_error!(command_line, output)
|
|
88
|
+
unless CfScript.stdout.is_a?(StringIO)
|
|
89
|
+
CfScript.stdout.puts output.stdout unless output.stdout.empty?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
unless CfScript.stderr.is_a?(StringIO)
|
|
93
|
+
CfScript.stderr.puts output.stderr unless output.stderr.empty?
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|