occi-core 4.1.3 → 4.2.0
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/.gitignore +1 -0
- data/Gemfile +8 -0
- data/README.md +49 -17
- data/lib/occi/collection.rb +37 -21
- data/lib/occi/core/action.rb +5 -5
- data/lib/occi/core/action_instance.rb +45 -3
- data/lib/occi/core/actions.rb +2 -1
- data/lib/occi/core/attributes.rb +253 -73
- data/lib/occi/core/categories.rb +1 -0
- data/lib/occi/core/category.rb +25 -8
- data/lib/occi/core/entities.rb +1 -0
- data/lib/occi/core/entity.rb +51 -74
- data/lib/occi/core/kind.rb +15 -11
- data/lib/occi/core/kinds.rb +1 -1
- data/lib/occi/core/link.rb +14 -15
- data/lib/occi/core/links.rb +1 -1
- data/lib/occi/core/mixin.rb +5 -5
- data/lib/occi/core/mixins.rb +2 -2
- data/lib/occi/core/properties.rb +90 -12
- data/lib/occi/core/resource.rb +7 -3
- data/lib/occi/core/resources.rb +2 -2
- data/lib/occi/errors/attribute_definitions_converted_error.rb +5 -0
- data/lib/occi/errors/attribute_missing_error.rb +5 -0
- data/lib/occi/errors/attribute_name_invalid_error.rb +5 -0
- data/lib/occi/errors/attribute_not_defined_error.rb +5 -0
- data/lib/occi/errors/attribute_property_type_error.rb +5 -0
- data/lib/occi/errors/attribute_type_error.rb +5 -0
- data/lib/occi/errors/kind_not_defined_error.rb +5 -0
- data/lib/occi/errors/parser_input_error.rb +5 -0
- data/lib/occi/errors/parser_type_error.rb +5 -0
- data/lib/occi/errors.rb +1 -0
- data/lib/occi/extensions/hashie.rb +25 -0
- data/lib/occi/helpers/comparators/action_instance.rb +22 -0
- data/lib/occi/helpers/comparators/attributes.rb +22 -0
- data/lib/occi/helpers/comparators/categories.rb +22 -0
- data/lib/occi/helpers/comparators/category.rb +22 -0
- data/lib/occi/helpers/comparators/collection.rb +40 -0
- data/lib/occi/helpers/comparators/entities.rb +22 -0
- data/lib/occi/helpers/comparators/entity.rb +22 -0
- data/lib/occi/helpers/comparators/properties.rb +26 -0
- data/lib/occi/helpers/comparators.rb +1 -0
- data/lib/occi/infrastructure/compute.rb +11 -9
- data/lib/occi/infrastructure/network.rb +27 -27
- data/lib/occi/infrastructure/networkinterface.rb +22 -23
- data/lib/occi/infrastructure/os_tpl.rb +1 -1
- data/lib/occi/infrastructure/resource_tpl.rb +1 -1
- data/lib/occi/infrastructure/storage.rb +7 -6
- data/lib/occi/infrastructure/storagelink.rb +4 -4
- data/lib/occi/log.rb +13 -10
- data/lib/occi/model.rb +9 -8
- data/lib/occi/parser/json.rb +11 -9
- data/lib/occi/parser/ova.rb +12 -6
- data/lib/occi/parser/ovf.rb +173 -116
- data/lib/occi/parser/text/constants.rb +87 -0
- data/lib/occi/parser/text.rb +161 -200
- data/lib/occi/parser/xml.rb +10 -8
- data/lib/occi/parser.rb +100 -50
- data/lib/occi/settings.rb +2 -1
- data/lib/occi/version.rb +1 -1
- data/lib/occi-core.rb +6 -4
- data/occi-core.gemspec +0 -7
- data/spec/occi/collection_samples/collection1.json +1 -0
- data/spec/occi/collection_samples/directory2/collection2.json +1 -0
- data/spec/occi/collection_spec.rb +961 -31
- data/spec/occi/core/action_instance_spec.rb +317 -0
- data/spec/occi/core/action_spec.rb +71 -0
- data/spec/occi/core/attributes_spec.rb +582 -27
- data/spec/occi/core/category_spec.rb +194 -18
- data/spec/occi/core/entities_spec.rb +96 -0
- data/spec/occi/core/entity_spec.rb +317 -28
- data/spec/occi/core/kind_spec.rb +127 -16
- data/spec/occi/core/link_spec.rb +35 -0
- data/spec/occi/core/links_spec.rb +130 -0
- data/spec/occi/core/mixins_spec.rb +107 -0
- data/spec/occi/core/properties_spec.rb +167 -0
- data/spec/occi/core/resource_spec.rb +23 -9
- data/spec/occi/core_spec.rb +12 -0
- data/spec/occi/infrastructure/compute_spec.rb +218 -18
- data/spec/occi/infrastructure/network_spec.rb +96 -0
- data/spec/occi/infrastructure/networkinterface_spec.rb +96 -0
- data/spec/occi/infrastructure/storage_spec.rb +33 -0
- data/spec/occi/infrastructure/storagelink_spec.rb +45 -0
- data/spec/occi/log_spec.rb +104 -1
- data/spec/occi/model_spec.rb +251 -39
- data/spec/occi/{test.json → parser/json_samples/test.json} +0 -0
- data/spec/occi/parser/ova_samples/test.dump +0 -0
- data/spec/occi/{test.ova → parser/ova_samples/test.ova} +0 -0
- data/spec/occi/parser/ovf_samples/test.dump +0 -0
- data/spec/occi/{test.ovf → parser/ovf_samples/test.ovf} +0 -0
- data/spec/occi/parser/text_samples/occi_categories.dump +0 -0
- data/spec/occi/parser/text_samples/occi_categories.text +2 -0
- data/spec/occi/parser/text_samples/occi_compute_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_compute_rocci_server.resource.dump +0 -0
- data/spec/occi/parser/text_samples/occi_compute_rocci_server.text +10 -0
- data/spec/occi/parser/text_samples/occi_link_resource_instance.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_resource_instance.text +7 -0
- data/spec/occi/parser/text_samples/occi_link_simple.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_simple.link_string.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_simple.text +1 -0
- data/spec/occi/parser/text_samples/occi_link_w_attributes.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_w_attributes.text +7 -0
- data/spec/occi/parser/text_samples/occi_link_w_category.dump +0 -0
- data/spec/occi/parser/text_samples/occi_link_w_category.text +3 -0
- data/spec/occi/parser/text_samples/occi_model_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_model_rocci_server.text +51 -0
- data/spec/occi/parser/text_samples/occi_network_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_network_rocci_server.resource.dump +0 -0
- data/spec/occi/parser/text_samples/occi_network_rocci_server.text +11 -0
- data/spec/occi/parser/text_samples/occi_resource_w_attributes.dump +0 -0
- data/spec/occi/parser/text_samples/occi_resource_w_attributes.text +11 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links.dump +0 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links.text +16 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links_only.dump +0 -0
- data/spec/occi/parser/text_samples/occi_resource_w_inline_links_only.text +13 -0
- data/spec/occi/parser/text_samples/occi_storage_rocci_server.dump +0 -0
- data/spec/occi/parser/text_samples/occi_storage_rocci_server.resource.dump +0 -0
- data/spec/occi/parser/text_samples/occi_storage_rocci_server.text +9 -0
- data/spec/occi/parser/text_spec.rb +274 -78
- data/spec/occi/parser/xml_samples/test.xml +352 -0
- data/spec/occi/parser_spec.rb +255 -104
- data/spec/occi-core_spec.rb +31 -0
- data/spec/spec_helper.rb +6 -2
- metadata +110 -111
- checksums.yaml +0 -7
- data/spec/occi/core/attribute_spec.rb +0 -0
data/.gitignore
CHANGED
data/Gemfile
CHANGED
|
@@ -4,4 +4,12 @@ gemspec
|
|
|
4
4
|
|
|
5
5
|
group :development do
|
|
6
6
|
gem 'rubygems-tasks', :git => 'git://github.com/postmodern/rubygems-tasks.git'
|
|
7
|
+
gem 'json_spec', :git => "https://github.com/collectiveidea/json_spec", :branch => "master"
|
|
8
|
+
gem 'rspec'
|
|
9
|
+
gem 'rake'
|
|
10
|
+
gem 'builder'
|
|
11
|
+
gem 'simplecov'
|
|
12
|
+
gem 'yard'
|
|
13
|
+
gem 'yard-rspec'
|
|
14
|
+
gem 'debugger', :platforms => :ruby
|
|
7
15
|
end
|
data/README.md
CHANGED
|
@@ -14,20 +14,30 @@ Requirements
|
|
|
14
14
|
* RubyGems have to be installed
|
|
15
15
|
* Rake has to be installed (e.g., `gem install rake`)
|
|
16
16
|
|
|
17
|
-
###
|
|
18
|
-
* libxslt1-dev
|
|
19
|
-
* libxml2-dev
|
|
17
|
+
### Dependencies
|
|
18
|
+
* `libxslt1-dev` or `libxslt-devel`
|
|
19
|
+
* `libxml2-dev`or `libxml2-devel`
|
|
20
20
|
|
|
21
21
|
### Examples
|
|
22
|
-
For distros based on Debian:
|
|
22
|
+
#### For distros based on Debian:
|
|
23
23
|
~~~
|
|
24
24
|
apt-get install ruby rubygems ruby-dev libxslt1-dev libxml2-dev
|
|
25
25
|
~~~
|
|
26
|
+
~~~
|
|
27
|
+
ruby -v
|
|
28
|
+
~~~
|
|
29
|
+
|
|
30
|
+
**Unless you have Ruby >= 1.9.3, please, go to [rOCCI-core#RVM](#rvm) and install RVM with a newer Ruby version.**
|
|
26
31
|
|
|
27
|
-
For distros based on RHEL:
|
|
32
|
+
#### For distros based on RHEL:
|
|
28
33
|
~~~
|
|
29
34
|
yum install libxml2-devel libxslt-devel ruby-devel openssl-devel gcc gcc-c++ ruby rubygems
|
|
30
35
|
~~~
|
|
36
|
+
~~~
|
|
37
|
+
ruby -v
|
|
38
|
+
~~~
|
|
39
|
+
|
|
40
|
+
**Unless you have Ruby >= 1.9.3, please, go to [rOCCI-core#RVM](#rvm) and install RVM with a newer Ruby version.**
|
|
31
41
|
|
|
32
42
|
Installation
|
|
33
43
|
------------
|
|
@@ -47,12 +57,8 @@ To install the most recent beta version
|
|
|
47
57
|
### From source (dev)
|
|
48
58
|
|
|
49
59
|
**Installation from source should never be your first choice! Especially, if you are not familiar with RVM, Bundler, Rake and other dev tools for Ruby!**
|
|
50
|
-
**However, if you wish to contribute to our project, this is the right way to start.**
|
|
51
|
-
|
|
52
|
-
To use rOCCI from source it is very much recommended to use RVM. [Install RVM](https://rvm.io/rvm/install/) with
|
|
53
60
|
|
|
54
|
-
|
|
55
|
-
rvm install 1.9.3
|
|
61
|
+
**However, if you wish to contribute to our project, this is the right way to start.**
|
|
56
62
|
|
|
57
63
|
To build and install the bleeding edge version from master
|
|
58
64
|
|
|
@@ -63,9 +69,29 @@ To build and install the bleeding edge version from master
|
|
|
63
69
|
bundle exec rake test
|
|
64
70
|
rake install
|
|
65
71
|
|
|
72
|
+
### RVM
|
|
73
|
+
|
|
74
|
+
**Notice:** Follow the RVM installation guide linked below, we recommend using the default 'Single-User installation'.
|
|
75
|
+
|
|
76
|
+
**Warning:** NEVER install RVM as root! If you choose the 'Multi-User installation', use a different user account with sudo access instead!
|
|
77
|
+
|
|
78
|
+
* [Installing RVM](https://rvm.io/rvm/install#explained)
|
|
79
|
+
* Install Ruby
|
|
80
|
+
|
|
81
|
+
~~~
|
|
82
|
+
rvm requirements
|
|
83
|
+
rvm install 1.9.3
|
|
84
|
+
rvm use 1.9.3 --default
|
|
85
|
+
~~~
|
|
86
|
+
~~~
|
|
87
|
+
ruby -v
|
|
88
|
+
~~~
|
|
89
|
+
|
|
66
90
|
Usage
|
|
67
91
|
-----
|
|
68
|
-
|
|
92
|
+
Detailed documentation is available in our [Wiki](https://github.com/gwdg/rOCCI-core/wiki).
|
|
93
|
+
|
|
94
|
+
### Logging
|
|
69
95
|
|
|
70
96
|
The OCCI gem includes its own logging mechanism using a message queue. By default, no one is listening to that queue.
|
|
71
97
|
A new OCCI Logger can be initialized by specifying the log destination (either a filename or an IO object like
|
|
@@ -80,7 +106,7 @@ You can always, even if there is no logger defined, log output using the class m
|
|
|
80
106
|
|
|
81
107
|
Occi::Log.info("Test message")
|
|
82
108
|
|
|
83
|
-
|
|
109
|
+
### Registering categories in the OCCI Model
|
|
84
110
|
|
|
85
111
|
Before the parser may be used, the available categories have to be registered in the OCCI Model.
|
|
86
112
|
|
|
@@ -89,16 +115,16 @@ For categories already specified by the OCCI WG a method exists in the OCCI Mode
|
|
|
89
115
|
model = Occi::Model.new
|
|
90
116
|
model.register_infrastructure
|
|
91
117
|
|
|
92
|
-
Further categories can either be registered from files which include OCCI collections in JSON
|
|
118
|
+
Further categories can either be registered from files which include OCCI collections in JSON format or or from parsed
|
|
93
119
|
JSON objects (e.g. from the query interface of an OCCI service endpoint).
|
|
94
120
|
|
|
95
|
-
|
|
121
|
+
### Parsing OCCI messages
|
|
96
122
|
|
|
97
123
|
The OCCI gem includes a Parser to easily parse OCCI messages. With a given media type (e.g. json,
|
|
98
124
|
xml or plain text) the parser analyses the content of the message body and, if supplied,
|
|
99
125
|
the message header. As the text/plain and text/occi media type do not clearly distinguish between a message with a
|
|
100
|
-
category and a message with an entity which has a kind, it has to be specified if the message contains a category
|
|
101
|
-
.g. for user defined mixins)
|
|
126
|
+
category and a message with an entity which has a kind, it has to be specified if the message contains a category
|
|
127
|
+
(e.g. for user defined mixins)
|
|
102
128
|
|
|
103
129
|
OCCI messages can be parsed to an OCCI collection for example like
|
|
104
130
|
|
|
@@ -106,7 +132,7 @@ OCCI messages can be parsed to an OCCI collection for example like
|
|
|
106
132
|
body = %Q|Category: compute; scheme="http://schemas.ogf.org/occi/infrastructure#"; class="kind"|
|
|
107
133
|
collection=Occi::Parser.parse(media_type, body)
|
|
108
134
|
|
|
109
|
-
|
|
135
|
+
### Parsing OVF / OVA files
|
|
110
136
|
|
|
111
137
|
Parsing of OVF/OVA files is partly supported and will be improved in future versions.
|
|
112
138
|
|
|
@@ -137,6 +163,12 @@ The occi-core gem includes all OCCI Core classes necessary to handly arbitrary O
|
|
|
137
163
|
Changelog
|
|
138
164
|
---------
|
|
139
165
|
|
|
166
|
+
### Version 4.2
|
|
167
|
+
* Internal changes and bug fixes
|
|
168
|
+
* Extended test coverage
|
|
169
|
+
* Added custom exceptions and error classes
|
|
170
|
+
* Improved text/plain and text/occi rendering
|
|
171
|
+
|
|
140
172
|
### Version 4.1
|
|
141
173
|
* Dropped support for Rubies 1.8.x
|
|
142
174
|
* Updated dependencies
|
data/lib/occi/collection.rb
CHANGED
|
@@ -2,6 +2,7 @@ module Occi
|
|
|
2
2
|
class Collection
|
|
3
3
|
|
|
4
4
|
include Occi::Helpers::Inspect
|
|
5
|
+
include Occi::Helpers::Comparators::Collection
|
|
5
6
|
|
|
6
7
|
attr_accessor :kinds, :mixins, :actions, :resources, :links, :action, :model
|
|
7
8
|
|
|
@@ -24,19 +25,17 @@ module Occi
|
|
|
24
25
|
@actions.merge collection.actions.to_a.collect { |action| Occi::Core::Action.new(action.scheme, action.term, action.title, action.attributes) }
|
|
25
26
|
@resources.merge collection.resources.to_a.collect { |resource| Occi::Core::Resource.new(resource.kind, resource.mixins, resource.attributes, resource.links) }
|
|
26
27
|
@links.merge collection.links.to_a.collect { |link| Occi::Core::Link.new(link.kind, link.mixins, link.attributes) }
|
|
27
|
-
@action = Occi::Core::ActionInstance.new(collection.action
|
|
28
|
+
@action = Occi::Core::ActionInstance.new(collection.action) if collection.action
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def <<(object)
|
|
31
|
-
object.kind_of? Occi::Core::Kind
|
|
32
|
-
object.kind_of? Occi::Core::Mixin
|
|
33
|
-
object.kind_of? Occi::Core::Action
|
|
34
|
-
object.kind_of? Occi::Core::Resource
|
|
35
|
-
object.kind_of? Occi::Core::Link
|
|
36
|
-
end
|
|
32
|
+
self.kinds << object if object.kind_of? Occi::Core::Kind
|
|
33
|
+
self.mixins << object if object.kind_of? Occi::Core::Mixin
|
|
34
|
+
self.actions << object if object.kind_of? Occi::Core::Action
|
|
35
|
+
self.resources << object if object.kind_of? Occi::Core::Resource
|
|
36
|
+
self.links << object if object.kind_of? Occi::Core::Link
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
not intersect(category).empty?
|
|
38
|
+
self
|
|
40
39
|
end
|
|
41
40
|
|
|
42
41
|
# @return [Occi::Core::Categories] categories combined list of all kinds, mixins and actions
|
|
@@ -70,19 +69,23 @@ module Occi
|
|
|
70
69
|
# @param [Occi::Collection] other_collection
|
|
71
70
|
# @return [Occi::Collection]
|
|
72
71
|
def merge!(other_collection)
|
|
73
|
-
merge other_collection
|
|
72
|
+
self.kinds.merge other_collection.kinds.select { |kind| get_by_id(kind.type_identifier).nil? }
|
|
73
|
+
self.mixins.merge other_collection.mixins.select { |mixin| get_by_id(mixin.type_identifier).nil? }
|
|
74
|
+
self.actions.merge other_collection.actions.select { |action| get_by_id(action.type_identifier).nil? }
|
|
75
|
+
self.resources.merge other_collection.resources.select { |resource| get_by_id(resource.id).nil? }
|
|
76
|
+
self.links.merge other_collection.links.select { |link| get_by_id(link.id).nil? }
|
|
77
|
+
self.action = other_collection.action if other_collection.action
|
|
74
78
|
end
|
|
75
79
|
|
|
76
80
|
# @param [Occi::Collection] other_collection
|
|
77
81
|
# @param [Occi::Collection] collection
|
|
78
82
|
# @return [Occi::Collection]
|
|
79
|
-
def merge(other_collection,
|
|
80
|
-
collection
|
|
81
|
-
|
|
82
|
-
collection.
|
|
83
|
-
collection.
|
|
84
|
-
|
|
85
|
-
collection.action = other_collection.action if other_collection.action
|
|
83
|
+
def merge(other_collection, first=self)
|
|
84
|
+
collection = Occi::Collection.new
|
|
85
|
+
|
|
86
|
+
collection.merge!(first)
|
|
87
|
+
collection.merge!(other_collection)
|
|
88
|
+
|
|
86
89
|
collection
|
|
87
90
|
end
|
|
88
91
|
|
|
@@ -100,7 +103,7 @@ module Occi
|
|
|
100
103
|
collection.mixins.replace other_collection.mixins.select { |mixin| get_by_id(mixin.type_identifier) }
|
|
101
104
|
collection.actions.replace other_collection.actions.select { |action| get_by_id(action.type_identifier) }
|
|
102
105
|
collection.resources.replace other_collection.resources.select { |resource| get_by_id(resource.id) }
|
|
103
|
-
collection.links.replace other_collection.links.select { |link| get_by_id(link.
|
|
106
|
+
collection.links.replace other_collection.links.select { |link| get_by_id(link.id) }
|
|
104
107
|
if collection.action == other_collection.action
|
|
105
108
|
collection.action = other_collection.action
|
|
106
109
|
else
|
|
@@ -182,11 +185,24 @@ module Occi
|
|
|
182
185
|
header = Hashie::Mash.new
|
|
183
186
|
header['Category'] = self.categories.collect { |category| category.to_string_short }.join(',') if self.categories.any?
|
|
184
187
|
raise "Only one resource allowed for rendering to text/occi" if self.resources.size > 1
|
|
185
|
-
header = self.resources.first.to_header if self.resources.any?
|
|
188
|
+
header = self.class.header_merge(header, self.resources.first.to_header) if self.resources.any?
|
|
186
189
|
header['Link'] = self.links.collect { |link| link.to_string }.join(',') if self.links.any?
|
|
187
|
-
header = self.action.to_header if self.action
|
|
190
|
+
header = self.class.header_merge(header, self.action.to_header) if self.action
|
|
188
191
|
header
|
|
189
192
|
end
|
|
190
193
|
|
|
194
|
+
private
|
|
195
|
+
|
|
196
|
+
def self.header_merge(target, other, separator=',')
|
|
197
|
+
other.each_pair do |key,val|
|
|
198
|
+
if target.key?(key)
|
|
199
|
+
target[key] = "#{target[key]}#{separator}#{val}"
|
|
200
|
+
else
|
|
201
|
+
target[key] = val
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
target
|
|
205
|
+
end
|
|
206
|
+
|
|
191
207
|
end
|
|
192
|
-
end
|
|
208
|
+
end
|
data/lib/occi/core/action.rb
CHANGED
|
@@ -2,7 +2,7 @@ module Occi
|
|
|
2
2
|
module Core
|
|
3
3
|
class Action < Occi::Core::Category
|
|
4
4
|
|
|
5
|
-
# @param [String
|
|
5
|
+
# @param [String] scheme
|
|
6
6
|
# @param [String] term
|
|
7
7
|
# @param [String] title
|
|
8
8
|
# @param [Hash] attributes
|
|
@@ -10,23 +10,23 @@ module Occi
|
|
|
10
10
|
term='action',
|
|
11
11
|
title=nil,
|
|
12
12
|
attributes=Occi::Core::Attributes.new)
|
|
13
|
-
super
|
|
13
|
+
super(scheme, term, title, attributes)
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
# @return [String] text representation
|
|
17
17
|
def to_text
|
|
18
18
|
text = super
|
|
19
|
-
text <<
|
|
19
|
+
text << "#{@attributes.to_string_short}"
|
|
20
20
|
text
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
# @return [Hash] hash containing the HTTP headers of the text/occi rendering
|
|
24
24
|
def to_header
|
|
25
25
|
header = super
|
|
26
|
-
header[
|
|
26
|
+
header[:Category] << "#{@attributes.to_string_short}"
|
|
27
27
|
header
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
|
-
end
|
|
32
|
+
end
|
|
@@ -3,6 +3,7 @@ module Occi
|
|
|
3
3
|
class ActionInstance
|
|
4
4
|
|
|
5
5
|
include Occi::Helpers::Inspect
|
|
6
|
+
include Occi::Helpers::Comparators::ActionInstance
|
|
6
7
|
|
|
7
8
|
attr_accessor :action, :attributes, :model
|
|
8
9
|
|
|
@@ -16,12 +17,17 @@ module Occi
|
|
|
16
17
|
attributes=self.attributes
|
|
17
18
|
|
|
18
19
|
def initialize(action = self.action, attributes=self.attributes)
|
|
20
|
+
raise ArgumentError, 'action cannot be nil' unless action
|
|
21
|
+
raise ArgumentError, 'attributes cannot be nil' unless attributes
|
|
22
|
+
raise ArgumentError, 'attributes must respond to #convert' unless attributes.respond_to? :convert
|
|
23
|
+
|
|
19
24
|
if action.kind_of? String
|
|
20
25
|
scheme, term = action.split '#'
|
|
21
26
|
action = Occi::Core::Action.new(scheme, term)
|
|
22
27
|
end
|
|
28
|
+
|
|
23
29
|
@action = action
|
|
24
|
-
@attributes = attributes
|
|
30
|
+
@attributes = Occi::Core::Attributes.new(attributes)
|
|
25
31
|
end
|
|
26
32
|
|
|
27
33
|
# @param [Hash] options
|
|
@@ -29,10 +35,46 @@ module Occi
|
|
|
29
35
|
def as_json(options={})
|
|
30
36
|
action = Hashie::Mash.new
|
|
31
37
|
action.action = @action.to_s if @action
|
|
32
|
-
action.attributes = @attributes
|
|
38
|
+
action.attributes = @attributes.any? ? @attributes.as_json : Occi::Core::Attributes.new.as_json
|
|
33
39
|
action
|
|
34
40
|
end
|
|
35
41
|
|
|
42
|
+
# @return [String] text representation
|
|
43
|
+
def to_text
|
|
44
|
+
text = "Category: #{@action.to_string_short}"
|
|
45
|
+
@attributes.names.each_pair do |name, value|
|
|
46
|
+
value = value.to_s.inspect unless value && value.is_a?(Numeric)
|
|
47
|
+
text << "\nX-OCCI-Attribute: #{name}=#{value}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
text
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [String] JSON representation
|
|
54
|
+
def to_json
|
|
55
|
+
as_json.to_json
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Hash] hash containing the HTTP headers of the text/occi rendering
|
|
59
|
+
def to_header
|
|
60
|
+
header = Hashie::Mash.new
|
|
61
|
+
header['Category'] = @action.to_string_short
|
|
62
|
+
|
|
63
|
+
attributes = []
|
|
64
|
+
@attributes.names.each_pair do |name, value|
|
|
65
|
+
value = value.to_s.inspect unless value && value.is_a?(Numeric)
|
|
66
|
+
attributes << "#{name}=#{value}"
|
|
67
|
+
end
|
|
68
|
+
header['X-OCCI-Attribute'] = attributes.join(',') if attributes.any?
|
|
69
|
+
|
|
70
|
+
header
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @return [Bool] Indicating whether this action instance is "empty", i.e. required attributes are blank
|
|
74
|
+
def empty?
|
|
75
|
+
action.nil? || action.empty?
|
|
76
|
+
end
|
|
77
|
+
|
|
36
78
|
end
|
|
37
79
|
end
|
|
38
|
-
end
|
|
80
|
+
end
|