occi-core 4.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +43 -0
  5. data/.yardopts +1 -0
  6. data/AUTHORS +9 -0
  7. data/Gemfile +11 -0
  8. data/LICENSE +13 -0
  9. data/README.md +212 -0
  10. data/Rakefile +28 -0
  11. data/config/occi.yml +4 -0
  12. data/ext/mkrf_conf.rb +35 -0
  13. data/lib/occi/collection.rb +192 -0
  14. data/lib/occi/core/action.rb +32 -0
  15. data/lib/occi/core/action_instance.rb +38 -0
  16. data/lib/occi/core/actions.rb +20 -0
  17. data/lib/occi/core/attribute.rb +99 -0
  18. data/lib/occi/core/attributes.rb +172 -0
  19. data/lib/occi/core/categories.rb +51 -0
  20. data/lib/occi/core/category.rb +153 -0
  21. data/lib/occi/core/entities.rb +47 -0
  22. data/lib/occi/core/entity.rb +264 -0
  23. data/lib/occi/core/kind.rb +58 -0
  24. data/lib/occi/core/kinds.rb +22 -0
  25. data/lib/occi/core/link.rb +95 -0
  26. data/lib/occi/core/links.rb +34 -0
  27. data/lib/occi/core/mixin.rb +55 -0
  28. data/lib/occi/core/mixins.rb +41 -0
  29. data/lib/occi/core/properties.rb +35 -0
  30. data/lib/occi/core/related.rb +7 -0
  31. data/lib/occi/core/resource.rb +78 -0
  32. data/lib/occi/core/resources.rb +14 -0
  33. data/lib/occi/core.rb +31 -0
  34. data/lib/occi/helpers/inspect.rb +12 -0
  35. data/lib/occi/infrastructure/compute.rb +122 -0
  36. data/lib/occi/infrastructure/network/ipnetwork.rb +27 -0
  37. data/lib/occi/infrastructure/network.rb +107 -0
  38. data/lib/occi/infrastructure/networkinterface/ipnetworkinterface.rb +27 -0
  39. data/lib/occi/infrastructure/networkinterface.rb +103 -0
  40. data/lib/occi/infrastructure/os_tpl.rb +19 -0
  41. data/lib/occi/infrastructure/resource_tpl.rb +19 -0
  42. data/lib/occi/infrastructure/storage.rb +61 -0
  43. data/lib/occi/infrastructure/storagelink.rb +56 -0
  44. data/lib/occi/infrastructure.rb +25 -0
  45. data/lib/occi/log.rb +66 -0
  46. data/lib/occi/model.rb +86 -0
  47. data/lib/occi/parser/json.rb +34 -0
  48. data/lib/occi/parser/ova.rb +35 -0
  49. data/lib/occi/parser/ovf.rb +154 -0
  50. data/lib/occi/parser/text.rb +234 -0
  51. data/lib/occi/parser/xml.rb +18 -0
  52. data/lib/occi/parser.rb +78 -0
  53. data/lib/occi/settings.rb +9 -0
  54. data/lib/occi/version.rb +3 -0
  55. data/lib/occi-core.rb +50 -0
  56. data/occi-core.gemspec +36 -0
  57. data/spec/occi/collection_spec.rb +38 -0
  58. data/spec/occi/core/attribute_spec.rb +0 -0
  59. data/spec/occi/core/attributes_spec.rb +42 -0
  60. data/spec/occi/core/categories_spec.rb +27 -0
  61. data/spec/occi/core/category_spec.rb +38 -0
  62. data/spec/occi/core/entity_spec.rb +46 -0
  63. data/spec/occi/core/resource_spec.rb +18 -0
  64. data/spec/occi/infrastructure/compute_spec.rb +29 -0
  65. data/spec/occi/log_spec.rb +14 -0
  66. data/spec/occi/model_spec.rb +50 -0
  67. data/spec/occi/parser/text_spec.rb +31 -0
  68. data/spec/occi/parser_spec.rb +114 -0
  69. data/spec/occi/test.json +33 -0
  70. data/spec/occi/test.ova +0 -0
  71. data/spec/occi/test.ovf +198 -0
  72. data/spec/spec_helper.rb +25 -0
  73. metadata +304 -0
@@ -0,0 +1,78 @@
1
+ require 'occi/parser/text'
2
+ require 'occi/parser/json'
3
+ require 'occi/parser/xml'
4
+ require 'occi/parser/ova'
5
+ require 'occi/parser/ovf'
6
+
7
+ module Occi
8
+ module Parser
9
+
10
+ # Parses an OCCI message and extracts OCCI relevant information
11
+ # @param [String] media_type the media type of the OCCI message
12
+ # @param [String] body the body of the OCCI message
13
+ # @param [true, false] category for text/plain and text/occi media types information e.g. from the HTTP request location is needed to determine if the OCCI message includes a category or an entity
14
+ # @param [Occi::Core::Resource,Occi::Core::Link] entity_type entity type to use for parsing of text plain entities
15
+ # @param [Hash] header optional header of the OCCI message
16
+ # @return [Occi::Collection] list consisting of an array of locations and the OCCI object collection
17
+ def self.parse(media_type, body, category=false, entity_type=Occi::Core::Resource, header={})
18
+ Occi::Log.debug '### Parsing request data to OCCI Collection ###'
19
+ collection = Occi::Collection.new
20
+
21
+ # remove trailing HTTP_ prefix if present
22
+ header = Hash[header.map { |k, v| [k.gsub('HTTP_', '').upcase, v] }]
23
+
24
+ if category
25
+ collection = Occi::Parser::Text.categories(header.map { |k, v| v.to_s.split(',').collect { |w| "#{k}: #{w}" } }.flatten)
26
+ else
27
+ if entity_type == Occi::Core::Resource
28
+ collection = Occi::Parser::Text.resource(header.map { |k, v| v.to_s.split(',').collect { |w| "#{k}: #{w}" } }.flatten)
29
+ elsif entity_type == Occi::Core::Link
30
+ collection = Occi::Parser::Text.link(header.map { |k, v| v.to_s.split(',').collect { |w| "#{k}: #{w}" } }.flatten)
31
+ end
32
+ end
33
+
34
+ case media_type
35
+ when 'text/uri-list'
36
+ nil
37
+ when 'text/occi'
38
+ nil
39
+ when 'text/plain', nil
40
+ if category
41
+ collection = Occi::Parser::Text.categories body.split "\n"
42
+ else
43
+ if entity_type == Occi::Core::Resource
44
+ collection = Occi::Parser::Text.resource body.split "\n"
45
+ elsif entity_type == Occi::Core::Link
46
+ collection = Occi::Parser::Text.link body.split "\n"
47
+ end
48
+ end
49
+ when 'application/occi+json', 'application/json'
50
+ collection = Occi::Parser::Json.collection body
51
+ when 'application/occi+xml', 'application/xml'
52
+ collection = Occi::Parser::Xml.collection body
53
+ when 'application/ovf', 'application/ovf+xml'
54
+ collection = Occi::Parser::Ovf.collection body
55
+ when 'application/ova'
56
+ collection = Occi::Parser::Ova.collection body
57
+ else
58
+ raise "Content Type not supported"
59
+ end
60
+ collection
61
+ end
62
+
63
+ def self.locations(media_type, body, header)
64
+ locations = Occi::Parser::Text.locations header.map { |k, v| v.to_s.split(',').collect { |w| "#{k}: #{w}" } }.flatten
65
+ locations << header['Location'] if !header['Location'].nil? && header['Location'].any?
66
+ case media_type
67
+ when 'text/uri-list'
68
+ locations << body.split("\n")
69
+ when 'text/plain', nil
70
+ locations << Occi::Parser::Text.locations(body)
71
+ else
72
+ nil
73
+ end
74
+ locations
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,9 @@
1
+ module Occi
2
+ class Settings < Settingslogic
3
+ gem_root = File.expand_path '../../..', __FILE__
4
+
5
+ source "#{gem_root}/config/occi.yml"
6
+ source open(ENV['HOME']+'/.occi') if File.file?(ENV['HOME']+'/.occi')
7
+ namespace 'core'
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Occi
2
+ VERSION = "4.0.0.alpha.1" unless defined?(::Occi::VERSION)
3
+ end
data/lib/occi-core.rb ADDED
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+
3
+ require 'set'
4
+ require 'hashie/mash'
5
+
6
+ require 'active_support/core_ext'
7
+ require 'active_support/json'
8
+ require 'active_support/inflector'
9
+ require 'active_support/notifications'
10
+
11
+ require 'logger'
12
+ require 'uuidtools'
13
+ require 'nokogiri'
14
+ require 'rubygems/package'
15
+ require 'zlib'
16
+ require 'tempfile'
17
+ require 'settingslogic'
18
+
19
+ require 'occi/helpers/inspect'
20
+
21
+ require 'occi/settings'
22
+ require 'occi/log'
23
+ require 'occi/version'
24
+ require 'occi/collection'
25
+ require 'occi/parser'
26
+ require 'occi/model'
27
+ require 'occi/core'
28
+ require 'occi/infrastructure'
29
+
30
+ module Occi
31
+
32
+ VERIFY_ATTRIBUTE_PATTERN = false
33
+
34
+ def kinds
35
+ Occi::Core::Kinds.new
36
+ end
37
+
38
+ def mixins
39
+ Occi::Core::Mixins.new
40
+ end
41
+
42
+ def actions
43
+ Occi::Core::Actions.new
44
+ end
45
+
46
+ # @return [Array] list of Occi::Core::Categories
47
+ def categories
48
+ self.kinds + self.mixins + self.actions
49
+ end
50
+ end
data/occi-core.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require 'occi/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = 'occi-core'
9
+ gem.version = Occi::VERSION
10
+ gem.authors = ['Florian Feldhaus','Piotr Kasprzak', 'Boris Parak']
11
+ gem.email = ['florian.feldhaus@gmail.com', 'piotr.kasprzak@gwdg.de', 'xparak@mail.muni.cz']
12
+ gem.description = %q{OCCI is a collection of classes to simplify the implementation of the Open Cloud Computing API in Ruby}
13
+ gem.summary = %q{OCCI toolkit}
14
+ gem.homepage = 'https://github.com/gwdg/rOCCI-core'
15
+
16
+ gem.files = `git ls-files`.split("\n")
17
+ gem.test_files = `git ls-files -- {test,spec}/*`.split("\n")
18
+ gem.require_paths = ['lib']
19
+ gem.extensions = 'ext/mkrf_conf.rb'
20
+
21
+ gem.add_dependency 'json'
22
+ gem.add_dependency 'hashie'
23
+ gem.add_dependency 'uuidtools', '>=2.1.3'
24
+ gem.add_dependency 'nokogiri', '~>1.5.0'
25
+ gem.add_dependency 'activesupport', '~>3.2'
26
+ gem.add_dependency 'settingslogic'
27
+
28
+ gem.add_development_dependency 'rspec'
29
+ gem.add_development_dependency 'rake'
30
+ gem.add_development_dependency 'builder'
31
+ gem.add_development_dependency 'simplecov'
32
+ gem.add_development_dependency 'yard'
33
+ gem.add_development_dependency 'yard-rspec'
34
+
35
+ gem.required_ruby_version = '>= 1.8.7'
36
+ end
@@ -0,0 +1,38 @@
1
+ module Occi
2
+ describe Collection do
3
+
4
+ it "creates a new Occi collection including the Occi base objects" do
5
+ collection = Occi::Collection.new
6
+ collection.kinds << "http://schemas.ogf.org/occi/infrastructure#compute"
7
+ collection.mixins << "http://example.com/occi/tags#my_mixin"
8
+ collection.actions << "http://schemas.ogf.org/occi/infrastructure/compute/action#start"
9
+ collection.action = Occi::Core::ActionInstance.new
10
+ collection.resources << Occi::Core::Resource.new
11
+ collection.links << Occi::Core::Link.new
12
+ collection.kinds.first.should be_kind_of Occi::Core::Kind
13
+ collection.mixins.first.should be_kind_of Occi::Core::Mixin
14
+ collection.actions.first.should be_kind_of Occi::Core::Action
15
+ collection.resources.first.should be_kind_of Occi::Core::Resource
16
+ collection.links.first.should be_kind_of Occi::Core::Link
17
+ collection.action.should be_kind_of Occi::Core::ActionInstance
18
+ end
19
+
20
+ it "registers a model, creates a new OCCI Resource and checks it against the model" do
21
+ collection = Occi::Collection.new
22
+ collection.model.should be_kind_of Occi::Model
23
+ collection.resources.create 'http://schemas.ogf.org/occi/core#resource'
24
+ collection.resources.first.should be_kind_of Occi::Core::Resource
25
+ expect { collection.check }.to_not raise_error
26
+ end
27
+
28
+ it 'successfully gets all categories related to a category' do
29
+ collection = Occi::Collection.new
30
+ collection.kinds << Occi::Core::Resource.kind
31
+ collection.kinds << Occi::Core::Link.kind
32
+ collection.get_related_to(Occi::Core::Entity.kind).should == collection
33
+ collection.get_related_to(Occi::Core::Resource.kind).kinds.first.should == Occi::Core::Resource.kind
34
+ collection.get_related_to(Occi::Core::Link.kind).kinds.first.should == Occi::Core::Link.kind
35
+ end
36
+
37
+ end
38
+ end
File without changes
@@ -0,0 +1,42 @@
1
+ module Occi
2
+ module Core
3
+ describe Attributes do
4
+
5
+ it 'stores properties using hashes in hash notation' do
6
+ attributes=Occi::Core::Attributes.new
7
+ attributes['test']={}
8
+ attributes['test'].should be_kind_of Occi::Core::Properties
9
+ end
10
+
11
+ it 'stores properties using hashes in dot notation' do
12
+ attributes=Occi::Core::Attributes.new
13
+ attributes.test={}
14
+ attributes.test.should be_kind_of Occi::Core::Properties
15
+ end
16
+
17
+ it 'removes attributes' do
18
+ attributes=Occi::Core::Attributes.new
19
+ attributes['one.two']={}
20
+ attributes['one.three']={}
21
+ attr=Occi::Core::Attributes.new
22
+ attr['one.two']={}
23
+ attributes.remove attr
24
+ attributes['one.two'].should be_nil
25
+ attributes['one.three'].should be_kind_of Occi::Core::Properties
26
+ end
27
+
28
+ it 'converts properties to an empty attribute' do
29
+ attributes=Occi::Core::Attributes.new
30
+ attributes.test={}
31
+ attr = attributes.convert
32
+ attributes.test.should be_kind_of Occi::Core::Properties
33
+ attr.test.should be_nil
34
+ attr._test.should be_kind_of Occi::Core::Properties
35
+ attributes.convert!
36
+ attributes.test.should be_nil
37
+ attributes._test.should be_kind_of Occi::Core::Properties
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ module Occi
2
+ module Core
3
+ describe Categories do
4
+
5
+ it "replaces an existing category instance when a model is added with the instance from the model" do
6
+ categories = Occi::Core::Categories.new
7
+ categories << Occi::Core::Resource.kind
8
+ model = Occi::Model.new
9
+ resource = model.get_by_id Occi::Core::Resource.type_identifier
10
+ resource.location = '/new_location/'
11
+ categories.model = model
12
+ categories.first.location.should == '/new_location/'
13
+ end
14
+
15
+ it "replaces a category string when a model is added with the instance from the model" do
16
+ categories = Occi::Core::Categories.new
17
+ categories << Occi::Core::Resource.type_identifier
18
+ model = Occi::Model.new
19
+ resource = model.get_by_id Occi::Core::Resource.type_identifier
20
+ resource.location = '/new_location/'
21
+ categories.model = model
22
+ categories.first.location.should == '/new_location/'
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+ module Occi
2
+ module Core
3
+ describe Category do
4
+
5
+ it "gets OCCI Resource class by term and scheme" do
6
+ scheme = 'http://schemas.ogf.org/occi/core'
7
+ term = 'resource'
8
+ klass = Occi::Core::Category.get_class scheme, term
9
+ klass.should be Occi::Core::Resource
10
+ klass.superclass.should be Occi::Core::Entity
11
+ end
12
+
13
+ it "gets non predefined OCCI class by term, scheme and related class" do
14
+ scheme = 'http://example.com/occi'
15
+ term = 'test'
16
+ related = ['http://schemas.ogf.org/occi/core#resource']
17
+ klass = Occi::Core::Category.get_class scheme, term, related
18
+ klass.should be Com::Example::Occi::Test
19
+ klass.superclass.should be Occi::Core::Resource
20
+ end
21
+
22
+ it "does not get OCCI class by term and scheme if it relates to existing class not derived from OCCI Entity" do
23
+ scheme = 'http://hashie/'
24
+ term = 'mash'
25
+ related = ['http://schemas.ogf.org/occi/core#resource']
26
+ expect { Occi::Core::Category.get_class scheme, term, related }.to raise_error
27
+ end
28
+
29
+ it "checks if the category is related to another category" do
30
+ category = Occi::Core::Resource.kind
31
+ category.related_to?(Occi::Core::Entity.kind).should be true
32
+ end
33
+
34
+ # rendering
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,46 @@
1
+ module Occi
2
+ module Core
3
+ describe Entity do
4
+
5
+ it "initializes itself successfully" do
6
+ entity = Occi::Core::Entity.new
7
+ entity.should be_kind_of Occi::Core::Entity
8
+ end
9
+
10
+ it "initializes a subclass successfully using a type identifier" do
11
+ type_identifier = 'http://example.com/testnamespace#test'
12
+ entity = Occi::Core::Entity.new type_identifier
13
+ entity.should be_kind_of 'Com::Example::Testnamespace::Test'.constantize
14
+ entity.kind.type_identifier.should == type_identifier
15
+ entity.kind.related.first.should == Occi::Core::Entity.kind
16
+ end
17
+
18
+ it "initializes a subclass successfully using an OCCI Kind" do
19
+ kind = Occi::Core::Resource.kind
20
+ entity = Occi::Core::Entity.new kind
21
+ entity.should be_kind_of Occi::Core::Resource
22
+ entity.kind.type_identifier.should == Occi::Core::Resource.type_identifier
23
+ entity.kind.related.first.should == Occi::Core::Entity.kind
24
+ end
25
+
26
+ it "converts mixin type identifiers to objects if a mixin is added to the entities mixins" do
27
+ mixin = 'http://example.com/mynamespace#mymixin'
28
+ entity = Occi::Core::Entity.new
29
+ entity.mixins << mixin
30
+ entity.mixins.first.to_s.should == mixin
31
+ end
32
+
33
+ # TODO: check adding of model
34
+ it "checks a valid attribute value against their definition in its kind and associated mixins" do
35
+ entity = Occi::Core::Entity.new
36
+ expect { entity.check }.to raise_error
37
+ entity.model = Occi::Model.new
38
+ entity.title = 'test'
39
+ uuid = UUIDTools::UUID.random_create.to_s
40
+ entity.id = uuid
41
+ expect { entity.check }.to_not raise_error
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ module Occi
2
+ module Core
3
+ describe Resource do
4
+
5
+ it "links another resource succesfully" do
6
+ resource = Occi::Core::Resource.new
7
+ target = Occi::Core::Resource.new
8
+ # create a random ID as the resource must already exist and therefore must have an ID assigned
9
+ target.id = UUIDTools::UUID.random_create.to_s
10
+ resource.link target
11
+ resource.links.should have(1).link
12
+ resource.links.first.should be_kind_of Occi::Core::Link
13
+ resource.links.first.target.should be target
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module Occi
2
+ module Infrastructure
3
+ describe Compute do
4
+
5
+ it "creates a storagelink to an existing storage resource" do
6
+ compute = Occi::Infrastructure::Compute.new
7
+ target = Occi::Infrastructure::Storage.new
8
+ # create a random ID as the storage resource must already exist and therefore must have an ID assigned
9
+ target.id = UUIDTools::UUID.random_create.to_s
10
+ compute.storagelink target
11
+ compute.links.should have(1).link
12
+ compute.links.first.should be_kind_of Occi::Infrastructure::Storagelink
13
+ compute.links.first.target.should be target
14
+ end
15
+
16
+ it "creates a networkinterface to an existing network resource" do
17
+ compute = Occi::Infrastructure::Compute.new
18
+ target = Occi::Infrastructure::Network.new
19
+ # create a random ID as the network resource must already exist and therefore must have an ID assigned
20
+ target.id = UUIDTools::UUID.random_create.to_s
21
+ compute.networkinterface target
22
+ compute.links.should have(1).link
23
+ compute.links.first.should be_kind_of Occi::Infrastructure::Networkinterface
24
+ compute.links.first.target.should be target
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ module Occi
2
+ describe Log do
3
+
4
+ it "logs a message to a pipe" do
5
+ r, w = IO.pipe
6
+ logger = Occi::Log.new(w)
7
+ logger.level = Occi::Log::INFO
8
+ Occi::Log.info("Test")
9
+ r.readline.include?("Test")
10
+ logger.close
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ module Occi
2
+ describe "Model" do
3
+
4
+ it "initializes Core Model successfully" do
5
+ model = Occi::Model.new
6
+ model.get_by_id('http://schemas.ogf.org/occi/core#entity').should be_kind_of Occi::Core::Kind
7
+ model.get_by_id('http://schemas.ogf.org/occi/core#resource').should be_kind_of Occi::Core::Kind
8
+ model.get_by_id('http://schemas.ogf.org/occi/core#link').should be_kind_of Occi::Core::Kind
9
+ end
10
+
11
+ it "initializes Infrastructure Model successfully" do
12
+ model = Occi::Model.new
13
+ model.register_infrastructure
14
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#compute').should be_kind_of Occi::Core::Kind
15
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#os_tpl').should be_kind_of Occi::Core::Mixin
16
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#resource_tpl').should be_kind_of Occi::Core::Mixin
17
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#network').should be_kind_of Occi::Core::Kind
18
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure/network#ipnetwork').should be_kind_of Occi::Core::Mixin
19
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#networkinterface').should be_kind_of Occi::Core::Kind
20
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface').should be_kind_of Occi::Core::Mixin
21
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#storage').should be_kind_of Occi::Core::Kind
22
+ model.get_by_id('http://schemas.ogf.org/occi/infrastructure#storagelink').should be_kind_of Occi::Core::Kind
23
+ end
24
+
25
+ it "returns all registered categories" do
26
+ model = Occi::Model.new
27
+ collection = model.get
28
+ collection.kind_of? Occi::Collection
29
+ collection.kinds.should have(3).kinds
30
+ collection.mixins.should be_empty
31
+ collection.actions.should be_empty
32
+ collection.resources.should be_empty
33
+ collection.links.should be_empty
34
+ end
35
+
36
+ it "returns categories with filter" do
37
+ model = Occi::Model.new
38
+ model.register_infrastructure
39
+ network = Occi::Infrastructure::Network.kind
40
+ collection = model.get(network)
41
+ collection.kind_of? Occi::Collection
42
+ collection.kinds.first.should == network
43
+ collection.mixins.first.should == Occi::Infrastructure::Network::Ipnetwork.mixin
44
+ collection.actions.should be_empty
45
+ collection.resources.should be_empty
46
+ collection.links.should be_empty
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+
3
+ module Occi
4
+ module Parser
5
+ describe Text do
6
+
7
+ describe '.category' do
8
+
9
+ it 'parses a string to an OCCI Category' do
10
+ category_string = 'Category: a_a1-_;scheme="http://a.a/a#";class="kind";title="aA1!\"§$%&/()=?`´ß+*#-_.:,;<>";rel="http://a.a/b#a";location="/a1-A/";attributes="a_1-_.a1-_a a-1.a.b";actions="http://a.a/a1#a1 http://a.b1/b1#b2"'
11
+ category = Occi::Parser::Text.category category_string
12
+ category.term.should == 'a_a1-_'
13
+ category.scheme.should == 'http://a.a/a#'
14
+ category.class.should == Occi::Core::Kind
15
+ category.title.should == 'aA1!\"§$%&/()=?`´ß+*#-_.:,;<>'
16
+ category.related.first.should == 'http://a.a/b#a'
17
+ category.location.should == '/a1-A/'
18
+ category.attributes['a_1-_'].class.should == Occi::Core::Attributes
19
+ category.attributes['a_1-_']['a1-_a'].class.should == Occi::Core::Properties
20
+ category.attributes['a-1'].class.should == Occi::Core::Attributes
21
+ category.attributes['a-1']['a'].class.should == Occi::Core::Attributes
22
+ category.attributes['a-1']['a']['b'].class.should == Occi::Core::Properties
23
+ category.actions.to_a.first.to_s == 'http://a.a/a1#a1'
24
+ category.actions.to_a.last.to_s == 'http://a.b1/b1#b2'
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,114 @@
1
+ module Occi
2
+ describe "Parser" do
3
+
4
+ it "parses an OCCI message with MIME type text/plain containing an OCCI resource" do
5
+ # create new collection
6
+ collection = Occi::Collection.new
7
+ # create new resource within collection
8
+ resource = collection.resources.create
9
+
10
+ # render collection to text/plain MIME type
11
+ rendered_collection = collection.to_text
12
+ # parse rendered collection and compare with original collection
13
+ Occi::Parser.parse('text/plain', rendered_collection).to_json.should == collection.to_json
14
+
15
+ # add attributes to resource
16
+ resource.id = UUIDTools::UUID.random_create.to_s
17
+ resource.title = 'title'
18
+
19
+ # render collection to text/plain MIME type
20
+ rendered_collection = collection.to_text
21
+ # parse rendered collection and compare with original collection
22
+ Occi::Parser.parse('text/plain', rendered_collection).to_json.should == collection.to_json
23
+
24
+ # add mixin to resource
25
+ resource.mixins << Occi::Core::Mixin.new
26
+
27
+ # render collection to text/plain MIME type
28
+ rendered_collection = collection.to_text
29
+ # parse rendered collection and compare with original collection
30
+ Occi::Parser.parse('text/plain', rendered_collection).to_json.should == collection.to_json
31
+
32
+ # add link to resource
33
+ link = resource.links.create
34
+ link.id = UUIDTools::UUID.random_create.to_s
35
+ link.target = 'http://example.com/resource/aee5acf5-71de-40b0-bd1c-2284658bfd0e'
36
+
37
+ # render collection to text/plain MIME type
38
+ rendered_collection = collection.to_text
39
+ # parse rendered collection and compare with original collection
40
+ Occi::Parser.parse('text/plain', rendered_collection).to_json.should == collection.to_json
41
+ end
42
+
43
+ it "parses an OCCI message with MIME type application/occi+json containing an OCCI resource" do
44
+ # create new collection
45
+ collection = Occi::Collection.new
46
+ # create new resource within collection
47
+ resource = collection.resources.create
48
+
49
+ # render collection to text/plain MIME type
50
+ rendered_collection = collection.to_json
51
+ # parse rendered collection and compare with original collection
52
+ Occi::Parser.parse('application/occi+json', rendered_collection).should == collection
53
+
54
+ # add attributes to resource
55
+ resource.id = UUIDTools::UUID.random_create.to_s
56
+ resource.title = 'title'
57
+
58
+ # render collection to text/plain MIME type
59
+ rendered_collection = collection.to_json
60
+ # parse rendered collection and compare with original collection
61
+ Occi::Parser.parse('application/occi+json', rendered_collection).should == collection
62
+
63
+ # add mixin to resource
64
+ resource.mixins << Occi::Core::Mixin.new
65
+
66
+ # render collection to text/plain MIME type
67
+ rendered_collection = collection.to_json
68
+ # parse rendered collection and compare with original collection
69
+ Occi::Parser.parse('application/occi+json', rendered_collection).should == collection
70
+
71
+ # add link to resource
72
+ link = resource.links.create
73
+ link.target = 'http://example.com/resource/aee5acf5-71de-40b0-bd1c-2284658bfd0e'
74
+
75
+ # render collection to text/plain MIME type
76
+ rendered_collection = collection.to_json
77
+ # parse rendered collection and compare with original collection
78
+ Occi::Parser.parse('application/occi+json', rendered_collection).should == collection
79
+ end
80
+
81
+ it "parses an OVF file" do
82
+ media_type = 'application/ovf+xml'
83
+ body = File.read('spec/occi/test.ovf')
84
+ collection = Occi::Parser.parse(media_type, body)
85
+ storage_resources = collection.resources.select { |resource| resource.kind.to_s == 'http://schemas.ogf.org/occi/infrastructure#storage' }
86
+ storage_resources.should have(1).storage_resource
87
+ storage_resources.first.title.should == 'lamp'
88
+ network_resources = collection.resources.select { |resource| resource.kind.to_s == 'http://schemas.ogf.org/occi/infrastructure#network' }
89
+ network_resources.should have(1).network_resource
90
+ network_resources.first.title.should == 'VM Network'
91
+ compute_resources = collection.resources.select { |resource| resource.kind.to_s == 'http://schemas.ogf.org/occi/infrastructure#compute' }
92
+ compute_resources.should have(1).compute_resource
93
+ compute_resources.first.attributes.occi!.compute!.cores.should == 1
94
+ compute_resources.first.attributes.occi!.compute!.memory.should == 0.25
95
+ end
96
+
97
+ it "parses an OVA container" do
98
+ media_type = 'application/ova'
99
+ body = File.read('spec/occi/test.ova')
100
+ collection = Occi::Parser.parse(media_type, body)
101
+ storage_resources = collection.resources.select { |resource| resource.kind.to_s == 'http://schemas.ogf.org/occi/infrastructure#storage' }
102
+ storage_resources.should have(1).storage_resource
103
+ storage_resources.first.title.should == 'lamp'
104
+ network_resources = collection.resources.select { |resource| resource.kind.to_s == 'http://schemas.ogf.org/occi/infrastructure#network' }
105
+ network_resources.should have(1).network_resource
106
+ network_resources.first.title.should == 'VM Network'
107
+ compute_resources = collection.resources.select { |resource| resource.kind.to_s == 'http://schemas.ogf.org/occi/infrastructure#compute' }
108
+ compute_resources.should have(1).compute_resource
109
+ compute_resources.first.attributes.occi!.compute!.cores.should == 1
110
+ compute_resources.first.attributes.occi!.compute!.memory.should == 0.25
111
+ end
112
+
113
+ end
114
+ end