fog-maestrodev 1.18.0.20131209091424 → 1.18.0.20131218202447

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.
Files changed (133) hide show
  1. data/.gitignore +1 -0
  2. data/CONTRIBUTING.md +22 -0
  3. data/LICENSE.md +20 -0
  4. data/README.md +29 -42
  5. data/fog.gemspec +3 -3
  6. data/lib/fog/aws/compute.rb +1 -0
  7. data/lib/fog/aws/models/compute/subnet.rb +4 -0
  8. data/lib/fog/aws/models/compute/vpc.rb +5 -0
  9. data/lib/fog/aws/models/rds/server.rb +2 -0
  10. data/lib/fog/aws/models/storage/file.rb +2 -2
  11. data/lib/fog/aws/parsers/compute/assign_private_ip_addresses.rb +25 -0
  12. data/lib/fog/aws/requests/compute/assign_private_ip_addresses.rb +60 -0
  13. data/lib/fog/aws/requests/compute/describe_subnets.rb +8 -0
  14. data/lib/fog/aws/requests/compute/describe_vpcs.rb +8 -0
  15. data/lib/fog/cloudstack.rb +1 -1
  16. data/lib/fog/core/connection.rb +1 -2
  17. data/lib/fog/core/hmac.rb +3 -3
  18. data/lib/fog/core/mock.rb +2 -2
  19. data/lib/fog/core/wait_for.rb +1 -1
  20. data/lib/fog/core/{timeout.rb → wait_for_defaults.rb} +10 -0
  21. data/lib/fog/core.rb +1 -1
  22. data/lib/fog/google/compute.rb +19 -11
  23. data/lib/fog/google/examples/create.rb +12 -1
  24. data/lib/fog/google/examples/eric-fail.rb +13 -2
  25. data/lib/fog/google/examples/image_create.rb +0 -1
  26. data/lib/fog/google/examples/launch_micro_instance.rb +1 -2
  27. data/lib/fog/google/examples/metadata.rb +14 -2
  28. data/lib/fog/google/examples/network.rb +13 -2
  29. data/lib/fog/google/models/compute/disk.rb +10 -8
  30. data/lib/fog/google/models/compute/image.rb +8 -3
  31. data/lib/fog/google/models/compute/server.rb +19 -4
  32. data/lib/fog/google/models/compute/servers.rb +25 -9
  33. data/lib/fog/google/requests/compute/insert_disk.rb +6 -3
  34. data/lib/fog/google/requests/compute/insert_image.rb +1 -5
  35. data/lib/fog/google/requests/compute/insert_server.rb +8 -21
  36. data/lib/fog/openstack/compute.rb +3 -0
  37. data/lib/fog/openstack/models/compute/host.rb +1 -0
  38. data/lib/fog/openstack/models/compute/security_group.rb +18 -4
  39. data/lib/fog/openstack/models/compute/security_group_rule.rb +32 -0
  40. data/lib/fog/openstack/models/compute/security_group_rules.rb +22 -0
  41. data/lib/fog/openstack/network.rb +33 -3
  42. data/lib/fog/openstack/requests/compute/create_security_group.rb +3 -3
  43. data/lib/fog/openstack/requests/compute/create_security_group_rule.rb +1 -1
  44. data/lib/fog/openstack/requests/compute/create_server.rb +12 -5
  45. data/lib/fog/openstack/requests/compute/delete_security_group.rb +1 -1
  46. data/lib/fog/openstack/requests/compute/delete_security_group_rule.rb +2 -0
  47. data/lib/fog/openstack/requests/compute/get_security_group.rb +14 -24
  48. data/lib/fog/openstack/requests/compute/get_security_group_rule.rb +38 -0
  49. data/lib/fog/openstack/requests/compute/list_hosts.rb +3 -3
  50. data/lib/fog/openstack/volume.rb +3 -1
  51. data/lib/fog/rackspace/docs/auto_scale.md +9 -9
  52. data/lib/fog/rackspace/docs/getting_started.md +1 -0
  53. data/lib/fog/rackspace/docs/queues.md +312 -0
  54. data/lib/fog/vcloud_director/README.md +2 -0
  55. data/lib/fog/vcloud_director/compute.rb +78 -8
  56. data/lib/fog/vcloud_director/generators/compute/org_vdc_network.rb +91 -0
  57. data/lib/fog/vcloud_director/generators/compute/vapp.rb +30 -0
  58. data/lib/fog/vcloud_director/models/compute/vm_customization.rb +2 -0
  59. data/lib/fog/vcloud_director/parsers/compute/vm_customization.rb +2 -0
  60. data/lib/fog/vcloud_director/requests/compute/delete_network.rb +64 -0
  61. data/lib/fog/vcloud_director/requests/compute/get_execute_query.rb +433 -333
  62. data/lib/fog/vcloud_director/requests/compute/get_vapp_metadata.rb +3 -1
  63. data/lib/fog/vcloud_director/requests/compute/post_attach_disk.rb +1 -1
  64. data/lib/fog/vcloud_director/requests/compute/post_create_org_vdc_network.rb +83 -0
  65. data/lib/fog/vcloud_director/requests/compute/post_detach_disk.rb +1 -1
  66. data/lib/fog/vcloud_director/requests/compute/post_eject_cd_rom.rb +1 -1
  67. data/lib/fog/vcloud_director/requests/compute/post_insert_cd_rom.rb +1 -1
  68. data/lib/fog/vcloud_director/requests/compute/put_guest_customization_section_vapp.rb +1 -0
  69. data/lib/fog/vcloud_director/requests/compute/put_vapp_name_and_description.rb +37 -0
  70. data/lib/fog/vsphere/models/compute/server.rb +1 -1
  71. data/lib/fog/xenserver/compute.rb +35 -0
  72. data/lib/fog/xenserver/models/compute/blob.rb +22 -0
  73. data/lib/fog/xenserver/models/compute/blobs.rb +25 -0
  74. data/lib/fog/xenserver/models/compute/bond.rb +23 -0
  75. data/lib/fog/xenserver/models/compute/bonds.rb +25 -0
  76. data/lib/fog/xenserver/models/compute/console.rb +3 -1
  77. data/lib/fog/xenserver/models/compute/crash_dump.rb +19 -0
  78. data/lib/fog/xenserver/models/compute/crash_dumps.rb +25 -0
  79. data/lib/fog/xenserver/models/compute/dr_task.rb +17 -0
  80. data/lib/fog/xenserver/models/compute/dr_tasks.rb +25 -0
  81. data/lib/fog/xenserver/models/compute/gpu_group.rb +22 -0
  82. data/lib/fog/xenserver/models/compute/gpu_groups.rb +25 -0
  83. data/lib/fog/xenserver/models/compute/guest_metrics.rb +2 -1
  84. data/lib/fog/xenserver/models/compute/host.rb +41 -8
  85. data/lib/fog/xenserver/models/compute/host_cpu.rb +2 -1
  86. data/lib/fog/xenserver/models/compute/host_crash_dump.rb +20 -0
  87. data/lib/fog/xenserver/models/compute/host_crash_dumps.rb +25 -0
  88. data/lib/fog/xenserver/models/compute/host_metrics.rb +1 -1
  89. data/lib/fog/xenserver/models/compute/host_patch.rb +25 -0
  90. data/lib/fog/xenserver/models/compute/host_patchs.rb +25 -0
  91. data/lib/fog/xenserver/models/compute/network.rb +7 -6
  92. data/lib/fog/xenserver/models/compute/pbd.rb +3 -1
  93. data/lib/fog/xenserver/models/compute/pci.rb +22 -0
  94. data/lib/fog/xenserver/models/compute/pcis.rb +25 -0
  95. data/lib/fog/xenserver/models/compute/pgpu.rb +20 -0
  96. data/lib/fog/xenserver/models/compute/pgpus.rb +25 -0
  97. data/lib/fog/xenserver/models/compute/pif.rb +19 -8
  98. data/lib/fog/xenserver/models/compute/pif_metrics.rb +28 -0
  99. data/lib/fog/xenserver/models/compute/pifs_metrics.rb +25 -0
  100. data/lib/fog/xenserver/models/compute/pool.rb +18 -1
  101. data/lib/fog/xenserver/models/compute/pool_patch.rb +24 -0
  102. data/lib/fog/xenserver/models/compute/pool_patchs.rb +25 -0
  103. data/lib/fog/xenserver/models/compute/role.rb +19 -0
  104. data/lib/fog/xenserver/models/compute/roles.rb +25 -0
  105. data/lib/fog/xenserver/models/compute/server.rb +59 -26
  106. data/lib/fog/xenserver/models/compute/server_appliance.rb +21 -0
  107. data/lib/fog/xenserver/models/compute/server_appliances.rb +25 -0
  108. data/lib/fog/xenserver/models/compute/storage_manager.rb +28 -0
  109. data/lib/fog/xenserver/models/compute/storage_managers.rb +25 -0
  110. data/lib/fog/xenserver/models/compute/storage_repository.rb +4 -1
  111. data/lib/fog/xenserver/models/compute/tunnel.rb +20 -0
  112. data/lib/fog/xenserver/models/compute/tunnels.rb +25 -0
  113. data/lib/fog/xenserver/models/compute/vbd.rb +3 -2
  114. data/lib/fog/xenserver/models/compute/vbd_metrics.rb +1 -1
  115. data/lib/fog/xenserver/models/compute/vdi.rb +4 -1
  116. data/lib/fog/xenserver/models/compute/vif.rb +11 -2
  117. data/lib/fog/xenserver/models/compute/vlan.rb +2 -1
  118. data/lib/fog/xenserver/models/compute/vmpp.rb +35 -0
  119. data/lib/fog/xenserver/models/compute/vmpps.rb +25 -0
  120. data/lib/fog/xenserver/models/compute/vtpm.rb +18 -0
  121. data/lib/fog/xenserver/models/compute/vtpms.rb +25 -0
  122. data/tests/aws/requests/compute/assign_private_ip_tests.rb +52 -0
  123. data/tests/google/models/compute/servers_tests.rb +12 -1
  124. data/tests/google/requests/compute/image_tests.rb +0 -1
  125. data/tests/helpers/mock_helper.rb +1 -1
  126. data/tests/openstack/models/compute/security_group_tests.rb +54 -0
  127. data/tests/openstack/requests/compute/security_group_tests.rb +22 -20
  128. data/tests/openstack/requests/network/network_tests.rb +8 -8
  129. data/tests/vcloud_director/requests/compute/edge_gateway_tests.rb +17 -8
  130. data/tests/vcloud_director/requests/compute/network_tests.rb +25 -1
  131. data/tests/vcloud_director/requests/compute/query_tests.rb +67 -2
  132. metadata +125 -132
  133. checksums.yaml +0 -15
@@ -4,9 +4,20 @@ def test
4
4
  # we create a new private network
5
5
  connection.insert_network('my-private-network', '10.240.0.0/16')
6
6
 
7
+ name = "fog-smoke-test-#{Time.now.to_i}"
8
+
9
+ disk = connection.disks.create({
10
+ :name => name,
11
+ :size_gb => 10,
12
+ :zone_name => 'us-central1-a',
13
+ :source_image => 'debian-7-wheezy-v20131120',
14
+ })
15
+
16
+ disk.wait_for { disk.ready? }
17
+
7
18
  server = connection.servers.create({
8
- :name => "fog-smoke-test-#{Time.now.to_i}",
9
- :image_name => "debian-7-wheezy-v20130522",
19
+ :name => name,
20
+ :disks => [disk],
10
21
  :machine_type => "n1-standard-1",
11
22
  :zone_name => "us-central1-a",
12
23
  :private_key_path => File.expand_path("~/.ssh/id_rsa"),
@@ -57,20 +57,22 @@ module Fog
57
57
  end
58
58
  end
59
59
 
60
- def get_as_boot_disk(writable=true)
60
+ def get_object(writable=true, boot=false, device_name=nil)
61
61
  mode = writable ? 'READ_WRITE' : 'READ_ONLY'
62
62
  return {
63
- 'name' => name,
64
- 'type' => 'PERSISTENT',
65
- 'boot' => true,
66
- 'source' => self_link,
67
- 'mode' => mode
68
- }
63
+ 'boot' => boot,
64
+ 'source' => self_link,
65
+ 'mode' => mode,
66
+ 'deviceName' => device_name
67
+ }.select { |k, v| !v.empty? }
68
+ end
69
+
70
+ def get_as_boot_disk(writable=true)
71
+ get_object(writable, true)
69
72
  end
70
73
 
71
74
  def ready?
72
75
  data = service.get_disk(self.name, self.zone_name).body
73
- data['zone_name'] = self.zone_name
74
76
  self.merge_attributes(data)
75
77
  self.status == RUNNING_STATE
76
78
  end
@@ -11,7 +11,6 @@ module Fog
11
11
  attribute :kind
12
12
  attribute :creation_timestamp, :aliases => 'creationTimestamp'
13
13
  attribute :description
14
- attribute :preferred_kernel, :aliases => 'preferredKernel'
15
14
 
16
15
  # This attribute is not available in the representation of an
17
16
  # 'image' returned by the GCE servser (see GCE API). However,
@@ -30,6 +29,14 @@ module Fog
30
29
 
31
30
  attribute :status
32
31
 
32
+ def preferred_kernel=(args)
33
+ Fog::Logger.deprecation("preferred_kernel= is no longer used [light_black](#{caller.first})[/]")
34
+ end
35
+ def preferred_kernel
36
+ Fog::Logger.deprecation("preferred_kernel is no longer used [light_black](#{caller.first})[/]")
37
+ nil
38
+ end
39
+
33
40
  def reload
34
41
  requires :name
35
42
 
@@ -41,11 +48,9 @@ module Fog
41
48
 
42
49
  def save
43
50
  requires :name
44
- requires :preferred_kernel
45
51
  requires :raw_disk
46
52
 
47
53
  options = {
48
- 'preferredKernel' => preferred_kernel,
49
54
  'rawDisk' => raw_disk,
50
55
  'description' => description,
51
56
  }
@@ -8,7 +8,7 @@ module Fog
8
8
  class Server < Fog::Compute::Server
9
9
 
10
10
  identity :name
11
- attribute :image_name, :aliases => 'image'
11
+
12
12
  attribute :network_interfaces, :aliases => 'networkInterfaces'
13
13
  attribute :network, :aliases => 'network'
14
14
  attribute :external_ip, :aliases => 'externalIP'
@@ -16,10 +16,24 @@ module Fog
16
16
  attribute :zone_name, :aliases => 'zone'
17
17
  attribute :machine_type, :aliases => 'machineType'
18
18
  attribute :disks, :aliases => 'disks'
19
- attribute :kernel, :aliases => 'kernel'
20
19
  attribute :metadata
21
20
  attribute :tags, :squash => 'items'
22
21
 
22
+ def image_name=(args)
23
+ Fog::Logger.deprecation("image_name= is no longer used [light_black](#{caller.first})[/]")
24
+ end
25
+ def image_name
26
+ Fog::Logger.deprecation("image_name is deprecated, use source_image from boot disk [light_black](#{caller.first})[/]")
27
+ disks.first.source_image
28
+ end
29
+ def kernel=(args)
30
+ Fog::Logger.deprecation("kernel= is no longer used [light_black](#{caller.first})[/]")
31
+ end
32
+ def kernel
33
+ Fog::Logger.deprecation("kernel is no longer used [light_black](#{caller.first})[/]")
34
+ nil
35
+ end
36
+
23
37
  def flavor_id
24
38
  machine_type
25
39
  end
@@ -39,7 +53,9 @@ module Fog
39
53
  operation
40
54
  end
41
55
 
56
+ # not used since v1
42
57
  def image
58
+ Fog::Logger.deprecation("Server.image is deprecated, get source_image from boot disk")
43
59
  service.get_image(self.image_name.split('/')[-1])
44
60
  end
45
61
 
@@ -112,6 +128,7 @@ module Fog
112
128
  requires :name
113
129
  requires :machine_type
114
130
  requires :zone_name
131
+ requires :disks
115
132
 
116
133
  if not service.zones.find{ |zone| zone.name == self.zone_name }
117
134
  raise ArgumentError.new "#{self.zone_name.inspect} is either down or you don't have permission to use it."
@@ -120,13 +137,11 @@ module Fog
120
137
  self.add_ssh_key(self.username, self.public_key) if self.public_key
121
138
 
122
139
  options = {
123
- 'image' => image_name,
124
140
  'machineType' => machine_type,
125
141
  'networkInterfaces' => network_interfaces,
126
142
  'network' => network,
127
143
  'externalIp' => external_ip,
128
144
  'disks' => disks,
129
- 'kernel' => kernel,
130
145
  'metadata' => metadata,
131
146
  'tags' => tags
132
147
  }.delete_if {|key, value| value.nil?}
@@ -45,22 +45,38 @@ module Fog
45
45
  end
46
46
 
47
47
  def bootstrap(new_attributes = {})
48
+ name = "fog-#{Time.now.to_i}"
49
+ zone = "us-central1-b"
50
+
51
+ disks = new_attributes[:disks]
52
+
53
+ if disks.nil? or disks.empty?
54
+ # create the persistent boot disk
55
+ disk_defaults = {
56
+ :name => name,
57
+ :size_gb => 10,
58
+ :zone_name => zone,
59
+ :source_image => "debian-7-wheezy-v20131120",
60
+ }
61
+
62
+ # backwards compatibility to pre-v1
63
+ new_attributes[:source_image] = new_attributes[:image_name] if new_attributes[:image_name]
64
+
65
+ disk = service.disks.create(disk_defaults.merge(new_attributes))
66
+ disk.wait_for { disk.ready? }
67
+ disks = [disk]
68
+ end
69
+
48
70
  defaults = {
49
- :name => "fog-#{Time.now.to_i}",
50
- :image_name => "debian-7-wheezy-v20131014",
71
+ :name => name,
72
+ :disks => disks,
51
73
  :machine_type => "n1-standard-1",
52
- :zone_name => "us-central1-b",
74
+ :zone_name => zone,
53
75
  :private_key_path => File.expand_path("~/.ssh/id_rsa"),
54
76
  :public_key_path => File.expand_path("~/.ssh/id_rsa.pub"),
55
77
  :username => ENV['USER'],
56
78
  }
57
79
 
58
- if new_attributes[:disks]
59
- new_attributes[:disks].each do |disk|
60
- defaults.delete :image_name if disk['boot']
61
- end
62
- end
63
-
64
80
  server = create(defaults.merge(new_attributes))
65
81
  server.wait_for { sshable? }
66
82
 
@@ -9,9 +9,12 @@ module Fog
9
9
  image_project = nil
10
10
  unless image_name.nil?
11
11
  ([ @project ] + Fog::Compute::Google::Images::GLOBAL_PROJECTS).each do |project|
12
- image_project = project
13
- break if data(project)[:images][options['image']]
12
+ if data(project)[:images][image_name]
13
+ image_project = project
14
+ break;
15
+ end
14
16
  end
17
+ raise ArgumentError.new("Invalid image specified: #{image_name}") unless image_project
15
18
  get_image(image_name, image_project) # ok if image exists, will fail otherwise
16
19
  end
17
20
  get_zone(zone_name)
@@ -61,7 +64,7 @@ module Fog
61
64
 
62
65
  if image_name
63
66
  image = images.get(image_name)
64
- raise ArgumentError.new('Invalid image specified') unless image
67
+ raise ArgumentError.new("Invalid image specified: #{image_name}") unless image
65
68
  @image_url = @api_url + image.resource_url
66
69
  parameters['sourceImage'] = @image_url
67
70
  end
@@ -19,14 +19,10 @@ module Fog
19
19
  'project' => @project,
20
20
  }
21
21
 
22
- kernel_url = @api_url + 'google/global/kernels/' + \
23
- options.delete('preferredKernel').to_s
24
-
25
22
  body_object = {
26
23
  'sourceType' => 'RAW',
27
24
  'name' => image_name,
28
- 'rawDisk' => options.delete('rawDisk'),
29
- 'preferredKernel' => kernel_url,
25
+ 'rawDisk' => options.delete('rawDisk')
30
26
  }
31
27
 
32
28
  # Merge in the remaining params (only 'description' should remain)
@@ -26,15 +26,7 @@ module Fog
26
26
 
27
27
  def insert_server(server_name, zone_name, options={}, *deprecated_args)
28
28
 
29
- # check that image and zone exist
30
- image_project = nil
31
- if options.has_key? 'image'
32
- ([ @project ] + Fog::Compute::Google::Images::GLOBAL_PROJECTS).each do |project|
33
- image_project = project
34
- break if data(project)[:images][options['image']]
35
- end
36
- get_image(options['image'], image_project) # ok if image exists, will fail otherwise
37
- end
29
+ # check that zone exists
38
30
  get_zone(zone_name)
39
31
 
40
32
  id = Fog::Mock.random_numbers(19).to_s
@@ -47,8 +39,6 @@ module Fog
47
39
  "name" => server_name,
48
40
  "tags" => { "fingerprint" => "42WmSpB8rSM=" },
49
41
  "machineType" => "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/zones/#{zone_name}/machineTypes/#{options['machineType']}",
50
- "image" => "https://www.googleapis.com/compute/#{api_version}/projects/#{image_project}/global/images/#{options['image']}",
51
- "kernel" => "https://www.googleapis.com/compute/#{api_version}/projects/google/global/kernels/gce-v20130813",
52
42
  "canIpForward" => false,
53
43
  "networkInterfaces" => [
54
44
  {
@@ -113,6 +103,8 @@ module Fog
113
103
 
114
104
  def handle_disks(options)
115
105
  disks = []
106
+ # An array of persistent disks. You must supply a boot disk as the first disk in
107
+ # this array and mark it as a boot disk using the disks[].boot property.
116
108
  options.delete('disks').each do |disk|
117
109
  if disk.is_a? Disk
118
110
  disks << disk.get_object
@@ -120,6 +112,7 @@ module Fog
120
112
  disks << disk
121
113
  end
122
114
  end
115
+ disks.first['boot'] = true
123
116
  disks
124
117
  end
125
118
 
@@ -139,12 +132,6 @@ module Fog
139
132
  }
140
133
  body_object = {:name => server_name}
141
134
 
142
- if options.has_key? 'image'
143
- image_name = options.delete 'image'
144
- image = images.get(image_name)
145
- @image_url = @api_url + image.resource_url
146
- body_object['image'] = @image_url
147
- end
148
135
  body_object['machineType'] = @api_url + @project + "/zones/#{zone_name}/machineTypes/#{options.delete 'machineType'}"
149
136
  network = nil
150
137
  if options.has_key? 'network'
@@ -170,15 +157,15 @@ module Fog
170
157
  # TODO: add other networks
171
158
  body_object['networkInterfaces'] = networkInterfaces
172
159
 
173
- body_object['disks'] = handle_disks(options) if options['disks']
160
+ if options['disks'].nil? or options['disks'].empty?
161
+ raise ArgumentError.new "Empty value for field 'disks'. Boot disk must be specified"
162
+ end
163
+ body_object['disks'] = handle_disks(options)
174
164
 
175
165
  options['metadata'] = format_metadata options['metadata'] if options['metadata']
176
166
 
177
167
  body_object['tags'] = { 'items' => options.delete('tags') } if options['tags']
178
168
 
179
- if options['kernel']
180
- body_object['kernel'] = @api_url + "google/global/kernels/#{options.delete 'kernel'}"
181
- end
182
169
  body_object.merge!(options) # Adds in all remaining options that weren't explicitly handled.
183
170
 
184
171
  result = self.build_result(api_method, parameters,
@@ -28,6 +28,8 @@ module Fog
28
28
  collection :addresses
29
29
  model :security_group
30
30
  collection :security_groups
31
+ model :security_group_rule
32
+ collection :security_group_rules
31
33
  model :key_pair
32
34
  collection :key_pairs
33
35
  model :tenant
@@ -128,6 +130,7 @@ module Fog
128
130
  request :create_security_group_rule
129
131
  request :delete_security_group
130
132
  request :delete_security_group_rule
133
+ request :get_security_group_rule
131
134
 
132
135
  # Key Pair
133
136
  request :list_key_pairs
@@ -10,6 +10,7 @@ module Fog
10
10
  attribute :host_name
11
11
  attribute :service_name
12
12
  attribute :details
13
+ attribute :zone
13
14
 
14
15
  def initialize(attributes)
15
16
  attributes["service_name"] = attributes.delete "service"
@@ -3,16 +3,30 @@ require 'fog/core/model'
3
3
  module Fog
4
4
  module Compute
5
5
  class OpenStack
6
-
7
6
  class SecurityGroup < Fog::Model
8
7
 
9
8
  identity :id
10
9
 
11
10
  attribute :name
12
11
  attribute :description
13
- attribute :rules
12
+ attribute :security_group_rules, :aliases => "rules"
14
13
  attribute :tenant_id
15
14
 
15
+ def security_group_rules
16
+ Fog::Compute::OpenStack::SecurityGroupRules.new(:service => service).load(attributes[:security_group_rules])
17
+ end
18
+
19
+ def rules
20
+ Fog::Logger.deprecation('#rules is deprecated. Use #security_group_rules instead')
21
+ attributes[:security_group_rules]
22
+ end
23
+
24
+ # no one should be calling this because it doesn't do anything
25
+ # useful but we deprecated the rules attribute and need to maintain the API
26
+ def rules=(new_rules)
27
+ Fog::Logger.deprecation('#rules= is deprecated. Use the Fog::Compute::Openstack::SecurityGroupRules collection to create new rules.')
28
+ attributes[:security_group_rules] = new_rules
29
+ end
16
30
 
17
31
  def save
18
32
  requires :name, :description
@@ -21,7 +35,6 @@ module Fog
21
35
  true
22
36
  end
23
37
 
24
-
25
38
  def destroy
26
39
  requires :id
27
40
  service.delete_security_group(id)
@@ -29,15 +42,16 @@ module Fog
29
42
  end
30
43
 
31
44
  def create_security_group_rule(min, max, ip_protocol = "tcp", cidr = "0.0.0.0/0", group_id = nil)
45
+ Fog::Logger.deprecation('#create_security_group_rule is deprecated. Use the Fog::Compute::Openstack::SecurityGroupRules collection to create new rules.')
32
46
  requires :id
33
47
  service.create_security_group_rule(id, ip_protocol, min, max, cidr, group_id)
34
48
  end
35
49
 
36
50
  def delete_security_group_rule(rule_id)
51
+ Fog::Logger.deprecation('#create_security_group_rule is deprecated. Use the Fog::Compute::Openstack::SecurityGroupRule objects to destroy rules.')
37
52
  service.delete_security_group_rule(rule_id)
38
53
  true
39
54
  end
40
-
41
55
  end
42
56
  end
43
57
  end
@@ -0,0 +1,32 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class OpenStack
6
+ class SecurityGroupRule < Fog::Model
7
+ identity :id
8
+
9
+ attribute :from_port
10
+ attribute :group
11
+ attribute :ip_protocol
12
+ attribute :to_port
13
+ attribute :parent_group_id
14
+ attribute :ip_range
15
+
16
+ def save
17
+ requires :ip_protocol, :from_port, :to_port, :parent_group_id
18
+ cidr = ip_range && ip_range["cidr"]
19
+ if rule = service.create_security_group_rule(parent_group_id, ip_protocol, from_port, to_port, cidr, group).data[:body]
20
+ merge_attributes(rule["security_group_rule"])
21
+ end
22
+ end
23
+
24
+ def destroy
25
+ requires :id
26
+ service.delete_security_group_rule(id)
27
+ true
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/openstack/models/compute/security_group_rule'
3
+
4
+ module Fog
5
+ module Compute
6
+ class OpenStack
7
+ class SecurityGroupRules < Fog::Collection
8
+
9
+ model Fog::Compute::OpenStack::SecurityGroupRule
10
+
11
+ def get(security_group_rule_id)
12
+ if security_group_rule_id
13
+ body = service.get_security_group_rule(security_group_rule_id).body
14
+ new(body['security_group_rule'])
15
+ end
16
+ rescue Fog::Compute::OpenStack::NotFound
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -118,10 +118,40 @@ module Fog
118
118
  class Mock
119
119
  def self.data
120
120
  @data ||= Hash.new do |hash, key|
121
+ network_id = Fog::UUID.uuid
122
+ subnet_id = Fog::UUID.uuid
123
+ tenant_id = Fog::Mock.random_hex(8)
124
+
121
125
  hash[key] = {
122
- :networks => {},
126
+ :networks => {
127
+ network_id => {
128
+ 'id' => network_id,
129
+ 'name' => 'Public',
130
+ 'subnets' => [subnet_id],
131
+ 'shared' => true,
132
+ 'status' => 'ACTIVE',
133
+ 'tenant_id' => tenant_id,
134
+ 'provider_network_type' => 'vlan',
135
+ 'router:external' => false,
136
+ 'admin_state_up' => true,
137
+ }
138
+ },
123
139
  :ports => {},
124
- :subnets => {},
140
+ :subnets => {
141
+ subnet_id => {
142
+ 'id' => subnet_id,
143
+ 'name' => "Public",
144
+ 'network_id' => network_id,
145
+ 'cidr' => "192.168.0.0/22",
146
+ 'ip_version' => 4,
147
+ 'gateway_ip' => Fog::Mock.random_ip,
148
+ 'allocation_pools' => [],
149
+ 'dns_nameservers' => [Fog::Mock.random_ip, Fog::Mock.random_ip],
150
+ 'host_routes' => [Fog::Mock.random_ip],
151
+ 'enable_dhcp' => true,
152
+ 'tenant_id' => tenant_id,
153
+ }
154
+ },
125
155
  :floating_ips => {},
126
156
  :routers => {},
127
157
  :lb_pools => {},
@@ -140,7 +170,7 @@ module Fog
140
170
  "subnet" => 10,
141
171
  "network" => 10,
142
172
  "floatingip" => 50,
143
- "tenant_id" => Fog::Mock.random_hex(8),
173
+ "tenant_id" => tenant_id,
144
174
  "router" => 10,
145
175
  "port" => 30
146
176
  }
@@ -23,10 +23,10 @@ module Fog
23
23
 
24
24
  class Mock
25
25
  def create_security_group(name, description)
26
- Fog::Identity.new(:provider => 'OpenStack')
26
+ Fog::Identity::OpenStack.new(:openstack_auth_url => credentials[:openstack_auth_url])
27
27
  tenant_id = Fog::Identity::OpenStack::Mock.data[current_tenant][:tenants].keys.first
28
28
  security_group_id = Fog::Mock.random_numbers(2).to_i
29
- self.data[:security_groups][security_group_id] = {
29
+ self.data[:security_groups][security_group_id.to_s] = {
30
30
  'tenant_id' => tenant_id,
31
31
  'rules' => [],
32
32
  'id' => security_group_id,
@@ -42,7 +42,7 @@ module Fog
42
42
  'Content-Length' => Fog::Mock.random_numbers(3).to_s,
43
43
  'Date' => Date.new}
44
44
  response.body = {
45
- 'security_group' => self.data[:security_groups][security_group_id]
45
+ 'security_group' => self.data[:security_groups][security_group_id.to_s]
46
46
  }
47
47
  response
48
48
  end
@@ -47,7 +47,7 @@ module Fog
47
47
  'cidr' => cidr
48
48
  }
49
49
  }
50
- self.data[:security_groups][parent_group_id]['rules'].push(rule)
50
+ self.data[:security_groups][parent_group_id.to_s]['rules'].push(rule)
51
51
  response.body = {
52
52
  'security_group_rule' => rule
53
53
  }
@@ -13,7 +13,7 @@ module Fog
13
13
  }
14
14
 
15
15
  vanilla_options = ['metadata', 'accessIPv4', 'accessIPv6',
16
- 'availability_zone', 'user_data', 'key_name',
16
+ 'availability_zone', 'user_data', 'key_name',
17
17
  'adminPass', 'config_drive', 'min_count', 'max_count',
18
18
  'return_reservation_id'
19
19
  ]
@@ -107,7 +107,6 @@ module Fog
107
107
  response.body["user"]["id"]
108
108
  end
109
109
 
110
-
111
110
  mock_data = {
112
111
  'addresses' => {},
113
112
  'flavor' => {"id" => flavor_ref, "links"=>[{"href"=>"http://nova1:8774/admin/flavors/1", "rel"=>"bookmark"}]},
@@ -127,10 +126,18 @@ module Fog
127
126
  'config_drive' => options['config_drive'] || '',
128
127
  }
129
128
 
129
+ if nics = options['nics']
130
+ nics.each do |nic|
131
+ mock_data["addresses"].merge!(
132
+ "Public" => [{ 'addr' => Fog::Mock.random_ip }]
133
+ )
134
+ end
135
+ end
136
+
130
137
  response_data = {}
131
138
  if options['return_reservation_id'] == 'True' then
132
139
  response_data = { 'reservation_id' => "r-#{Fog::Mock.random_numbers(6).to_s}" }
133
- else
140
+ else
134
141
  response_data = {
135
142
  'adminPass' => 'password',
136
143
  'id' => server_id,
@@ -156,12 +163,12 @@ module Fog
156
163
  self.data[:last_modified][:servers][server_id] = Time.now
157
164
  self.data[:servers][server_id] = mock_data
158
165
  if options['return_reservation_id'] == 'True' then
159
- response.body = response_data
166
+ response.body = response_data
160
167
  else
161
168
  response.body = { 'server' => response_data }
162
169
  end
163
170
  response
164
- end
171
+ end
165
172
  end
166
173
  end
167
174
  end
@@ -15,7 +15,7 @@ module Fog
15
15
 
16
16
  class Mock
17
17
  def delete_security_group(security_group_id)
18
- self.data[:security_groups].delete security_group_id
18
+ self.data[:security_groups].delete security_group_id.to_s
19
19
 
20
20
  response = Excon::Response.new
21
21
  response.status = 202
@@ -15,6 +15,8 @@ module Fog
15
15
 
16
16
  class Mock
17
17
  def delete_security_group_rule(security_group_rule_id)
18
+ security_group = self.data[:security_groups].values.detect{|sg| sg["rules"].detect{ |sgr| sgr["id"].to_s == security_group_rule_id.to_s }}
19
+ security_group["rules"].reject! { |sgr| sgr["id"] == security_group_rule_id }
18
20
  response = Excon::Response.new
19
21
  response.status = 202
20
22
  response.headers = {
@@ -15,32 +15,22 @@ module Fog
15
15
 
16
16
  class Mock
17
17
  def get_security_group(security_group_id)
18
+ security_group = self.data[:security_groups][security_group_id.to_s]
18
19
  response = Excon::Response.new
19
- response.status = 200
20
- response.headers = {
21
- "X-Compute-Request-Id" => "req-63a90344-7c4d-42e2-936c-fd748bced1b3",
22
- "Content-Type" => "application/json",
23
- "Content-Length" => "167",
24
- "Date" => Date.new
25
- }
26
- response.body = {
27
- "security_group" => {
28
- "rules" => [{
29
- "from_port" => 44,
30
- "group" => {},
31
- "ip_protocol" => "tcp",
32
- "to_port" => 55,
33
- "parent_group_id" => 1,
34
- "ip_range" => {
35
- "cidr" => "10.10.10.10/24"
36
- }, "id"=>1
37
- }],
38
- "tenant_id" => "d5183375ab0343f3a0b4b05f547aefc2",
39
- "id"=>security_group_id,
40
- "name"=>"default",
41
- "description"=>"default"
20
+ if security_group
21
+ response.status = 200
22
+ response.headers = {
23
+ "X-Compute-Request-Id" => "req-63a90344-7c4d-42e2-936c-fd748bced1b3",
24
+ "Content-Type" => "application/json",
25
+ "Content-Length" => "167",
26
+ "Date" => Date.new
42
27
  }
43
- }
28
+ response.body = {
29
+ "security_group" => security_group
30
+ }
31
+ else
32
+ raise Fog::Compute::OpenStack::NotFound, "Security group #{security_group_id} does not exist"
33
+ end
44
34
  response
45
35
  end
46
36
  end # mock