acquia_toolbelt 2.3.0 → 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/CONTRIBUTING.md +11 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +55 -0
- data/Guardfile +5 -0
- data/LICENSE +19 -0
- data/README.md +149 -0
- data/Rakefile +1 -0
- data/acquia_toolbelt.gemspec +34 -0
- data/bin/acquia +9 -0
- data/lib/acquia_toolbelt/cli/api.rb +164 -0
- data/lib/acquia_toolbelt/cli/auth.rb +31 -0
- data/lib/acquia_toolbelt/cli/database.rb +237 -0
- data/lib/acquia_toolbelt/cli/deploy.rb +36 -0
- data/lib/acquia_toolbelt/cli/domain.rb +177 -0
- data/lib/acquia_toolbelt/cli/environment.rb +71 -0
- data/lib/acquia_toolbelt/cli/file.rb +31 -0
- data/lib/acquia_toolbelt/cli/server.rb +67 -0
- data/lib/acquia_toolbelt/cli/site.rb +28 -0
- data/lib/acquia_toolbelt/cli/ssh.rb +78 -0
- data/lib/acquia_toolbelt/cli/svn.rb +73 -0
- data/lib/acquia_toolbelt/cli/task.rb +74 -0
- data/lib/acquia_toolbelt/cli/ui.rb +44 -0
- data/lib/acquia_toolbelt/cli.rb +103 -0
- data/lib/acquia_toolbelt/error.rb +4 -0
- data/lib/acquia_toolbelt/thor.rb +95 -0
- data/lib/acquia_toolbelt/version.rb +3 -0
- data/lib/acquia_toolbelt.rb +4 -0
- data/lib/vendor/thor/CHANGELOG.md +139 -0
- data/lib/vendor/thor/Gemfile +20 -0
- data/lib/vendor/thor/LICENSE.md +20 -0
- data/lib/vendor/thor/README.md +35 -0
- data/lib/vendor/thor/lib/thor/actions/create_file.rb +105 -0
- data/lib/vendor/thor/lib/thor/actions/create_link.rb +60 -0
- data/lib/vendor/thor/lib/thor/actions/directory.rb +119 -0
- data/lib/vendor/thor/lib/thor/actions/empty_directory.rb +137 -0
- data/lib/vendor/thor/lib/thor/actions/file_manipulation.rb +317 -0
- data/lib/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
- data/lib/vendor/thor/lib/thor/actions.rb +318 -0
- data/lib/vendor/thor/lib/thor/base.rb +654 -0
- data/lib/vendor/thor/lib/thor/command.rb +136 -0
- data/lib/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +80 -0
- data/lib/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/vendor/thor/lib/thor/core_ext/ordered_hash.rb +100 -0
- data/lib/vendor/thor/lib/thor/error.rb +32 -0
- data/lib/vendor/thor/lib/thor/group.rb +282 -0
- data/lib/vendor/thor/lib/thor/invocation.rb +172 -0
- data/lib/vendor/thor/lib/thor/parser/argument.rb +74 -0
- data/lib/vendor/thor/lib/thor/parser/arguments.rb +171 -0
- data/lib/vendor/thor/lib/thor/parser/option.rb +121 -0
- data/lib/vendor/thor/lib/thor/parser/options.rb +218 -0
- data/lib/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/vendor/thor/lib/thor/rake_compat.rb +72 -0
- data/lib/vendor/thor/lib/thor/runner.rb +322 -0
- data/lib/vendor/thor/lib/thor/shell/basic.rb +422 -0
- data/lib/vendor/thor/lib/thor/shell/color.rb +148 -0
- data/lib/vendor/thor/lib/thor/shell/html.rb +127 -0
- data/lib/vendor/thor/lib/thor/shell.rb +88 -0
- data/lib/vendor/thor/lib/thor/util.rb +270 -0
- data/lib/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/vendor/thor/lib/thor.rb +474 -0
- data/lib/vendor/thor/spec/actions/create_file_spec.rb +170 -0
- data/lib/vendor/thor/spec/actions/create_link_spec.rb +95 -0
- data/lib/vendor/thor/spec/actions/directory_spec.rb +169 -0
- data/lib/vendor/thor/spec/actions/empty_directory_spec.rb +129 -0
- data/lib/vendor/thor/spec/actions/file_manipulation_spec.rb +382 -0
- data/lib/vendor/thor/spec/actions/inject_into_file_spec.rb +135 -0
- data/lib/vendor/thor/spec/actions_spec.rb +331 -0
- data/lib/vendor/thor/spec/base_spec.rb +291 -0
- data/lib/vendor/thor/spec/command_spec.rb +80 -0
- data/lib/vendor/thor/spec/core_ext/hash_with_indifferent_access_spec.rb +48 -0
- data/lib/vendor/thor/spec/core_ext/ordered_hash_spec.rb +115 -0
- data/lib/vendor/thor/spec/exit_condition_spec.rb +19 -0
- data/lib/vendor/thor/spec/fixtures/application.rb +2 -0
- data/lib/vendor/thor/spec/fixtures/app{1}/README +3 -0
- data/lib/vendor/thor/spec/fixtures/bundle/execute.rb +6 -0
- data/lib/vendor/thor/spec/fixtures/bundle/main.thor +1 -0
- data/lib/vendor/thor/spec/fixtures/command.thor +10 -0
- data/lib/vendor/thor/spec/fixtures/doc/%file_name%.rb.tt +1 -0
- data/lib/vendor/thor/spec/fixtures/doc/COMMENTER +11 -0
- data/lib/vendor/thor/spec/fixtures/doc/README +3 -0
- data/lib/vendor/thor/spec/fixtures/doc/block_helper.rb +3 -0
- data/lib/vendor/thor/spec/fixtures/doc/components/.empty_directory +0 -0
- data/lib/vendor/thor/spec/fixtures/doc/config.rb +1 -0
- data/lib/vendor/thor/spec/fixtures/doc/config.yaml.tt +1 -0
- data/lib/vendor/thor/spec/fixtures/doc/excluding/%file_name%.rb.tt +1 -0
- data/lib/vendor/thor/spec/fixtures/enum.thor +10 -0
- data/lib/vendor/thor/spec/fixtures/group.thor +128 -0
- data/lib/vendor/thor/spec/fixtures/invoke.thor +118 -0
- data/lib/vendor/thor/spec/fixtures/path with spaces +0 -0
- data/lib/vendor/thor/spec/fixtures/preserve/script.sh +3 -0
- data/lib/vendor/thor/spec/fixtures/script.thor +220 -0
- data/lib/vendor/thor/spec/fixtures/subcommand.thor +17 -0
- data/lib/vendor/thor/spec/group_spec.rb +222 -0
- data/lib/vendor/thor/spec/helper.rb +67 -0
- data/lib/vendor/thor/spec/invocation_spec.rb +108 -0
- data/lib/vendor/thor/spec/parser/argument_spec.rb +53 -0
- data/lib/vendor/thor/spec/parser/arguments_spec.rb +66 -0
- data/lib/vendor/thor/spec/parser/option_spec.rb +202 -0
- data/lib/vendor/thor/spec/parser/options_spec.rb +400 -0
- data/lib/vendor/thor/spec/rake_compat_spec.rb +72 -0
- data/lib/vendor/thor/spec/register_spec.rb +197 -0
- data/lib/vendor/thor/spec/runner_spec.rb +241 -0
- data/lib/vendor/thor/spec/shell/basic_spec.rb +330 -0
- data/lib/vendor/thor/spec/shell/color_spec.rb +95 -0
- data/lib/vendor/thor/spec/shell/html_spec.rb +31 -0
- data/lib/vendor/thor/spec/shell_spec.rb +47 -0
- data/lib/vendor/thor/spec/subcommand_spec.rb +30 -0
- data/lib/vendor/thor/spec/thor_spec.rb +499 -0
- data/lib/vendor/thor/spec/util_spec.rb +196 -0
- data/lib/vendor/thor/thor.gemspec +24 -0
- data/script/release +50 -0
- data/script/setup_build +6 -0
- data/script/test +23 -0
- data/spec/auth_spec.rb +15 -0
- data/spec/cassettes/databases/all_databases.json +1 -0
- data/spec/cassettes/databases/copy_database_from_dev_to_stage.json +1 -0
- data/spec/cassettes/databases/create_a_database_backup.json +1 -0
- data/spec/cassettes/databases/create_a_new_database.json +1 -0
- data/spec/cassettes/databases/delete_a_database.json +1 -0
- data/spec/cassettes/databases/get_all_existing_databases.json +1 -0
- data/spec/cassettes/databases/list_all_database_backups.json +1 -0
- data/spec/cassettes/databases/view_database_instance_details.json +1 -0
- data/spec/cassettes/deploy/release_vcs_branch.json +1 -0
- data/spec/cassettes/domains/create_new_domain.json +1 -0
- data/spec/cassettes/domains/delete_a_domain.json +1 -0
- data/spec/cassettes/domains/get_all_existing_domains.json +1 -0
- data/spec/cassettes/domains/list_all_dev_domains.json +1 -0
- data/spec/cassettes/domains/move_from_dev_to_stage.json +1 -0
- data/spec/cassettes/domains/purge_varnish_cache.json +1 -0
- data/spec/cassettes/environments/all_environments.json +1 -0
- data/spec/cassettes/environments/disable_live_development.json +1 -0
- data/spec/cassettes/environments/enable_live_development.json +1 -0
- data/spec/cassettes/files/copy_from_dev_to_stage.json +1 -0
- data/spec/cassettes/servers/all_dev_servers.json +1 -0
- data/spec/cassettes/servers/all_prod_servers.json +1 -0
- data/spec/cassettes/sites/all_sites.json +1 -0
- data/spec/cassettes/ssh/all_sshkeys.json +1 -0
- data/spec/cassettes/svn/all_svnusers.json +1 -0
- data/spec/cassettes/tasks/all_tasks.json +1 -0
- data/spec/databases_spec.rb +78 -0
- data/spec/deploy_spec.rb +12 -0
- data/spec/domains_spec.rb +59 -0
- data/spec/environments_spec.rb +35 -0
- data/spec/files_spec.rb +11 -0
- data/spec/helper.rb +104 -0
- data/spec/servers_spec.rb +59 -0
- data/spec/sites_spec.rb +19 -0
- data/spec/ssh_spec.rb +19 -0
- data/spec/svn_spec.rb +11 -0
- data/spec/tasks_spec.rb +11 -0
- metadata +158 -4
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3
|
data/.travis.yml
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Submitting a Pull Request
|
2
|
+
|
3
|
+
* Check out the README guide for getting the project setup and running locally.
|
4
|
+
* Fork the repository.
|
5
|
+
* Create a topic branch.
|
6
|
+
* Add specs for your unimplemented feature or bug fix.
|
7
|
+
* Run `script/test` from the repository root. If your specs and tests pass,
|
8
|
+
continue on, otherwise fix them.
|
9
|
+
* Add documentation for your feature or bug fix.
|
10
|
+
* Add, commit, and push your changes.
|
11
|
+
* Submit a pull request.
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
acquia_toolbelt (2.3.1)
|
5
|
+
faraday (= 0.8.8)
|
6
|
+
highline (= 1.6.19)
|
7
|
+
json (= 1.8.0)
|
8
|
+
multi_json (= 1.8.2)
|
9
|
+
netrc (= 0.7.7)
|
10
|
+
rainbow (= 1.1.4)
|
11
|
+
sshkey (= 1.6.0)
|
12
|
+
thor (= 0.18.1)
|
13
|
+
|
14
|
+
GEM
|
15
|
+
remote: https://rubygems.org/
|
16
|
+
specs:
|
17
|
+
addressable (2.3.5)
|
18
|
+
crack (0.4.1)
|
19
|
+
safe_yaml (~> 0.9.0)
|
20
|
+
diff-lcs (1.2.4)
|
21
|
+
faraday (0.8.8)
|
22
|
+
multipart-post (~> 1.2.0)
|
23
|
+
highline (1.6.19)
|
24
|
+
json (1.8.0)
|
25
|
+
multi_json (1.8.2)
|
26
|
+
multipart-post (1.2.0)
|
27
|
+
netrc (0.7.7)
|
28
|
+
rainbow (1.1.4)
|
29
|
+
rake (10.1.0)
|
30
|
+
rspec (2.14.1)
|
31
|
+
rspec-core (~> 2.14.0)
|
32
|
+
rspec-expectations (~> 2.14.0)
|
33
|
+
rspec-mocks (~> 2.14.0)
|
34
|
+
rspec-core (2.14.7)
|
35
|
+
rspec-expectations (2.14.4)
|
36
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
37
|
+
rspec-mocks (2.14.4)
|
38
|
+
safe_yaml (0.9.7)
|
39
|
+
sshkey (1.6.0)
|
40
|
+
thor (0.18.1)
|
41
|
+
vcr (2.7.0)
|
42
|
+
webmock (1.15.2)
|
43
|
+
addressable (>= 2.2.7)
|
44
|
+
crack (>= 0.3.2)
|
45
|
+
|
46
|
+
PLATFORMS
|
47
|
+
ruby
|
48
|
+
|
49
|
+
DEPENDENCIES
|
50
|
+
acquia_toolbelt!
|
51
|
+
bundler (~> 1.3)
|
52
|
+
rake (= 10.1.0)
|
53
|
+
rspec (= 2.14.1)
|
54
|
+
vcr (= 2.7.0)
|
55
|
+
webmock (= 1.15.2)
|
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2012 Jacob Bednarz.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
5
|
+
the Software without restriction, including without limitation the rights to
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
8
|
+
so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
# Acquia Toolbelt
|
2
|
+
|
3
|
+
The Acquia Toolbelt is a CLI tool for using the Acquia Cloud API. Some of the
|
4
|
+
features include getting information around your servers, subscription,
|
5
|
+
databases, tasks and domains.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Installation is available (and recommended) via Ruby Gems.
|
10
|
+
|
11
|
+
```bash
|
12
|
+
$ gem install acquia_toolbelt
|
13
|
+
```
|
14
|
+
|
15
|
+
Once installed, the toolbelt is accessible via invoking `acquia` within the
|
16
|
+
command line.
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
You can see all available commands by running `acquia help`. Additonally, more
|
20
|
+
information on each command is available via `acquia [COMMAND] help`.
|
21
|
+
|
22
|
+
```bash
|
23
|
+
$ acquia help
|
24
|
+
|
25
|
+
Type 'acquia [COMMAND] help' for more details on subcommands or to show example usage.
|
26
|
+
|
27
|
+
Commands:
|
28
|
+
acquia auth
|
29
|
+
acquia databases
|
30
|
+
acquia deploy
|
31
|
+
acquia domains
|
32
|
+
acquia environments
|
33
|
+
acquia files
|
34
|
+
acquia servers
|
35
|
+
acquia sites
|
36
|
+
acquia ssh
|
37
|
+
acquia svn
|
38
|
+
acquia tasks
|
39
|
+
|
40
|
+
Options:
|
41
|
+
-s, [--subscription=SUBSCRIPTION] # Name of a subscription you would like to target.
|
42
|
+
-e, [--environment=ENVIRONMENT] # Environment to target for commands.
|
43
|
+
-v, [--verbose] # Increase the verbose output from the commands.
|
44
|
+
```
|
45
|
+
|
46
|
+
#### Example commands
|
47
|
+
|
48
|
+
Without parameters:
|
49
|
+
|
50
|
+
```bash
|
51
|
+
$ acquia databases:list
|
52
|
+
|
53
|
+
> mydb
|
54
|
+
> mydb2
|
55
|
+
```
|
56
|
+
|
57
|
+
With parameters:
|
58
|
+
|
59
|
+
```bash
|
60
|
+
$ acquia databases:list -e dev -d mydb
|
61
|
+
|
62
|
+
> Username: exampledb
|
63
|
+
> Password: h5hKN4v2nc*1nd
|
64
|
+
> Host: staging-1234
|
65
|
+
> DB cluster: 1111
|
66
|
+
> Instance name: mydb8717
|
67
|
+
```
|
68
|
+
|
69
|
+
## Getting started
|
70
|
+
|
71
|
+
Before you can start using any commands, you need to first run
|
72
|
+
`acquia auth:login`. This will write your login details to a local netrc file so
|
73
|
+
that you won't be prompted for login details every time a request is made. After
|
74
|
+
that, the sky is the limit!
|
75
|
+
|
76
|
+
## FAQ
|
77
|
+
|
78
|
+
**Q: Is there support for proxies and corporate firewalls?**
|
79
|
+
|
80
|
+
**A:** By god yes. Proxies and corporate firewalls are the bane of my existence
|
81
|
+
so there was no way this toolbelt _wasn't_ going to support it. To use a proxy,
|
82
|
+
all you need to do is set your HTTPS_PROXY environment variable to the required
|
83
|
+
value. Example:
|
84
|
+
|
85
|
+
```bash
|
86
|
+
$ export HTTPS_PROXY="http://myproxy.url.internal:1234"
|
87
|
+
```
|
88
|
+
|
89
|
+
Then to check the value was correctly set:
|
90
|
+
|
91
|
+
```bash
|
92
|
+
$ echo $HTTPS_PROXY
|
93
|
+
$ http://myproxy.url.internal:1234
|
94
|
+
```
|
95
|
+
|
96
|
+
**Q: Is there somewhere I can see all the commands with required parameters?**
|
97
|
+
|
98
|
+
**A:** Yep. Check out the
|
99
|
+
[commands listing](https://github.com/jacobbednarz/acquia-toolbelt/wiki/Commands)
|
100
|
+
in the [wiki](https://github.com/jacobbednarz/acquia-toolbelt/wiki).
|
101
|
+
|
102
|
+
## Hacking on the Acquia Toolbelt
|
103
|
+
|
104
|
+
The Acquia Toolbelt uses [VCR](https://github.com/vcr/vcr) for recording and
|
105
|
+
replaying API fixtures during test runs - doing this allows the tests to stay
|
106
|
+
fast and easy for anyone to run.
|
107
|
+
|
108
|
+
Authenticated requests are currently using the user credentials from the netrc
|
109
|
+
file on your local system. It is a good idea to have this setup first (simply
|
110
|
+
by running `acquia auth:login`) as if you are recording new cassettes you will
|
111
|
+
need to be able to make actual requests. Don't worry about your user credentials
|
112
|
+
being stored in the fixtures as they are removed during the request and they
|
113
|
+
will appear as ACQUIA_USERNAME and ACQUIA_PASSWORD in the requests
|
114
|
+
respectively.
|
115
|
+
|
116
|
+
Since the cassettes are periodically refreshed to match changes to the API,
|
117
|
+
remember the keep the following in mind when making cassettes.
|
118
|
+
|
119
|
+
* **Specs should be idempotent.** The HTTP calls made during a spec should be
|
120
|
+
able to be run over and over. This means deleting a known resource prior to
|
121
|
+
creating it if the name has to be unique.
|
122
|
+
* **Specs should be able to be run in random order.** If a spec depends on
|
123
|
+
another resource as a fixture, make sure that's created in the scope of the
|
124
|
+
spec and not depend on a previous spec to create the data needed.
|
125
|
+
* **Do not depend on authenticated user info.** Instead of asserting actual
|
126
|
+
values in resources, try to assert the existence of a key or that a response
|
127
|
+
is an Array. We're testing the client, not the API.
|
128
|
+
|
129
|
+
### Running and writing new tests
|
130
|
+
|
131
|
+
The testing is mainly done via [RSpec](https://github.com/rspec/rspec). To run
|
132
|
+
the test suite, execute the `script/test` script in the root of the repository:
|
133
|
+
|
134
|
+
```bash
|
135
|
+
$ script/test
|
136
|
+
```
|
137
|
+
|
138
|
+
This will ensure all dependencies are installed and kick off the test suite.
|
139
|
+
|
140
|
+
### Supported versions
|
141
|
+
|
142
|
+
This library aims to support and is [tested against](https://travis-ci.org/jacobbednarz/acquia-toolbelt) the following Ruby implementations:
|
143
|
+
|
144
|
+
* Ruby 1.9.2
|
145
|
+
* Ruby 1.9.3
|
146
|
+
* Ruby 2.0.0
|
147
|
+
|
148
|
+
If you would like support for other implementations or versions, please open an
|
149
|
+
issue and it can be looked into.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'acquia_toolbelt/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'acquia_toolbelt'
|
8
|
+
spec.version = AcquiaToolbelt::VERSION
|
9
|
+
spec.authors = ['Jacob Bednarz']
|
10
|
+
spec.email = ['jacob.bednarz@gmail.com']
|
11
|
+
spec.summary = %q{A CLI tool for interacting with Acquia's hosting services.}
|
12
|
+
spec.description = %q{The Acquia Toolbelt allows you to interact with the Acquia Cloud API via the CLI.}
|
13
|
+
spec.homepage = 'https://github.com/jacobbednarz/acquia-toolbelt'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_runtime_dependency 'thor', '0.18.1'
|
21
|
+
spec.add_runtime_dependency 'netrc', '0.7.7'
|
22
|
+
spec.add_runtime_dependency 'highline', '1.6.19'
|
23
|
+
spec.add_runtime_dependency 'faraday', '0.8.8'
|
24
|
+
spec.add_runtime_dependency 'json', '1.8.0'
|
25
|
+
spec.add_runtime_dependency 'rainbow', '1.1.4'
|
26
|
+
spec.add_runtime_dependency 'sshkey', '1.6.0'
|
27
|
+
spec.add_runtime_dependency 'multi_json', '1.8.2'
|
28
|
+
|
29
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
30
|
+
spec.add_development_dependency 'rake', '10.1.0'
|
31
|
+
spec.add_development_dependency 'rspec', '2.14.1'
|
32
|
+
spec.add_development_dependency 'vcr', '2.7.0'
|
33
|
+
spec.add_development_dependency 'webmock', '1.15.2'
|
34
|
+
end
|
data/bin/acquia
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
require "netrc"
|
2
|
+
require "faraday"
|
3
|
+
require "json"
|
4
|
+
require "acquia_toolbelt/version"
|
5
|
+
|
6
|
+
module AcquiaToolbelt
|
7
|
+
class CLI
|
8
|
+
class API
|
9
|
+
USER_AGENT = "AcquiaToolbelt/#{AcquiaToolbelt::VERSION}"
|
10
|
+
ENDPOINT = "https://cloudapi.acquia.com"
|
11
|
+
ENDPOINT_VERSION = "v1"
|
12
|
+
|
13
|
+
# Internal: Send a request to the Acquia API.
|
14
|
+
#
|
15
|
+
# Build a HTTP request to connect to the Acquia API and handle the JSON
|
16
|
+
# response accordingly.
|
17
|
+
#
|
18
|
+
# resource - The resource URI that is after the version in the API
|
19
|
+
# URI.
|
20
|
+
# method - HTTP verb to use on the request.
|
21
|
+
# data - Data to send to the endpoint.
|
22
|
+
# parse_request - Whether to JSON parse the body before returning or just
|
23
|
+
# return the whole request object. The whole request is
|
24
|
+
# returned during tests whereas only the body is required
|
25
|
+
# for the application.
|
26
|
+
#
|
27
|
+
# Retuns JSON object from the response body.
|
28
|
+
def self.request(resource, method = "GET", data = {}, parse_request = true)
|
29
|
+
n = Netrc.read
|
30
|
+
|
31
|
+
# Make sure there is an entry for the Acquia API before generating the
|
32
|
+
# requests.
|
33
|
+
if n["cloudapi.acquia.com"].nil?
|
34
|
+
puts "No entry for cloudapi.acquia.com within your netrc file."
|
35
|
+
puts "You can login/reset your user credentials by running `acquia auth:login`"
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
@acquia_user, @acquia_password = n["cloudapi.acquia.com"]
|
40
|
+
|
41
|
+
# Check if the user is behind a proxy and add the proxy settings if
|
42
|
+
# they are.
|
43
|
+
conn = (using_proxy?) ? Faraday.new(:proxy => ENV["HTTPS_PROXY"]) : Faraday.new
|
44
|
+
conn.basic_auth(@acquia_user, @acquia_password)
|
45
|
+
|
46
|
+
# Be nice and send a user agent - help tracking and issue detection on
|
47
|
+
# Acquia's end as well as the client.
|
48
|
+
conn.headers["User-Agent"] = "#{AcquiaToolbelt::CLI::API::USER_AGENT}"
|
49
|
+
|
50
|
+
case method
|
51
|
+
when "GET"
|
52
|
+
response = conn.get "#{endpoint_uri}/#{resource}.json"
|
53
|
+
is_successful_response? response
|
54
|
+
|
55
|
+
if parse_request == true
|
56
|
+
JSON.parse(response.body)
|
57
|
+
else
|
58
|
+
response
|
59
|
+
end
|
60
|
+
when "POST"
|
61
|
+
response = conn.post "#{endpoint_uri}/#{resource}.json", data.to_json
|
62
|
+
is_successful_response? response
|
63
|
+
|
64
|
+
if parse_request == true
|
65
|
+
JSON.parse(response.body)
|
66
|
+
else
|
67
|
+
response
|
68
|
+
end
|
69
|
+
when "QUERY-STRING-POST"
|
70
|
+
response = conn.post "#{endpoint_uri}/#{resource}.json?#{data[:key]}=#{data[:value]}", data.to_json
|
71
|
+
is_successful_response? response
|
72
|
+
|
73
|
+
if parse_request == true
|
74
|
+
JSON.parse(response.body)
|
75
|
+
else
|
76
|
+
response
|
77
|
+
end
|
78
|
+
when "DELETE"
|
79
|
+
response = conn.delete "#{endpoint_uri}/#{resource}.json"
|
80
|
+
is_successful_response? response
|
81
|
+
|
82
|
+
if parse_request == true
|
83
|
+
JSON.parse(response.body)
|
84
|
+
else
|
85
|
+
response
|
86
|
+
end
|
87
|
+
else
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Internal: Get defined subscription environments.
|
92
|
+
#
|
93
|
+
# This is a helper method that fetches all the available environments for
|
94
|
+
# a subscription and returns them for use in other methods.
|
95
|
+
#
|
96
|
+
# Returns an array of environments.
|
97
|
+
def self.get_environments
|
98
|
+
subscription = default_subscription
|
99
|
+
env_data = request "sites/#{subscription}/envs"
|
100
|
+
|
101
|
+
envs = []
|
102
|
+
env_data.each do |env|
|
103
|
+
envs << env["name"]
|
104
|
+
end
|
105
|
+
|
106
|
+
envs
|
107
|
+
end
|
108
|
+
|
109
|
+
# Internal: Use the default environment the user has access to.
|
110
|
+
#
|
111
|
+
# If the -s (subscription) flag is not set, just use the first
|
112
|
+
# subscription the user has access to. This is handy for users that
|
113
|
+
# primarily only deal with a specific subscription.
|
114
|
+
#
|
115
|
+
# Returns the first subscription name.
|
116
|
+
def self.default_subscription
|
117
|
+
sites = request "sites"
|
118
|
+
sites.first
|
119
|
+
end
|
120
|
+
|
121
|
+
# Internal: Build the endpoint URI.
|
122
|
+
#
|
123
|
+
# By building the URI here, we ensure that it is consistent throughout the
|
124
|
+
# application and also allows a single point to update should it be
|
125
|
+
# needed.
|
126
|
+
#
|
127
|
+
# Returns a URI string.
|
128
|
+
def self.endpoint_uri
|
129
|
+
"#{AcquiaToolbelt::CLI::API::ENDPOINT}/#{AcquiaToolbelt::CLI::API::ENDPOINT_VERSION}"
|
130
|
+
end
|
131
|
+
|
132
|
+
# Internal: Check whether a proxy is in use.
|
133
|
+
#
|
134
|
+
# Return boolean based on whether HTTPS_PROXY is set.
|
135
|
+
def self.using_proxy?
|
136
|
+
ENV["HTTPS_PROXY"] ? true : false
|
137
|
+
end
|
138
|
+
|
139
|
+
# Internal: Show the error message from the response.
|
140
|
+
#
|
141
|
+
# If the API request fails, this will get the "message" and allow that to
|
142
|
+
# be outputted to the end user to be a little more helpful.
|
143
|
+
#
|
144
|
+
# Returns string of the message.
|
145
|
+
def self.display_error(response)
|
146
|
+
"Oops, an error occurred! Reason: #{response["message"]}"
|
147
|
+
end
|
148
|
+
|
149
|
+
# Internal: Ensure the response returns a HTTP 200.
|
150
|
+
#
|
151
|
+
# If the response status isn't a HTTP 200, we need to find out why. This
|
152
|
+
# helps identify the issues earlier on and will prevent extra API calls
|
153
|
+
# that won't complete.
|
154
|
+
#
|
155
|
+
# Returns false if the response code isn't a HTTP 200.
|
156
|
+
def self.is_successful_response?(response)
|
157
|
+
if response.status != 200
|
158
|
+
puts display_error(JSON.parse(response.body))
|
159
|
+
return
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "highline/import"
|
2
|
+
require "netrc"
|
3
|
+
require "acquia_toolbelt/cli"
|
4
|
+
|
5
|
+
module AcquiaToolbelt
|
6
|
+
class CLI
|
7
|
+
class Auth < AcquiaToolbelt::Thor
|
8
|
+
# Public: Login to an Acquia account.
|
9
|
+
#
|
10
|
+
# Save the login details in a netrc file for use for all authenticated
|
11
|
+
# requests.
|
12
|
+
#
|
13
|
+
# Returns a status message.
|
14
|
+
desc "login", "Login to your Acquia account."
|
15
|
+
def login
|
16
|
+
cli = HighLine.new
|
17
|
+
user = cli.ask("Enter your username: ")
|
18
|
+
password = cli.ask("Enter your password: ") { |q| q.echo = false }
|
19
|
+
|
20
|
+
# Update (or create if needed) the netrc file that will contain the user
|
21
|
+
# authentication details.
|
22
|
+
n = Netrc.read
|
23
|
+
n.new_item_prefix = "# This entry was added for connecting to the Acquia Cloud API\n"
|
24
|
+
n["cloudapi.acquia.com"] = user, password
|
25
|
+
n.save
|
26
|
+
|
27
|
+
ui.success "Your user credentials have been successfully set."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|