occi 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/.gitignore +9 -0
  2. data/.project +32 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +8 -0
  5. data/.yardopts +1 -0
  6. data/AUTHORS +8 -0
  7. data/Gemfile +35 -14
  8. data/Gemfile.lock +89 -32
  9. data/LICENSE +13 -4
  10. data/README.md +70 -21
  11. data/Rakefile +25 -21
  12. data/lib/OpenNebula/Acl.rb +256 -0
  13. data/lib/OpenNebula/AclPool.rb +53 -0
  14. data/lib/OpenNebula/Group.rb +147 -0
  15. data/lib/OpenNebula/GroupPool.rb +54 -0
  16. data/lib/OpenNebula/Host.rb +143 -0
  17. data/lib/OpenNebula/HostPool.rb +55 -0
  18. data/lib/OpenNebula/Image.rb +256 -0
  19. data/lib/OpenNebula/ImagePool.rb +74 -0
  20. data/lib/OpenNebula/OpenNebula.rb +137 -0
  21. data/lib/OpenNebula/Pool.rb +285 -0
  22. data/lib/OpenNebula/Template.rb +173 -0
  23. data/lib/OpenNebula/TemplatePool.rb +74 -0
  24. data/lib/OpenNebula/User.rb +157 -0
  25. data/lib/OpenNebula/UserPool.rb +53 -0
  26. data/lib/OpenNebula/VirtualMachine.rb +319 -0
  27. data/lib/OpenNebula/VirtualMachinePool.rb +120 -0
  28. data/lib/OpenNebula/VirtualNetwork.rb +229 -0
  29. data/lib/OpenNebula/VirtualNetworkPool.rb +74 -0
  30. data/lib/OpenNebula/XMLUtils.rb +337 -0
  31. data/lib/occi/antlr/.gitignore +18 -0
  32. data/lib/occi/antlr/OCCI.g +164 -0
  33. data/lib/occi/antlr/OCCI.tokens +75 -0
  34. data/lib/occi/antlr/OCCILexer.rb +1532 -0
  35. data/lib/occi/antlr/OCCIParser.rb +2472 -0
  36. data/lib/occi/antlr/README.md +2 -0
  37. data/lib/occi/backend/dummy.rb +232 -0
  38. data/lib/occi/backend/ec2/Compute.rb +310 -0
  39. data/lib/occi/backend/ec2/compute.rb +310 -0
  40. data/lib/occi/backend/ec2/ec2.rb +215 -0
  41. data/lib/occi/backend/manager.rb +131 -0
  42. data/lib/occi/backend/opennebula/compute.rb +360 -0
  43. data/lib/occi/backend/opennebula/network.rb +143 -0
  44. data/lib/occi/backend/opennebula/opennebula.rb +188 -0
  45. data/lib/occi/backend/opennebula/storage.rb +175 -0
  46. data/lib/occi/configuration.rb +118 -0
  47. data/lib/occi/core/action.rb +29 -0
  48. data/lib/occi/core/attribute_properties.rb +54 -0
  49. data/lib/occi/core/attributes.rb +40 -0
  50. data/lib/occi/core/category.rb +62 -0
  51. data/lib/occi/core/collection.rb +27 -0
  52. data/lib/occi/core/entity.rb +135 -0
  53. data/lib/occi/core/kind.rb +55 -0
  54. data/lib/occi/core/link.rb +88 -0
  55. data/lib/occi/core/mixin.rb +43 -0
  56. data/lib/occi/core/resource.rb +73 -0
  57. data/lib/occi/exceptions.rb +59 -0
  58. data/lib/occi/extensions/monitoring/cpu.rb +51 -0
  59. data/lib/occi/extensions/monitoring/memory.rb +49 -0
  60. data/lib/occi/extensions/monitoring/metric.rb +54 -0
  61. data/lib/occi/extensions/monitoring/netrx.rb +49 -0
  62. data/lib/occi/extensions/monitoring/nettx.rb +55 -0
  63. data/lib/occi/extensions/one/VNC.rb +58 -0
  64. data/lib/occi/extensions/one/vnc.rb +58 -0
  65. data/lib/occi/log.rb +47 -0
  66. data/lib/occi/parse.rb +164 -0
  67. data/lib/occi/registry.rb +87 -0
  68. data/lib/occi/server.rb +594 -0
  69. data/lib/occi/version.rb +3 -0
  70. data/occi.gemspec +18 -96
  71. data/spec/occi/antlr/parser_spec.rb +82 -0
  72. data/spec/spec_helper.rb +6 -0
  73. metadata +100 -208
  74. data/.autotest +0 -21
  75. data/.rvmrc +0 -1
  76. data/VERSION +0 -1
  77. data/lib/occi.rb +0 -1
  78. data/lib/occi/client.rb +0 -36
  79. data/lib/occi/compute.rb +0 -4
  80. data/lib/occi/network.rb +0 -4
  81. data/lib/occi/resource.rb +0 -59
  82. data/lib/occi/storage.rb +0 -7
  83. data/test/fixtures/cassettes/compute_all.yml +0 -28
  84. data/test/fixtures/cassettes/compute_create.yml +0 -45
  85. data/test/fixtures/cassettes/compute_destroy.yml +0 -22
  86. data/test/fixtures/cassettes/compute_find.yml +0 -28
  87. data/test/fixtures/cassettes/compute_update.yml +0 -35
  88. data/test/fixtures/cassettes/network_all.yml +0 -28
  89. data/test/fixtures/cassettes/network_create.yml +0 -37
  90. data/test/fixtures/cassettes/network_destroy.yml +0 -22
  91. data/test/fixtures/cassettes/network_find.yml +0 -28
  92. data/test/fixtures/cassettes/storage_all.yml +0 -28
  93. data/test/fixtures/cassettes/storage_create.yml +0 -50
  94. data/test/fixtures/cassettes/storage_destroy.yml +0 -22
  95. data/test/fixtures/cassettes/storage_find.yml +0 -28
  96. data/test/lib/occi/compute_test.rb +0 -91
  97. data/test/lib/occi/network_test.rb +0 -57
  98. data/test/lib/occi/storage_test.rb +0 -67
  99. data/test/test_helper.rb +0 -48
@@ -0,0 +1,310 @@
1
+ ##############################################################################
2
+ # Copyright 2011 Service Computing group, TU Dortmund
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ##############################################################################
16
+
17
+ ##############################################################################
18
+ # Description: EC2 Backend
19
+ # Author(s): Max Guenther
20
+ ##############################################################################
21
+
22
+ require 'aws-sdk'
23
+ require 'occi/log'
24
+
25
+ module OCCI
26
+ module Backend
27
+ module EC2
28
+
29
+ # ---------------------------------------------------------------------------------------------------------------------
30
+ module Compute
31
+
32
+ # ---------------------------------------------------------------------------------------------------------------------
33
+ private
34
+ # ---------------------------------------------------------------------------------------------------------------------
35
+
36
+ def get_backend_instance(compute)
37
+ # get the ec2 interface
38
+ ec2 = OCCI::Backend::EC2.get_ec2_interface()
39
+
40
+ # get the ec2 backend instance
41
+ backend_instance = ec2.instances[compute.backend[:id]]
42
+
43
+ raise "Problems refreshing compute instance: An instance with the EC2 ID #{compute.backend[:id]} could not be found." if backend_instance.nil?
44
+ # return the instance
45
+ return backend_instance
46
+ end
47
+
48
+ def has_console_link(compute)
49
+ compute.links.each do |link|
50
+ OCCI::Log.debug("Link: #{link}")
51
+ if link.kind.term == "console"
52
+ return true
53
+ end
54
+ end
55
+ return false
56
+ end
57
+
58
+ def key_pair_exists(key_name)
59
+ ec2 = OCCI::Backend::EC2.get_ec2_interface()
60
+
61
+ ec2.key_pairs.each do |key|
62
+ if key.name == "default_occi_key"
63
+ return true
64
+ end
65
+ end
66
+ return false
67
+ end
68
+
69
+ public
70
+ # ---------------------------------------------------------------------------------------------------------------------
71
+
72
+ # ---------------------------------------------------------------------------------------------------------------------
73
+ def compute_deploy(compute)
74
+ OCCI::Log.debug("Deploying EC2 instance.")
75
+
76
+ # look what template and instance type to use
77
+ image_id = "ami-973b06e3" # fallback os template
78
+ instance_type = "t1.micro" # fallback resource template
79
+ compute.mixins.each do |mixin|
80
+ mixin.related.each do |related|
81
+ if related.term == "os_tpl"
82
+ image_id = mixin.term
83
+ break # use the first template found
84
+ elsif related.term == "resource_tpl"
85
+ instance_type = mixin.term
86
+ break # use the first template found
87
+ end
88
+ end
89
+ end
90
+
91
+ # get the ec2 interface
92
+ ec2 = OCCI::Backend::EC2.get_ec2_interface()
93
+
94
+ # create an instance
95
+ if key_pair_exists("default_occi_key")
96
+ backend_instance = ec2.instances.create(:image_id => image_id,
97
+ :instance_type => instance_type,
98
+ :key_name => "default_occi_key")
99
+ else
100
+ backend_instance = ec2.instances.create(:image_id => image_id,
101
+ :instance_type => instance_type)
102
+ end
103
+
104
+ # save the id of the instance
105
+ compute.backend[:id] = backend_instance.id
106
+
107
+ # link it to the private ec2 network
108
+ OCCI::Log.debug("Linking instance to \"/network/ec2_private_network\".")
109
+ private_network = OCCI::Rendering::HTTP::LocationRegistry.get_object("/network/ec2_private_network")
110
+ attributes = OCCI::Core::Attributes.new()
111
+ attributes["occi.networkinterface.interface"] = ""
112
+ attributes["occi.core.source"] = compute.get_location
113
+ attributes["occi.core.target"] = "/network/ec2_private_network"
114
+ ipnetwork = OCCI::CategoryRegistry.get_by_id("http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface")
115
+ ipnetwork.backend[:network] = "private"
116
+ mixins = [ipnetwork]
117
+ private_networkinterface = OCCI::Infrastructure::Networkinterface.new(attributes, mixins)
118
+ # save the id of the compute backend instance in the network link for future identification
119
+ private_networkinterface.backend[:backend_id] = backend_instance.id
120
+ private_networkinterface.backend[:network] = "ec2_private_network"
121
+ compute.links << private_networkinterface
122
+ private_network.links << private_networkinterface
123
+ OCCI::Rendering::HTTP::LocationRegistry.register(private_networkinterface.get_location, private_networkinterface)
124
+
125
+ # link it to the public ec2 network
126
+ OCCI::Log.debug("Linking instance to \"/network/ec2_public_network\".")
127
+ public_network = OCCI::Rendering::HTTP::LocationRegistry.get_object("/network/ec2_public_network")
128
+ attributes = OCCI::Core::Attributes.new()
129
+ attributes["occi.networkinterface.interface"] = ""
130
+ attributes["occi.core.source"] = compute.get_location
131
+ attributes["occi.core.target"] = "/network/ec2_public_network"
132
+ ipnetwork = OCCI::CategoryRegistry.get_by_id("http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface")
133
+ ipnetwork.backend[:network] = "ec2_public_network"
134
+ mixins = [ipnetwork]
135
+ public_networkinterface = OCCI::Infrastructure::Networkinterface.new(attributes, mixins)
136
+ # save the id of the compute backend instance in the network link for future identification
137
+ public_networkinterface.backend[:backend_id] = backend_instance.id
138
+ public_networkinterface.backend[:network] = "public"
139
+ compute.links << public_networkinterface
140
+ public_network.links << public_networkinterface
141
+ OCCI::Rendering::HTTP::LocationRegistry.register(public_networkinterface.get_location, public_networkinterface)
142
+
143
+ OCCI::Log.debug("Deployed EC2 instance with EC2 ID: #{compute.backend[:id]}")
144
+ end
145
+
146
+ # ---------------------------------------------------------------------------------------------------------------------
147
+ def compute_refresh(compute)
148
+ OCCI::Log.debug("Refreshing EC2 compute object with backend ID: #{compute.backend[:id]}")
149
+
150
+ # get the ec2 backend instance
151
+ backend_instance = get_backend_instance(compute)
152
+
153
+ # check if there are any problems with the backend instance
154
+ if backend_instance.nil?
155
+ OCCI::Log.debug("Problems refreshing compute instance: An instance with the EC2 ID #{compute.backend[:id]} could not be found.")
156
+ return
157
+ end
158
+
159
+ # update the state
160
+ compute_update_state(compute)
161
+ OCCI::Log.debug("Refreshed EC2 compute object with backend ID: #{compute.backend[:id]}")
162
+
163
+ # setting the architecture
164
+ compute.attributes["occi.compute.architecture"] = backend_instance.architecture.to_s
165
+ compute.attributes["ec2.compute.platform"] = backend_instance.platform
166
+ compute.attributes["ec2.compute.kernel_id"] = backend_instance.kernel_id
167
+
168
+ # update public and private ip
169
+ compute.links.each do |link|
170
+ if link.kind.term == "networkinterface" and link.backend[:backend_id] == backend_instance.id
171
+ if link.backend[:network] == "public" and backend_instance.ip_address != nil
172
+ link.mixins.each do |mixin|
173
+ if mixin.backend[:network] == "ec2_public_network"
174
+ link.attributes["occi.networkinterface.address"] = backend_instance.ip_address
175
+ state = OCCI::Infrastructure::Networkinterface::STATE_ACTIVE
176
+ link.state_machine.set_state(state)
177
+ link.attributes['occi.networkinterface.state'] = "active"
178
+ end
179
+ end
180
+ elsif link.backend[:network] == "private" and backend_instance.private_ip_address != nil
181
+ link.mixins.each do |mixin|
182
+ if mixin.backend[:network] == "ec2_private_network"
183
+ link.attributes["occi.networkinterface.address"] = backend_instance.private_ip_address
184
+ state = OCCI::Infrastructure::Networkinterface::STATE_ACTIVE
185
+ link.state_machine.set_state(state)
186
+ link.attributes['occi.networkinterface.state'] = "active"
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+ # create the console link if not already existent and if in state active
194
+ if compute.state_machine.current_state == OCCI::Infrastructure::Compute::STATE_ACTIVE and not has_console_link(compute) and backend_instance.key_name == "default_occi_key"
195
+ # create a ConsoleLink
196
+ OCCI::Log.debug("Creating a ConsoleLink to the EC2 Compute instance.")
197
+ attributes = OCCI::Core::Attributes.new()
198
+ attributes['occi.core.target'] = "ssh://" + backend_instance.public_dns_name
199
+ attributes['occi.core.source'] = compute.get_location
200
+ mixins = []
201
+ console_link = OCCI::Infrastructure::ConsoleLink.new(attributes, mixins)
202
+ # save the id of the compute backend instance in the network link for future identification
203
+ console_link.backend[:backend_id] = backend_instance.id
204
+ # link and register
205
+ location = console_link.get_location
206
+ compute.links << console_link
207
+ OCCI::Rendering::HTTP::LocationRegistry.register(location, console_link)
208
+ end
209
+ end
210
+
211
+ # ---------------------------------------------------------------------------------------------------------------------
212
+ def compute_update_state(compute)
213
+ # get the ec2 backend instance
214
+ backend_instance = get_backend_instance(compute)
215
+
216
+ # map the ec2 state to an OCCI state
217
+ OCCI::Log.debug("Current EC2 VM state is: #{backend_instance.status}")
218
+ state = case backend_instance.status
219
+ when :running then
220
+ OCCI::Infrastructure::Compute::STATE_ACTIVE
221
+ when :pending, :shutting_down, :stopping, :terminated then
222
+ OCCI::Infrastructure::Compute::STATE_INACTIVE
223
+ when :stopped then
224
+ OCCI::Infrastructure::Compute::STATE_SUSPENDED
225
+ else
226
+ OCCI::Infrastructure::Compute::STATE_INACTIVE
227
+ end
228
+ # set the state
229
+ compute.state_machine.set_state(state)
230
+ compute.attributes['occi.compute.state'] = compute.state_machine.current_state.name
231
+ end
232
+
233
+ # ---------------------------------------------------------------------------------------------------------------------
234
+ def compute_delete(compute)
235
+ OCCI::Log.debug("Deleting EC2 Compute instance with EC2 ID #{compute.backend[:id]}")
236
+
237
+ # get the ec2 backend instance
238
+ backend_instance = get_backend_instance(compute)
239
+
240
+ if backend_instance.nil?
241
+ OCCI::Log.debug("Problems refreshing compute instance: An instance with the EC2 ID #{compute.backend[:id]} could not be found.")
242
+ return
243
+ end
244
+ # terminate the instance
245
+ backend_instance.terminate()
246
+
247
+ # delete networklinks to the private and public network and the ConsoleLink
248
+ compute.links.each do |link|
249
+ if link.backend[:backend_id] == backend_instance.id
250
+ location = OCCI::Rendering::HTTP::LocationRegistry.get_location_of_object(link)
251
+ OCCI::Log.debug("Deleting link to #{location}")
252
+ OCCI::Rendering::HTTP::LocationRegistry.unregister(location)
253
+ end
254
+ end
255
+ OCCI::Log.debug("Deleted EC2 Compute instance with EC2 ID #{compute.backend[:id]}")
256
+ end
257
+
258
+ # ---------------------------------------------------------------------------------------------------------------------
259
+ # COMPUTE ACTIONS
260
+ # ---------------------------------------------------------------------------------------------------------------------
261
+ # COMPUTE Action start
262
+ def compute_start(compute, parameters=nil)
263
+ OCCI::Log.debug("Starting EC2 VM with EC2 instance ID #{compute.backend[:id]}")
264
+
265
+ # get the ec2 backend instance
266
+ backend_instance = get_backend_instance(compute)
267
+
268
+ # suspend the instance (in EC2 lingo stop it)
269
+ backend_instance.start()
270
+ OCCI::Log.debug("Started EC2 VM with EC2 instance ID #{compute.backend[:id]}")
271
+ end
272
+
273
+ # ---------------------------------------------------------------------------------------------------------------------
274
+ # Action stop
275
+ def compute_stop(compute, parameters=nil)
276
+ OCCI::Log.debug("Stopping EC2 VM with EC2 instance ID #{compute.backend[:id]}")
277
+
278
+ # get the ec2 backend instance
279
+ backend_instance = get_backend_instance(compute)
280
+
281
+ # stop the instance
282
+ backend_instance.stop()
283
+ OCCI::Log.debug("Stopped EC2 VM with EC2 instance ID #{compute.backend[:id]}")
284
+ end
285
+
286
+ # ---------------------------------------------------------------------------------------------------------------------
287
+ # Action restart
288
+ def compute_restart(compute, parameters=nil)
289
+ OCCI::Log.debug("Restarting EC2 VM with EC2 instance ID #{compute.backend[:id]}")
290
+
291
+ # get the ec2 backend instance
292
+ backend_instance = get_backend_instance(compute)
293
+
294
+ # restart the instance
295
+ backend_instance.reboot()
296
+ OCCI::Log.debug("Restarted EC2 VM with EC2 instance ID #{compute.backend[:id]}")
297
+ end
298
+
299
+ # ---------------------------------------------------------------------------------------------------------------------
300
+ # Action suspend
301
+ def compute_suspend(compute, parameters=nil)
302
+ OCCI::Log.warning("Stop suspend is not supported on EC2 Compute instances.")
303
+ end
304
+
305
+ end
306
+
307
+ end
308
+ end
309
+ end
310
+
@@ -0,0 +1,215 @@
1
+ ##############################################################################
2
+ # Copyright 2011 Service Computing group, TU Dortmund
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ##############################################################################
16
+
17
+ ##############################################################################
18
+ # Description: EC2 Backend
19
+ # Author(s): Max Guenther
20
+ ##############################################################################
21
+
22
+ # Amazon Webservices SDK
23
+ require 'aws-sdk'
24
+
25
+ # EC2 backend
26
+ #require 'occi/backend/ec2/Compute'
27
+
28
+ # for XML parsing (gem = "xml-simple")
29
+ require 'xmlsimple'
30
+
31
+ require 'occi/log'
32
+
33
+
34
+ module OCCI
35
+ module Backend
36
+ module EC2
37
+ # ---------------------------------------------------------------------------------------------------------------------
38
+
39
+ #begin
40
+ # ### Create networks
41
+ # # Create private network
42
+ # attributes = OCCI::Core::Attributes.new()
43
+ # attributes['occi.core.title'] = "ec2_private_network"
44
+ # attributes['occi.core.summary'] = "This network contains private links to all EC2 compute instances."
45
+ # mixins = []
46
+ # private_network = OCCI::Infrastructure::Network.new(attributes, mixins)
47
+ # OCCI::Rendering::HTTP::LocationRegistry.register("/network/ec2_private_network", private_network)
48
+ # private_network.state_machine.set_state(OCCI::Infrastructure::Network::STATE_ACTIVE)
49
+ # private_network.attributes['occi.network.state'] = "active"
50
+ #
51
+ # # Create public network
52
+ # attributes = OCCI::Core::Attributes.new()
53
+ # attributes['occi.core.title'] = "ec2_public_network"
54
+ # attributes['occi.core.summary'] = "This network contains public links to all EC2 compute instances."
55
+ # mixins = []
56
+ # public_network = OCCI::Infrastructure::Network.new(attributes, mixins)
57
+ # OCCI::Rendering::HTTP::LocationRegistry.register("/network/ec2_public_network", public_network)
58
+ # public_network.state_machine.set_state(OCCI::Infrastructure::Network::STATE_ACTIVE)
59
+ # public_network.attributes['occi.network.state'] = "active"
60
+ #end
61
+
62
+ public
63
+
64
+ def self.get_ec2_interface
65
+ ec2 = AWS::EC2.new
66
+ return ec2.regions[OCCI::Server.config["avail_zone"]]
67
+ end
68
+
69
+ class EC2
70
+
71
+ #include Compute
72
+
73
+ # ---------------------------------------------------------------------------------------------------------------------
74
+ # Operation mappings
75
+
76
+
77
+ OPERATIONS = {}
78
+
79
+ OPERATIONS["http://schemas.ogf.org/occi/infrastructure#compute"] = {
80
+
81
+ # Generic resource operations
82
+ :deploy => :compute_deploy,
83
+ :update_state => :compute_update_state,
84
+ :refresh => :compute_refresh,
85
+ :delete => :compute_delete,
86
+
87
+ # Compute specific resource operations
88
+ :start => :compute_start,
89
+ :stop => :compute_stop,
90
+ :restart => :compute_restart,
91
+ :suspend => nil
92
+ }
93
+
94
+ OPERATIONS["http://schemas.ogf.org/occi/infrastructure#network"] = {
95
+
96
+ # Generic resource operations
97
+ :deploy => nil,
98
+ :update_state => nil,
99
+ :refresh => nil,
100
+ :delete => nil,
101
+
102
+ # Network specific resource operations
103
+ :up => nil,
104
+ :down => nil
105
+ }
106
+
107
+ OPERATIONS["http://schemas.ogf.org/occi/infrastructure#storage"] = {
108
+
109
+ # Generic resource operations
110
+ :deploy => nil,
111
+ :update_state => nil,
112
+ :refresh => nil,
113
+ :delete => nil,
114
+
115
+ # Network specific resource operations
116
+ :online => nil,
117
+ :offline => nil,
118
+ :backup => nil,
119
+ :snapshot => nil,
120
+ :resize => nil
121
+ }
122
+
123
+ OPERATIONS["http://schemas.ogf.org/gwdg#nfsstorage"] = {
124
+
125
+ # Generic resource operations
126
+ :deploy => nil,
127
+ :update_state => nil,
128
+ :refresh => nil,
129
+ :delete => nil
130
+ }
131
+
132
+ # ---------------------------------------------------------------------------------------------------------------------
133
+
134
+ def initialize(access_key_id, secret_access_key)
135
+ # EC2 access key
136
+ AWS.config(
137
+ :access_key_id => access_key_id,
138
+ :secret_access_key => secret_access_key)
139
+ end
140
+
141
+ def register_templates
142
+ OCCI::Log.debug("Loading EC2 templates.")
143
+
144
+ # import Compute Resource Templates from etc/ec2_templates/resource_templates.xml
145
+ xml = XmlSimple.xml_in("etc/ec2_templates/resource_templates.xml")
146
+ xml["instance"].each do |instance|
147
+ term = instance["term"][0]
148
+ scheme = "http://mycloud.org/templates/compute#"
149
+ title = instance["title"][0]
150
+ attributes = OCCI::Core::Attributes.new()
151
+ actions = []
152
+ entities = []
153
+ related = [OCCI::Infrastructure::ResourceTemplate::MIXIN]
154
+ mixin = OCCI::Core::Mixin.new(term, scheme, title, attributes, actions, related, entities)
155
+ OCCI::CategoryRegistry.register(mixin)
156
+ end
157
+
158
+ ## import image templates
159
+ # get the ec2 interface
160
+ ec2 = OCCI::Backend::EC2.get_ec2_interface()
161
+ # register each image
162
+ ec2.images.each do |image|
163
+ term = image.id
164
+ scheme = "http://mycloud.org/templates/os#"
165
+ title = image.name
166
+ attributes = OCCI::Core::Attributes.new()
167
+ actions = []
168
+ entities = []
169
+ related = [OCCI::Infrastructure::OSTemplate::MIXIN]
170
+ mixin = OCCI::Core::Mixin.new(term, scheme, title, attributes, actions, related, entities)
171
+ OCCI::CategoryRegistry.register(mixin)
172
+ end
173
+ OCCI::Log.debug("Finished loading EC2 templates.")
174
+ end
175
+
176
+
177
+ # ---------------------------------------------------------------------------------------------------------------------
178
+ def register_existing_resources
179
+
180
+ end
181
+
182
+ # ---------------------------------------------------------------------------------------------------------------------
183
+ def resource_deploy(resource)
184
+ OCCI::Log.debug("Deploying resource '#{resource.attributes['occi.core.title']}'...")
185
+ end
186
+
187
+ # ---------------------------------------------------------------------------------------------------------------------
188
+ def resource_refresh(resource)
189
+ OCCI::Log.debug("Refreshing resource '#{resource.attributes['occi.core.title']}'...")
190
+ end
191
+
192
+ # ---------------------------------------------------------------------------------------------------------------------
193
+ def resource_update_state(resource)
194
+ OCCI::Log.debug("Updating state of resource '#{resource.attributes['occi.core.title']}'...")
195
+ end
196
+
197
+ # ---------------------------------------------------------------------------------------------------------------------
198
+ def resource_delete(resource)
199
+ OCCI::Log.debug("Deleting resource '#{resource.attributes['occi.core.title']}'...")
200
+ end
201
+
202
+ # ---------------------------------------------------------------------------------------------------------------------
203
+ # ACTIONS
204
+ # ---------------------------------------------------------------------------------------------------------------------
205
+
206
+ # ---------------------------------------------------------------------------------------------------------------------
207
+ def action_dummy(compute, parameters)
208
+ OCCI::Log.debug("Calling method for resource '#{resource.attributes['occi.core.title']}' with parameters: #{parameters.inspect}")
209
+ end
210
+
211
+ end
212
+
213
+ end
214
+ end
215
+ end