lita-digitalocean 0.0.1 → 1.0.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 +178 -6
- data/lib/lita-digitalocean.rb +18 -0
- data/lib/lita/handlers/digitalocean.rb +0 -147
- data/lib/lita/handlers/digitalocean/base.rb +62 -0
- data/lib/lita/handlers/digitalocean/domain.rb +61 -0
- data/lib/lita/handlers/digitalocean/domain_record.rb +99 -0
- data/lib/lita/handlers/digitalocean/droplet.rb +236 -0
- data/lib/lita/handlers/digitalocean/image.rb +68 -0
- data/lib/lita/handlers/digitalocean/region.rb +23 -0
- data/lib/lita/handlers/digitalocean/size.rb +23 -0
- data/lib/lita/handlers/digitalocean/ssh_key.rb +94 -0
- data/lita-digitalocean.gemspec +4 -3
- data/locales/en.yml +142 -5
- data/spec/lita/handlers/digitalocean/base_spec.rb +39 -0
- data/spec/lita/handlers/digitalocean/domain_record_spec.rb +118 -0
- data/spec/lita/handlers/digitalocean/domain_spec.rb +85 -0
- data/spec/lita/handlers/digitalocean/droplet_spec.rb +238 -0
- data/spec/lita/handlers/digitalocean/image_spec.rb +121 -0
- data/spec/lita/handlers/digitalocean/region_spec.rb +44 -0
- data/spec/lita/handlers/digitalocean/size_spec.rb +44 -0
- data/spec/lita/handlers/digitalocean/ssh_key_spec.rb +119 -0
- metadata +44 -8
- data/spec/lita/handlers/digitalocean_spec.rb +0 -130
@@ -0,0 +1,61 @@
|
|
1
|
+
module Lita
|
2
|
+
module Handlers
|
3
|
+
class Digitalocean < Handler
|
4
|
+
class Domain < Base
|
5
|
+
do_route /^do\s+domains?\s+create\s+[^\s]+\s+[^\s]+$/i, :create, {
|
6
|
+
t("help.domains.create_key") => t("help.domains.create_value")
|
7
|
+
}
|
8
|
+
|
9
|
+
do_route /^do\s+domains?\s+delete\s+[^\s]+$/i, :delete, {
|
10
|
+
t("help.domains.delete_key") => t("help.domains.delete_value")
|
11
|
+
}
|
12
|
+
|
13
|
+
do_route /^do\s+domains?\s+list$/i, :list, {
|
14
|
+
t("help.domains.list_key") => t("help.domains.list_value")
|
15
|
+
}
|
16
|
+
|
17
|
+
do_route /^do\s+domains?\s+show\s+[^\s]+$/i, :show, {
|
18
|
+
t("help.domains.show_key") => t("help.domains.show_value")
|
19
|
+
}
|
20
|
+
|
21
|
+
def create(response)
|
22
|
+
name, ip_address = response.args[2..3]
|
23
|
+
|
24
|
+
do_response = do_call(response) do |client|
|
25
|
+
client.domains.create(name: name, ip_address: ip_address)
|
26
|
+
end or return
|
27
|
+
|
28
|
+
response.reply(t("domains.create.created", do_response[:domain]))
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete(response)
|
32
|
+
do_response = do_call(response) do |client|
|
33
|
+
client.domains.delete(response.args[2])
|
34
|
+
end or return
|
35
|
+
|
36
|
+
response.reply(t("domains.delete.deleted"))
|
37
|
+
end
|
38
|
+
|
39
|
+
def list(response)
|
40
|
+
do_response = do_call(response) do |client|
|
41
|
+
client.domains.list
|
42
|
+
end or return
|
43
|
+
|
44
|
+
messages = do_response[:domains].map { |domain| t("domains.list.detail", domain) }
|
45
|
+
|
46
|
+
response.reply(*messages)
|
47
|
+
end
|
48
|
+
|
49
|
+
def show(response)
|
50
|
+
do_response = do_call(response) do |client|
|
51
|
+
client.domains.show(response.args[2])
|
52
|
+
end or return
|
53
|
+
|
54
|
+
response.reply(t("domains.show.details", do_response[:domain]))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Lita.register_handler(Domain)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Lita
|
2
|
+
module Handlers
|
3
|
+
class Digitalocean < Handler
|
4
|
+
class DomainRecord < Base
|
5
|
+
do_route /^do\s+domain\s+records?\s+create\s(?:[^\s]+\s+){2}[^\s]/i, :create, {
|
6
|
+
t("help.domain_records.create_key") => t("help.domain_records.create_value")
|
7
|
+
}, {
|
8
|
+
name: {},
|
9
|
+
priority: {},
|
10
|
+
port: {},
|
11
|
+
weight: {}
|
12
|
+
}
|
13
|
+
|
14
|
+
do_route /^do\s+domain\s+records?\s+delete\s+[^\s]+\s+\d+$/i, :delete, {
|
15
|
+
t("help.domain_records.delete_key") => t("help.domain_records.delete_value")
|
16
|
+
}
|
17
|
+
|
18
|
+
do_route /^do\s+domain\s+records?\s+edit\s+(?:[^\s]+\s+){3}[^\s]+/i, :edit, {
|
19
|
+
t("help.domain_records.edit_key") => t("help.domain_records.edit_value")
|
20
|
+
}, {
|
21
|
+
name: {},
|
22
|
+
priority: {},
|
23
|
+
port: {},
|
24
|
+
weight: {}
|
25
|
+
}
|
26
|
+
|
27
|
+
do_route /^do\s+domain\s+records?\s+list\s+[^\s]+$/i, :list, {
|
28
|
+
t("help.domain_records.list_key") => t("help.domain_records.list_value")
|
29
|
+
}
|
30
|
+
|
31
|
+
do_route /^do\s+domain\s+records?\s+show\s+[^\s]+\s+\d+$/i, :show, {
|
32
|
+
t("help.domain_records.show_key") => t("help.domain_records.show_value")
|
33
|
+
}
|
34
|
+
|
35
|
+
def create(response)
|
36
|
+
id, type, data = response.args[3..5]
|
37
|
+
|
38
|
+
params = {
|
39
|
+
data: data,
|
40
|
+
record_type: type
|
41
|
+
}.merge(response.extensions[:kwargs])
|
42
|
+
|
43
|
+
do_response = do_call(response) do |client|
|
44
|
+
client.domains.create_record(id, params)
|
45
|
+
end or return
|
46
|
+
|
47
|
+
response.reply(t("domain_records.create.created", do_response[:record]))
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(response)
|
51
|
+
id, record_id = response.args[3..4]
|
52
|
+
|
53
|
+
do_response = do_call(response) do |client|
|
54
|
+
client.domains.delete_record(id, record_id)
|
55
|
+
end or return
|
56
|
+
|
57
|
+
response.reply(t("domain_records.delete.deleted"))
|
58
|
+
end
|
59
|
+
|
60
|
+
def edit(response)
|
61
|
+
id, record_id, type, data = response.args[3..6]
|
62
|
+
|
63
|
+
params = {
|
64
|
+
data: data,
|
65
|
+
record_type: type
|
66
|
+
}.merge(response.extensions[:kwargs].reject { |_key, value| value.nil? })
|
67
|
+
|
68
|
+
do_response = do_call(response) do |client|
|
69
|
+
client.domains.edit_record(id, record_id, params)
|
70
|
+
end or return
|
71
|
+
|
72
|
+
response.reply(t("domain_records.edit.updated"))
|
73
|
+
end
|
74
|
+
|
75
|
+
def list(response)
|
76
|
+
do_response = do_call(response) do |client|
|
77
|
+
client.domains.list_records(response.args[3])
|
78
|
+
end or return
|
79
|
+
|
80
|
+
messages = do_response[:records].map { |record| t("domain_records.list.detail", record) }
|
81
|
+
|
82
|
+
response.reply(*messages)
|
83
|
+
end
|
84
|
+
|
85
|
+
def show(response)
|
86
|
+
id, record_id = response.args[3..4]
|
87
|
+
|
88
|
+
do_response = do_call(response) do |client|
|
89
|
+
client.domains.show_record(id, record_id)
|
90
|
+
end or return
|
91
|
+
|
92
|
+
response.reply(t("domain_records.show.details", do_response[:record]))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
Lita.register_handler(DomainRecord)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
module Lita
|
2
|
+
module Handlers
|
3
|
+
class Digitalocean < Handler
|
4
|
+
class Droplet < Base
|
5
|
+
do_route /^do\s+droplets?\s+create(?:\s+[^\s]+){4}/i, :create, {
|
6
|
+
t("help.droplets.create_key") => t("help.droplets.create_value")
|
7
|
+
}, {
|
8
|
+
backups_enabled: { boolean: true },
|
9
|
+
private_networking: { boolean: true },
|
10
|
+
ssh_key_ids: {}
|
11
|
+
}
|
12
|
+
|
13
|
+
do_route /^do\s+droplets?\s+delete\s+\d+/i, :delete, {
|
14
|
+
t("help.droplets.delete_key") => t("help.droplets.delete_value")
|
15
|
+
}, { scrub: { boolean: true } }
|
16
|
+
|
17
|
+
do_route /^do\s+droplets?\s+list$/i, :list, {
|
18
|
+
t("help.droplets.list_key") => t("help.droplets.list_value")
|
19
|
+
}
|
20
|
+
|
21
|
+
do_route /^do\s+droplets?\s+password\s+reset\s+\d+$/i, :password_reset, {
|
22
|
+
t("help.droplets.password_reset_key") => t("help.droplets.password_reset_value")
|
23
|
+
}
|
24
|
+
|
25
|
+
do_route /^do\s+droplets?\s+power\s+cycle\s+\d+$/i, :power_cycle, {
|
26
|
+
t("help.droplets.power_cycle_key") => t("help.droplets.power_cycle_value")
|
27
|
+
}
|
28
|
+
|
29
|
+
do_route /^do\s+droplets?\s+power\s+off\s+\d+$/i, :power_off, {
|
30
|
+
t("help.droplets.power_off_key") => t("help.droplets.power_off_value")
|
31
|
+
}
|
32
|
+
|
33
|
+
do_route /^do\s+droplets?\s+power\s+on\s+\d+$/i, :power_on, {
|
34
|
+
t("help.droplets.power_on_key") => t("help.droplets.power_on_value")
|
35
|
+
}
|
36
|
+
|
37
|
+
do_route /^do\s+droplets?\s+reboot\s+\d+$/i, :reboot, {
|
38
|
+
t("help.droplets.reboot_key") => t("help.droplets.reboot_value")
|
39
|
+
}
|
40
|
+
|
41
|
+
do_route /^do\s+droplets?\s+rebuild(?:\s+\d+){2}$/i, :rebuild, {
|
42
|
+
t("help.droplets.rebuild_key") => t("help.droplets.rebuild_value")
|
43
|
+
}
|
44
|
+
|
45
|
+
do_route /^do\s+droplets?\s+resize\s+\d+\s+[^\s]+$/i, :resize, {
|
46
|
+
t("help.droplets.resize_key") => t("help.droplets.resize_value")
|
47
|
+
}
|
48
|
+
|
49
|
+
do_route /^do\s+droplets?\s+restore(?:\s+\d+){2}$/i, :restore, {
|
50
|
+
t("help.droplets.restore_key") => t("help.droplets.restore_value")
|
51
|
+
}
|
52
|
+
|
53
|
+
do_route /^do\s+droplets?\s+show\s+\d+$/i, :show, {
|
54
|
+
t("help.droplets.show_key") => t("help.droplets.show_value")
|
55
|
+
}
|
56
|
+
|
57
|
+
do_route /^do\s+droplets?\s+shut\s*down\s+(\d+)$/i, :shutdown, {
|
58
|
+
t("help.droplets.shutdown_key") => t("help.droplets.shutdown_value")
|
59
|
+
}
|
60
|
+
|
61
|
+
do_route /^do\s+droplets?\s+snapshot\s+\d+/i, :snapshot, {
|
62
|
+
t("help.droplets.snapshot_key") => t("help.droplets.snapshot_value")
|
63
|
+
}
|
64
|
+
|
65
|
+
def create(response)
|
66
|
+
name, size, image, region = response.args[2..5]
|
67
|
+
kwargs = response.extensions[:kwargs].dup
|
68
|
+
kwargs.each { |k, v| kwargs.delete(k) if v.nil? }
|
69
|
+
|
70
|
+
numeric = /^\d+$/
|
71
|
+
|
72
|
+
size_key = size =~ numeric ? :size_id : :size_slug
|
73
|
+
image_key = image =~ numeric ? :image_id : :image_slug
|
74
|
+
region_key = region =~ numeric ? :region_id : :region_slug
|
75
|
+
|
76
|
+
options = {
|
77
|
+
name: name,
|
78
|
+
size_key => size,
|
79
|
+
image_key => image,
|
80
|
+
region_key => region
|
81
|
+
}.merge(kwargs)
|
82
|
+
|
83
|
+
do_response = do_call(response) do |client|
|
84
|
+
client.droplets.create(options)
|
85
|
+
end or return
|
86
|
+
|
87
|
+
response.reply(t("droplets.create.created", do_response[:droplet]))
|
88
|
+
end
|
89
|
+
|
90
|
+
def delete(response)
|
91
|
+
id = response.args[2]
|
92
|
+
options = {}
|
93
|
+
options[:scrub_data] = true if response.extensions[:kwargs][:scrub]
|
94
|
+
|
95
|
+
do_response = do_call(response) do |client|
|
96
|
+
client.droplets.delete(id, options)
|
97
|
+
end or return
|
98
|
+
|
99
|
+
response.reply(t("droplets.delete.deleted", id: id))
|
100
|
+
end
|
101
|
+
|
102
|
+
def list(response)
|
103
|
+
do_response = do_call(response) do |client|
|
104
|
+
client.droplets.list
|
105
|
+
end or return
|
106
|
+
|
107
|
+
messages = do_response[:droplets].map { |droplet| t("droplets.list.detail", droplet) }
|
108
|
+
|
109
|
+
response.reply(*messages)
|
110
|
+
end
|
111
|
+
|
112
|
+
def password_reset(response)
|
113
|
+
id = response.args[3]
|
114
|
+
|
115
|
+
do_response = do_call(response) do |client|
|
116
|
+
client.droplets.password_reset(id)
|
117
|
+
end or return
|
118
|
+
|
119
|
+
response.reply(t("droplets.password_reset.reset", id: id))
|
120
|
+
end
|
121
|
+
|
122
|
+
def power_cycle(response)
|
123
|
+
id = response.args[3]
|
124
|
+
|
125
|
+
do_response = do_call(response) do |client|
|
126
|
+
client.droplets.power_cycle(response.args[3])
|
127
|
+
end or return
|
128
|
+
|
129
|
+
response.reply(t("droplets.power_cycle.cycled", id: id))
|
130
|
+
end
|
131
|
+
|
132
|
+
def power_off(response)
|
133
|
+
id = response.args[3]
|
134
|
+
|
135
|
+
do_response = do_call(response) do |client|
|
136
|
+
client.droplets.power_off(response.args[3])
|
137
|
+
end or return
|
138
|
+
|
139
|
+
response.reply(t("droplets.power_off.powered_off", id: id))
|
140
|
+
end
|
141
|
+
|
142
|
+
def power_on(response)
|
143
|
+
id = response.args[3]
|
144
|
+
|
145
|
+
do_response = do_call(response) do |client|
|
146
|
+
client.droplets.power_on(response.args[3])
|
147
|
+
end or return
|
148
|
+
|
149
|
+
response.reply(t("droplets.power_on.powered_on", id: id))
|
150
|
+
end
|
151
|
+
|
152
|
+
def reboot(response)
|
153
|
+
id = response.args[2]
|
154
|
+
|
155
|
+
do_response = do_call(response) do |client|
|
156
|
+
client.droplets.reboot(response.args[2])
|
157
|
+
end or return
|
158
|
+
|
159
|
+
response.reply(t("droplets.reboot.rebooted", id: id))
|
160
|
+
end
|
161
|
+
|
162
|
+
def rebuild(response)
|
163
|
+
id, image_id = response.args[2..3]
|
164
|
+
|
165
|
+
do_response = do_call(response) do |client|
|
166
|
+
client.droplets.rebuild(id, image_id: image_id)
|
167
|
+
end or return
|
168
|
+
|
169
|
+
response.reply(t("droplets.rebuild.rebuilt", id: id))
|
170
|
+
end
|
171
|
+
|
172
|
+
def resize(response)
|
173
|
+
id, size = response.args[2..3]
|
174
|
+
size_key = size =~ /^\d+$/ ? :size_id : :size_slug
|
175
|
+
|
176
|
+
do_response = do_call(response) do |client|
|
177
|
+
client.droplets.resize(id, size_key => size)
|
178
|
+
end or return
|
179
|
+
|
180
|
+
response.reply(t("droplets.resize.resized", id: id))
|
181
|
+
end
|
182
|
+
|
183
|
+
def restore(response)
|
184
|
+
id, image_id = response.args[2..3]
|
185
|
+
|
186
|
+
do_response = do_call(response) do |client|
|
187
|
+
client.droplets.restore(id, image_id: image_id)
|
188
|
+
end or return
|
189
|
+
|
190
|
+
response.reply(t("droplets.restore.restored", id: id))
|
191
|
+
end
|
192
|
+
|
193
|
+
def show(response)
|
194
|
+
do_response = do_call(response) do |client|
|
195
|
+
client.droplets.show(response.args[2])
|
196
|
+
end or return
|
197
|
+
|
198
|
+
response.reply(t("droplets.show.details", formatted_droplet(do_response[:droplet])))
|
199
|
+
end
|
200
|
+
|
201
|
+
def shutdown(response)
|
202
|
+
id = response.matches[0][0]
|
203
|
+
|
204
|
+
do_response = do_call(response) do |client|
|
205
|
+
client.droplets.shutdown(id)
|
206
|
+
end or return
|
207
|
+
|
208
|
+
response.reply(t("droplets.shutdown.shut_down", id: id))
|
209
|
+
end
|
210
|
+
|
211
|
+
def snapshot(response)
|
212
|
+
id, name = response.args[2..3]
|
213
|
+
options = {}
|
214
|
+
options[:name] = name if name
|
215
|
+
|
216
|
+
do_response = do_call(response) do |client|
|
217
|
+
client.droplets.snapshot(id, options)
|
218
|
+
end or return
|
219
|
+
|
220
|
+
response.reply(t("droplets.snapshot.snapshotted", id: id))
|
221
|
+
end
|
222
|
+
|
223
|
+
private
|
224
|
+
|
225
|
+
def formatted_droplet(droplet)
|
226
|
+
Hashie::Mash.new droplet.merge(
|
227
|
+
formatted_backups: format_array(droplet[:backups]),
|
228
|
+
formatted_snapshots: format_array(droplet[:snapshots])
|
229
|
+
)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
Lita.register_handler(Droplet)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Lita
|
2
|
+
module Handlers
|
3
|
+
class Digitalocean < Handler
|
4
|
+
class Image < Base
|
5
|
+
do_route /^do\s+images?\s+delete\s+([^\s]+)$/i, :delete, {
|
6
|
+
t("help.images.delete_key") => t("help.images.delete_value")
|
7
|
+
}
|
8
|
+
|
9
|
+
do_route /^do\s+images?\s+list\s*.*$/i, :list, {
|
10
|
+
t("help.images.list_key") => t("help.images.list_value")
|
11
|
+
}
|
12
|
+
|
13
|
+
do_route /^do\s+images?\s+show\s([^\s]+)$/i, :show, {
|
14
|
+
t("help.images.show_key") => t("help.images.show_value")
|
15
|
+
}
|
16
|
+
|
17
|
+
def delete(response)
|
18
|
+
image_id = response.args[2]
|
19
|
+
|
20
|
+
do_response = do_call(response) do |client|
|
21
|
+
client.images.delete(image_id)
|
22
|
+
end or return
|
23
|
+
|
24
|
+
response.reply(t("images.delete.deleted", image_id: image_id))
|
25
|
+
end
|
26
|
+
|
27
|
+
def list(response)
|
28
|
+
filter = response.args[2]
|
29
|
+
normalized_filter = filter.to_s.downcase
|
30
|
+
options = {}
|
31
|
+
|
32
|
+
if filter && %(global my_images).include?(normalized_filter)
|
33
|
+
options[:filter] = normalized_filter
|
34
|
+
end
|
35
|
+
|
36
|
+
do_response = do_call(response) do |client|
|
37
|
+
client.images.list(options)
|
38
|
+
end or return
|
39
|
+
|
40
|
+
messages = do_response[:images].map { |image| t("images.details", formatted_image(image)) }
|
41
|
+
|
42
|
+
response.reply(*messages)
|
43
|
+
end
|
44
|
+
|
45
|
+
def show(response)
|
46
|
+
image_id = response.args[2]
|
47
|
+
|
48
|
+
do_response = do_call(response) do |client|
|
49
|
+
client.images.show(image_id)
|
50
|
+
end or return
|
51
|
+
|
52
|
+
response.reply(t("images.details", formatted_image(do_response[:image])))
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def formatted_image(image)
|
58
|
+
Hashie::Mash.new image.merge(
|
59
|
+
formatted_regions: format_array(image[:regions]),
|
60
|
+
formatted_region_slugs: format_array(image[:region_slugs])
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Lita.register_handler(Image)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|