dawn-cli 0.9.1 → 0.10.0
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 +4 -4
- data/README.md +1 -3
- data/bin/dawni +15 -0
- data/lib/dawn/cli/commands.rb +9 -8
- data/lib/dawn/cli/commands/app.rb +35 -6
- data/lib/dawn/cli/commands/auth.rb +9 -7
- data/lib/dawn/cli/commands/base_commands.rb +31 -0
- data/lib/dawn/cli/commands/domain.rb +15 -5
- data/lib/dawn/cli/commands/drain.rb +15 -5
- data/lib/dawn/cli/commands/env.rb +25 -14
- data/lib/dawn/cli/commands/key.rb +20 -7
- data/lib/dawn/cli/commands/local.rb +13 -3
- data/lib/dawn/cli/commands/release.rb +6 -4
- data/lib/dawn/cli/helpers.rb +3 -5
- data/lib/dawn/cli/output_formatter.rb +15 -2
- data/lib/dawn/cli/parser.rb +58 -36
- data/lib/dawn/cli/version.rb +2 -2
- data/spec/api.log +45272 -0
- data/spec/cli/commands/app_spec.rb +71 -0
- data/spec/cli/commands/auth_spec.rb +13 -0
- data/spec/cli/commands/domain_spec.rb +25 -0
- data/spec/cli/commands/drain_spec.rb +25 -0
- data/spec/cli/commands/env_spec.rb +26 -0
- data/spec/cli/commands/key_spec.rb +30 -0
- data/spec/cli/commands/local_spec.rb +15 -0
- data/spec/cli/commands/release_spec.rb +19 -0
- data/spec/cli/parser_spec.rb +262 -0
- data/spec/cli_spec_helper.rb +13 -0
- data/spec/support/vcr.rb +11 -0
- data/spec/vcr/Dawn_CLI_App/_create/should_create_a_new_app_with_a_name.yml +51 -0
- data/spec/vcr/Dawn_CLI_App/_create/should_create_a_new_app_without_a_name.yml +51 -0
- data/spec/vcr/Dawn_CLI_App/_delete/should_delete_current_app.yml +98 -0
- data/spec/vcr/Dawn_CLI_App/_list/should_list_all_available_apps.yml +65 -0
- data/spec/vcr/Dawn_CLI_App/_list_gears/should_list_all_gears_for_current_app.yml +98 -0
- data/spec/vcr/Dawn_CLI_App/_logs/should_trail_the_current_app_s_logs.yml +98 -0
- data/spec/vcr/Dawn_CLI_App/_scale/should_modify_the_formation_for_the_current_app.yml +98 -0
- data/spec/vcr/Dawn_CLI_Auth/_login/should_login_using_proper_credentials.yml +48 -0
- data/spec/vcr/Dawn_CLI_Auth/_login/should_not_login_using_invalid_credentials.yml +46 -0
- data/spec/vcr/Dawn_CLI_Domain/_add/should_add_a_domain_to_the_current_app.yml +96 -0
- data/spec/vcr/Dawn_CLI_Domain/_delete/should_delete_a_domain_to_the_current_app.yml +97 -0
- data/spec/vcr/Dawn_CLI_Domain/_list/should_list_all_domains_for_current_app.yml +102 -0
- data/spec/vcr/Dawn_CLI_Drain/_add/should_add_a_drain_to_the_current_app.yml +359 -0
- data/spec/vcr/Dawn_CLI_Drain/_delete/should_remove_a_drain_from_current_app.yml +476 -0
- data/spec/vcr/Dawn_CLI_Drain/_list/should_list_all_drains_for_current_app.yml +98 -0
- data/spec/vcr/Dawn_CLI_Env/_get/should_retrieve_an_ENV_variable_given_a_key.yml +51 -0
- data/spec/vcr/Dawn_CLI_Env/_set/should_set_an_ENV_variable_given_a_Hash.yml +424 -0
- data/spec/vcr/Dawn_CLI_Env/_unset/should_remove_an_ENV_variable_given_a_key.yml +275 -0
- data/spec/vcr/Dawn_CLI_Key/_add/should_add_existing_id_rsa.yml +52 -0
- data/spec/vcr/Dawn_CLI_Key/_delete/should_delete_a_key_by_id.yml +101 -0
- data/spec/vcr/Dawn_CLI_Key/_get/should_retrieve_a_key_by_id.yml +102 -0
- data/spec/vcr/Dawn_CLI_Key/_list/should_list_all_keys_deployed.yml +53 -0
- data/spec/vcr/Dawn_CLI_Local/_health_check/should_verify_that_server_is_running.yml +50 -0
- data/spec/vcr/Dawn_CLI_Local/_whoami/should_print_current_user_to_console.yml +51 -0
- metadata +43 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb88fe1d21465c414f7484e29a1ea5c0b5707fce
|
4
|
+
data.tar.gz: ab4c46253f6b16ee661d6e80502ffc075087fea3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a0a7ddb400aa20f6e1159f6ddce03f2a337a7a435fa344b1b0a6f3d829a166047293d62d828cdb11dedbf5b71dd4a7a59323c6ac558082e9feb538016775552
|
7
|
+
data.tar.gz: 9bed41ab03f8752d942d738c8b52eda1e6fd8a5b2e6bfd0e8865f30223baef4a48c8dccf46f2c3e1c5e197fe067c80d4af1ebfd2fd79c36998f3feb5c61b345e
|
data/README.md
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
Dawn-CLI
|
2
2
|
========
|
3
|
-
[link](https://github.com/dawn/dawn-cli)
|
4
|
-
|
5
3
|
[](https://gemnasium.com/dawn/dawn-cli)
|
6
4
|
[](http://badge.fury.io/rb/dawn-cli)
|
7
5
|
[](https://codeclimate.com/github/dawn/dawn-cli)
|
8
6
|
|
9
|
-
CLI for [Dawn](https://github.com/dawn/dawn)
|
7
|
+
[CLI](https://github.com/dawn/dawn-cli) for [Dawn](https://github.com/dawn/dawn)
|
10
8
|
|
11
9
|
If you are looking for the ruby API
|
12
10
|
[Dawn-API](https://github.com/dawn/dawn-api)
|
data/bin/dawni
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'dawn/cli'
|
3
|
+
|
4
|
+
line_number = 1
|
5
|
+
loop do
|
6
|
+
print("~dawn %03d> " % line_number)
|
7
|
+
line = gets.chomp
|
8
|
+
argv = line.split(" ")
|
9
|
+
break if %w[quit exit].include?(argv.first)
|
10
|
+
begin
|
11
|
+
Dawn::CLI.run argv
|
12
|
+
rescue SystemExit # any form of abort
|
13
|
+
end
|
14
|
+
line_number += 1
|
15
|
+
end
|
data/lib/dawn/cli/commands.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
require 'dawn/cli/commands/
|
2
|
-
require 'dawn/cli/commands/
|
3
|
-
require 'dawn/cli/commands/
|
4
|
-
require 'dawn/cli/commands/
|
5
|
-
require 'dawn/cli/commands/
|
6
|
-
require 'dawn/cli/commands/
|
7
|
-
require 'dawn/cli/commands/
|
8
|
-
require 'dawn/cli/commands/
|
1
|
+
require 'dawn/cli/commands/base_commands' #
|
2
|
+
require 'dawn/cli/commands/auth' # Netrc setup and login command
|
3
|
+
require 'dawn/cli/commands/app' # App management
|
4
|
+
require 'dawn/cli/commands/drain' # App Drains management
|
5
|
+
require 'dawn/cli/commands/env' # App ENV management
|
6
|
+
require 'dawn/cli/commands/domain' # App Domains management
|
7
|
+
require 'dawn/cli/commands/key' # Key management
|
8
|
+
require 'dawn/cli/commands/local' # Various functions
|
9
|
+
require 'dawn/cli/commands/release' # App Releases functions
|
@@ -1,12 +1,15 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
|
+
require "json"
|
2
3
|
|
3
4
|
module Dawn
|
4
5
|
module CLI
|
5
6
|
module App
|
7
|
+
extend Dawn::CLI::BaseCommands
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
###
|
9
10
|
# "Create a new dawn App (with git; setup)"
|
11
|
+
# @param [String] appname
|
12
|
+
###
|
10
13
|
def self.create(appname=nil)
|
11
14
|
app = try_create_app appname
|
12
15
|
# since its possible for dawn to create a new app, with a random name
|
@@ -16,12 +19,18 @@ module Dawn
|
|
16
19
|
say "\tAPP\t#{app.name}"
|
17
20
|
end
|
18
21
|
|
22
|
+
###
|
19
23
|
# "Displays a list of all the apps you have deployed to dawn"
|
24
|
+
###
|
20
25
|
def self.list
|
21
26
|
say format_apps(Dawn::App.all)
|
22
27
|
end
|
23
28
|
|
29
|
+
###
|
24
30
|
# "Modify the gears of the current app"
|
31
|
+
# @param [Hash<String, Array[String, Integer]>] modifiers
|
32
|
+
# EG. { "web" => ["+", 1] }
|
33
|
+
###
|
25
34
|
def self.scale(modifiers)
|
26
35
|
app = current_app
|
27
36
|
|
@@ -43,7 +52,9 @@ module Dawn
|
|
43
52
|
app.scale(app: { formation: formation })
|
44
53
|
end
|
45
54
|
|
55
|
+
###
|
46
56
|
# "Deletes the app on dawn"
|
57
|
+
###
|
47
58
|
def self.delete
|
48
59
|
app = current_app
|
49
60
|
|
@@ -51,19 +62,23 @@ module Dawn
|
|
51
62
|
git_remove_dawn_remote app
|
52
63
|
end
|
53
64
|
|
65
|
+
###
|
54
66
|
# "Prints the App's log to STDOUT"
|
55
|
-
|
67
|
+
# @param [Array<String>] filters
|
68
|
+
# @param [Boolean] follow
|
69
|
+
###
|
70
|
+
def self.logs(filters, follow=false)
|
56
71
|
# this is the only method which requires the uri & net/http
|
57
72
|
require 'uri'
|
58
73
|
require 'net/http'
|
59
74
|
|
75
|
+
app = current_app
|
76
|
+
|
60
77
|
filter_regex = %r{\A(?<timestamp>\S+)\s(?<token>\S+)\[(?<proc_id>\S+)\]\:(?<message>.*)}
|
61
78
|
timestamp_regex = %r{(?<year>\d+)-(?<month>\d+)-(?<day>\d+)T(?<hour>\d+)\:(?<minute>\d+)\:(?<second>\d+)\.(?<other>.*)}
|
62
79
|
|
63
80
|
opts = {}
|
64
81
|
opts[:tail] = follow
|
65
|
-
filters = args
|
66
|
-
app = current_app
|
67
82
|
url = app.logs(opts)
|
68
83
|
uri = URI.parse(url)
|
69
84
|
|
@@ -97,7 +112,9 @@ module Dawn
|
|
97
112
|
end
|
98
113
|
end
|
99
114
|
|
115
|
+
###
|
100
116
|
# "Lists all currently running Gears"
|
117
|
+
###
|
101
118
|
def self.list_gears
|
102
119
|
app = current_app
|
103
120
|
gears = app.gears.all.sort_by(&:number)
|
@@ -113,10 +130,22 @@ module Dawn
|
|
113
130
|
end
|
114
131
|
end
|
115
132
|
|
133
|
+
###
|
134
|
+
# "Restart the current app"
|
135
|
+
###
|
116
136
|
def self.restart
|
117
137
|
current_app.restart
|
118
138
|
end
|
119
139
|
|
140
|
+
###
|
141
|
+
# "run a command in the current_app"
|
142
|
+
# @param [Array<String>] argv
|
143
|
+
###
|
144
|
+
def self.run(argv)
|
145
|
+
current_app.run(command: argv.join(" "))
|
146
|
+
rescue Excon::Errors::BadRequest => ex
|
147
|
+
handle_abort_exception("dawn run", ex)
|
148
|
+
end
|
120
149
|
end
|
121
150
|
end
|
122
151
|
end
|
@@ -1,19 +1,21 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
2
|
|
3
3
|
module Dawn
|
4
4
|
module CLI
|
5
5
|
module Auth
|
6
|
+
extend Dawn::CLI::BaseCommands
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
###
|
9
9
|
# "save login details to .netrc"
|
10
|
-
#
|
11
|
-
#
|
10
|
+
# @param [String] username
|
11
|
+
# @param [String] password
|
12
|
+
###
|
12
13
|
def self.login(username, password)
|
13
14
|
Dawn.authenticate(username: username, password: password)
|
14
|
-
say "
|
15
|
+
say "\tLOGIN details have been saved to your ~/.netrc"
|
16
|
+
rescue Excon::Errors::BadRequest
|
17
|
+
abort "dawn login: Login has failed, check your username and password"
|
15
18
|
end
|
16
|
-
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "dawn/cli/helpers"
|
2
|
+
|
3
|
+
module Dawn
|
4
|
+
module CLI
|
5
|
+
module BaseCommands
|
6
|
+
include Dawn::CLI::Helpers
|
7
|
+
|
8
|
+
###
|
9
|
+
# @param [Symbol] sym
|
10
|
+
# @param [Array<Objects>] *args
|
11
|
+
###
|
12
|
+
def command(sym, *args, &block)
|
13
|
+
if Dawn::CLI.no_operation
|
14
|
+
say "#{self}.#{sym}(#{args.map(&:inspect).join(", ")})"
|
15
|
+
else
|
16
|
+
send(sym, *args, &block)
|
17
|
+
end
|
18
|
+
sym
|
19
|
+
end
|
20
|
+
|
21
|
+
def handle_abort_exception(basename, ex)
|
22
|
+
error_obj = JSON.load(ex.response.body) rescue nil
|
23
|
+
if error_obj
|
24
|
+
abort "#{basename}: (#{error_obj["id"]}) #{error_obj["message"]} #{error_obj["error"]}"
|
25
|
+
else
|
26
|
+
abort "#{basename}: has failed for some unknown reason"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,26 +1,36 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
2
|
|
3
3
|
module Dawn
|
4
4
|
module CLI
|
5
5
|
module Domain
|
6
|
+
extend Dawn::CLI::BaseCommands
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
###
|
9
9
|
# "List all domains for the current app"
|
10
|
+
###
|
10
11
|
def self.list
|
11
12
|
say format_domains(current_app.domains.all)
|
12
13
|
end
|
13
14
|
|
15
|
+
###
|
14
16
|
# "Add a new domain to the current app"
|
17
|
+
# @param [String] url
|
18
|
+
###
|
15
19
|
def self.add(url)
|
16
20
|
current_app.domains.create(domain: { url: url })
|
21
|
+
rescue Excon::Errors::Conflict => ex
|
22
|
+
handle_abort_exception("dawn domain add", ex)
|
17
23
|
end
|
18
24
|
|
25
|
+
###
|
19
26
|
# "Remove an existing domain from the current app"
|
27
|
+
# @param [String] url
|
28
|
+
###
|
20
29
|
def self.delete(url)
|
21
|
-
current_app.domains.
|
30
|
+
current_app.domains.destroy(url: url)
|
31
|
+
rescue Excon::Errors::NotFound => ex
|
32
|
+
handle_abort_exception("dawn domain delete", ex)
|
22
33
|
end
|
23
|
-
|
24
34
|
end
|
25
35
|
end
|
26
36
|
end
|
@@ -1,26 +1,36 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
2
|
|
3
3
|
module Dawn
|
4
4
|
module CLI
|
5
5
|
module Drain
|
6
|
+
extend Dawn::CLI::BaseCommands
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
###
|
9
9
|
# "List all drains for the current app"
|
10
|
+
###
|
10
11
|
def self.list
|
11
12
|
say format_drains(current_app.drains.all)
|
12
13
|
end
|
13
14
|
|
15
|
+
###
|
14
16
|
# "Add a new drain to the current app"
|
17
|
+
# @param [String] url
|
18
|
+
###
|
15
19
|
def self.add(url)
|
16
20
|
current_app.drains.create(drain: { url: url })
|
21
|
+
rescue Excon::Errors::Conflict => ex
|
22
|
+
handle_abort_exception("dawn drain add", ex)
|
17
23
|
end
|
18
24
|
|
25
|
+
###
|
19
26
|
# "Remove an existing drain from the current app"
|
27
|
+
# @param [String] url
|
28
|
+
###
|
20
29
|
def self.delete(url)
|
21
|
-
current_app.drains.
|
30
|
+
current_app.drains.destroy(url: url)
|
31
|
+
rescue Excon::Errors::NotFound => ex
|
32
|
+
handle_abort_exception("dawn drain delete", ex)
|
22
33
|
end
|
23
|
-
|
24
34
|
end
|
25
35
|
end
|
26
36
|
end
|
@@ -1,43 +1,54 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
2
|
|
3
3
|
module Dawn
|
4
4
|
module CLI
|
5
5
|
module Env
|
6
|
+
extend Dawn::CLI::BaseCommands
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
###
|
9
|
+
# "Displays all the current app's ENV variables"
|
10
|
+
###
|
10
11
|
def self.list
|
11
12
|
current_app.env.each do |k, v|
|
12
13
|
say "#{k}=#{v}"
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
17
|
+
###
|
16
18
|
# "Get an ENV var"
|
19
|
+
###
|
17
20
|
def self.get(*keys)
|
18
|
-
|
19
|
-
env = app.env
|
21
|
+
env = current_app.env
|
20
22
|
keys.each do |k|
|
21
23
|
say "#{k}=#{env[k]}"
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
27
|
+
###
|
25
28
|
# "Set multiple ENV variables"
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
# @param [Hash<String, String>] env
|
30
|
+
###
|
31
|
+
def self.set(env)
|
32
|
+
appenv = current_app.env
|
33
|
+
appenv.update(appenv.merge(env)) # this is a Hash method
|
34
|
+
appenv.save # this is an API method
|
35
|
+
rescue Excon::Errors::BadRequest => ex
|
36
|
+
handle_abort_exception("dawn env set", ex)
|
30
37
|
end
|
31
38
|
|
39
|
+
###
|
32
40
|
# "Deletes an ENV var"
|
41
|
+
# @param [Array<String>] *keys
|
42
|
+
###
|
33
43
|
def self.unset(*keys)
|
34
|
-
|
44
|
+
env = current_app.env
|
35
45
|
keys.each do |k|
|
36
|
-
|
46
|
+
env.delete(k)
|
37
47
|
end
|
38
|
-
|
48
|
+
env.save
|
49
|
+
rescue Excon::Errors::BadRequest => ex
|
50
|
+
handle_abort_exception("dawn env unset", ex)
|
39
51
|
end
|
40
|
-
|
41
52
|
end
|
42
53
|
end
|
43
54
|
end
|
@@ -1,34 +1,47 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
2
|
|
3
3
|
module Dawn
|
4
4
|
module CLI
|
5
5
|
module Key
|
6
|
+
extend Dawn::CLI::BaseCommands
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
###
|
9
9
|
# "Lists all your Keys currently on dawn"
|
10
|
+
###
|
10
11
|
def self.list
|
11
12
|
say format_keys(Dawn::Key.all)
|
12
13
|
end
|
13
14
|
|
15
|
+
###
|
14
16
|
# "Adds this machine's sshkey to Dawn"
|
17
|
+
###
|
15
18
|
def self.add
|
16
19
|
filename = File.join(Dir.home, ".ssh/id_rsa.pub")
|
17
20
|
pubkey = File.read filename
|
18
21
|
key = Dawn::Key.create(key: pubkey)
|
22
|
+
rescue Excon::Errors::UnprocessableEntity => ex
|
23
|
+
handle_abort_exception("dawn key add", ex)
|
19
24
|
end
|
20
25
|
|
26
|
+
###
|
21
27
|
# "Retrieve a Key by ID"
|
28
|
+
# @param [String] id
|
29
|
+
###
|
22
30
|
def self.get(id)
|
23
|
-
|
24
|
-
|
31
|
+
say Dawn::Key.find(id: id).key
|
32
|
+
rescue Excon::Errors::NotFound => ex
|
33
|
+
handle_abort_exception("dawn key get", ex)
|
25
34
|
end
|
26
35
|
|
36
|
+
###
|
27
37
|
# "Delete a Key by ID"
|
28
|
-
|
38
|
+
# @param [String] id
|
39
|
+
###
|
40
|
+
def self.delete(id)
|
29
41
|
Dawn::Key.destroy(id: id)
|
42
|
+
rescue Excon::Errors::NotFound => ex
|
43
|
+
handle_abort_exception("dawn key delete", ex)
|
30
44
|
end
|
31
|
-
|
32
45
|
end
|
33
46
|
end
|
34
47
|
end
|
@@ -1,15 +1,25 @@
|
|
1
|
-
require "dawn/cli/
|
1
|
+
require "dawn/cli/commands/base_commands"
|
2
2
|
|
3
3
|
module Dawn
|
4
4
|
module CLI
|
5
5
|
module Local
|
6
|
+
extend Dawn::CLI::BaseCommands
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
###
|
9
|
+
# "verify if server is running"
|
10
|
+
###
|
9
11
|
def self.health_check
|
10
12
|
Dawn::API.health_check
|
13
|
+
say "All is well"
|
11
14
|
end
|
12
15
|
|
16
|
+
###
|
17
|
+
# "print current username to console"
|
18
|
+
###
|
19
|
+
def self.whoami
|
20
|
+
account = Dawn::Account.current
|
21
|
+
say account.username
|
22
|
+
end
|
13
23
|
end
|
14
24
|
end
|
15
25
|
end
|