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
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 760492ef86eb59b8e5fdcb8275227fc8e8e884e4
|
|
4
|
+
data.tar.gz: 3d347022f374182c81c52cfaa69b24986a620406
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 1d430f863f77eebe4188a6891fb2e609abdc0e2e1a168920e23ac0f6ee50feee970ef3c9d16b7052011597977131a0c8c671b01df7e5d9a5f94036bbca9ae01a
|
|
7
|
+
data.tar.gz: 42a1de9c7fbd5d2cdee6affafa8c53862112057aaad50d0daaba59df433e7298b393ae0fd06b87e5c0f6ec301e417d96d8c02d6b5b5f4805f7cd797cd0f72bb1
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
|
File without changes
|
data/Gemfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2010, 2015-2016, Ammar Ali
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
|
4
|
+
obtaining a copy of this software and associated documentation
|
|
5
|
+
files (the "Software"), to deal in the Software without
|
|
6
|
+
restriction, including without limitation the rights to use,
|
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the
|
|
9
|
+
Software is furnished to do so, subject to the following
|
|
10
|
+
conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be
|
|
13
|
+
included in all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# CfScript
|
|
2
|
+
|
|
3
|
+
CfScript is a DSL for scripting and automating the Cloud Foundry CLI.
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
require 'cf_script'
|
|
7
|
+
|
|
8
|
+
cf space: 'staging' do
|
|
9
|
+
workers = apps ending_with: 'worker'
|
|
10
|
+
|
|
11
|
+
workers.each do |worker|
|
|
12
|
+
app worker do
|
|
13
|
+
set_env 'SOME_NAME', 'SOME_VALUE'
|
|
14
|
+
|
|
15
|
+
restart if started?
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Requirements
|
|
22
|
+
|
|
23
|
+
* `ruby` >= 2.0
|
|
24
|
+
* `cf` >= 16.0
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
Install the gem with:
|
|
30
|
+
|
|
31
|
+
`gem install cf_script --pre`
|
|
32
|
+
|
|
33
|
+
Or, add it to your project's `Gemfile`:
|
|
34
|
+
|
|
35
|
+
```gem 'cf_script', '0.1.0.pre'```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Supported Commands
|
|
40
|
+
|
|
41
|
+
| Commands | CLI command | ⋯ |
|
|
42
|
+
| ------------------------------------- | ------------------------------------------------------- |:--------:|
|
|
43
|
+
| **General** | | ⋱ |
|
|
44
|
+
|   _**api**_ | `cf api URL` | ✓ |
|
|
45
|
+
|   _**auth**_ | `cf auth USER PASSWORD` | ✓ |
|
|
46
|
+
|   _**login**_ | `cf login -u USER -p PASSWORD [OPTIONS]` | ✓ |
|
|
47
|
+
|   _**logout**_ | `cf logout` | ✓ |
|
|
48
|
+
|   _**target**_ | `cf target [-s SPACE -o ORG]` | ✓ |
|
|
49
|
+
| **Applications** | | ⋱ |
|
|
50
|
+
|   _**app**_ | `cf app APP_NAME` | ✓ |
|
|
51
|
+
|   _**apps**_ | `cf apps` | ✓ |
|
|
52
|
+
|   _**start**_ | `cf start APP_NAME` | ✓ |
|
|
53
|
+
|   _**stop**_ | `cf stop APP_NAME` | ✓ |
|
|
54
|
+
|   _**restart**_ | `cf restart APP_NAME` | ✓ |
|
|
55
|
+
|   _**push**_ | `cf push [OPTIONS]` | ✓ |
|
|
56
|
+
|   _**restage**_ | `cf restage APP_NAME` | ✓ |
|
|
57
|
+
|   _**env**_ | `cf env APP_NAME` | ✓ |
|
|
58
|
+
|   _**set-env**_ | `cf set-env APP_NAME VAR_NAME VAR_VALUE` | ✓ |
|
|
59
|
+
|   _**unset-env**_ | `cf unset-env APP_NAME VAR_NAME` | ✓ |
|
|
60
|
+
| **Routes** | | ⋱ |
|
|
61
|
+
|   _**routes**_ | `cf routes` | ✓ |
|
|
62
|
+
|   _**check-route**_ | `cf check-route HOST DOMAIN` | ✓ |
|
|
63
|
+
|   _**create-route**_ | `cf create-route SPACE DOMAIN [-n HOSTNAME]` | ✓ |
|
|
64
|
+
|   _**map-route**_ | `cf map-route APP_NAME DOMAIN [-n HOSTNAME]` | ✓ |
|
|
65
|
+
|   _**unmap-route**_ | `cf unmap-route APP_NAME DOMAIN [-n HOSTNAME]` | ✓ |
|
|
66
|
+
|   _**delete-route**_ | `cf delete-route DOMAIN [-n HOSTNAME] [-f]` | ✓ |
|
|
67
|
+
| **Spaces** | | ⋱ |
|
|
68
|
+
|   _**space**_ | `cf space SPACE` | ✓ |
|
|
69
|
+
|   _**spaces**_ | `cf spaces` | ✓ |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Building
|
|
74
|
+
The project uses the standard rubygems package tasks, so:
|
|
75
|
+
|
|
76
|
+
To build your cloned copy of the gem, run:
|
|
77
|
+
```
|
|
78
|
+
rake build
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
To install the gem from the cloned project, run:
|
|
82
|
+
```
|
|
83
|
+
rake install
|
|
84
|
+
```
|
data/Rakefile
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
|
|
3
|
+
require 'rake'
|
|
4
|
+
require 'rake/testtask'
|
|
5
|
+
|
|
6
|
+
require 'bundler'
|
|
7
|
+
require 'rubygems/package_task'
|
|
8
|
+
|
|
9
|
+
Bundler::GemHelper.install_tasks
|
|
10
|
+
|
|
11
|
+
task :default => [:test]
|
|
12
|
+
|
|
13
|
+
Rake::TestTask.new('test') do |t|
|
|
14
|
+
if t.respond_to?(:description)
|
|
15
|
+
t.description = "Run all unit tests under the test directory"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
t.libs << "test"
|
|
19
|
+
t.test_files = FileList['test/**/*.rb']
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
namespace :test do
|
|
23
|
+
%w{commands runner parser}.each do |component|
|
|
24
|
+
Rake::TestTask.new(component) do |t|
|
|
25
|
+
if t.respond_to?(:description)
|
|
26
|
+
t.description = "Run all #{component} unit tests under the test/#{component} directory"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
t.libs << "test"
|
|
30
|
+
t.test_files = ["test/#{component}/**/*.rb"]
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/cf_script.gemspec
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
|
2
|
+
|
|
3
|
+
require 'cf_script/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |gem|
|
|
6
|
+
gem.name = 'cf_script'
|
|
7
|
+
gem.version = ::CfScript::VERSION
|
|
8
|
+
|
|
9
|
+
gem.summary = 'A DSL for scripting the Cloud Foundry CLI'
|
|
10
|
+
gem.description = ''
|
|
11
|
+
gem.homepage = 'http://github.com/ammar/cf_script'
|
|
12
|
+
|
|
13
|
+
if gem.respond_to?(:metadata)
|
|
14
|
+
gem.metadata = { 'issue_tracker' => 'https://github.com/ammar/cf_script/issues' }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
gem.authors = ['Ammar Ali']
|
|
18
|
+
gem.email = ['ammar@syntax.ps']
|
|
19
|
+
|
|
20
|
+
gem.license = 'MIT'
|
|
21
|
+
|
|
22
|
+
gem.require_paths = ['lib']
|
|
23
|
+
|
|
24
|
+
gem.files = `git ls-files`.split("\n")
|
|
25
|
+
gem.test_files = Dir.glob('test/**/*.rb')
|
|
26
|
+
|
|
27
|
+
gem.rdoc_options = ["--inline-source", "--charset=UTF-8"]
|
|
28
|
+
|
|
29
|
+
gem.platform = Gem::Platform::RUBY
|
|
30
|
+
|
|
31
|
+
gem.required_ruby_version = '>= 2.0.0'
|
|
32
|
+
|
|
33
|
+
gem.add_dependency('colorize', '>= 0.7.7')
|
|
34
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module CfScript::Callbacks
|
|
2
|
+
def callbacks
|
|
3
|
+
@callbacks ||= { before: {}, after: {} }
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def before(step, &block)
|
|
7
|
+
callbacks[:before][step] ||= []
|
|
8
|
+
callbacks[:before][step] << block
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def after(step, &block)
|
|
12
|
+
callbacks[:after][step] ||= []
|
|
13
|
+
callbacks[:after][step] << block
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def callbacks_for(type, step)
|
|
17
|
+
return [] unless callbacks.key?(type) && callbacks[type].key?(step)
|
|
18
|
+
|
|
19
|
+
callbacks[type][step]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def run_callbacks(type, step)
|
|
23
|
+
return unless callbacks[type].key?(step)
|
|
24
|
+
|
|
25
|
+
callbacks[type][step].each do |callback|
|
|
26
|
+
instance_eval(&callback)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def run_before(step)
|
|
31
|
+
run_callbacks(:before, step)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def run_after(step)
|
|
35
|
+
run_callbacks(:after, step)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def run_around(step, &block)
|
|
39
|
+
run_before(step)
|
|
40
|
+
yield
|
|
41
|
+
run_after(step)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
|
|
3
|
+
module CfScript::Command
|
|
4
|
+
class Base
|
|
5
|
+
include ::Singleton
|
|
6
|
+
|
|
7
|
+
attr_reader :type
|
|
8
|
+
attr_reader :name
|
|
9
|
+
|
|
10
|
+
include CfScript::Command::Runner
|
|
11
|
+
|
|
12
|
+
include CfScript::UI
|
|
13
|
+
include CfScript::UI::NameTag
|
|
14
|
+
|
|
15
|
+
def initialize(type, name)
|
|
16
|
+
@type = type
|
|
17
|
+
@name = name
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def line(env, bin, args)
|
|
21
|
+
Line.new(env, bin, type, name, args)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def run(*args, &block)
|
|
25
|
+
raise "run called in base command class"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def can_run?(output, options = {})
|
|
29
|
+
options[:check_status] = options.key?(:check_status) ? options[:check_status] : true
|
|
30
|
+
options[:check_failed] = options.key?(:check_failed) ? options[:check_failed] : true
|
|
31
|
+
|
|
32
|
+
if options[:check_status] == true && !output.good?
|
|
33
|
+
error 'cf exited with error'
|
|
34
|
+
output.dump
|
|
35
|
+
return false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if output.no_api_endpoint?
|
|
39
|
+
error "No API endpoint set"
|
|
40
|
+
return false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if output.not_logged_in?
|
|
44
|
+
error 'Not logged in'
|
|
45
|
+
return false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
if options[:check_failed] == true && output.failed?
|
|
49
|
+
error 'FAILED'
|
|
50
|
+
output.dump
|
|
51
|
+
return false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::AppCommand < CfScript::Command::Apps::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :app)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, options = {}, &block)
|
|
8
|
+
run_cf self, app_name do |output|
|
|
9
|
+
return nil unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
if app_info = build_app_info(app_name, output)
|
|
12
|
+
block_given? ? yield(app_info) : app_info
|
|
13
|
+
else
|
|
14
|
+
error 'attributes is nil'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::AppsCommand < CfScript::Command::Base
|
|
3
|
+
NO_APPS_FOUND = 'No apps found'
|
|
4
|
+
|
|
5
|
+
APPS_TABLE = [
|
|
6
|
+
'name',
|
|
7
|
+
'requested state',
|
|
8
|
+
'instances',
|
|
9
|
+
'memory',
|
|
10
|
+
'disk',
|
|
11
|
+
'urls'
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
def initialize
|
|
15
|
+
super(:apps, :apps)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def run(options = {}, &block)
|
|
19
|
+
run_cf self do |output|
|
|
20
|
+
return [] unless can_run?(output)
|
|
21
|
+
return [] if output.contains? NO_APPS_FOUND
|
|
22
|
+
|
|
23
|
+
if rows = output.table(APPS_TABLE)
|
|
24
|
+
list = build_app_list(rows)
|
|
25
|
+
|
|
26
|
+
block_given? ? yield(list) : list
|
|
27
|
+
else
|
|
28
|
+
error 'rows is nil'
|
|
29
|
+
return []
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def build_app_list(rows)
|
|
37
|
+
apps = rows.map do |row|
|
|
38
|
+
CfScript::AppInfo.new(row[:name].value, row)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
CfScript::AppList.new(apps)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::EnvCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :env)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, &block)
|
|
8
|
+
run_cf self, app_name do |output|
|
|
9
|
+
return {} unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
if vars = output.section_attributes('User-Provided')
|
|
12
|
+
block_given? ? yield(vars.to_h) : vars.to_h
|
|
13
|
+
else
|
|
14
|
+
error 'vars is nil'
|
|
15
|
+
return {}
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::PushCommand < CfScript::Command::Apps::Base
|
|
3
|
+
LONG_OPTIONS_MAP = {
|
|
4
|
+
manifest: :f,
|
|
5
|
+
instances: :i,
|
|
6
|
+
memory: :m,
|
|
7
|
+
command: :c,
|
|
8
|
+
buildpack: :b,
|
|
9
|
+
hostname: :n,
|
|
10
|
+
domain: :d,
|
|
11
|
+
disk: :k,
|
|
12
|
+
path: :p,
|
|
13
|
+
stack: :s,
|
|
14
|
+
timeout: :t,
|
|
15
|
+
docker_image: :o,
|
|
16
|
+
health_check_type: :u,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
super(:apps, :push)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def run(app_name, options = {}, &block)
|
|
24
|
+
run_cf self, app_name, translate_options(options.dup) do |output|
|
|
25
|
+
return unless can_run?(output, check_failed: false)
|
|
26
|
+
|
|
27
|
+
if app = build_app_info(app_name, output)
|
|
28
|
+
block_given? ? yield(app) : app
|
|
29
|
+
else
|
|
30
|
+
error "app is nil"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def translate_options(options)
|
|
36
|
+
opts = options.dup
|
|
37
|
+
|
|
38
|
+
LONG_OPTIONS_MAP.each do |long, short|
|
|
39
|
+
if opts.key?(long)
|
|
40
|
+
opts[short] = opts.delete(long)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
opts
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::RestageCommand < CfScript::Command::Apps::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :restage)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, &block)
|
|
8
|
+
run_cf self, app_name do |output|
|
|
9
|
+
return unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
if app = build_app_info(app_name, output)
|
|
12
|
+
block_given? ? yield(app) : app
|
|
13
|
+
else
|
|
14
|
+
error "app is nil"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::RestartCommand < CfScript::Command::Apps::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :restart)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, &block)
|
|
8
|
+
run_cf self, app_name do |output|
|
|
9
|
+
return unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
if app = build_app_info(app_name, output)
|
|
12
|
+
block_given? ? yield(app) : app
|
|
13
|
+
else
|
|
14
|
+
error "app is nil"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::SetEnvCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :set_env)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, var_name, var_value, &block)
|
|
8
|
+
run_cf self, app_name, var_name, var_value do |output|
|
|
9
|
+
return false unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
return true if output.contains?("\nOK\n")
|
|
12
|
+
|
|
13
|
+
error 'Could not set env variable'
|
|
14
|
+
return false
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::StartCommand < CfScript::Command::Apps::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :start)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, &block)
|
|
8
|
+
run_cf self, app_name do |output|
|
|
9
|
+
return unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
if app = build_app_info(app_name, output)
|
|
12
|
+
block_given? ? yield(app) : app
|
|
13
|
+
else
|
|
14
|
+
error "app is nil"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::StopCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :stop)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, &block)
|
|
8
|
+
run_cf self, app_name do |output|
|
|
9
|
+
return false unless can_run?(output, check_failed: false)
|
|
10
|
+
|
|
11
|
+
if output.ok?
|
|
12
|
+
block_given? ? yield(true) : true
|
|
13
|
+
else
|
|
14
|
+
error "failed to stop"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module CfScript::Command
|
|
2
|
+
class Apps::UnsetEnvCommand < CfScript::Command::Base
|
|
3
|
+
def initialize
|
|
4
|
+
super(:apps, :unset_env)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def run(app_name, var_name, &block)
|
|
8
|
+
run_cf self, app_name, var_name do |output|
|
|
9
|
+
return false unless can_run?(output)
|
|
10
|
+
|
|
11
|
+
return true if output.contains?("\nOK\n")
|
|
12
|
+
|
|
13
|
+
error 'Could not unset env variable'
|
|
14
|
+
return false
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
CfScript::Command.const_set(:Apps, Module.new)
|
|
2
|
+
|
|
3
|
+
module CfScript::Command
|
|
4
|
+
class Apps::Base < CfScript::Command::Base
|
|
5
|
+
INSTANCE_STATUS_TABLE = [
|
|
6
|
+
'',
|
|
7
|
+
'state',
|
|
8
|
+
'since',
|
|
9
|
+
'cpu',
|
|
10
|
+
'memory',
|
|
11
|
+
'disk',
|
|
12
|
+
'details'
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
def build_app_info(app_name, output)
|
|
16
|
+
attributes = output.attributes_from(
|
|
17
|
+
'Showing health and status for app'
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
if attributes
|
|
21
|
+
app = CfScript::AppInfo.new(app_name, attributes)
|
|
22
|
+
|
|
23
|
+
if rows = output.table(INSTANCE_STATUS_TABLE)
|
|
24
|
+
app.set_instance_status rows
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
app
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
require 'cf_script/command/cf/apps/apps'
|
|
34
|
+
require 'cf_script/command/cf/apps/app'
|
|
35
|
+
require 'cf_script/command/cf/apps/start'
|
|
36
|
+
require 'cf_script/command/cf/apps/stop'
|
|
37
|
+
require 'cf_script/command/cf/apps/restart'
|
|
38
|
+
require 'cf_script/command/cf/apps/push'
|
|
39
|
+
require 'cf_script/command/cf/apps/restage'
|
|
40
|
+
require 'cf_script/command/cf/apps/env'
|
|
41
|
+
require 'cf_script/command/cf/apps/set_env'
|
|
42
|
+
require 'cf_script/command/cf/apps/unset_env'
|
|
43
|
+
|
|
44
|
+
module CfScript::Command::Apps
|
|
45
|
+
CfScript::Command.register AppsCommand
|
|
46
|
+
CfScript::Command.register AppCommand
|
|
47
|
+
CfScript::Command.register StartCommand
|
|
48
|
+
CfScript::Command.register StopCommand
|
|
49
|
+
CfScript::Command.register RestartCommand
|
|
50
|
+
CfScript::Command.register PushCommand
|
|
51
|
+
CfScript::Command.register RestageCommand
|
|
52
|
+
CfScript::Command.register EnvCommand
|
|
53
|
+
CfScript::Command.register SetEnvCommand
|
|
54
|
+
CfScript::Command.register UnsetEnvCommand
|
|
55
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module CfScript::Command::General
|
|
2
|
+
class ApiCommand < CfScript::Command::Base
|
|
3
|
+
API_NOT_SET = 'No api endpoint set'
|
|
4
|
+
|
|
5
|
+
API_ENDPOINT_REGEX = %r|API endpoint:\s+(?<url>https?://[\S]+)\s+\(API version:\s+(?<version>[^)]+)\)|
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
super(:general, :api)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run(url = nil, &block)
|
|
12
|
+
run_cf self, url do |output|
|
|
13
|
+
return unless can_run?(output)
|
|
14
|
+
|
|
15
|
+
if output.contains? API_NOT_SET
|
|
16
|
+
error API_NOT_SET
|
|
17
|
+
else
|
|
18
|
+
build_endpoint(output)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def build_endpoint(output)
|
|
26
|
+
attrs = output.line_attributes API_ENDPOINT_REGEX
|
|
27
|
+
|
|
28
|
+
unless attrs.nil? or attrs.empty?
|
|
29
|
+
CfScript::ApiEndpoint.new(
|
|
30
|
+
attrs[:url].value,
|
|
31
|
+
attrs[:version].value
|
|
32
|
+
)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|