openstack-compute 1.1.2 → 1.1.3
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.
- data/VERSION +1 -1
- data/lib/openstack/compute.rb +1 -0
- data/lib/openstack/compute/address.rb +1 -1
- data/lib/openstack/compute/connection.rb +1 -18
- data/lib/openstack/compute/image.rb +3 -2
- data/lib/openstack/compute/metadata.rb +86 -27
- data/lib/openstack/compute/personalities.rb +23 -0
- data/lib/openstack/compute/server.rb +17 -10
- metadata +5 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.3
|
data/lib/openstack/compute.rb
CHANGED
@@ -203,7 +203,7 @@ module Compute
|
|
203
203
|
# => "NewServerSHMGpvI"
|
204
204
|
def create_server(options)
|
205
205
|
raise OpenStack::Compute::Exception::MissingArgument, "Server name, flavorRef, and imageRef, must be supplied" unless (options[:name] && options[:flavorRef] && options[:imageRef])
|
206
|
-
options[:personality] = get_personality(options[:personality])
|
206
|
+
options[:personality] = Personalities.get_personality(options[:personality])
|
207
207
|
data = JSON.generate(:server => options)
|
208
208
|
response = csreq("POST",svrmgmthost,"#{svrmgmtpath}/servers",svrmgmtport,svrmgmtscheme,{'content-type' => 'application/json'},data)
|
209
209
|
OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
|
@@ -330,23 +330,6 @@ module Compute
|
|
330
330
|
end
|
331
331
|
end
|
332
332
|
|
333
|
-
# Handles parsing the Personality hash to load it up with Base64-encoded data.
|
334
|
-
def get_personality(options)
|
335
|
-
return if options.nil?
|
336
|
-
require 'base64'
|
337
|
-
data = []
|
338
|
-
itemcount = 0
|
339
|
-
options.each do |localpath,svrpath|
|
340
|
-
raise OpenStack::Compute::Exception::TooManyPersonalityItems, "Personality files are limited to a total of #{MAX_PERSONALITY_ITEMS} items" if itemcount >= MAX_PERSONALITY_ITEMS
|
341
|
-
raise OpenStack::Compute::Exception::PersonalityFilePathTooLong, "Server-side path of #{svrpath} exceeds the maximum length of #{MAX_SERVER_PATH_LENGTH} characters" if svrpath.size > MAX_SERVER_PATH_LENGTH
|
342
|
-
raise OpenStack::Compute::Exception::PersonalityFileTooLarge, "Local file #{localpath} exceeds the maximum size of #{MAX_PERSONALITY_FILE_SIZE} bytes" if File.size(localpath) > MAX_PERSONALITY_FILE_SIZE
|
343
|
-
b64 = Base64.encode64(IO.read(localpath))
|
344
|
-
data.push({:path => svrpath, :contents => b64})
|
345
|
-
itemcount += 1
|
346
|
-
end
|
347
|
-
data
|
348
|
-
end
|
349
|
-
|
350
333
|
end
|
351
334
|
end
|
352
335
|
end
|
@@ -28,7 +28,6 @@ module Compute
|
|
28
28
|
def initialize(connection,id)
|
29
29
|
@id = id
|
30
30
|
@connection = connection
|
31
|
-
@metadata = OpenStack::Compute::ImageMetadata.new(connection, id)
|
32
31
|
populate
|
33
32
|
end
|
34
33
|
|
@@ -38,7 +37,8 @@ module Compute
|
|
38
37
|
# >> image.populate
|
39
38
|
# => true
|
40
39
|
def populate
|
41
|
-
|
40
|
+
path = "/images/#{URI.escape(self.id.to_s)}"
|
41
|
+
response = @connection.req("GET", path)
|
42
42
|
OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
|
43
43
|
data = JSON.parse(response.body)['image']
|
44
44
|
@id = data['id']
|
@@ -48,6 +48,7 @@ module Compute
|
|
48
48
|
@updated = DateTime.parse(data['updated'])
|
49
49
|
end
|
50
50
|
@created = DateTime.parse(data['created'])
|
51
|
+
@metadata = OpenStack::Compute::Metadata.new(@connection, path, data['metadata'])
|
51
52
|
@status = data['status']
|
52
53
|
@minDisk = data['minDisk']
|
53
54
|
@minRam = data['minRam']
|
@@ -1,51 +1,110 @@
|
|
1
1
|
module OpenStack
|
2
2
|
module Compute
|
3
3
|
|
4
|
-
class
|
4
|
+
class Metadata
|
5
5
|
|
6
|
-
def initialize(connection,
|
6
|
+
def initialize(connection, parent_url, metadata=nil)
|
7
7
|
@connection = connection
|
8
|
-
@
|
8
|
+
@base_url = "#{parent_url}/metadata"
|
9
|
+
@metadata = metadata
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
12
|
+
def [](key)
|
13
|
+
refresh if @metadata.nil?
|
14
|
+
@metadata[key]
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
-
|
18
|
-
@
|
17
|
+
def []=(key, value)
|
18
|
+
@metadata = {} if @metadata.nil?
|
19
|
+
@metadata[key] = value
|
19
20
|
end
|
20
21
|
|
21
|
-
def
|
22
|
-
@
|
22
|
+
def store(key, value)
|
23
|
+
@metadata = {} if @metadata.nil?
|
24
|
+
@metadata[key] = value
|
23
25
|
end
|
24
26
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
27
|
+
def each_pair
|
28
|
+
@metadata = {} if @metadata.nil?
|
29
|
+
@metadata.each_pair do |k,v|
|
30
|
+
yield k, v
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
|
-
def
|
31
|
-
|
32
|
-
@
|
34
|
+
def each
|
35
|
+
refresh if @metadata.nil?
|
36
|
+
@metadata.each
|
33
37
|
end
|
34
38
|
|
35
|
-
|
39
|
+
def save
|
40
|
+
return if @metadata.nil?
|
41
|
+
json = JSON.generate(:metadata => @metadata)
|
42
|
+
response = @connection.req('PUT', @base_url, :data => json)
|
43
|
+
@metadata = JSON.parse(response.body)['metadata']
|
44
|
+
end
|
36
45
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
46
|
+
def update(keys=nil)
|
47
|
+
return if @metadata.nil?
|
48
|
+
if keys.nil?
|
49
|
+
json = JSON.generate(:metadata => @metadata)
|
50
|
+
response = @connection.req('POST', @base_url, :data => json)
|
51
|
+
@metadata = JSON.parse(response.body)['metadata']
|
52
|
+
else
|
53
|
+
keys.each { |key|
|
54
|
+
next if not @metadata.has_key?(key)
|
55
|
+
json = JSON.generate(:meta => { key => @metadata[key] })
|
56
|
+
@connection.req('PUT', "#{@base_url}/#{key}", :data => json)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def refresh(keys=nil)
|
62
|
+
if keys.nil?
|
63
|
+
response = @connection.req('GET', @base_url)
|
64
|
+
@metadata = JSON.parse(response.body)['metadata']
|
65
|
+
else
|
66
|
+
@metadata = {} if @metadata == nil
|
67
|
+
keys.each { |key|
|
68
|
+
response = @connection.req('GET', "#{@base_url}/#{key}")
|
69
|
+
next if response.code == "404"
|
70
|
+
meta = JSON.parse(response.body)['meta']
|
71
|
+
meta.each { |k, v| @metadata[k] = v }
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete(keys)
|
77
|
+
return if @metadata.nil?
|
78
|
+
keys.each { |key|
|
79
|
+
@metadata.delete(key)
|
80
|
+
}
|
41
81
|
end
|
42
|
-
end
|
43
82
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
83
|
+
def delete!(keys)
|
84
|
+
keys.each { |key|
|
85
|
+
@connection.req('DELETE', "#{@base_url}/#{key}")
|
86
|
+
@metadata.delete(key) if not @metadata.nil?
|
87
|
+
}
|
48
88
|
end
|
89
|
+
|
90
|
+
def clear
|
91
|
+
if @metadata.nil?
|
92
|
+
@metadata = {}
|
93
|
+
else
|
94
|
+
@metadata.clear
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def clear!
|
99
|
+
clear
|
100
|
+
save
|
101
|
+
end
|
102
|
+
|
103
|
+
def has_key?(key)
|
104
|
+
return False if @metadata.nil?
|
105
|
+
return @metadata.has_key?(key)
|
106
|
+
end
|
107
|
+
|
49
108
|
end
|
50
109
|
|
51
110
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module OpenStack
|
2
|
+
module Compute
|
3
|
+
module Personalities
|
4
|
+
|
5
|
+
# Handles parsing the Personality hash to load it up with Base64-encoded data.
|
6
|
+
def self.get_personality(options)
|
7
|
+
return if options.nil?
|
8
|
+
require 'base64'
|
9
|
+
data = []
|
10
|
+
itemcount = 0
|
11
|
+
options.each do |localpath,svrpath|
|
12
|
+
raise OpenStack::Compute::Exception::TooManyPersonalityItems, "Personality files are limited to a total of #{MAX_PERSONALITY_ITEMS} items" if itemcount >= MAX_PERSONALITY_ITEMS
|
13
|
+
raise OpenStack::Compute::Exception::PersonalityFilePathTooLong, "Server-side path of #{svrpath} exceeds the maximum length of #{MAX_SERVER_PATH_LENGTH} characters" if svrpath.size > MAX_SERVER_PATH_LENGTH
|
14
|
+
raise OpenStack::Compute::Exception::PersonalityFileTooLarge, "Local file #{localpath} exceeds the maximum size of #{MAX_PERSONALITY_FILE_SIZE} bytes" if File.size(localpath) > MAX_PERSONALITY_FILE_SIZE
|
15
|
+
b64 = Base64.encode64(IO.read(localpath))
|
16
|
+
data.push({:path => svrpath, :contents => b64})
|
17
|
+
itemcount += 1
|
18
|
+
end
|
19
|
+
data
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -45,16 +45,19 @@ module Compute
|
|
45
45
|
#
|
46
46
|
# >> server.refresh
|
47
47
|
# => true
|
48
|
-
def populate
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
def populate(data=nil)
|
49
|
+
path = "/servers/#{URI.encode(@id.to_s)}"
|
50
|
+
if data.nil? then
|
51
|
+
response = @connection.req("GET", path)
|
52
|
+
OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
|
53
|
+
data = JSON.parse(response.body)["server"]
|
54
|
+
end
|
52
55
|
@id = data["id"]
|
53
56
|
@name = data["name"]
|
54
57
|
@status = data["status"]
|
55
58
|
@progress = data["progress"]
|
56
59
|
@addresses = get_addresses(data["addresses"])
|
57
|
-
@metadata = OpenStack::Compute::
|
60
|
+
@metadata = OpenStack::Compute::Metadata.new(@connection, path, data["metadata"])
|
58
61
|
@hostId = data["hostId"]
|
59
62
|
@image = data["image"]
|
60
63
|
@flavor = data["flavor"]
|
@@ -145,9 +148,13 @@ module Compute
|
|
145
148
|
# >> server.rebuild!
|
146
149
|
# => true
|
147
150
|
def rebuild!(options)
|
151
|
+
options[:personality] = Personalities.get_personality(options[:personality])
|
148
152
|
json = JSON.generate(:rebuild => options)
|
149
|
-
@connection.req('POST', "/servers/#{@id}/action", :data => json)
|
150
|
-
|
153
|
+
response = @connection.req('POST', "/servers/#{@id}/action", :data => json)
|
154
|
+
OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
|
155
|
+
data = JSON.parse(response.body)['server']
|
156
|
+
self.populate(data)
|
157
|
+
self.adminPass = data['adminPass']
|
151
158
|
true
|
152
159
|
end
|
153
160
|
|
@@ -160,10 +167,10 @@ module Compute
|
|
160
167
|
# The image is saved as a backup, of which there are only three available slots. If there are no backup slots available,
|
161
168
|
# A OpenStack::Compute::Exception::OpenStackComputeFault will be raised.
|
162
169
|
#
|
163
|
-
# >> image = server.create_image("My Rails Server")
|
170
|
+
# >> image = server.create_image(:name => "My Rails Server")
|
164
171
|
# =>
|
165
|
-
def create_image(
|
166
|
-
data = JSON.generate(:createImage =>
|
172
|
+
def create_image(options)
|
173
|
+
data = JSON.generate(:createImage => options)
|
167
174
|
response = @connection.csreq("POST",@svrmgmthost,"#{@svrmgmtpath}/servers/#{URI.encode(self.id.to_s)}/action",@svrmgmtport,@svrmgmtscheme,{'content-type' => 'application/json'},data)
|
168
175
|
OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
|
169
176
|
image_id = response["Location"].scan(/.*\/(.*)/).flatten
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openstack-compute
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 3
|
10
|
+
version: 1.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dan Prince
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-10-
|
18
|
+
date: 2011-10-28 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- lib/openstack/compute/flavor.rb
|
53
53
|
- lib/openstack/compute/image.rb
|
54
54
|
- lib/openstack/compute/metadata.rb
|
55
|
+
- lib/openstack/compute/personalities.rb
|
55
56
|
- lib/openstack/compute/server.rb
|
56
57
|
has_rdoc: true
|
57
58
|
homepage: https://launchpad.net/ruby-openstack-compute
|