acquia_toolbelt 2.3.0 → 2.3.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.
- 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
|