fog 1.32.0 → 1.33.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +59 -0
- data/Gemfile +1 -0
- data/Rakefile +4 -4
- data/fog.gemspec +3 -2
- data/lib/fog/linode/requests/compute/avail_datacenters.rb +8 -7
- data/lib/fog/openstack.rb +1 -0
- data/lib/fog/openstack/compute.rb +7 -1
- data/lib/fog/openstack/core.rb +28 -54
- data/lib/fog/openstack/identity.rb +1 -0
- data/lib/fog/openstack/identity_v3.rb +10 -9
- data/lib/fog/openstack/models/baremetal/chassis.rb +3 -14
- data/lib/fog/openstack/models/baremetal/chassis_collection.rb +5 -5
- data/lib/fog/openstack/models/baremetal/driver.rb +2 -8
- data/lib/fog/openstack/models/baremetal/drivers.rb +3 -5
- data/lib/fog/openstack/models/baremetal/node.rb +3 -14
- data/lib/fog/openstack/models/baremetal/nodes.rb +4 -4
- data/lib/fog/openstack/models/baremetal/port.rb +3 -14
- data/lib/fog/openstack/models/baremetal/ports.rb +4 -4
- data/lib/fog/openstack/models/collection.rb +45 -0
- data/lib/fog/openstack/models/compute/address.rb +2 -2
- data/lib/fog/openstack/models/compute/addresses.rb +3 -5
- data/lib/fog/openstack/models/compute/aggregate.rb +2 -8
- data/lib/fog/openstack/models/compute/aggregates.rb +3 -5
- data/lib/fog/openstack/models/compute/availability_zone.rb +14 -0
- data/lib/fog/openstack/models/compute/availability_zones.rb +22 -0
- data/lib/fog/openstack/models/compute/flavor.rb +2 -8
- data/lib/fog/openstack/models/compute/flavors.rb +6 -6
- data/lib/fog/openstack/models/compute/host.rb +1 -1
- data/lib/fog/openstack/models/compute/hosts.rb +4 -6
- data/lib/fog/openstack/models/compute/image.rb +2 -8
- data/lib/fog/openstack/models/compute/images.rb +4 -6
- data/lib/fog/openstack/models/compute/key_pair.rb +2 -2
- data/lib/fog/openstack/models/compute/key_pairs.rb +3 -4
- data/lib/fog/openstack/models/compute/metadata.rb +3 -2
- data/lib/fog/openstack/models/compute/metadatum.rb +2 -2
- data/lib/fog/openstack/models/compute/network.rb +2 -2
- data/lib/fog/openstack/models/compute/networks.rb +3 -2
- data/lib/fog/openstack/models/compute/security_group.rb +2 -2
- data/lib/fog/openstack/models/compute/security_group_rule.rb +2 -2
- data/lib/fog/openstack/models/compute/security_group_rules.rb +2 -2
- data/lib/fog/openstack/models/compute/security_groups.rb +3 -5
- data/lib/fog/openstack/models/compute/server.rb +20 -1
- data/lib/fog/openstack/models/compute/servers.rb +9 -5
- data/lib/fog/openstack/models/compute/service.rb +2 -8
- data/lib/fog/openstack/models/compute/services.rb +4 -4
- data/lib/fog/openstack/models/compute/snapshot.rb +2 -8
- data/lib/fog/openstack/models/compute/snapshots.rb +5 -5
- data/lib/fog/openstack/models/compute/tenant.rb +2 -2
- data/lib/fog/openstack/models/compute/tenants.rb +3 -4
- data/lib/fog/openstack/models/compute/volume.rb +2 -8
- data/lib/fog/openstack/models/compute/volumes.rb +5 -5
- data/lib/fog/openstack/models/identity_v2/ec2_credential.rb +3 -9
- data/lib/fog/openstack/models/identity_v2/ec2_credentials.rb +3 -5
- data/lib/fog/openstack/models/identity_v2/role.rb +3 -3
- data/lib/fog/openstack/models/identity_v2/roles.rb +3 -5
- data/lib/fog/openstack/models/identity_v2/tenant.rb +5 -9
- data/lib/fog/openstack/models/identity_v2/tenants.rb +3 -5
- data/lib/fog/openstack/models/identity_v2/user.rb +2 -8
- data/lib/fog/openstack/models/identity_v2/users.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/domain.rb +5 -9
- data/lib/fog/openstack/models/identity_v3/domains.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/endpoint.rb +5 -9
- data/lib/fog/openstack/models/identity_v3/endpoints.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/group.rb +5 -9
- data/lib/fog/openstack/models/identity_v3/groups.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/os_credential.rb +3 -3
- data/lib/fog/openstack/models/identity_v3/os_credentials.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/policies.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/policy.rb +5 -9
- data/lib/fog/openstack/models/identity_v3/project.rb +5 -8
- data/lib/fog/openstack/models/identity_v3/projects.rb +21 -10
- data/lib/fog/openstack/models/identity_v3/role.rb +3 -8
- data/lib/fog/openstack/models/identity_v3/role_assignment.rb +3 -3
- data/lib/fog/openstack/models/identity_v3/role_assignments.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/roles.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/service.rb +3 -3
- data/lib/fog/openstack/models/identity_v3/services.rb +3 -5
- data/lib/fog/openstack/models/identity_v3/token.rb +3 -3
- data/lib/fog/openstack/models/identity_v3/tokens.rb +3 -3
- data/lib/fog/openstack/models/identity_v3/user.rb +3 -9
- data/lib/fog/openstack/models/identity_v3/users.rb +3 -5
- data/lib/fog/openstack/models/image/image.rb +2 -13
- data/lib/fog/openstack/models/image/images.rb +5 -5
- data/lib/fog/openstack/models/metering/resource.rb +2 -7
- data/lib/fog/openstack/models/metering/resources.rb +3 -3
- data/lib/fog/openstack/models/model.rb +44 -0
- data/lib/fog/openstack/models/network/floating_ip.rb +2 -7
- data/lib/fog/openstack/models/network/floating_ips.rb +3 -5
- data/lib/fog/openstack/models/network/lb_health_monitor.rb +2 -12
- data/lib/fog/openstack/models/network/lb_health_monitors.rb +3 -5
- data/lib/fog/openstack/models/network/lb_member.rb +2 -12
- data/lib/fog/openstack/models/network/lb_members.rb +3 -5
- data/lib/fog/openstack/models/network/lb_pool.rb +2 -12
- data/lib/fog/openstack/models/network/lb_pools.rb +3 -5
- data/lib/fog/openstack/models/network/lb_vip.rb +2 -12
- data/lib/fog/openstack/models/network/lb_vips.rb +3 -5
- data/lib/fog/openstack/models/network/network.rb +2 -12
- data/lib/fog/openstack/models/network/networks.rb +3 -5
- data/lib/fog/openstack/models/network/port.rb +2 -13
- data/lib/fog/openstack/models/network/ports.rb +3 -5
- data/lib/fog/openstack/models/network/router.rb +2 -13
- data/lib/fog/openstack/models/network/routers.rb +3 -5
- data/lib/fog/openstack/models/network/security_group.rb +2 -2
- data/lib/fog/openstack/models/network/security_group_rule.rb +2 -2
- data/lib/fog/openstack/models/network/security_group_rules.rb +3 -5
- data/lib/fog/openstack/models/network/security_groups.rb +3 -5
- data/lib/fog/openstack/models/network/subnet.rb +3 -14
- data/lib/fog/openstack/models/network/subnets.rb +3 -5
- data/lib/fog/openstack/models/orchestration/event.rb +2 -2
- data/lib/fog/openstack/models/orchestration/events.rb +5 -7
- data/lib/fog/openstack/models/orchestration/resource.rb +2 -2
- data/lib/fog/openstack/models/orchestration/resource_schemas.rb +2 -2
- data/lib/fog/openstack/models/orchestration/resources.rb +3 -5
- data/lib/fog/openstack/models/orchestration/stack.rb +3 -7
- data/lib/fog/openstack/models/orchestration/stacks.rb +5 -5
- data/lib/fog/openstack/models/orchestration/template.rb +2 -2
- data/lib/fog/openstack/models/orchestration/templates.rb +1 -1
- data/lib/fog/openstack/models/planning/plan.rb +2 -13
- data/lib/fog/openstack/models/planning/plans.rb +3 -5
- data/lib/fog/openstack/models/planning/role.rb +2 -8
- data/lib/fog/openstack/models/planning/roles.rb +3 -6
- data/lib/fog/openstack/models/storage/directories.rb +4 -6
- data/lib/fog/openstack/models/storage/directory.rb +2 -2
- data/lib/fog/openstack/models/storage/file.rb +15 -2
- data/lib/fog/openstack/models/storage/files.rb +7 -8
- data/lib/fog/openstack/models/volume/availability_zone.rb +13 -0
- data/lib/fog/openstack/models/volume/availability_zones.rb +17 -0
- data/lib/fog/openstack/models/volume/transfer.rb +36 -0
- data/lib/fog/openstack/models/volume/transfers.rb +38 -0
- data/lib/fog/openstack/models/volume/volume.rb +9 -8
- data/lib/fog/openstack/models/volume/volume_type.rb +2 -8
- data/lib/fog/openstack/models/volume/volume_types.rb +3 -6
- data/lib/fog/openstack/models/volume/volumes.rb +5 -6
- data/lib/fog/openstack/requests/compute/list_servers.rb +8 -5
- data/lib/fog/openstack/requests/compute/list_servers_detail.rb +9 -6
- data/lib/fog/openstack/requests/compute/list_zones.rb +6 -5
- data/lib/fog/openstack/requests/compute/list_zones_detailed.rb +55 -0
- data/lib/fog/openstack/requests/compute/shelve_offload_server.rb +24 -0
- data/lib/fog/openstack/requests/compute/shelve_server.rb +24 -0
- data/lib/fog/openstack/requests/compute/unshelve_server.rb +24 -0
- data/lib/fog/openstack/requests/identity_v3/get_project.rb +2 -2
- data/lib/fog/openstack/requests/network/create_subnet.rb +1 -1
- data/lib/fog/openstack/requests/network/update_subnet.rb +8 -7
- data/lib/fog/openstack/requests/volume/accept_transfer.rb +24 -0
- data/lib/fog/openstack/requests/volume/create_transfer.rb +27 -0
- data/lib/fog/openstack/requests/volume/delete_transfer.rb +17 -0
- data/lib/fog/openstack/requests/volume/extend_volume.rb +25 -0
- data/lib/fog/openstack/requests/volume/get_transfer_details.rb +17 -0
- data/lib/fog/openstack/requests/volume/list_transfers.rb +18 -0
- data/lib/fog/openstack/requests/volume/list_transfers_detailed.rb +18 -0
- data/lib/fog/openstack/requests/volume/list_zones.rb +32 -0
- data/lib/fog/openstack/storage.rb +3 -1
- data/lib/fog/openstack/volume.rb +16 -0
- data/lib/fog/rackspace/examples/compute_v2/create_network.rb +1 -1
- data/lib/fog/vcloud_director/generators/compute/edge_gateway_service_configuration.rb +31 -30
- data/lib/fog/vcloud_director/models/compute/task.rb +2 -2
- data/lib/fog/version.rb +1 -1
- data/lib/fog/vsphere/compute.rb +1 -0
- data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +1 -1
- data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +4 -3
- data/lib/fog/vsphere/requests/compute/list_clusters.rb +1 -1
- data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +2 -2
- data/lib/fog/vsphere/requests/compute/vm_clone.rb +101 -30
- data/lib/fog/vsphere/requests/compute/vm_execute.rb +47 -0
- data/lib/tasks/changelog_task.rb +1 -0
- data/spec/fog/openstack/identity_v3/{idv3.yml → common_setup.yml} +0 -0
- data/spec/fog/openstack/identity_v3/idv3_project_hier_crud_list.yml +1394 -0
- data/spec/fog/openstack/identity_v3_spec.rb +255 -196
- data/spec/fog/openstack/network/common_setup.yml +131 -0
- data/spec/fog/openstack/network/subnets_crud.yml +140 -0
- data/spec/fog/openstack/network_spec.rb +43 -0
- data/spec/fog/openstack/shared_context.rb +98 -0
- data/spec/fog/openstack/volume/{volume_common_setup.yml → common_setup.yml} +0 -0
- data/spec/fog/openstack/volume/volume_extend.yml +762 -0
- data/spec/fog/openstack/volume/volume_transfer_and_accept.yml +1078 -0
- data/spec/fog/openstack/volume/volume_transfer_and_delete.yml +695 -0
- data/spec/fog/openstack/volume_spec.rb +232 -67
- data/tests/openstack/models/storage/file_tests.rb +26 -0
- data/tests/openstack/requests/compute/availability_zone_tests.rb +18 -0
- data/tests/openstack/requests/compute/server_tests.rb +12 -0
- data/tests/openstack/requests/network/subnet_tests.rb +2 -2
- data/tests/openstack/requests/volume/availability_zone_tests.rb +13 -0
- data/tests/vcloud_director/requests/compute/edge_gateway_tests.rb +2 -2
- metadata +61 -26
- data/lib/fog/dynect.rb +0 -1
- data/lib/fog/dynect/core.rb +0 -26
- data/lib/fog/dynect/dns.rb +0 -157
- data/lib/fog/dynect/models/dns/record.rb +0 -67
- data/lib/fog/dynect/models/dns/records.rb +0 -48
- data/lib/fog/dynect/models/dns/zone.rb +0 -56
- data/lib/fog/dynect/models/dns/zones.rb +0 -25
- data/lib/fog/dynect/requests/dns/delete_record.rb +0 -55
- data/lib/fog/dynect/requests/dns/delete_zone.rb +0 -41
- data/lib/fog/dynect/requests/dns/get_all_records.rb +0 -56
- data/lib/fog/dynect/requests/dns/get_node_list.rb +0 -55
- data/lib/fog/dynect/requests/dns/get_record.rb +0 -83
- data/lib/fog/dynect/requests/dns/get_zone.rb +0 -57
- data/lib/fog/dynect/requests/dns/post_record.rb +0 -71
- data/lib/fog/dynect/requests/dns/post_session.rb +0 -43
- data/lib/fog/dynect/requests/dns/post_zone.rb +0 -70
- data/lib/fog/dynect/requests/dns/put_record.rb +0 -76
- data/lib/fog/dynect/requests/dns/put_zone.rb +0 -76
- data/tests/dynect/requests/dns/dns_tests.rb +0 -258
@@ -2,61 +2,69 @@ require 'fog/openstack/compute'
|
|
2
2
|
require 'fog/openstack/identity'
|
3
3
|
require 'fog/openstack/identity_v3'
|
4
4
|
require 'fog/openstack/volume'
|
5
|
-
|
6
|
-
|
7
|
-
require '
|
5
|
+
|
6
|
+
if RUBY_VERSION =~ /1.8/
|
7
|
+
require File.expand_path('../shared_context', __FILE__)
|
8
|
+
else
|
9
|
+
require_relative './shared_context'
|
10
|
+
end
|
8
11
|
|
9
12
|
RSpec.describe Fog::Volume::OpenStack do
|
10
13
|
|
14
|
+
include_context 'OpenStack specs with VCR'
|
11
15
|
before :all do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
16
|
+
setup_vcr_and_service(
|
17
|
+
:vcr_directory => 'spec/fog/openstack/volume',
|
18
|
+
:service_class => Fog::Volume::OpenStack
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def setup_test_object(options)
|
23
|
+
type = options.delete(:type)
|
24
|
+
case type
|
25
|
+
when :volume
|
26
|
+
puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
|
27
|
+
volume_name = options[:display_name]
|
28
|
+
# if this fails, cleanup this object (it was left over from a failed test run)
|
29
|
+
expect(@service.volumes.all(:display_name => volume_name).length).to be(0)
|
30
|
+
|
31
|
+
puts "Creating volume #{volume_name}..." if ENV['DEBUG_VERBOSE']
|
32
|
+
return @service.volumes.create(options)
|
28
33
|
|
29
|
-
|
30
|
-
|
31
|
-
|
34
|
+
when :transfer
|
35
|
+
puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
|
36
|
+
transfer_name = options[:name]
|
37
|
+
# if this fails, cleanup this object (it was left over from a failed test run)
|
38
|
+
expect(@service.transfers.all(:name => transfer_name).length).to be(0)
|
39
|
+
|
40
|
+
puts "Creating transfer #{transfer_name}..." if ENV['DEBUG_VERBOSE']
|
41
|
+
return @service.transfers.create(options)
|
32
42
|
|
33
|
-
if ENV['DEBUG']
|
34
|
-
config.ignore_request do |request|
|
35
|
-
false && !ENV['OS_AUTH_URL'].nil?
|
36
|
-
end
|
37
|
-
config.cassette_library_dir = "spec/debug"
|
38
|
-
config.default_cassette_options.merge! :record => :all
|
39
43
|
else
|
40
|
-
|
41
|
-
config.default_cassette_options = {:record => :none}
|
42
|
-
config.default_cassette_options.merge! :match_requests_on => [:method, :uri, :body] unless RUBY_VERSION =~ /1.8/ # Ruby 1.8.7 encodes JSON differently, which screws up request matching
|
43
|
-
end
|
44
|
+
raise ArgumentError, "don't know how to setup a test object of type #{type.inspect}"
|
44
45
|
end
|
46
|
+
end
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
+
def cleanup_test_object(collection, id)
|
49
|
+
# has the object already been deleted?
|
50
|
+
begin
|
51
|
+
object = collection.get(id)
|
52
|
+
rescue Fog::Compute::OpenStack::NotFound # "Compute", not "Volume"; see issue #3618
|
53
|
+
true
|
54
|
+
end
|
48
55
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
puts "Deleting object #{object.class} #{id}..." if ENV['DEBUG_VERBOSE']
|
57
|
+
object.destroy
|
58
|
+
|
59
|
+
# wait for the object to be deleted
|
60
|
+
Fog.wait_for do
|
61
|
+
begin
|
62
|
+
object = collection.get(id)
|
63
|
+
puts "Current status: #{object ? object.status : 'deleted'}" if ENV['DEBUG_VERBOSE']
|
64
|
+
false
|
65
|
+
rescue Fog::Compute::OpenStack::NotFound # "Compute", not "Volume"; see issue #3618
|
66
|
+
true
|
67
|
+
end
|
60
68
|
end
|
61
69
|
end
|
62
70
|
|
@@ -67,18 +75,13 @@ RSpec.describe Fog::Volume::OpenStack do
|
|
67
75
|
volume_description = 'This is the volume description.'
|
68
76
|
volume_size = 1 # in GB
|
69
77
|
|
70
|
-
# if any of these expectations fail, that means you have left-over
|
71
|
-
# objects from your previous failed test run
|
72
|
-
puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
|
73
|
-
expect(@service.volumes.all(:display_name => volume_name).length).to be 0
|
74
|
-
|
75
78
|
# create volume
|
76
|
-
|
77
|
-
volume_id = @service.volumes.create(
|
79
|
+
volume_id = setup_test_object(:type => :volume,
|
78
80
|
:display_name => volume_name,
|
79
81
|
:display_description => volume_description,
|
80
82
|
:size => volume_size
|
81
83
|
).id
|
84
|
+
|
82
85
|
expect(@service.volumes.all(:display_name => volume_name).length).to be 1
|
83
86
|
|
84
87
|
# check retrieval of volume by ID
|
@@ -99,8 +102,9 @@ RSpec.describe Fog::Volume::OpenStack do
|
|
99
102
|
puts "Retrieving volume by name..." if ENV['DEBUG_VERBOSE']
|
100
103
|
|
101
104
|
volumes = @service.volumes.all(:display_name => volume_name)
|
102
|
-
expect(volumes).to
|
105
|
+
expect(volumes.length).to be 1
|
103
106
|
volume = volumes[0]
|
107
|
+
expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
|
104
108
|
|
105
109
|
expect(volume.id).to eq(volume_id)
|
106
110
|
expect(volume.display_name).to eq(volume_name)
|
@@ -108,20 +112,7 @@ RSpec.describe Fog::Volume::OpenStack do
|
|
108
112
|
expect(volume.size).to eq(volume_size)
|
109
113
|
|
110
114
|
# delete volume
|
111
|
-
|
112
|
-
|
113
|
-
@service.delete_volume(volume_id)
|
114
|
-
|
115
|
-
Fog.wait_for do # wait for the volume to be deleted
|
116
|
-
begin
|
117
|
-
volume = @service.volumes.get(volume_id)
|
118
|
-
puts "Current volume status: #{volume ? volume.status : 'deleted'}" if ENV['DEBUG_VERBOSE']
|
119
|
-
false
|
120
|
-
rescue Fog::Compute::OpenStack::NotFound # FIXME: Why is this "Compute", not "Volume"? Copy-paste error?
|
121
|
-
true
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
115
|
+
cleanup_test_object(@service.volumes, volume_id)
|
125
116
|
end
|
126
117
|
end
|
127
118
|
|
@@ -159,6 +150,180 @@ RSpec.describe Fog::Volume::OpenStack do
|
|
159
150
|
end
|
160
151
|
end
|
161
152
|
|
153
|
+
it 'can extend volumes' do
|
154
|
+
VCR.use_cassette('volume_extend') do
|
155
|
+
|
156
|
+
volume_size_small = 1 # in GB
|
157
|
+
volume_size_large = 2 # in GB
|
158
|
+
|
159
|
+
volume = setup_test_object(:type => :volume,
|
160
|
+
:display_name => 'fog-testvolume-1',
|
161
|
+
:size => volume_size_small
|
162
|
+
)
|
163
|
+
volume.wait_for { ready? and size == volume_size_small }
|
164
|
+
|
165
|
+
# extend volume
|
166
|
+
puts "Extending volume..." if ENV['DEBUG_VERBOSE']
|
167
|
+
volume.extend(volume_size_large)
|
168
|
+
volume.wait_for { ready? and size == volume_size_large }
|
169
|
+
|
170
|
+
# shrinking is not allowed in OpenStack
|
171
|
+
puts "Shrinking volume should fail..." if ENV['DEBUG_VERBOSE']
|
172
|
+
expect { volume.extend(volume_size_small) }.to raise_error(Excon::Errors::BadRequest, /Invalid input received: New size for extend must be greater than current size./)
|
173
|
+
|
174
|
+
# delete volume
|
175
|
+
cleanup_test_object(@service.volumes, volume.id)
|
176
|
+
|
177
|
+
# check that extending a non-existing volume fails
|
178
|
+
puts "Extending deleted volume should fail..." if ENV['DEBUG_VERBOSE']
|
179
|
+
expect { @service.extend_volume(volume.id, volume_size_small) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'can create and accept volume transfers' do
|
184
|
+
VCR.use_cassette('volume_transfer_and_accept') do
|
185
|
+
|
186
|
+
transfer_name = 'fog-testtransfer-1'
|
187
|
+
|
188
|
+
# create volume object
|
189
|
+
volume = setup_test_object(:type => :volume,
|
190
|
+
:display_name => 'fog-testvolume-1',
|
191
|
+
:size => 1
|
192
|
+
)
|
193
|
+
volume.wait_for { ready? }
|
194
|
+
|
195
|
+
# create transfer object
|
196
|
+
transfer = setup_test_object(:type => :transfer,
|
197
|
+
:name => transfer_name,
|
198
|
+
:volume_id => volume.id
|
199
|
+
)
|
200
|
+
# we need to save the auth_key NOW, it's only present in the response
|
201
|
+
# from the create_transfer request
|
202
|
+
auth_key = transfer.auth_key
|
203
|
+
transfer_id = transfer.id
|
204
|
+
|
205
|
+
# check retrieval of transfer by ID
|
206
|
+
puts 'Retrieving transfer by ID...' if ENV['DEBUG_VERBOSE']
|
207
|
+
|
208
|
+
transfer = @service.transfers.get(transfer_id)
|
209
|
+
expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
|
210
|
+
|
211
|
+
expect(transfer.id).to eq(transfer_id)
|
212
|
+
expect(transfer.name).to eq(transfer_name)
|
213
|
+
expect(transfer.volume_id).to eq(volume.id)
|
214
|
+
|
215
|
+
# check retrieval of transfer by name
|
216
|
+
puts 'Retrieving transfer by name...' if ENV['DEBUG_VERBOSE']
|
217
|
+
|
218
|
+
transfers = @service.transfers.all(:name => transfer_name)
|
219
|
+
expect(transfers.length).to be(1)
|
220
|
+
transfer = transfers[0]
|
221
|
+
expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
|
222
|
+
|
223
|
+
expect(transfer.id).to eq(transfer_id)
|
224
|
+
expect(transfer.name).to eq(transfer_name)
|
225
|
+
expect(transfer.volume_id).to eq(volume.id)
|
226
|
+
|
227
|
+
# to accept the transfer, we need a second connection to a different project
|
228
|
+
puts 'Checking object visibility from different projects...' if ENV['DEBUG_VERBOSE']
|
229
|
+
other_service = Fog::Volume::OpenStack.new(
|
230
|
+
:openstack_auth_url => "#{@os_auth_url}/tokens",
|
231
|
+
:openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
|
232
|
+
:openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'devstack',
|
233
|
+
:openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
|
234
|
+
:openstack_tenant => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
|
235
|
+
)
|
236
|
+
|
237
|
+
# check that recipient cannot see the transfer object
|
238
|
+
expect { other_service.transfers.get(transfer.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
239
|
+
expect(other_service.transfers.all(:name => transfer_name).length).to be(0)
|
240
|
+
|
241
|
+
# # check that recipient cannot see the volume before transfer
|
242
|
+
# expect { other_service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
243
|
+
# expect(other_service.volumes.all(:display_name => volume_name).length).to be(0)
|
244
|
+
|
245
|
+
# The recipient can inexplicably see the volume even before the
|
246
|
+
# transfer, so to confirm that the transfer happens, we record its tenant ID.
|
247
|
+
expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
|
248
|
+
source_tenant_id = volume.tenant_id
|
249
|
+
|
250
|
+
# check that accept_transfer fails without valid transfer ID and auth key
|
251
|
+
bogus_uuid = 'ec8ff7e8-81e2-4e12-b9fb-3e8890612c2d' # generated by Fog::UUID.uuid, but fixed to play nice with VCR
|
252
|
+
expect { other_service.transfers.accept(bogus_uuid, auth_key) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
253
|
+
expect { other_service.transfers.accept(transfer_id, 'invalidauthkey') }.to raise_error(Excon::Errors::BadRequest)
|
254
|
+
|
255
|
+
# accept transfer
|
256
|
+
puts 'Accepting transfer...' if ENV['DEBUG_VERBOSE']
|
257
|
+
transfer = other_service.transfers.accept(transfer.id, auth_key)
|
258
|
+
expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
|
259
|
+
|
260
|
+
expect(transfer.id).to eq(transfer_id)
|
261
|
+
expect(transfer.name).to eq(transfer_name)
|
262
|
+
|
263
|
+
# check that recipient can see the volume
|
264
|
+
volume = other_service.volumes.get(volume.id)
|
265
|
+
expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
|
266
|
+
|
267
|
+
# # check that sender cannot see the volume anymore
|
268
|
+
# expect { @service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
269
|
+
# expect(@service.volumes.all(:display_name => volume_name).length).to be(0)
|
270
|
+
|
271
|
+
# As noted above, both users seem to be able to see the volume at all times.
|
272
|
+
# Check change of ownership by looking at the tenant_id, instead.
|
273
|
+
expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
|
274
|
+
expect(volume.tenant_id).not_to eq(source_tenant_id)
|
275
|
+
|
276
|
+
# check that the transfer object is gone on both sides
|
277
|
+
[ @service, other_service ].each do |service|
|
278
|
+
expect { service.transfers.get(transfer.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
279
|
+
expect(service.transfers.all(:name => transfer_name).length).to be(0)
|
280
|
+
end
|
281
|
+
|
282
|
+
# cleanup volume
|
283
|
+
cleanup_test_object(other_service.volumes, volume.id)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'can create and delete volume transfers' do
|
288
|
+
VCR.use_cassette('volume_transfer_and_delete') do
|
289
|
+
# create volume object
|
290
|
+
volume = setup_test_object(:type => :volume,
|
291
|
+
:display_name => 'fog-testvolume-1',
|
292
|
+
:size => 1
|
293
|
+
)
|
294
|
+
volume.wait_for { ready? }
|
295
|
+
|
296
|
+
# create transfer object
|
297
|
+
transfer = setup_test_object(:type => :transfer,
|
298
|
+
:name => 'fog-testtransfer-1',
|
299
|
+
:volume_id => volume.id
|
300
|
+
)
|
301
|
+
# we need to save the auth_key NOW, it's only present in the response
|
302
|
+
# from the create_transfer request
|
303
|
+
auth_key = transfer.auth_key
|
304
|
+
transfer_id = transfer.id
|
305
|
+
|
306
|
+
# to try to accept the transfer, we need a second connection to a different project
|
307
|
+
other_service = Fog::Volume::OpenStack.new(
|
308
|
+
:openstack_auth_url => "#{@os_auth_url}/tokens",
|
309
|
+
:openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
|
310
|
+
:openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'devstack',
|
311
|
+
:openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
|
312
|
+
:openstack_tenant => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
|
313
|
+
)
|
314
|
+
|
315
|
+
# delete transfer again
|
316
|
+
transfer.destroy
|
317
|
+
|
318
|
+
# check that transfer cannot be accepted when it has been deleted
|
319
|
+
puts 'Checking that accepting a deleted transfer fails...' if ENV['DEBUG_VERBOSE']
|
320
|
+
expect { other_service.transfers.accept(transfer_id, auth_key) }.to raise_error(Fog::Compute::OpenStack::NotFound)
|
321
|
+
|
322
|
+
# cleanup volume
|
323
|
+
cleanup_test_object(@service.volumes, volume.id)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
162
327
|
# TODO: tests for snapshots
|
163
328
|
# TODO: tests for quotas
|
164
329
|
|
@@ -156,6 +156,32 @@ Shindo.tests('Fog::OpenStack::Storage | file', ['openstack']) do
|
|
156
156
|
|
157
157
|
end
|
158
158
|
|
159
|
+
tests("#delete_at") do
|
160
|
+
@delete_at_time = (Time.now + 300).to_i
|
161
|
+
|
162
|
+
tests("#delete_at should default to nil").returns(nil) do
|
163
|
+
@instance.delete_at
|
164
|
+
end
|
165
|
+
|
166
|
+
@instance.delete_at = @delete_at_time
|
167
|
+
@instance.save
|
168
|
+
tests("#delete_at should return delete_at attribute").returns(@delete_at_time) do
|
169
|
+
@instance.delete_at
|
170
|
+
end
|
171
|
+
|
172
|
+
@instance.delete_at = @delete_at_time
|
173
|
+
@instance.save
|
174
|
+
tests("#delete_at= should update delete_at").returns(@delete_at_time + 100) do
|
175
|
+
@instance.delete_at = @delete_at_time + 100
|
176
|
+
@instance.save
|
177
|
+
@instance.delete_at
|
178
|
+
end
|
179
|
+
|
180
|
+
tests("#delete_at= should not blow up on nil") do
|
181
|
+
@instance.delete_at = nil
|
182
|
+
@instance.save
|
183
|
+
end
|
184
|
+
end
|
159
185
|
end
|
160
186
|
|
161
187
|
model_tests(@directory.files, file_attributes, Fog.mocking?) do
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Shindo.tests('Fog::Compute[:openstack] | availability zone requests', ['openstack']) do
|
2
|
+
|
3
|
+
@flavor_format = {
|
4
|
+
'zoneName' => String,
|
5
|
+
'hosts' => Fog::Nullable::Hash,
|
6
|
+
'zoneState' => Hash,
|
7
|
+
}
|
8
|
+
|
9
|
+
tests('success') do
|
10
|
+
tests('#list_zones').data_matches_schema({'availabilityZoneInfo' => [@flavor_format]}) do
|
11
|
+
Fog::Compute[:openstack].list_zones.body
|
12
|
+
end
|
13
|
+
|
14
|
+
tests('#list_zones_detailed').data_matches_schema({'availabilityZoneInfo' => [@flavor_format]}) do
|
15
|
+
Fog::Compute[:openstack].list_zones_detailed.body
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -232,6 +232,18 @@ Shindo.tests('Fog::Compute[:openstack] | server requests', ['openstack']) do
|
|
232
232
|
|
233
233
|
Fog::Compute[:openstack].servers.get(@server_id).wait_for { ready? } if not Fog.mocking?
|
234
234
|
|
235
|
+
tests("#shelve_server(#{@server_id})").succeeds do
|
236
|
+
Fog::Compute[:openstack].shelve_server(@server_id)
|
237
|
+
end
|
238
|
+
|
239
|
+
Fog::Compute[:openstack].servers.get(@server_id).wait_for { ready? } if not Fog.mocking?
|
240
|
+
|
241
|
+
tests("#unshelve_server(#{@server_id})").succeeds do
|
242
|
+
Fog::Compute[:openstack].unshelve_server(@server_id)
|
243
|
+
end
|
244
|
+
|
245
|
+
Fog::Compute[:openstack].servers.get(@server_id).wait_for { ready? } if not Fog.mocking?
|
246
|
+
|
235
247
|
#DELETE
|
236
248
|
tests("#delete_server(#{@server_id})").succeeds do
|
237
249
|
Fog::Compute[:openstack].delete_server(@server_id)
|
@@ -38,8 +38,8 @@ Shindo.tests('Fog::Network[:openstack] | subnet requests', ['openstack']) do
|
|
38
38
|
tests('#update_subnet').formats({'subnet' => @subnet_format}) do
|
39
39
|
subnet_id = Fog::Network[:openstack].subnets.all.first.id
|
40
40
|
attributes = {:name => 'subnet_name', :gateway_ip => '10.2.2.1',
|
41
|
-
:
|
42
|
-
:enable_dhcp => true}
|
41
|
+
:allocation_pools => [], :dns_nameservers => [],
|
42
|
+
:host_routes => [], :enable_dhcp => true}
|
43
43
|
Fog::Network[:openstack].update_subnet(subnet_id, attributes).body
|
44
44
|
end
|
45
45
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Shindo.tests('Fog::Volume[:openstack] | availability zone requests', ['openstack']) do
|
2
|
+
|
3
|
+
@flavor_format = {
|
4
|
+
'zoneName' => String,
|
5
|
+
'zoneState' => Hash,
|
6
|
+
}
|
7
|
+
|
8
|
+
tests('success') do
|
9
|
+
tests('#list_zones').data_matches_schema({'availabilityZoneInfo' => [@flavor_format]}) do
|
10
|
+
Fog::Volume[:openstack].list_zones.body
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -20,7 +20,7 @@ Shindo.tests('Compute::VcloudDirector | edge gateway requests', ['vclouddirector
|
|
20
20
|
:GatewayIpsecVpnService =>
|
21
21
|
{
|
22
22
|
:IsEnabled => "true",
|
23
|
-
:Tunnel => {
|
23
|
+
:Tunnel => [{
|
24
24
|
:Name => "test vpn",
|
25
25
|
:PeerIpAddress => "110.110.110.110",
|
26
26
|
:PeerId => "1223-123UDH-12321",
|
@@ -41,7 +41,7 @@ Shindo.tests('Compute::VcloudDirector | edge gateway requests', ['vclouddirector
|
|
41
41
|
:Gateway => "192.168.90.254",
|
42
42
|
:Netmask => "255.255.255.0"
|
43
43
|
}]
|
44
|
-
}
|
44
|
+
}]
|
45
45
|
}
|
46
46
|
}
|
47
47
|
|