fog 1.32.0 → 1.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/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
|
|