openstack 1.0.7 → 1.0.8

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.
@@ -195,7 +195,7 @@ See the class definitions for documentation on specific methods and operations.
195
195
  >> os.detach_volume(704289, 90805)
196
196
  => true
197
197
 
198
- == Examples for Volumes:
198
+ == Examples for Volumes and Snaphots:
199
199
 
200
200
  #NOTE - attach/detach operations are implemented for the compute service as the OS API defines these operations as extensions to Openstack Compute.
201
201
 
@@ -227,6 +227,21 @@ See the class definitions for documentation on specific methods and operations.
227
227
  >> vs.delete_volume(90805)
228
228
  => true
229
229
 
230
+ # Create a snapshot: - must specify display_name and volume_id parameters... optionally also :display_description
231
+ >> vs.create_snapshot({:volume_id=>"3b38b570-a4ff-4444-984a-3566cbdc8ab2", :display_name=>"marios_snapshot"})
232
+ => #<OpenStack::Volume::Snapshot:0xa0cfea4 @id=223, @display_name="marios_snapshot", @display_description=nil, @volume_id="3b38b570-a4ff-4444-984a-3566cbdc8ab2", @status="creating", @size=1, @created_at="2013-01-23 14:25:02.654217">
233
+
234
+ # List snapshots: - aliased as just 'snapshots' ... vs.snapshots
235
+ >> vs.list_snapshots
236
+ => [#<OpenStack::Volume::Snapshot:0x9a6e4fc @id="0e76dacb-2fcf-4565-84a3-aa3d7bd16224", @display_name="marios_snapshot", @display_description=nil, @volume_id="3b38b570-a4ff-4444-984a-3566cbdc8ab2", @status="creating", @size=1, @created_at="2013-01-23T14:18:13.000000">]
237
+
238
+ # Get a specific snapshot: - aliased as 'snapshot'
239
+ >> vs.get_snapshot("0e76dacb-2fcf-4565-84a3-aa3d7bd16224")
240
+ => #<OpenStack::Volume::Snapshot:0x9a890b8 @id="0e76dacb-2fcf-4565-84a3-aa3d7bd16224", @display_name="marios_snapshot", @display_description=nil, @volume_id="3b38b570-a4ff-4444-984a-3566cbdc8ab2", @status="creating", @size=1, @created_at="2013-01-23T14:18:13.000000">
241
+
242
+ # Delete a snapshot:
243
+ >> vs.delete_snapshot("0e76dacb-2fcf-4565-84a3-aa3d7bd16224")
244
+ => true
230
245
 
231
246
  == Examples for Object-Store:
232
247
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.7
1
+ 1.0.8
@@ -45,6 +45,7 @@ module OpenStack
45
45
  require 'openstack/volume/connection'
46
46
  require 'openstack/volume/volume'
47
47
  require 'openstack/volume/snapshot'
48
+ require 'openstack/image/connection'
48
49
 
49
50
 
50
51
  # Constants that set limits on server creation
@@ -65,7 +65,9 @@ class Connection
65
65
  OpenStack::Swift::Connection.new(connection)
66
66
  when "volume"
67
67
  OpenStack::Volume::Connection.new(connection)
68
- else
68
+ when "image"
69
+ OpenStack::Image::Connection.new(connection)
70
+ else
69
71
  raise Exception::InvalidArgument, "Invalid :service_type parameter: #{@service_type}"
70
72
  end
71
73
  end
@@ -0,0 +1,16 @@
1
+ module OpenStack
2
+ module Image
3
+
4
+ class Connection
5
+
6
+ attr_accessor :connection
7
+
8
+ def initialize(connection)
9
+ @connection = connection
10
+ OpenStack::Authentication.init(@connection)
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+ end
@@ -9,7 +9,8 @@ module Volume
9
9
  def initialize(connection)
10
10
  @connection = connection
11
11
  OpenStack::Authentication.init(@connection)
12
- @volumes_native, @volume_path = check_if_native
12
+ @volumes_native, @volume_path = check_if_native("volumes")
13
+ @snapshots_native, @snapshot_path = check_if_native("snapshots")
13
14
  end
14
15
 
15
16
  # Returns true if the authentication was successful and returns false otherwise.
@@ -27,6 +28,7 @@ module Volume
27
28
  raise OpenStack::Exception::MissingArgument, ":display_name and :size must be specified to create a volume" unless (options[:display_name] && options[:size])
28
29
  data = JSON.generate(:volume => options)
29
30
  response = @connection.csreq("POST",@connection.service_host,"#{@connection.service_path}/#{@volume_path}",@connection.service_port,@connection.service_scheme,{'content-type' => 'application/json'},data)
31
+ OpenStack::Exception.raise_exception(response) unless response.code.match(/^20.$/)
30
32
  volume_info = JSON.parse(response.body)["volume"]
31
33
  volume = OpenStack::Volume::Volume.new(volume_info)
32
34
  end
@@ -53,32 +55,63 @@ module Volume
53
55
  true
54
56
  end
55
57
 
56
- #TODO SNAPSHOTS
58
+ def list_snapshots
59
+ response = @connection.req("GET", "/#{@snapshot_path}")
60
+ snapshot_hash = JSON.parse(response.body)["snapshots"]
61
+ snapshot_hash.inject([]){|res, current| res << OpenStack::Volume::Snapshot.new(current); res}
62
+ end
63
+ alias :snapshots :list_snapshots
64
+
65
+ def get_snapshot(snap_id)
66
+ response = @connection.req("GET", "/#{@snapshot_path}/#{snap_id}")
67
+ snapshot_hash = JSON.parse(response.body)["snapshot"]
68
+ OpenStack::Volume::Snapshot.new(snapshot_hash)
69
+ end
70
+ alias :snapshot :get_snapshot
71
+
72
+ #require params: {:display_name, :volume_id}
73
+ #optional params: {:display_description, :metadata=>{:key=>val, ...}, :availability_zone, :volume_type }
74
+ #returns OpenStack::Volume::Snapshot object
75
+ def create_snapshot(options)
76
+ raise OpenStack::Exception::MissingArgument, ":volume_id and :display_name must be specified to create a snapshot" unless (options[:display_name] && options[:volume_id])
77
+ #:force documented in API but not explained... clarify (fails without)
78
+ options.merge!({:force=>"true"})
79
+ data = JSON.generate(:snapshot => options)
80
+ response = @connection.csreq("POST",@connection.service_host,"#{@connection.service_path}/#{@snapshot_path}",@connection.service_port,@connection.service_scheme,{'content-type' => 'application/json'},data)
81
+ OpenStack::Exception.raise_exception(response) unless response.code.match(/^20.$/)
82
+ snapshot_info = JSON.parse(response.body)["snapshot"]
83
+ OpenStack::Volume::Snapshot.new(snapshot_info)
84
+ end
85
+
86
+ def delete_snapshot(snap_id)
87
+ @connection.req("DELETE", "/#{@snapshot_path}/#{snap_id}")
88
+ true
89
+ end
57
90
 
58
91
  private
59
92
 
60
93
  #fudge... not clear if volumes support is available as 'native' volume API or
61
94
  #as the os-volumes extension. Need to probe to find out (for now)
62
95
  #see https://lists.launchpad.net/openstack/msg16601.html
63
- def check_if_native
96
+ def check_if_native(entity) #volumes or snapshots
64
97
  native = extension = false
65
98
  #check if 'native' volume API present:
66
99
  begin
67
- response = @connection.req("GET", "/volumes")
100
+ response = @connection.req("GET", "/#{entity}")
68
101
  native = true if response.code.match(/^20.$/)
69
- return true, "volumes"
102
+ return true, entity
70
103
  rescue OpenStack::Exception::ItemNotFound => not_found
71
104
  native = false
72
105
  end
73
106
  #check if available as extension:
74
107
  begin
75
- response = @connection.req("GET", "/os-volumes")
108
+ response = @connection.req("GET", "/os-#{entity}")
76
109
  extension = true if response.code.match(/^20.$/)
77
- return false, "os-volumes"
110
+ return false, "os-#{entity}"
78
111
  rescue OpenStack::Exception::ItemNotFound => not_found
79
112
  extension = false
80
113
  end
81
- raise OpenStack::Exception::NotImplemented.new("No Volumes support for this provider", 501, "No Volumes Support") unless (native || extension)
114
+ raise OpenStack::Exception::NotImplemented.new("No Volumes support for this provider", 501, "No #{entity} Support") unless (native || extension)
82
115
  end
83
116
 
84
117
 
@@ -0,0 +1,25 @@
1
+ module OpenStack
2
+ module Volume
3
+ class Snapshot
4
+
5
+ attr_reader :id
6
+ attr_reader :display_name
7
+ attr_reader :display_description
8
+ attr_reader :volume_id
9
+ attr_reader :status
10
+ attr_reader :size
11
+ attr_reader :created_at
12
+
13
+ def initialize(snap_info)
14
+ @id = snap_info["id"]
15
+ @display_name = snap_info["display_name"] || snap_info["displayName"]
16
+ @display_description = snap_info["display_description"] || snap_info["displayDescription"]
17
+ @volume_id = snap_info["volume_id"] || snap_info["volumeId"]
18
+ @status = snap_info["status"]
19
+ @size = snap_info["size"]
20
+ @created_at = snap_info["created_at"] || snap_info["createdAt"]
21
+ end
22
+
23
+ end
24
+ end
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-19 00:00:00.000000000 Z
13
+ date: 2013-01-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: mocha
@@ -81,6 +81,7 @@ files:
81
81
  - lib/openstack/compute/personalities.rb
82
82
  - lib/openstack/compute/server.rb
83
83
  - lib/openstack/connection.rb
84
+ - lib/openstack/image/connection.rb
84
85
  - lib/openstack/swift/connection.rb
85
86
  - lib/openstack/swift/container.rb
86
87
  - lib/openstack/swift/storage_object.rb