deltacloud-client 0.0.2

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 (47) hide show
  1. data/COPYING +502 -0
  2. data/Rakefile +39 -0
  3. data/credentials.yml +2 -0
  4. data/init.rb +19 -0
  5. data/lib/dcloud/base_model.rb +80 -0
  6. data/lib/dcloud/flavor.rb +43 -0
  7. data/lib/dcloud/image.rb +46 -0
  8. data/lib/dcloud/instance.rb +97 -0
  9. data/lib/dcloud/realm.rb +47 -0
  10. data/lib/dcloud/state.rb +30 -0
  11. data/lib/dcloud/storage_snapshot.rb +50 -0
  12. data/lib/dcloud/storage_volume.rb +53 -0
  13. data/lib/dcloud/transition.rb +35 -0
  14. data/lib/deltacloud.rb +356 -0
  15. data/specs/data/images/img1.yml +3 -0
  16. data/specs/data/images/img2.yml +3 -0
  17. data/specs/data/images/img3.yml +3 -0
  18. data/specs/data/instances/inst1.yml +8 -0
  19. data/specs/data/instances/inst2.yml +8 -0
  20. data/specs/data/storage_snapshots/snap1.yml +4 -0
  21. data/specs/data/storage_snapshots/snap2.yml +4 -0
  22. data/specs/data/storage_snapshots/snap3.yml +4 -0
  23. data/specs/data/storage_volumes/vol1.yml +6 -0
  24. data/specs/data/storage_volumes/vol2.yml +6 -0
  25. data/specs/data/storage_volumes/vol3.yml +6 -0
  26. data/specs/fixtures/images/img1.yml +3 -0
  27. data/specs/fixtures/images/img2.yml +3 -0
  28. data/specs/fixtures/images/img3.yml +3 -0
  29. data/specs/fixtures/instances/inst1.yml +8 -0
  30. data/specs/fixtures/instances/inst2.yml +8 -0
  31. data/specs/fixtures/storage_snapshots/snap1.yml +4 -0
  32. data/specs/fixtures/storage_snapshots/snap2.yml +4 -0
  33. data/specs/fixtures/storage_snapshots/snap3.yml +4 -0
  34. data/specs/fixtures/storage_volumes/vol1.yml +6 -0
  35. data/specs/fixtures/storage_volumes/vol2.yml +6 -0
  36. data/specs/fixtures/storage_volumes/vol3.yml +6 -0
  37. data/specs/flavors_spec.rb +67 -0
  38. data/specs/images_spec.rb +104 -0
  39. data/specs/initialization_spec.rb +59 -0
  40. data/specs/instance_states_spec.rb +77 -0
  41. data/specs/instances_spec.rb +171 -0
  42. data/specs/realms_spec.rb +65 -0
  43. data/specs/shared/resources.rb +29 -0
  44. data/specs/spec_helper.rb +54 -0
  45. data/specs/storage_snapshot_spec.rb +76 -0
  46. data/specs/storage_volume_spec.rb +86 -0
  47. metadata +108 -0
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ require 'spec/rake/spectask'
20
+
21
+
22
+ desc "Run all examples"
23
+ Spec::Rake::SpecTask.new('spec') do |t|
24
+ t.spec_files = FileList['specs/**/*_spec.rb']
25
+ t.spec_opts = [
26
+ '--format html:spec_report.html'
27
+ ]
28
+ end
29
+
30
+ desc "Setup Fixtures"
31
+ task 'fixtures' do
32
+ FileUtils.rm_rf( File.dirname( __FILE__ ) + '/specs/data' )
33
+ FileUtils.cp_r( File.dirname( __FILE__ ) + '/specs/fixtures', File.dirname( __FILE__ ) + '/specs/data' )
34
+ end
35
+
36
+ desc "Clean Fixtures"
37
+ task 'fixtures:clean' do
38
+ FileUtils.rm_rf( File.dirname( __FILE__ ) + '/specs/data' )
39
+ end
data/credentials.yml ADDED
@@ -0,0 +1,2 @@
1
+ name: mockuser
2
+ password: mockpassword
data/init.rb ADDED
@@ -0,0 +1,19 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ require 'deltacloud'
@@ -0,0 +1,80 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ module DCloud
20
+ class BaseModel
21
+
22
+ def self.xml_tag_name(name=nil)
23
+ unless ( name.nil? )
24
+ @xml_tag_name = name
25
+ end
26
+ @xml_tag_name || self.class.name.downcase.to_sym
27
+ end
28
+
29
+
30
+ def self.attribute(attr)
31
+ build_reader attr
32
+ end
33
+
34
+ def self.build_reader(attr)
35
+ eval "
36
+ def #{attr}
37
+ check_load_payload
38
+ @#{attr}
39
+ end
40
+ "
41
+ end
42
+
43
+ attr_reader :uri
44
+
45
+ def initialize(client, uri=nil, xml=nil)
46
+ @client = client
47
+ @uri = uri
48
+ @loaded = false
49
+ load_payload( xml )
50
+ end
51
+
52
+ def id()
53
+ check_load_payload
54
+ @id
55
+ end
56
+
57
+
58
+ protected
59
+
60
+ attr_reader :client
61
+
62
+ def check_load_payload()
63
+ return if @loaded
64
+ xml = @client.fetch_resource( self.class.xml_tag_name.to_sym, @uri )
65
+ load_payload(xml)
66
+ end
67
+
68
+ def load_payload(xml=nil)
69
+ unless ( xml.nil? )
70
+ @loaded = true
71
+ @id = xml.text( 'id' )
72
+ end
73
+ end
74
+
75
+ def unload
76
+ @loaded = false
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,43 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ require 'dcloud/base_model'
20
+
21
+ module DCloud
22
+ class Flavor < BaseModel
23
+
24
+ xml_tag_name :flavor
25
+
26
+ attribute :memory
27
+ attribute :storage
28
+ attribute :architecture
29
+
30
+ def initialize(client, uri, xml=nil)
31
+ super( client, uri, xml )
32
+ end
33
+
34
+ def load_payload(xml=nil)
35
+ super(xml)
36
+ unless xml.nil?
37
+ @memory = xml.text( 'memory' ).to_f
38
+ @storage = xml.text( 'storage' ).to_f
39
+ @architecture = xml.text( 'architecture' )
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,46 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ require 'dcloud/base_model'
20
+
21
+ module DCloud
22
+ class Image < BaseModel
23
+
24
+ xml_tag_name :image
25
+
26
+ attribute :description
27
+ attribute :owner_id
28
+ attribute :architecture
29
+ attribute :name
30
+
31
+ def initialize(client, uri, xml=nil)
32
+ super( client, uri, xml )
33
+ end
34
+
35
+ def load_payload(xml)
36
+ super( xml )
37
+ unless xml.nil?
38
+ @description = xml.text( 'description' )
39
+ @owner_id = xml.text( 'owner_id' )
40
+ @name = xml.text( 'name' )
41
+ @architecture = xml.text( 'architecture' )
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,97 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ require 'dcloud/base_model'
20
+
21
+ module DCloud
22
+ class Instance < BaseModel
23
+
24
+ xml_tag_name :instance
25
+
26
+ attribute :name
27
+ attribute :owner_id
28
+ attribute :public_addresses
29
+ attribute :private_addresses
30
+ attribute :state
31
+ attribute :actions
32
+ attribute :image
33
+ attribute :flavor
34
+ attribute :realm
35
+ attribute :action_urls
36
+
37
+ def initialize(client, uri, xml=nil)
38
+ @action_urls = {}
39
+ super( client, uri, xml )
40
+ end
41
+
42
+ def start!()
43
+ url = action_urls['start']
44
+ throw Exception.new( "Unable to start" ) unless url
45
+ client.post_instance( url )
46
+ unload
47
+ end
48
+
49
+ def reboot!()
50
+ url = action_urls['reboot']
51
+ throw Exception.new( "Unable to reboot" ) unless url
52
+ client.post_instance( url )
53
+ unload
54
+ end
55
+
56
+ def stop!()
57
+ url = action_urls['stop']
58
+ throw Exception.new( "Unable to stop" ) unless url
59
+ client.post_instance( url )
60
+ unload
61
+ end
62
+
63
+ def load_payload(xml=nil)
64
+ super(xml)
65
+ unless xml.nil?
66
+ @owner_id = xml.text('owner_id')
67
+ @name = xml.text('name')
68
+ @public_addresses = []
69
+ xml.get_elements( 'public-addresses/address' ).each do |address|
70
+ @public_addresses << address.text
71
+ end
72
+ @private_addresses = []
73
+ xml.get_elements( 'private-addresses/address' ).each do |address|
74
+ @private_addresses << address.text
75
+ end
76
+ image_uri = xml.get_elements( 'image' )[0].attributes['href']
77
+ @image = Image.new( @client, image_uri )
78
+ flavor_uri = xml.get_elements( 'flavor' )[0].attributes['href']
79
+ @flavor = Flavor.new( @client, flavor_uri )
80
+ # Only use realms if they are there
81
+ if (!xml.get_elements( 'realm' ).empty?)
82
+ realm_uri = xml.get_elements( 'realm' )[0].attributes['href']
83
+ @realm = Realm.new( @client, realm_uri )
84
+ end
85
+ @state = xml.text( 'state' )
86
+ @actions = []
87
+ xml.get_elements( 'actions/link' ).each do |link|
88
+ action_name = link.attributes['rel']
89
+ if ( action_name )
90
+ @actions << link.attributes['rel']
91
+ @action_urls[ link.attributes['rel'] ] = link.attributes['href']
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require 'dcloud/base_model'
19
+
20
+ module DCloud
21
+ class Realm < BaseModel
22
+
23
+ xml_tag_name :realm
24
+
25
+ attribute :name
26
+ attribute :state
27
+ attribute :limit
28
+
29
+ def initialize(client, uri, xml=nil)
30
+ super( client, uri, xml )
31
+ end
32
+
33
+ def load_payload(xml=nil)
34
+ super(xml)
35
+ unless xml.nil?
36
+ @name = xml.text( 'name' )
37
+ @state = xml.text( 'state' )
38
+ @limit = xml.text( 'limit' )
39
+ if ( @limit.nil? || @limit == '' )
40
+ @limit = :unlimited
41
+ else
42
+ @limit = @limit.to_f
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ module DCloud
19
+ class State
20
+
21
+ attr_accessor :name
22
+ attr_accessor :transitions
23
+
24
+ def initialize(name)
25
+ @name = name
26
+ @transitions = []
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,50 @@
1
+ #
2
+ # Copyright (C) 2009 Red Hat, Inc.
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+
19
+ require 'dcloud/base_model'
20
+
21
+ module DCloud
22
+ class StorageSnapshot < BaseModel
23
+
24
+ xml_tag_name :storage_snapshot
25
+
26
+ attribute :created
27
+ attribute :state
28
+ attribute :storage_volume
29
+
30
+ def initialize(client, uri, xml=nil)
31
+ super( client, uri, xml )
32
+ end
33
+
34
+ def load_payload(xml=nil)
35
+ super(xml)
36
+ unless xml.nil?
37
+ @created = xml.text( 'created' )
38
+ @state = xml.text( 'state' )
39
+ storage_volumes = xml.get_elements( 'storage-volume' )
40
+ if ( ! storage_volumes.empty? )
41
+ storage_volume = storage_volumes.first
42
+ storage_volume_href = storage_volume.attributes['href']
43
+ if ( storage_volume_href )
44
+ @storage_volume = StorageVolume.new( @client, storage_volume_href )
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end