lita-digitalocean 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,85 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Digitalocean::Domain, lita_handler: true do
4
+ it { routes_command("do domains create example.com 10.10.10.10").to(:create) }
5
+ it { routes_command("do domains delete example.com").to(:delete) }
6
+ it { routes_command("do domains list").to(:list) }
7
+ it { routes_command("do domains show example.com").to(:show) }
8
+
9
+ let(:client) { instance_double("::DigitalOcean::API", domains: client_domains) }
10
+ let(:client_domains) { instance_double("::DigitalOcean::Resource::Domain") }
11
+
12
+ before do
13
+ Lita.config.handlers.digitalocean = Lita::Config.new
14
+ Lita.config.handlers.digitalocean.tap do |config|
15
+ config.client_id = "CLIENT_ID"
16
+ config.api_key = "API_KEY"
17
+ end
18
+
19
+ allow(Lita::Authorization).to receive(:user_in_group?).with(
20
+ user,
21
+ :digitalocean_admins
22
+ ).and_return(true)
23
+
24
+ allow(::DigitalOcean::API).to receive(:new).and_return(client)
25
+ end
26
+
27
+ describe "#create" do
28
+ it "creates a new DNS record set" do
29
+ allow(client_domains).to receive(:create).with(
30
+ name: "example.com",
31
+ ip_address: "10.0.0.0"
32
+ ).and_return(status: "OK", domain: { id: 123, name: "example.com" })
33
+ send_command("do domains create example.com 10.0.0.0")
34
+ expect(replies.last).to eq("Created new DNS record set for example.com.")
35
+ end
36
+ end
37
+
38
+ describe "#delete" do
39
+ it "deletes a DNS record set" do
40
+ allow(client_domains).to receive(:delete).with("123").and_return(status: "OK")
41
+ send_command("do domains delete 123")
42
+ expect(replies.last).to eq("Deleted DNS record set.")
43
+ end
44
+ end
45
+
46
+ describe "#list" do
47
+ it "lists all DNS record sets" do
48
+ allow(client_domains).to receive(:list).and_return(
49
+ status: "OK",
50
+ domains: [{
51
+ id: 123,
52
+ name: "example.com"
53
+ }, {
54
+ id: 456,
55
+ name: "another.example.com"
56
+ }]
57
+ )
58
+ send_command("do domains list")
59
+ expect(replies).to eq([
60
+ "ID: 123, Name: example.com",
61
+ "ID: 456, Name: another.example.com"
62
+ ])
63
+ end
64
+ end
65
+
66
+ describe "#show" do
67
+ it "responds with the details of the DNS record set" do
68
+ allow(client_domains).to receive(:show).with("123").and_return(
69
+ status: "OK",
70
+ domain: {
71
+ id: 123,
72
+ name: "example.com",
73
+ ttl: 1800,
74
+ live_zone_file: "LZF",
75
+ error: nil,
76
+ zone_file_with_error: nil
77
+ }
78
+ )
79
+ send_command("do domains show 123")
80
+ expect(replies.last).to eq(
81
+ "ID: 123, Name: example.com, TTL: 1800, Live Zone File: LZF, Error: , Zone File With Error: "
82
+ )
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,238 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Digitalocean::Droplet, lita_handler: true do
4
+ it do
5
+ routes_command(
6
+ "do droplets create example.com 512mb centos-5-8-x64 nyc1"
7
+ ).to(:create)
8
+ end
9
+ it { routes_command("do droplets delete 123").to(:delete) }
10
+ it { routes_command("do droplets delete 123 --scrub").to(:delete) }
11
+ it { routes_command("do droplets list").to(:list) }
12
+ it { routes_command("do droplets password reset 123").to(:password_reset) }
13
+ it { routes_command("do droplets power cycle 123").to(:power_cycle) }
14
+ it { routes_command("do droplets power off 123").to(:power_off) }
15
+ it { routes_command("do droplets power on 123").to(:power_on) }
16
+ it { routes_command("do droplets reboot 123").to(:reboot) }
17
+ it { routes_command("do droplets rebuild 123 456").to(:rebuild) }
18
+ it { routes_command("do droplets resize 123 1gb").to(:resize) }
19
+ it { routes_command("do droplets restore 123 456").to(:restore) }
20
+ it { routes_command("do droplets show 123").to(:show) }
21
+ it { routes_command("do droplets shutdown 123").to(:shutdown) }
22
+ it { routes_command("do droplets snapshot 123 'My Snapshot'").to(:snapshot) }
23
+
24
+ let(:client) { instance_double("::DigitalOcean::API", droplets: client_droplets) }
25
+ let(:client_droplets) { instance_double("::DigitalOcean::Resource::Droplet") }
26
+
27
+ let(:do_ok) { { status: "OK" } }
28
+
29
+ before do
30
+ Lita.config.handlers.digitalocean = Lita::Config.new
31
+ Lita.config.handlers.digitalocean.tap do |config|
32
+ config.client_id = "CLIENT_ID"
33
+ config.api_key = "API_KEY"
34
+ end
35
+
36
+ allow(Lita::Authorization).to receive(:user_in_group?).with(
37
+ user,
38
+ :digitalocean_admins
39
+ ).and_return(true)
40
+
41
+ allow(::DigitalOcean::API).to receive(:new).and_return(client)
42
+ end
43
+
44
+ describe "#create" do
45
+ it "creates a new droplet using slugs" do
46
+ allow(client_droplets).to receive(:create).with(
47
+ name: "example.com",
48
+ size_slug: "512mb",
49
+ image_slug: "centos-5-8-x64",
50
+ region_slug: "nyc1"
51
+ ).and_return(status: "OK", droplet: { id: 123, name: "example.com" })
52
+ send_command("do droplets create example.com 512mb centos-5-8-x64 nyc1")
53
+ expect(replies.last).to eq("Created new droplet: 123 (example.com)")
54
+ end
55
+
56
+ it "creates a new droplet using IDs" do
57
+ allow(client_droplets).to receive(:create).with(
58
+ name: "example.com",
59
+ size_id: "1",
60
+ image_id: "2",
61
+ region_id: "3"
62
+ ).and_return(status: "OK", droplet: { id: 123, name: "example.com" })
63
+ send_command("do droplets create example.com 1 2 3")
64
+ expect(replies.last).to eq("Created new droplet: 123 (example.com)")
65
+ end
66
+
67
+ it "creates a new droplet with optional parameters" do
68
+ expect(client_droplets).to receive(:create).with(
69
+ hash_including(ssh_key_ids: "1,2,3", private_networking: true, backups_enabled: true)
70
+ ).and_return(status: "OK", droplet: { id: 123, name: "example.com" })
71
+ send_command <<-COMMAND.chomp
72
+ do droplets create example.com 1 2 3 --ssh-key-ids 1,2,3 --private-networking --backups_enabled
73
+ COMMAND
74
+ end
75
+ end
76
+
77
+ describe "#delete" do
78
+ it "deletes a droplet" do
79
+ allow(client_droplets).to receive(:delete).with("123", {}).and_return(do_ok)
80
+ send_command("do droplets delete 123")
81
+ expect(replies.last).to eq("Deleted droplet: 123")
82
+ end
83
+
84
+ it "scrubs the disk before deleting the droplet" do
85
+ allow(client_droplets).to receive(:delete).with(
86
+ "123", {
87
+ scrub_data: true
88
+ }).and_return(do_ok)
89
+ send_command("do droplets delete 123 --scrub")
90
+ end
91
+ end
92
+
93
+ describe "#list" do
94
+ let(:do_droplets) do
95
+ {
96
+ status: "OK",
97
+ droplets: [{
98
+ id: 123,
99
+ name: "image1",
100
+ ip_address: "1.2.3.4"
101
+ }, {
102
+ id: 456,
103
+ name: "image2",
104
+ ip_address: "5.6.7.8"
105
+ }]
106
+ }
107
+ end
108
+
109
+ it "lists all droplets" do
110
+ allow(client_droplets).to receive(:list).and_return(do_droplets)
111
+ send_command("do droplets list")
112
+ expect(replies).to eq([
113
+ "ID: 123, Name: image1, IP: 1.2.3.4",
114
+ "ID: 456, Name: image2, IP: 5.6.7.8"
115
+ ])
116
+ end
117
+ end
118
+
119
+ describe "#password_reset" do
120
+ it "resets the root password" do
121
+ allow(client_droplets).to receive(:password_reset).with("123").and_return(do_ok)
122
+ send_command("do droplets password reset 123")
123
+ expect(replies.last).to eq("Password reset for droplet: 123")
124
+ end
125
+ end
126
+
127
+ describe "#power_cycle" do
128
+ it "cycles the droplet's power" do
129
+ allow(client_droplets).to receive(:power_cycle).with("123").and_return(do_ok)
130
+ send_command("do droplets power cycle 123")
131
+ expect(replies.last).to eq("Power cycled for droplet: 123")
132
+ end
133
+ end
134
+
135
+ describe "#power_off" do
136
+ it "powers off the droplet" do
137
+ allow(client_droplets).to receive(:power_off).with("123").and_return(do_ok)
138
+ send_command("do droplets power off 123")
139
+ expect(replies.last).to eq("Powered off droplet: 123")
140
+ end
141
+ end
142
+
143
+ describe "#power_on" do
144
+ it "powers on the droplet" do
145
+ allow(client_droplets).to receive(:power_on).with("123").and_return(do_ok)
146
+ send_command("do droplets power on 123")
147
+ expect(replies.last).to eq("Powered on droplet: 123")
148
+ end
149
+ end
150
+
151
+ describe "#reboot" do
152
+ it "reboots the droplet" do
153
+ allow(client_droplets).to receive(:reboot).with("123").and_return(do_ok)
154
+ send_command("do droplets reboot 123")
155
+ expect(replies.last).to eq("Rebooted droplet: 123")
156
+ end
157
+ end
158
+
159
+ describe "#rebuild" do
160
+ it "rebuilds the droplet with the provided image" do
161
+ allow(client_droplets).to receive(:rebuild).with("123", image_id: "456").and_return(do_ok)
162
+ send_command("do droplets rebuild 123 456")
163
+ expect(replies.last).to eq("Rebuilt droplet: 123")
164
+ end
165
+ end
166
+
167
+ describe "#resize" do
168
+ it "resizes the droplet with the provided size ID" do
169
+ allow(client_droplets).to receive(:resize).with("123", size_id: "456").and_return(do_ok)
170
+ send_command("do droplets resize 123 456")
171
+ expect(replies.last).to eq("Resized droplet: 123")
172
+ end
173
+
174
+ it "resizes the droplet with the provided size slug" do
175
+ allow(client_droplets).to receive(:resize).with("123", size_slug: "1gb").and_return(do_ok)
176
+ send_command("do droplets resize 123 1gb")
177
+ expect(replies.last).to eq("Resized droplet: 123")
178
+ end
179
+ end
180
+
181
+ describe "#restore" do
182
+ it "restores the droplet to the provided image" do
183
+ allow(client_droplets).to receive(:restore).with("123", image_id: "456").and_return(do_ok)
184
+ send_command("do droplets restore 123 456")
185
+ expect(replies.last).to eq("Restored droplet: 123")
186
+ end
187
+ end
188
+
189
+ describe "#show" do
190
+ it "responds with the details of the droplet" do
191
+ allow(client_droplets).to receive(:show).with("123").and_return(
192
+ status: "OK",
193
+ droplet: {
194
+ id: 123,
195
+ image_id: 456,
196
+ name: "My Droplet",
197
+ region_id: 1,
198
+ size_id: 33,
199
+ backups_active: true,
200
+ backups: [],
201
+ snapshots: [],
202
+ ip_address: "1.2.3.4",
203
+ private_ip_address: "5.6.7.8",
204
+ locked: false,
205
+ status: "active"
206
+ }
207
+ )
208
+ send_command("do droplets show 123")
209
+ expect(replies.last).to eq <<-DROPLET.chomp
210
+ ID: 123, Image ID: 456, Name: My Droplet, Region ID: 1, Size ID: 33, Backups active: true, \
211
+ Backups: [], Snapshots: [], IP address: 1.2.3.4, Private IP address: 5.6.7.8, Locked: false, \
212
+ Status: active
213
+ DROPLET
214
+ end
215
+ end
216
+
217
+ describe "#shutdown" do
218
+ it "shuts down the droplet" do
219
+ allow(client_droplets).to receive(:shutdown).with("123").and_return(do_ok)
220
+ send_command("do droplets shutdown 123")
221
+ expect(replies.last).to eq("Shut down droplet: 123")
222
+ end
223
+ end
224
+
225
+ describe "#snapshot" do
226
+ it "takes a snapshot of the droplet" do
227
+ allow(client_droplets).to receive(:snapshot).with("123", {}).and_return(do_ok)
228
+ send_command("do droplets snapshot 123")
229
+ expect(replies.last).to eq("Snapshotted droplet: 123")
230
+ end
231
+
232
+ it "takes a named snapshot of the droplet" do
233
+ allow(client_droplets).to receive(:snapshot).with("123", name: "My Droplet").and_return(do_ok)
234
+ send_command("do droplets snapshot 123 'My Droplet'")
235
+ expect(replies.last).to eq("Snapshotted droplet: 123")
236
+ end
237
+ end
238
+ end
@@ -0,0 +1,121 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Digitalocean::Image, lita_handler: true do
4
+ it { routes_command("do images delete 123").to(:delete) }
5
+ it { routes_command("do images list").to(:list) }
6
+ it { routes_command("do images list filter").to(:list) }
7
+ it { routes_command("do images show 123").to(:show) }
8
+
9
+ let(:client) { instance_double("::DigitalOcean::API", images: client_images) }
10
+ let(:client_images) { instance_double("::DigitalOcean::Resource::Image") }
11
+
12
+ before do
13
+ Lita.config.handlers.digitalocean = Lita::Config.new
14
+ Lita.config.handlers.digitalocean.tap do |config|
15
+ config.client_id = "CLIENT_ID"
16
+ config.api_key = "API_KEY"
17
+ end
18
+
19
+ allow(Lita::Authorization).to receive(:user_in_group?).with(
20
+ user,
21
+ :digitalocean_admins
22
+ ).and_return(true)
23
+
24
+ allow(::DigitalOcean::API).to receive(:new).and_return(client)
25
+ end
26
+
27
+ let(:public_image) do
28
+ {
29
+ id: 1601,
30
+ name: "CentOS 5.8 x64",
31
+ slug: "centos-5-8-x64",
32
+ distribution: "CentOS",
33
+ public: true,
34
+ regions: [1, 2, 3, 4, 5, 6],
35
+ region_slugs: %w(nyc1 ams1 sfo1 nyc2 ams2 sgp1)
36
+ }
37
+ end
38
+
39
+ let(:public_image_message) do
40
+ <<-IMAGE.chomp
41
+ ID: 1601, Name: CentOS 5.8 x64, Slug: centos-5-8-x64, Distribution: CentOS, Public: true, \
42
+ Regions: [1,2,3,4,5,6], Region Slugs: [nyc1,ams1,sfo1,nyc2,ams2,sgp1]
43
+ IMAGE
44
+ end
45
+
46
+ let(:do_delete) { { status: "OK" } }
47
+
48
+ describe "#delete" do
49
+ it "responds with a success message" do
50
+ allow(client_images).to receive(:delete).with("123").and_return(do_delete)
51
+ send_command("do images delete 123")
52
+ expect(replies.last).to eq("Deleted image: 123")
53
+ end
54
+ end
55
+
56
+ describe "#list" do
57
+ let(:private_image) do
58
+ {
59
+ "id" => 1602,
60
+ name: "CentOS 5.8 x32",
61
+ slug: "centos-5-8-x32",
62
+ distribution: "CentOS",
63
+ public: false,
64
+ regions: [1, 2, 3],
65
+ region_slugs: %w(nyc1 ams1 sfo1)
66
+ }
67
+ end
68
+
69
+ let(:do_images) do
70
+ {
71
+ status: "OK",
72
+ images: [public_image, private_image]
73
+ }
74
+ end
75
+
76
+ let(:do_public_images) do
77
+ {
78
+ status: "OK",
79
+ images: [public_image]
80
+ }
81
+ end
82
+
83
+ let(:do_private_images) do
84
+ {
85
+ status: "OK",
86
+ images: [private_image]
87
+ }
88
+ end
89
+
90
+ let(:private_image_message) do
91
+ <<-IMAGE.chomp
92
+ ID: 1602, Name: CentOS 5.8 x32, Slug: centos-5-8-x32, Distribution: CentOS, Public: false, \
93
+ Regions: [1,2,3], Region Slugs: [nyc1,ams1,sfo1]
94
+ IMAGE
95
+ end
96
+
97
+ it "responds with a list of all available images" do
98
+ allow(client_images).to receive(:list).and_return(do_images)
99
+ send_command("do images list")
100
+ expect(replies).to eq([public_image_message, private_image_message])
101
+ end
102
+
103
+ it "responds with a list of only public images" do
104
+ allow(client_images).to receive(:list).with(
105
+ filter: "global"
106
+ ).and_return(do_public_images)
107
+ send_command("do images list global")
108
+ expect(replies.last).to eq(public_image_message)
109
+ end
110
+ end
111
+
112
+ describe "#show" do
113
+ it "responds with the details of the image" do
114
+ allow(client_images).to receive(:show).with("123").and_return(
115
+ { status: "OK", image: public_image }
116
+ )
117
+ send_command("do images show 123")
118
+ expect(replies.last).to eq(public_image_message)
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Digitalocean::Region, lita_handler: true do
4
+ it { routes_command("do regions list").to(:list) }
5
+
6
+ let(:client) { instance_double("::DigitalOcean::API", regions: client_regions) }
7
+ let(:client_regions) { instance_double("::DigitalOcean::Resource::Region") }
8
+
9
+ before do
10
+ Lita.config.handlers.digitalocean = Lita::Config.new
11
+ Lita.config.handlers.digitalocean.tap do |config|
12
+ config.client_id = "CLIENT_ID"
13
+ config.api_key = "API_KEY"
14
+ end
15
+
16
+ allow(Lita::Authorization).to receive(:user_in_group?).with(
17
+ user,
18
+ :digitalocean_admins
19
+ ).and_return(true)
20
+
21
+ allow(::DigitalOcean::API).to receive(:new).and_return(client)
22
+ end
23
+
24
+ let(:do_list) do
25
+ {
26
+ status: "OK",
27
+ regions: [
28
+ { id: 1, name: "New York 1", slug: "nyc1" },
29
+ { id: 2, name: "Amsterdam 1", slug: "ams1" }
30
+ ]
31
+ }
32
+ end
33
+
34
+ describe "#list" do
35
+ it "responds with a list of all regions" do
36
+ allow(client_regions).to receive(:list).and_return(do_list)
37
+ send_command("do regions list")
38
+ expect(replies).to eq ([
39
+ "ID: 1, Name: New York 1, Slug: nyc1",
40
+ "ID: 2, Name: Amsterdam 1, Slug: ams1"
41
+ ])
42
+ end
43
+ end
44
+ end