occi-core 4.0.0.alpha.1

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 (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