fog-digitalocean 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|