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,44 @@
|
|
|
1
|
+
module CfScript
|
|
2
|
+
module Output::Parser::Attributes
|
|
3
|
+
ATTRIBUTE_REGEXP = /^(?<name>[^:]+):\s+(?<value>.+)$/
|
|
4
|
+
|
|
5
|
+
def parse_attribute(line, symbolize_name = false)
|
|
6
|
+
if line =~ ATTRIBUTE_REGEXP
|
|
7
|
+
name = Regexp.last_match[:name].strip
|
|
8
|
+
value = Regexp.last_match[:value].strip
|
|
9
|
+
|
|
10
|
+
CfScript::Attribute.new(
|
|
11
|
+
symbolize_name ? symbolize(name) : name,
|
|
12
|
+
Regexp.last_match['value'].strip
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def parse_attribute_list(buffer, symbolize_names = true)
|
|
18
|
+
attribute_list = CfScript::AttributeList.new
|
|
19
|
+
|
|
20
|
+
buffer.each_line do |line|
|
|
21
|
+
if attribute = parse_attribute(line, symbolize_names)
|
|
22
|
+
attribute_list << attribute
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attribute_list
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parse_line_attributes(buffer, regexp)
|
|
30
|
+
if matched = buffer.match(regexp)
|
|
31
|
+
attribute_list = CfScript::AttributeList.new
|
|
32
|
+
|
|
33
|
+
matched.names.each do |name|
|
|
34
|
+
attribute_list << CfScript::Attribute.new(
|
|
35
|
+
symbolize(name),
|
|
36
|
+
matched[name].strip
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
attribute_list
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module CfScript
|
|
2
|
+
module Output::Parser::Section
|
|
3
|
+
def extract_section(buffer, header)
|
|
4
|
+
if match = buffer.match(/^#{header}:?\s*\n(.*?)\n\n/m)
|
|
5
|
+
match[1]
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def parse_section_attributes(buffer, header)
|
|
10
|
+
if section = extract_section(buffer, header)
|
|
11
|
+
parse_attribute_list(section, false)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module CfScript
|
|
2
|
+
module Output::Parser::Table
|
|
3
|
+
def parse_columns(line)
|
|
4
|
+
line ? line.split(/\s{2,}/).map(&:strip) : []
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def parse_row(line, columns)
|
|
8
|
+
row = CfScript::AttributeList.new
|
|
9
|
+
values = line.split(/\s{2,}/, columns.length).map!(&:strip)
|
|
10
|
+
|
|
11
|
+
columns.each_with_index do |column, index|
|
|
12
|
+
# Special case for instance status tables
|
|
13
|
+
name = index == 0 && column == '' ? 'index' : column
|
|
14
|
+
|
|
15
|
+
row << CfScript::Attribute.new(
|
|
16
|
+
symbolize(name),
|
|
17
|
+
(values[index] ? values[index].strip : '')
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
row
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def parse_rows(lines)
|
|
25
|
+
rows = []
|
|
26
|
+
|
|
27
|
+
if lines.first.strip.empty?
|
|
28
|
+
lines.shift
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
cols = parse_columns(lines.shift)
|
|
32
|
+
|
|
33
|
+
lines.each do |line|
|
|
34
|
+
rows << parse_row(line, cols)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
rows
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def parse_table(buffer, headers)
|
|
41
|
+
if m = buffer.match(/^#{headers.join('\s+')}/)
|
|
42
|
+
parse_rows buffer[m.begin(0)..-1].lines
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
CfScript::Output.const_set(:Parser, Module.new)
|
|
2
|
+
|
|
3
|
+
require 'cf_script/output/parser/attributes'
|
|
4
|
+
require 'cf_script/output/parser/section'
|
|
5
|
+
require 'cf_script/output/parser/table'
|
|
6
|
+
|
|
7
|
+
module CfScript
|
|
8
|
+
module Output::Parser
|
|
9
|
+
include CfScript::Utils
|
|
10
|
+
|
|
11
|
+
include CfScript::Output::Parser::Attributes
|
|
12
|
+
include CfScript::Output::Parser::Section
|
|
13
|
+
include CfScript::Output::Parser::Table
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module CfScript
|
|
2
|
+
module Output::Tests
|
|
3
|
+
def matches?(regexp)
|
|
4
|
+
out.matches?(regexp)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def contains?(text)
|
|
8
|
+
out.contains?(text)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def ok?
|
|
12
|
+
out.last_line_matches? /^OK$/
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def authenticated?
|
|
16
|
+
matches? /Authenticating\.\.\.\nOK/m
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def failed?
|
|
20
|
+
contains? 'FAILED'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def no_api_endpoint?
|
|
24
|
+
contains? 'No API endpoint set.'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def not_logged_in?
|
|
28
|
+
contains? 'Not logged in'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def not_authorized?
|
|
32
|
+
contains? 'You are not authorized'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def credentials_rejected?
|
|
36
|
+
contains? 'Credentials were rejected'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def not_found?(type, name)
|
|
40
|
+
out.last_line_matches? /#{type} #{name} not found/
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def is_already?(name, state)
|
|
44
|
+
out.last_line_matches? /#{name} is already #{state}/
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def already_exists?(type, name)
|
|
48
|
+
out.last_line_matches? /#{type} #{name} already exists/
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module CfScript
|
|
2
|
+
module Output::Utils
|
|
3
|
+
def dump
|
|
4
|
+
list = []
|
|
5
|
+
|
|
6
|
+
list << 'STATUS:' << status.inspect
|
|
7
|
+
list << 'STDOUT:' << (stdout.size == 0 ? '<empty>' : stdout)
|
|
8
|
+
list << 'STDERR:' << (stderr.size == 0 ? '<empty>' : stderr)
|
|
9
|
+
|
|
10
|
+
CfScript.stderr.puts list.join("\n")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
CfScript.const_set(:Output, Class.new)
|
|
2
|
+
|
|
3
|
+
require 'cf_script/output/buffer'
|
|
4
|
+
require 'cf_script/output/parser'
|
|
5
|
+
require 'cf_script/output/tests'
|
|
6
|
+
require 'cf_script/output/utils'
|
|
7
|
+
|
|
8
|
+
module CfScript
|
|
9
|
+
class Output
|
|
10
|
+
attr_reader :command
|
|
11
|
+
attr_reader :stdout
|
|
12
|
+
attr_reader :stderr
|
|
13
|
+
attr_reader :status
|
|
14
|
+
|
|
15
|
+
include CfScript::Output::Parser
|
|
16
|
+
include CfScript::Output::Tests
|
|
17
|
+
include CfScript::Output::Utils
|
|
18
|
+
|
|
19
|
+
def initialize(command, stdout, stderr, status)
|
|
20
|
+
@command = command
|
|
21
|
+
@stdout = stdout
|
|
22
|
+
@stderr = stderr
|
|
23
|
+
@status = status
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def good?
|
|
27
|
+
status.success? && status.exitstatus == 0
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def out
|
|
31
|
+
@sane_stdout ||= Buffer.new(stdout)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def err
|
|
35
|
+
@sane_stderr ||= Buffer.new(stderr)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def last_line
|
|
39
|
+
out.last_line
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def attributes
|
|
43
|
+
parse_attribute_list(out)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def line_attributes(line_regexp)
|
|
47
|
+
parse_line_attributes(out, line_regexp)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def attributes_from(line_start)
|
|
51
|
+
parse_attribute_list(out.from(line_start))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def table(headers)
|
|
55
|
+
parse_table(out, headers)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def section_attributes(header)
|
|
59
|
+
parse_section_attributes(out, header)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module CfScript::Scope
|
|
2
|
+
module App::Env
|
|
3
|
+
def env
|
|
4
|
+
CfScript::Command.env name
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def set_env(var_name, var_value)
|
|
8
|
+
CfScript::Command.set_env name, var_name, var_value
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def unset_env(var_name)
|
|
12
|
+
CfScript::Command.unset_env name, var_name
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module CfScript::Scope
|
|
2
|
+
module App::Routes
|
|
3
|
+
def has_route?(domain, host = nil)
|
|
4
|
+
route = [host, domain].compact.join('.')
|
|
5
|
+
|
|
6
|
+
urls.split(', ').include?(route)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def map_route(domain, host = nil)
|
|
10
|
+
CfScript::Command.map_route name, domain, host do |mapped|
|
|
11
|
+
cf_self; has_route?(domain, host)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def unmap_route(domain, host = nil)
|
|
16
|
+
CfScript::Command.unmap_route name, domain, host do |unmapped|
|
|
17
|
+
cf_self; not has_route?(domain, host)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module CfScript::Scope
|
|
2
|
+
module App::State
|
|
3
|
+
def start
|
|
4
|
+
CfScript::Command.start name do |app_info|
|
|
5
|
+
@app_info = app_info if app_info
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def stop
|
|
10
|
+
CfScript::Command.stop name do |stopped|
|
|
11
|
+
cf_self
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def restart
|
|
16
|
+
CfScript::Command.restart name do |app_info|
|
|
17
|
+
@app_info = app_info if app_info
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def push(options = {})
|
|
22
|
+
CfScript::Command.push name, options do |app_info|
|
|
23
|
+
@app_info = app_info if app_info
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def restage
|
|
28
|
+
CfScript::Command.restage name do |app_info|
|
|
29
|
+
@app_info = app_info if app_info
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module CfScript::Scope
|
|
2
|
+
module App::Utils
|
|
3
|
+
def dump
|
|
4
|
+
title name
|
|
5
|
+
|
|
6
|
+
app_info.instance_variables.each do |var|
|
|
7
|
+
next if var == :@name or var == :@instance_status
|
|
8
|
+
detail "#{var.to_s.gsub('@', '')}: #{app_info.instance_variable_get(var)}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
if app_info.instance_status
|
|
12
|
+
title 'Instances', 2
|
|
13
|
+
|
|
14
|
+
app_info.instance_status.each do |inst|
|
|
15
|
+
str = inst.show(:index, :state, :cpu, :memory, :disk, :since)
|
|
16
|
+
|
|
17
|
+
detail str, 3
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def show(*attrs)
|
|
23
|
+
line = []
|
|
24
|
+
|
|
25
|
+
attrs.each do |attr|
|
|
26
|
+
line << "#{attr}: #{self.send(attr)}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
info line.join(', ')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
module CfScript::Scope
|
|
4
|
+
class App < Base
|
|
5
|
+
extend Forwardable
|
|
6
|
+
|
|
7
|
+
attr_reader :name
|
|
8
|
+
attr_reader :app_info
|
|
9
|
+
#attr_reader :app_spec
|
|
10
|
+
attr_reader :current_target
|
|
11
|
+
|
|
12
|
+
#include CfScript::Callbacks
|
|
13
|
+
include CfScript::UI
|
|
14
|
+
include CfScript::UI::NameTag
|
|
15
|
+
|
|
16
|
+
def initialize(name_or_info, current_target)
|
|
17
|
+
@current_target = current_target
|
|
18
|
+
|
|
19
|
+
case name_or_info
|
|
20
|
+
when String, Symbol
|
|
21
|
+
@name = name_or_info
|
|
22
|
+
@app_info = nil
|
|
23
|
+
#@app_spec = spec_for(name)
|
|
24
|
+
when CfScript::AppInfo
|
|
25
|
+
@name = name_or_info.name
|
|
26
|
+
@app_info = name_or_info
|
|
27
|
+
#@app_spec = spec_for(name)
|
|
28
|
+
else
|
|
29
|
+
raise "App accepts a name (String or Symbol) or an AppInfo object, " +
|
|
30
|
+
"but a #{name_or_info.class.name} was given"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
cf_self
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def_delegators :@app_info, :requested_state, :instances, :urls,
|
|
37
|
+
:usage, :last_uploaded, :stack, :buildpack, :memory, :disk,
|
|
38
|
+
:state, :started?, :hot?, :stopped?, :cold?
|
|
39
|
+
|
|
40
|
+
def current_space
|
|
41
|
+
current_target.space
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def tag_color(type = nil)
|
|
45
|
+
started? ? :active : :inactive
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def name_tag
|
|
49
|
+
"#{current_target.space}:#{name}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#def run_callbacks(stage, command)
|
|
53
|
+
# return unless app_spec
|
|
54
|
+
|
|
55
|
+
# app_spec.callbacks_for(stage, command).each do |callback|
|
|
56
|
+
# self.instance_eval(&callback)
|
|
57
|
+
# end
|
|
58
|
+
#end
|
|
59
|
+
|
|
60
|
+
#def callbacks_before(command)
|
|
61
|
+
# run_callbacks(:before, command)
|
|
62
|
+
#end
|
|
63
|
+
|
|
64
|
+
#def callbacks_after(command)
|
|
65
|
+
# run_callbacks(:after, command)
|
|
66
|
+
#end
|
|
67
|
+
|
|
68
|
+
#def callbacks_around(command, &block)
|
|
69
|
+
# run_callbacks(:before, command)
|
|
70
|
+
# self.instance_eval(&block)
|
|
71
|
+
# run_callbacks(:after, command)
|
|
72
|
+
#end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
def cf_self
|
|
77
|
+
CfScript::Command.app name do |app_info|
|
|
78
|
+
@app_info = app_info if app_info
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
require 'cf_script/scope/app/state'
|
|
85
|
+
require 'cf_script/scope/app/env'
|
|
86
|
+
require 'cf_script/scope/app/routes'
|
|
87
|
+
require 'cf_script/scope/app/utils'
|
|
88
|
+
|
|
89
|
+
class CfScript::Scope::App
|
|
90
|
+
include State
|
|
91
|
+
include Env
|
|
92
|
+
include Routes
|
|
93
|
+
include Utils
|
|
94
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
module CfScript
|
|
4
|
+
class Scope::Proxy
|
|
5
|
+
BASIC_OBJECT_METHODS = BasicObject.instance_methods.to_set
|
|
6
|
+
PROXY_OBJECT_METHODS = BASIC_OBJECT_METHODS | Set[
|
|
7
|
+
:object_id,
|
|
8
|
+
:instance_variables,
|
|
9
|
+
:instance_variable_get,
|
|
10
|
+
:instance_variable_set
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
PROXY_OBJECT_INSTANCE_VARIABLES = Set[:@__inner__, :@__outer__]
|
|
14
|
+
|
|
15
|
+
instance_methods.each do |m|
|
|
16
|
+
undef_method(m) unless PROXY_OBJECT_METHODS.include?(m)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def initialize(inner, outer)
|
|
20
|
+
@__inner__ = inner
|
|
21
|
+
@__outer__ = outer
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def instance_variables
|
|
25
|
+
super.select { |v| !PROXY_OBJECT_INSTANCE_VARIABLES.include?(v.to_sym) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def method_missing(m, *args, &block)
|
|
29
|
+
if @__inner__.respond_to?(m.to_sym)
|
|
30
|
+
@__inner__.__send__(m.to_sym, *args, &block)
|
|
31
|
+
else
|
|
32
|
+
@__outer__.__send__(m.to_sym, *args, &block)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module CfScript::Scope
|
|
2
|
+
class Script < Target
|
|
3
|
+
attr_reader :options
|
|
4
|
+
|
|
5
|
+
VALID_OPTIONS = [:api, :org, :username, :password, :space]
|
|
6
|
+
|
|
7
|
+
include CfScript::UI
|
|
8
|
+
|
|
9
|
+
def initialize(options = {})
|
|
10
|
+
super()
|
|
11
|
+
|
|
12
|
+
@options = options
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def run(&block)
|
|
16
|
+
apply_options unless options.empty?
|
|
17
|
+
|
|
18
|
+
exec_in(self, nil, &block)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def check_options
|
|
22
|
+
options.keys.each do |key|
|
|
23
|
+
unless VALID_OPTIONS.include?(key)
|
|
24
|
+
alert :options, "#{key} is not a valid option for the " +
|
|
25
|
+
'cf method. It will be ignored.'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def apply_options
|
|
31
|
+
check_options
|
|
32
|
+
|
|
33
|
+
# If api is given and there are no username or password, set the api
|
|
34
|
+
if options[:api] and (options[:username].nil? or options[:password].nil?)
|
|
35
|
+
unless endpoint = CfScript::Command.api(options[:api])
|
|
36
|
+
error :cf, "Could not set the API endpoint: #{options[:api]}"
|
|
37
|
+
raise "Could not set the API endpoint: #{options[:api]}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# If username and password are given, call login. This also sets the api
|
|
42
|
+
# and the space if they are given.
|
|
43
|
+
if options[:username] and options[:password]
|
|
44
|
+
unless CfScript::Command.login(options[:username], options[:password], options)
|
|
45
|
+
error :cf, 'Could not login with given credentials'
|
|
46
|
+
raise 'Could not login with given credentials'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# If a space is given, don't set it if there is a username and password,
|
|
51
|
+
# login would have already set it.
|
|
52
|
+
if options[:space] and (options[:username].nil? or options[:password].nil?)
|
|
53
|
+
# Use target, not CfScript::Command.target, so we can keep track of
|
|
54
|
+
# the previous and current spaces and reset them on scope exit.
|
|
55
|
+
target options[:space]
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module CfScript::Scope
|
|
2
|
+
class Target < Base
|
|
3
|
+
def current_org
|
|
4
|
+
@current_target ? @current_target.org : ''
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def current_space
|
|
8
|
+
@current_target ? @current_target.space : ''
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def target(*args, &block)
|
|
12
|
+
unless args.empty?
|
|
13
|
+
# TODO: check if it's the same org too
|
|
14
|
+
if args.first.to_s == current_space
|
|
15
|
+
return @current_target
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
@current_target = CfScript::Command.run(:target, *args)
|
|
20
|
+
|
|
21
|
+
block_given? ? yield(@current_target) : @current_target
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def space(space_name, &block)
|
|
25
|
+
space_scope = nil
|
|
26
|
+
|
|
27
|
+
if block_given?
|
|
28
|
+
space_scope = CfScript::Scope::Space.new(space_name)
|
|
29
|
+
|
|
30
|
+
exec_in(space_scope, nil, &block)
|
|
31
|
+
else
|
|
32
|
+
CfScript::Command.space(space_name)
|
|
33
|
+
end
|
|
34
|
+
ensure
|
|
35
|
+
space_scope.finalize if space_scope
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def app(name_or_info, &block)
|
|
39
|
+
if block_given?
|
|
40
|
+
app = CfScript::Scope::App.new(name_or_info, @current_target)
|
|
41
|
+
|
|
42
|
+
exec_in(app, nil, &block)
|
|
43
|
+
else
|
|
44
|
+
app_name = name_or_info.respond_to?(:name) ? name_or_info.name : name_or_info
|
|
45
|
+
|
|
46
|
+
CfScript::Command.app(app_name)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def apps(options = {}, &block)
|
|
51
|
+
apps = CfScript::Command.apps
|
|
52
|
+
|
|
53
|
+
apps.select!(options) unless options.empty?
|
|
54
|
+
|
|
55
|
+
block_given? ? yield(apps) : apps
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def target_desc(t)
|
|
61
|
+
desc = ''
|
|
62
|
+
desc << (t.org.nil? || t.org.empty? ? 'ORG-NOT-SET' : t.org)
|
|
63
|
+
desc << ':'
|
|
64
|
+
desc << (t.space.nil? || t.space.empty? ? 'SPACE-NOT-SET' : t.space)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def enter_scope
|
|
68
|
+
if current = target
|
|
69
|
+
@initial_target = @current_target = current
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
raise "Could not set initial and current targets" unless
|
|
73
|
+
@initial_target and @current_target
|
|
74
|
+
|
|
75
|
+
trace scope_name, "enter_scope: " +
|
|
76
|
+
"initial: (#{target_desc(@initial_target)}), " +
|
|
77
|
+
"current: (#{target_desc(@current_target)})"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def exit_scope
|
|
81
|
+
trace scope_name, "exit_scope: " +
|
|
82
|
+
"initial: (#{target_desc(@initial_target)}), " +
|
|
83
|
+
"current: (#{target_desc(@current_target)})"
|
|
84
|
+
|
|
85
|
+
if @initial_target.org != current_org or @initial_target.space != current_space
|
|
86
|
+
target(@initial_target)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|