fog-digitalocean 0.1.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 +7 -0
- data/.coveralls.yml +1 -0
- data/.document +3 -0
- data/.gitignore +30 -0
- data/.irbrc +82 -0
- data/.rubocop.yml +20 -0
- data/.rubocop_todo.yml +606 -0
- data/.travis.yml +35 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +276 -0
- data/CONTRIBUTORS.md +898 -0
- data/Gemfile +5 -0
- data/LICENSE.md +20 -0
- data/README.md +130 -0
- data/RELEASE.md +40 -0
- data/Rakefile +12 -0
- data/benchs/each_provider.sh +6 -0
- data/benchs/each_service.sh +6 -0
- data/benchs/fog_vs.rb +106 -0
- data/benchs/load_times.rb +37 -0
- data/benchs/params.rb +43 -0
- data/benchs/parse_vs_push.rb +67 -0
- data/bin/fog +78 -0
- data/fog-digitalocean.gemspec +61 -0
- data/gemfiles/Gemfile-edge +14 -0
- data/lib/fog/digitalocean.rb +1 -0
- data/lib/fog/digitalocean/CHANGELOG.md +6 -0
- data/lib/fog/digitalocean/compute.rb +109 -0
- data/lib/fog/digitalocean/core.rb +9 -0
- data/lib/fog/digitalocean/examples/getting_started.md +123 -0
- data/lib/fog/digitalocean/models/compute/flavor.rb +17 -0
- data/lib/fog/digitalocean/models/compute/flavors.rb +21 -0
- data/lib/fog/digitalocean/models/compute/image.rb +25 -0
- data/lib/fog/digitalocean/models/compute/images.rb +42 -0
- data/lib/fog/digitalocean/models/compute/region.rb +13 -0
- data/lib/fog/digitalocean/models/compute/regions.rb +21 -0
- data/lib/fog/digitalocean/models/compute/server.rb +170 -0
- data/lib/fog/digitalocean/models/compute/servers.rb +43 -0
- data/lib/fog/digitalocean/models/compute/ssh_key.rb +31 -0
- data/lib/fog/digitalocean/models/compute/ssh_keys.rb +40 -0
- data/lib/fog/digitalocean/models/paging_collection.rb +42 -0
- data/lib/fog/digitalocean/requests/compute/change_kernel.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/convert_to_snapshot.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/create_server.rb +93 -0
- data/lib/fog/digitalocean/requests/compute/create_ssh_key.rb +49 -0
- data/lib/fog/digitalocean/requests/compute/delete_ssh_key.rb +32 -0
- data/lib/fog/digitalocean/requests/compute/destroy_server.rb +35 -0
- data/lib/fog/digitalocean/requests/compute/disable_backups.rb +45 -0
- data/lib/fog/digitalocean/requests/compute/enable_ipv6.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/enable_private_networking.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/get_droplet_action.rb +36 -0
- data/lib/fog/digitalocean/requests/compute/get_image_details.rb +42 -0
- data/lib/fog/digitalocean/requests/compute/get_server_details.rb +84 -0
- data/lib/fog/digitalocean/requests/compute/get_ssh_key.rb +34 -0
- data/lib/fog/digitalocean/requests/compute/list_droplet_actions.rb +38 -0
- data/lib/fog/digitalocean/requests/compute/list_flavors.rb +132 -0
- data/lib/fog/digitalocean/requests/compute/list_images.rb +51 -0
- data/lib/fog/digitalocean/requests/compute/list_regions.rb +95 -0
- data/lib/fog/digitalocean/requests/compute/list_servers.rb +33 -0
- data/lib/fog/digitalocean/requests/compute/list_ssh_keys.rb +41 -0
- data/lib/fog/digitalocean/requests/compute/password_reset.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/power_cycle.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/power_off.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/power_on.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/reboot_server.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/rebuild.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/rename.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/resize.rb +48 -0
- data/lib/fog/digitalocean/requests/compute/restore.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/shutdown.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/snapshot.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/transfer_image.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/update_ssh_key.rb +46 -0
- data/lib/fog/digitalocean/requests/compute/upgrade.rb +44 -0
- data/lib/fog/digitalocean/service.rb +51 -0
- data/lib/fog/digitalocean/version.rb +5 -0
- data/spec/fog/account_spec.rb +14 -0
- data/spec/fog/billing_spec.rb +14 -0
- data/spec/fog/bin/atmos_spec.rb +33 -0
- data/spec/fog/bin/aws_spec.rb +98 -0
- data/spec/fog/bin/baremetalcloud_spec.rb +33 -0
- data/spec/fog/bin/bluebox_spec.rb +55 -0
- data/spec/fog/bin/brightbox_spec.rb +30 -0
- data/spec/fog/bin/clodo_spec.rb +9 -0
- data/spec/fog/bin/cloudsigma_spec.rb +9 -0
- data/spec/fog/bin/cloudstack_spec.rb +9 -0
- data/spec/fog/bin/digitalocean_spec.rb +9 -0
- data/spec/fog/bin/dnsimple_spec.rb +9 -0
- data/spec/fog/bin/dnsmadeeasy_spec.rb +9 -0
- data/spec/fog/bin/dreamhost_spec.rb +9 -0
- data/spec/fog/bin/dynect_spec.rb +9 -0
- data/spec/fog/bin/ecloud_spec.rb +10 -0
- data/spec/fog/bin/fogdocker_spec.rb +10 -0
- data/spec/fog/bin/glesys_spec.rb +10 -0
- data/spec/fog/bin/gogrid_spec.rb +10 -0
- data/spec/fog/bin/google_spec.rb +10 -0
- data/spec/fog/bin/ibm_spec.rb +10 -0
- data/spec/fog/bin/internetarchive_spec.rb +10 -0
- data/spec/fog/bin/joyent_spec.rb +10 -0
- data/spec/fog/bin/linode_spec.rb +10 -0
- data/spec/fog/bin/local_spec.rb +10 -0
- data/spec/fog/bin/ninefold_spec.rb +10 -0
- data/spec/fog/bin/opennebula_spec.rb +10 -0
- data/spec/fog/bin/openstack_spec.rb +10 -0
- data/spec/fog/bin/openvz_spec.rb +10 -0
- data/spec/fog/bin/ovirt_spec.rb +10 -0
- data/spec/fog/bin/powerdns_spec.rb +9 -0
- data/spec/fog/bin/profitbricks_spec.rb +10 -0
- data/spec/fog/bin/rackspace_spec.rb +10 -0
- data/spec/fog/bin/rage4_spec.rb +10 -0
- data/spec/fog/bin/riakcs_spec.rb +10 -0
- data/spec/fog/bin/sakuracloud_spec.rb +10 -0
- data/spec/fog/bin/serverlove_spec.rb +10 -0
- data/spec/fog/bin/softlayer_spec.rb +10 -0
- data/spec/fog/bin/stormondemand_spec.rb +10 -0
- data/spec/fog/bin/vcloud_spec.rb +10 -0
- data/spec/fog/bin/vclouddirector_spec.rb +10 -0
- data/spec/fog/bin/vmfusion_spec.rb +10 -0
- data/spec/fog/bin/voxel_spec.rb +10 -0
- data/spec/fog/bin/vsphere_spec.rb +10 -0
- data/spec/fog/bin/xenserver_spec.rb +10 -0
- data/spec/fog/bin/zerigo_spec.rb +10 -0
- data/spec/fog/bin_spec.rb +161 -0
- data/spec/fog/cdn_spec.rb +14 -0
- data/spec/fog/compute_spec.rb +19 -0
- data/spec/fog/dns_spec.rb +19 -0
- data/spec/fog/identity_spec.rb +14 -0
- data/spec/fog/image_spec.rb +14 -0
- data/spec/fog/metering_spec.rb +14 -0
- data/spec/fog/monitoring_spec.rb +14 -0
- data/spec/fog/network_spec.rb +14 -0
- data/spec/fog/orchestration_spec.rb +14 -0
- data/spec/fog/storage_spec.rb +14 -0
- data/spec/fog/support_spec.rb +14 -0
- data/spec/fog/volume_spec.rb +14 -0
- data/spec/fog/vpn_spec.rb +14 -0
- data/spec/fog/xml/connection_spec.rb +33 -0
- data/spec/helpers/bin.rb +34 -0
- data/spec/spec_helper.rb +18 -0
- data/tests/digitalocean/helper.rb +56 -0
- data/tests/digitalocean/requests/compute/list_flavors_tests.rb +25 -0
- data/tests/digitalocean/requests/compute/list_images_tests.rb +25 -0
- data/tests/digitalocean/requests/compute/list_regions_tests.rb +21 -0
- data/tests/digitalocean/requests/compute/server_tests.rb +77 -0
- data/tests/digitalocean/requests/compute_v2/list_ssh_keys_tests.rb +20 -0
- data/tests/helper.rb +25 -0
- data/tests/helpers/format_helper.rb +100 -0
- data/tests/helpers/mock_helper.rb +14 -0
- data/tests/helpers/succeeds_helper.rb +10 -0
- data/tests/lorem.txt +1 -0
- data/tests/watchr.rb +22 -0
- metadata +428 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Fog::Support do
|
|
4
|
+
Fog::Support.providers.each do |provider|
|
|
5
|
+
describe "when #{provider} is passed with no available credentials" do
|
|
6
|
+
it "returns ArgumentError" do
|
|
7
|
+
# Stub credentials so you still see errors where the tester really has credentials
|
|
8
|
+
Fog.stub :credentials, {} do
|
|
9
|
+
assert_raises(ArgumentError) { Fog::Support[provider] }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Fog::Volume do
|
|
4
|
+
Fog::Volume.providers.each do |provider|
|
|
5
|
+
describe "when #{provider} is passed with no available credentials" do
|
|
6
|
+
it "returns ArgumentError" do
|
|
7
|
+
# Stub credentials so you still see errors where the tester really has credentials
|
|
8
|
+
Fog.stub :credentials, {} do
|
|
9
|
+
assert_raises(ArgumentError) { Fog::Volume[provider] }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Fog::VPN do
|
|
4
|
+
Fog::VPN.providers.each do |provider|
|
|
5
|
+
describe "when #{provider} is passed with no available credentials" do
|
|
6
|
+
it "returns ArgumentError" do
|
|
7
|
+
# Stub credentials so you still see errors where the tester really has credentials
|
|
8
|
+
Fog.stub :credentials, {} do
|
|
9
|
+
assert_raises(ArgumentError) { Fog::VPN[provider] }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
# @note This is going to be part of fog-xml eventually
|
|
4
|
+
describe Fog::XML::Connection do
|
|
5
|
+
before do
|
|
6
|
+
@connection = Fog::XML::Connection.new("http://localhost")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
after do
|
|
10
|
+
Excon.stubs.clear
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "responds to #request" do
|
|
14
|
+
assert_respond_to @connection, :request
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "when request is passed a parser" do
|
|
18
|
+
it "returns the body after parsing" do
|
|
19
|
+
@parser = Fog::ToHashDocument.new
|
|
20
|
+
Excon.stub({}, { :status => 200, :body => "<xml></xml>" })
|
|
21
|
+
response = @connection.request(:parser => @parser, :mock => true)
|
|
22
|
+
assert_equal({ :xml => "" }, response.body)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "when request excludes a parser" do
|
|
27
|
+
it "returns the response body without change" do
|
|
28
|
+
Excon.stub({}, { :status => 200, :body => "<xml></xml>" })
|
|
29
|
+
response = @connection.request(:mock => true)
|
|
30
|
+
assert_equal("<xml></xml>", response.body)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/spec/helpers/bin.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module BinSpec
|
|
3
|
+
extend Minitest::Spec::DSL
|
|
4
|
+
|
|
5
|
+
it "responds to available?" do
|
|
6
|
+
assert_respond_to subject, :available?
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "responds to class_for" do
|
|
10
|
+
assert_respond_to subject, :class_for
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "#class_for raises ArgumentError for unknown services" do
|
|
14
|
+
assert_raises(ArgumentError) { subject.class_for(:unknown) }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "responds to collections" do
|
|
18
|
+
skip if subject == ::Google
|
|
19
|
+
assert_respond_to subject, :collections
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "responds to []" do
|
|
23
|
+
assert_respond_to subject, :[]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "#[] when unknown service is passed raises ArgumentError" do
|
|
27
|
+
assert_raises(ArgumentError) { subject[:bad_service] }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "responds to services" do
|
|
31
|
+
assert_respond_to subject, :services
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'coveralls'
|
|
2
|
+
Coveralls.wear!
|
|
3
|
+
|
|
4
|
+
if ENV["COVERAGE"]
|
|
5
|
+
require "simplecov"
|
|
6
|
+
|
|
7
|
+
SimpleCov.start do
|
|
8
|
+
add_filter "/spec/"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require "minitest/autorun"
|
|
13
|
+
require "minitest/spec"
|
|
14
|
+
require "minitest/stub_const"
|
|
15
|
+
|
|
16
|
+
$LOAD_PATH.unshift "lib"
|
|
17
|
+
|
|
18
|
+
require "fog/digitalocean"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
|
|
2
|
+
# Shortcut for Fog::Compute[:digitalocean]
|
|
3
|
+
def service
|
|
4
|
+
Fog::Compute[:digitalocean]
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def fog_test_server_attributes
|
|
8
|
+
# Hard coding numbers because requests from tests are sometimes failing.
|
|
9
|
+
# TODO: Mock properly instead
|
|
10
|
+
image = service.images.find { |i| i.name == 'Ubuntu 13.10 x64' }
|
|
11
|
+
image_id = image.nil? ? 1505447 : image.id
|
|
12
|
+
region = service.regions.find { |r| r.name == 'New York 1' }
|
|
13
|
+
region_id = region.nil? ? 4 : region.id
|
|
14
|
+
flavor = service.flavors.find { |r| r.name == '512MB' }
|
|
15
|
+
flavor_id = flavor.nil? ? 66 : flavor.id
|
|
16
|
+
|
|
17
|
+
{
|
|
18
|
+
:image_id => image_id,
|
|
19
|
+
:region_id => region_id,
|
|
20
|
+
:flavor_id => flavor_id
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def fog_server_name
|
|
25
|
+
"fog-server-test"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Create a long lived server for the tests
|
|
29
|
+
def fog_test_server
|
|
30
|
+
server = service.servers.find { |s| s.name == fog_server_name }
|
|
31
|
+
unless server
|
|
32
|
+
server = service.servers.create({
|
|
33
|
+
:name => fog_server_name
|
|
34
|
+
}.merge(fog_test_server_attributes))
|
|
35
|
+
server.wait_for { ready? }
|
|
36
|
+
end
|
|
37
|
+
server
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Destroy the long lived server
|
|
41
|
+
def fog_test_server_destroy
|
|
42
|
+
server = service.servers.find { |s| s.name == fog_server_name }
|
|
43
|
+
server.destroy if server
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
at_exit do
|
|
47
|
+
unless Fog.mocking? || Fog.credentials[:digitalocean_api_key].nil?
|
|
48
|
+
server = service.servers.find { |s| s.name == fog_server_name }
|
|
49
|
+
if server
|
|
50
|
+
server.wait_for(120) do
|
|
51
|
+
reload rescue nil; ready?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
fog_test_server_destroy
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Shindo.tests('Fog::Compute::DigitalOcean | list_flavors request', ['digitalocean', 'compute']) do
|
|
2
|
+
service = Fog::Compute.new(:provider => 'DigitalOcean')
|
|
3
|
+
|
|
4
|
+
size_format = {
|
|
5
|
+
'slug' => String,
|
|
6
|
+
'memory' => Integer,
|
|
7
|
+
'vcpus' => Integer,
|
|
8
|
+
'disk' => Integer,
|
|
9
|
+
'transfer' => Float,
|
|
10
|
+
'price_monthly' => Float,
|
|
11
|
+
'price_hourly' => Float,
|
|
12
|
+
'regions' => Array,
|
|
13
|
+
'available' => Fog::Boolean,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
tests('success') do
|
|
17
|
+
tests('#list_flavors') do
|
|
18
|
+
service.list_flavors.body['sizes'].each do |size|
|
|
19
|
+
tests('format').data_matches_schema(size_format) do
|
|
20
|
+
size
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Shindo.tests('Fog::Compute::DigitalOcean | list_images request', ['digitalocean', 'compute']) do
|
|
2
|
+
service = Fog::Compute.new(:provider => 'DigitalOcean')
|
|
3
|
+
|
|
4
|
+
image_format = {
|
|
5
|
+
'id' => Integer,
|
|
6
|
+
'name' => String,
|
|
7
|
+
'type' => String,
|
|
8
|
+
'distribution' => String,
|
|
9
|
+
'slug' => Fog::Nullable::String,
|
|
10
|
+
'public' => Fog::Boolean,
|
|
11
|
+
'regions' => Array,
|
|
12
|
+
'min_disk_size' => Fog::Nullable::Integer,
|
|
13
|
+
'created_at' => String,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
tests('success') do
|
|
17
|
+
tests('#list_images') do
|
|
18
|
+
service.list_images.body['images'].each do |image|
|
|
19
|
+
tests('format').data_matches_schema(image_format) do
|
|
20
|
+
image
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Shindo.tests('Fog::Compute::DigitalOcean | list_regions request', ['digitalocean', 'compute']) do
|
|
2
|
+
service = Fog::Compute.new(:provider => 'DigitalOcean')
|
|
3
|
+
|
|
4
|
+
region_format = {
|
|
5
|
+
'slug' => String,
|
|
6
|
+
'name' => String,
|
|
7
|
+
'sizes' => Array,
|
|
8
|
+
'available' => Fog::Boolean,
|
|
9
|
+
'features' => Array,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
tests('success') do
|
|
13
|
+
tests('#list_regions') do
|
|
14
|
+
service.list_regions.body['regions'].each do |region|
|
|
15
|
+
tests('format').data_matches_schema(region_format) do
|
|
16
|
+
region
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
Shindo.tests('Fog::Compute::DigitalOcean | create_server request', ['digitalocean', 'compute']) do
|
|
2
|
+
service = Fog::Compute.new(:provider => 'DigitalOcean')
|
|
3
|
+
|
|
4
|
+
server_format = {
|
|
5
|
+
'id' => Integer,
|
|
6
|
+
'name' => String,
|
|
7
|
+
'memory' => Integer,
|
|
8
|
+
'vcpus' => Integer,
|
|
9
|
+
'disk' => Integer,
|
|
10
|
+
'locked' => Fog::Boolean,
|
|
11
|
+
'created_at' => String,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
create_server_format = {
|
|
15
|
+
'droplet' => {
|
|
16
|
+
'id' => Integer,
|
|
17
|
+
'name' => String,
|
|
18
|
+
'memory' => Integer,
|
|
19
|
+
'vcpus' => Integer,
|
|
20
|
+
'disk' => Integer,
|
|
21
|
+
'locked' => Fog::Boolean,
|
|
22
|
+
'status' => String,
|
|
23
|
+
'kernel' => Hash,
|
|
24
|
+
"created_at" => String,
|
|
25
|
+
"features" => Array,
|
|
26
|
+
"backup_ids" => Array,
|
|
27
|
+
"snapshot_ids" => Array,
|
|
28
|
+
"image" => Hash,
|
|
29
|
+
"size" => Hash,
|
|
30
|
+
"size_slug" => String,
|
|
31
|
+
"networks" => Hash,
|
|
32
|
+
"region" => Hash,
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
'links' => {
|
|
36
|
+
"actions" => Array,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
tests('success') do
|
|
42
|
+
|
|
43
|
+
server_id = nil
|
|
44
|
+
server_name = "fog-#{Time.now.to_i.to_s}"
|
|
45
|
+
image = "ubuntu-14-04-x64"
|
|
46
|
+
region = "nyc3"
|
|
47
|
+
size = "512mb"
|
|
48
|
+
|
|
49
|
+
tests("#create_server(#{server_name}, #{size}, #{image}, #{region})").formats(create_server_format) do
|
|
50
|
+
body = service.create_server(server_name, size, image, region).body
|
|
51
|
+
server_id = body['droplet']['id']
|
|
52
|
+
body
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
test('#get_server_details can retrieve by id') do
|
|
56
|
+
body = service.get_server_details(server_id).body
|
|
57
|
+
tests('format').data_matches_schema(server_format) do
|
|
58
|
+
body['droplet']
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
server = service.servers.get(server_id)
|
|
63
|
+
server.wait_for { ready? }
|
|
64
|
+
|
|
65
|
+
tests('#delete_server').succeeds do
|
|
66
|
+
server.delete
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
tests('#list_servers') do
|
|
70
|
+
service.list_servers.body['droplets'].each do |droplet|
|
|
71
|
+
tests('format').data_matches_schema(server_format) do
|
|
72
|
+
droplet
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Shindo.tests('Fog::Compute::DigitalOceanV2 | list_ssh_keys request', ['digitalocean', 'compute']) do
|
|
2
|
+
service = Fog::Compute.new(:provider => 'DigitalOcean', :version => 'V2')
|
|
3
|
+
|
|
4
|
+
ssh_key_format = {
|
|
5
|
+
'id' => Integer,
|
|
6
|
+
'fingerprint' => String,
|
|
7
|
+
'public_key' => String,
|
|
8
|
+
'name' => String,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
tests('success') do
|
|
12
|
+
tests('#list_ssh_keys') do
|
|
13
|
+
service.list_ssh_keys.body['ssh_keys'].each do |ssh_key|
|
|
14
|
+
tests('format').data_matches_schema(ssh_key_format) do
|
|
15
|
+
ssh_key
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/tests/helper.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'coveralls'
|
|
2
|
+
Coveralls.wear!
|
|
3
|
+
|
|
4
|
+
require File.expand_path('../../lib/fog/digitalocean', __FILE__)
|
|
5
|
+
|
|
6
|
+
Bundler.require(:test)
|
|
7
|
+
|
|
8
|
+
Excon.defaults.merge!(:debug_request => true, :debug_response => true)
|
|
9
|
+
|
|
10
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'mock_helper'))
|
|
11
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'format_helper'))
|
|
12
|
+
|
|
13
|
+
# This overrides the default 600 seconds timeout during live test runs
|
|
14
|
+
unless Fog.mocking?
|
|
15
|
+
Fog.timeout = ENV['FOG_TEST_TIMEOUT'] || 2_000
|
|
16
|
+
Fog::Logger.warning "Setting default fog timeout to #{Fog.timeout} seconds"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def lorem_file
|
|
20
|
+
File.open(File.dirname(__FILE__) + '/lorem.txt', 'r')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def array_differences(array_a, array_b)
|
|
24
|
+
(array_a - array_b) | (array_b - array_a)
|
|
25
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
### Taken from https://github.com/fog/fog/blob/master/tests/helpers/formats_helper.rb
|
|
2
|
+
|
|
3
|
+
require "fog/schema/data_validator"
|
|
4
|
+
|
|
5
|
+
# format related hackery
|
|
6
|
+
# allows both true.is_a?(Fog::Boolean) and false.is_a?(Fog::Boolean)
|
|
7
|
+
# allows both nil.is_a?(Fog::Nullable::String) and ''.is_a?(Fog::Nullable::String)
|
|
8
|
+
module Fog
|
|
9
|
+
module Boolean; end
|
|
10
|
+
module Nullable
|
|
11
|
+
module Boolean; end
|
|
12
|
+
module Integer; end
|
|
13
|
+
module String; end
|
|
14
|
+
module Time; end
|
|
15
|
+
module Float; end
|
|
16
|
+
module Hash; end
|
|
17
|
+
module Array; end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
[FalseClass, TrueClass].each {|klass| klass.send(:include, Fog::Boolean)}
|
|
21
|
+
[FalseClass, TrueClass, NilClass, Fog::Boolean].each {|klass| klass.send(:include, Fog::Nullable::Boolean)}
|
|
22
|
+
[NilClass, String].each {|klass| klass.send(:include, Fog::Nullable::String)}
|
|
23
|
+
[NilClass, Time].each {|klass| klass.send(:include, Fog::Nullable::Time)}
|
|
24
|
+
[Integer, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Integer)}
|
|
25
|
+
[Float, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Float)}
|
|
26
|
+
[Hash, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Hash)}
|
|
27
|
+
[Array, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Array)}
|
|
28
|
+
|
|
29
|
+
module Shindo
|
|
30
|
+
class Tests
|
|
31
|
+
# Generates a Shindo test that compares a hash schema to the result
|
|
32
|
+
# of the passed in block returning true if they match.
|
|
33
|
+
#
|
|
34
|
+
# The schema that is passed in is a Hash or Array of hashes that
|
|
35
|
+
# have Classes in place of values. When checking the schema the
|
|
36
|
+
# value should match the Class.
|
|
37
|
+
#
|
|
38
|
+
# Strict mode will fail if the data has additional keys. Setting
|
|
39
|
+
# +strict+ to +false+ will allow additional keys to appear.
|
|
40
|
+
#
|
|
41
|
+
# @param [Hash] schema A Hash schema
|
|
42
|
+
# @param [Hash] options Options to change validation rules
|
|
43
|
+
# @option options [Boolean] :allow_extra_keys
|
|
44
|
+
# If +true+ does not fail when keys are in the data that are
|
|
45
|
+
# not specified in the schema. This allows new values to
|
|
46
|
+
# appear in API output without breaking the check.
|
|
47
|
+
# @option options [Boolean] :allow_optional_rules
|
|
48
|
+
# If +true+ does not fail if extra keys are in the schema
|
|
49
|
+
# that do not match the data. Not recommended!
|
|
50
|
+
# @yield Data to check with schema
|
|
51
|
+
#
|
|
52
|
+
# @example Using in a test
|
|
53
|
+
# Shindo.tests("comparing welcome data against schema") do
|
|
54
|
+
# data = {:welcome => "Hello" }
|
|
55
|
+
# data_matches_schema(:welcome => String) { data }
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
# comparing welcome data against schema
|
|
59
|
+
# + data matches schema
|
|
60
|
+
#
|
|
61
|
+
# @example Example schema
|
|
62
|
+
# {
|
|
63
|
+
# "id" => String,
|
|
64
|
+
# "ram" => Integer,
|
|
65
|
+
# "disks" => [
|
|
66
|
+
# {
|
|
67
|
+
# "size" => Float
|
|
68
|
+
# }
|
|
69
|
+
# ],
|
|
70
|
+
# "dns_name" => Fog::Nullable::String,
|
|
71
|
+
# "active" => Fog::Boolean,
|
|
72
|
+
# "created" => DateTime
|
|
73
|
+
# }
|
|
74
|
+
#
|
|
75
|
+
# @return [Boolean]
|
|
76
|
+
def data_matches_schema(schema, options = {})
|
|
77
|
+
test('data matches schema') do
|
|
78
|
+
validator = Fog::Schema::DataValidator.new
|
|
79
|
+
valid = validator.validate(yield, schema, options)
|
|
80
|
+
@message = validator.message unless valid
|
|
81
|
+
valid
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# @deprecated #formats is deprecated. Use #data_matches_schema instead
|
|
86
|
+
def formats(format, strict = true)
|
|
87
|
+
test('has proper format') do
|
|
88
|
+
if strict
|
|
89
|
+
options = {:allow_extra_keys => false, :allow_optional_rules => true}
|
|
90
|
+
else
|
|
91
|
+
options = {:allow_extra_keys => true, :allow_optional_rules => true}
|
|
92
|
+
end
|
|
93
|
+
validator = Fog::Schema::DataValidator.new
|
|
94
|
+
valid = validator.validate(yield, format, options)
|
|
95
|
+
@message = validator.message unless valid
|
|
96
|
+
valid
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|