occi-core 5.0.0.alpha.1 → 5.0.0.alpha.4
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/examples/rendering/categories.json +4 -74
- data/examples/rendering/categories.txt +4 -4
- data/lib/occi/core/helpers/argument_validator.rb +1 -0
- data/lib/occi/core/helpers/instance_attribute_resetter.rb +7 -1
- data/lib/occi/core/helpers/parser_dereferencer.rb +3 -0
- data/lib/occi/core/helpers/yaml_summoner.rb +1 -0
- data/lib/occi/core/instance_builder.rb +20 -13
- data/lib/occi/core/model.rb +1 -0
- data/lib/occi/core/parsers/json/category.rb +1 -4
- data/lib/occi/core/parsers/json/validator/category-identifiers.json +3 -0
- data/lib/occi/core/parsers/json/validator/occi-schema.json +97 -105
- data/lib/occi/core/parsers/json/validator.rb +12 -22
- data/lib/occi/core/parsers/json_parser.rb +9 -4
- data/lib/occi/core/version.rb +1 -1
- data/lib/occi/core/warehouse.rb +5 -0
- data/lib/occi/infrastructure/model.rb +15 -0
- data/lib/occi/infrastructure_ext/model.rb +8 -0
- data/occi-core.gemspec +0 -1
- metadata +4 -26
- data/lib/occi/core/parsers/json/validator/link-collection.json +0 -3
- data/lib/occi/core/parsers/json/validator/mixin-collection.json +0 -3
- data/lib/occi/core/parsers/json/validator/resource-collection.json +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 196f824b580d6a90fe2da14cbf85b99deb088d93
|
4
|
+
data.tar.gz: 8b06f630a141c702742c019529bf11184e8ce87f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db0db57a71621cf8beb45e2682659831a8aff23356efbdf26d6b1160f4a36d8e69ef9ecb94b55819d7584825dbc74034f6c1a155bf62d374c98722602a8d2f52
|
7
|
+
data.tar.gz: 93ef6536c47a7d0b3225f0ffb5280eaacc2b6b5611c4d902bcb5374bbf0cf162abfdbee0fdb58e35d0c914a514786a36ee8719ecd881c953afff81cc0b60e070
|
data/.rubocop.yml
CHANGED
@@ -1,78 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"mixins": [
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
"attributes": {
|
8
|
-
"occi.network.address": {
|
9
|
-
"description": "IP address (v4 or v6) assigned to this instance.",
|
10
|
-
"mutable": true,
|
11
|
-
"required": false,
|
12
|
-
"type": "string"
|
13
|
-
},
|
14
|
-
"occi.network.allocation": {
|
15
|
-
"default": "static",
|
16
|
-
"description": "Network address allocation mechanism.",
|
17
|
-
"mutable": true,
|
18
|
-
"pattern": "(?-mix:^(dynamic|static)$)",
|
19
|
-
"required": false,
|
20
|
-
"type": "string"
|
21
|
-
},
|
22
|
-
"occi.network.gateway": {
|
23
|
-
"description": "IP address (v4 or v6) of the pre-configured gateway.",
|
24
|
-
"mutable": true,
|
25
|
-
"required": false,
|
26
|
-
"type": "string"
|
27
|
-
}
|
28
|
-
},
|
29
|
-
"location": "/mixin/ipnetwork/",
|
30
|
-
"scheme": "http://schemas.ogf.org/occi/infrastructure/network#",
|
31
|
-
"term": "ipnetwork",
|
32
|
-
"title": "OCCI IP Network mixin"
|
33
|
-
},
|
34
|
-
{
|
35
|
-
"applies": [
|
36
|
-
"http://schemas.ogf.org/occi/infrastructure#networkinterface"
|
37
|
-
],
|
38
|
-
"attributes": {
|
39
|
-
"occi.networkinterface.address": {
|
40
|
-
"description": "IP address (v4 or v6) assigned to this instance.",
|
41
|
-
"mutable": true,
|
42
|
-
"required": false,
|
43
|
-
"type": "string"
|
44
|
-
},
|
45
|
-
"occi.networkinterface.allocation": {
|
46
|
-
"default": "static",
|
47
|
-
"description": "Network address allocation mechanism.",
|
48
|
-
"mutable": true,
|
49
|
-
"pattern": "(?-mix:^(dynamic|static)$)",
|
50
|
-
"required": false,
|
51
|
-
"type": "string"
|
52
|
-
},
|
53
|
-
"occi.networkinterface.gateway": {
|
54
|
-
"description": "IP address (v4 or v6) of the pre-configured gateway.",
|
55
|
-
"mutable": true,
|
56
|
-
"required": false,
|
57
|
-
"type": "string"
|
58
|
-
}
|
59
|
-
},
|
60
|
-
"location": "/mixin/ipnetworkinterface/",
|
61
|
-
"scheme": "http://schemas.ogf.org/occi/infrastructure/networkinterface#",
|
62
|
-
"term": "ipnetworkinterface",
|
63
|
-
"title": "OCCI IP NetworkInterface mixin"
|
64
|
-
},
|
65
|
-
{
|
66
|
-
"location": "/mixin/os_tpl/",
|
67
|
-
"scheme": "http://schemas.ogf.org/occi/infrastructure#",
|
68
|
-
"term": "os_tpl",
|
69
|
-
"title": "OS or Appliance template (parent mixin)"
|
70
|
-
},
|
71
|
-
{
|
72
|
-
"location": "/mixin/resource_tpl/",
|
73
|
-
"scheme": "http://schemas.ogf.org/occi/infrastructure#",
|
74
|
-
"term": "resource_tpl",
|
75
|
-
"title": "Resource template providing flavor/sizing information (parent mixin)"
|
76
|
-
}
|
3
|
+
"http://schemas.ogf.org/occi/infrastructure/network#ipnetwork",
|
4
|
+
"http://schemas.ogf.org/occi/infrastructure/networkinterface#ipnetworkinterface",
|
5
|
+
"http://schemas.ogf.org/occi/infrastructure#os_tpl",
|
6
|
+
"http://schemas.ogf.org/occi/infrastructure#resource_tpl"
|
77
7
|
]
|
78
8
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
Category: resource_tpl;scheme="http://schemas.ogf.org/occi/infrastructure#";class="mixin"
|
2
|
-
Category: os_tpl;scheme="http://schemas.ogf.org/occi/infrastructure#";class="mixin"
|
3
|
-
Category: ipnetwork;scheme="http://schemas.ogf.org/occi/infrastructure/network#";class="mixin"
|
4
|
-
Category: ipnetworkinterface;scheme="http://schemas.ogf.org/occi/infrastructure/networkinterface#";class="mixin"
|
1
|
+
Category: resource_tpl;scheme="http://schemas.ogf.org/occi/infrastructure#";class="mixin"
|
2
|
+
Category: os_tpl;scheme="http://schemas.ogf.org/occi/infrastructure#";class="mixin"
|
3
|
+
Category: ipnetwork;scheme="http://schemas.ogf.org/occi/infrastructure/network#";class="mixin"
|
4
|
+
Category: ipnetworkinterface;scheme="http://schemas.ogf.org/occi/infrastructure/networkinterface#";class="mixin"
|
@@ -51,7 +51,11 @@ module Occi
|
|
51
51
|
# @return [Hash] updated attribute hash
|
52
52
|
def remove_undef_attributes
|
53
53
|
name_cache = attribute_names
|
54
|
-
attributes.keep_if
|
54
|
+
attributes.keep_if do |key, value|
|
55
|
+
defined = name_cache.include?(key) && value && value.attribute_definition
|
56
|
+
logger.debug "#{self.class}: Removing undefined attribute #{key.inspect}" unless defined
|
57
|
+
defined
|
58
|
+
end
|
55
59
|
end
|
56
60
|
|
57
61
|
# Collects all available attribute names into a list. Without definitions
|
@@ -118,8 +122,10 @@ module Occi
|
|
118
122
|
# @param force [TrueClass, FalseClass] forcibly change attribute value to default
|
119
123
|
def reset_attribute(name, definition, force)
|
120
124
|
if attributes[name]
|
125
|
+
logger.debug "#{self.class}: Setting attribute definition for existing #{name.inspect}"
|
121
126
|
attributes[name].attribute_definition = definition
|
122
127
|
else
|
128
|
+
logger.debug "#{self.class}: Creating attribute definition for new #{name.inspect}"
|
123
129
|
attributes[name] = Attribute.new(nil, definition)
|
124
130
|
end
|
125
131
|
|
@@ -44,6 +44,7 @@ module Occi
|
|
44
44
|
# @param derefd [Array] list of all available category instances
|
45
45
|
# @param parsed_actions [Array] textual representation of needed actions
|
46
46
|
def lookup_action_references!(cat, derefd, parsed_actions)
|
47
|
+
logger.debug "#{self}: Dereferencing actions #{parsed_actions.inspect} for #{cat.identifier.inspect}"
|
47
48
|
return if parsed_actions.blank?
|
48
49
|
parsed_actions.each { |action| cat.actions << first_or_die(derefd, action) }
|
49
50
|
end
|
@@ -53,6 +54,7 @@ module Occi
|
|
53
54
|
# @param parsed_rel [Array] textual representation of needed parent(s)
|
54
55
|
def lookup_parent_references!(kind, derefd, parsed_rel)
|
55
56
|
return if parsed_rel.blank? || kind.parent.is_a?(Occi::Core::Kind)
|
57
|
+
logger.debug "#{self}: Dereferencing parent #{parsed_rel.inspect} for #{kind.identifier.inspect}"
|
56
58
|
if parsed_rel.is_a?(Enumerable)
|
57
59
|
if parsed_rel.count > 1
|
58
60
|
raise Occi::Core::Errors::ParsingError,
|
@@ -83,6 +85,7 @@ module Occi
|
|
83
85
|
# @param what [String] identifier of the desired item
|
84
86
|
# @return [Object] desired item from `where`
|
85
87
|
def first_or_die(where, what)
|
88
|
+
logger.debug "#{self}: Looking for #{what.inspect} in #{where.class}"
|
86
89
|
found = where.detect { |elm| elm.identifier == what }
|
87
90
|
unless found
|
88
91
|
raise Occi::Core::Errors::ParsingError,
|
@@ -25,6 +25,7 @@ module Occi
|
|
25
25
|
raise 'This method cannot be invoked on instances' unless is_a? Class
|
26
26
|
allowed_classes = respond_to?(:allowed_yaml_classes, true) ? allowed_yaml_classes : []
|
27
27
|
|
28
|
+
logger.debug "#{self}: Loading YAML definition from #{path.inspect}"
|
28
29
|
object_args = YAML.safe_load(File.read(path), allowed_classes)
|
29
30
|
object_args.symbolize_keys!
|
30
31
|
object_args.dereference_with!(self, model, attribute_definitions) if needs_dereferencing?
|
@@ -42,6 +42,7 @@ module Occi
|
|
42
42
|
# @return [Object] constructed instance
|
43
43
|
# @return [NilClass] if such an instance could not be constructed
|
44
44
|
def build(identifier, args = {})
|
45
|
+
logger.debug "#{self.class}: Building instance of #{identifier.inspect} with #{args.inspect}"
|
45
46
|
k_args = args_with_kind(identifier, args)
|
46
47
|
klass(identifier, parent_klass(k_args[:kind])).new k_args
|
47
48
|
end
|
@@ -77,19 +78,23 @@ module Occi
|
|
77
78
|
|
78
79
|
# Looks up the appropriate candidate class for the given identifier. If no class
|
79
80
|
# is found in static tables, the last known ancestor is returned. For Core, this
|
80
|
-
# method ALWAYS returns the last known ancestor given as `
|
81
|
+
# method ALWAYS returns the last known ancestor given as `known_ancestor`, for
|
81
82
|
# compatibility reasons.
|
82
83
|
#
|
83
84
|
# @param identifier [String] identifier of the category
|
84
|
-
# @param
|
85
|
+
# @param known_ancestor [Class] expected ancestor
|
85
86
|
# @return [Class] pre-defined class or given last ancestor
|
86
|
-
def klass(identifier,
|
87
|
-
|
88
|
-
|
87
|
+
def klass(identifier, known_ancestor)
|
88
|
+
found_klass = self.class.klass_map[identifier]
|
89
|
+
return known_ancestor unless found_klass
|
90
|
+
|
91
|
+
unless found_klass.ancestors.include?(known_ancestor)
|
89
92
|
raise Occi::Core::Errors::InstanceValidationError,
|
90
|
-
"#{
|
93
|
+
"#{found_klass} is not a sub-type of #{known_ancestor}"
|
91
94
|
end
|
92
|
-
|
95
|
+
|
96
|
+
logger.debug "#{self.class}: Found #{found_klass} for #{identifier.inspect}"
|
97
|
+
found_klass
|
93
98
|
end
|
94
99
|
|
95
100
|
# Looks up the given identifier in the model. Returns `Occi::Core::Kind` instance if
|
@@ -98,7 +103,7 @@ module Occi
|
|
98
103
|
#
|
99
104
|
# @param identifier [String] identifier of the category
|
100
105
|
# @return [Occi::Core::Kind] full category definition from the model
|
101
|
-
def
|
106
|
+
def kind_instance(identifier)
|
102
107
|
kind = model.find_by_identifier!(identifier)
|
103
108
|
unless kind.is_a? Occi::Core::Kind
|
104
109
|
raise Occi::Core::Errors::CategoryValidationError, "#{identifier.inspect} " \
|
@@ -113,13 +118,15 @@ module Occi
|
|
113
118
|
# @param kind [Occi::Core::Kind] kind instance to evaluate
|
114
119
|
# @return [Class] located known parent class
|
115
120
|
def parent_klass(kind)
|
116
|
-
if kind.related?
|
121
|
+
if kind.related? kind_instance(Occi::Core::Constants::RESOURCE_KIND)
|
122
|
+
logger.debug "#{self.class}: Identified #{kind.identifier} as Resource"
|
117
123
|
Occi::Core::Resource
|
118
|
-
elsif kind.related?
|
124
|
+
elsif kind.related? kind_instance(Occi::Core::Constants::LINK_KIND)
|
125
|
+
logger.debug "#{self.class}: Identified #{kind.identifier} as Link"
|
119
126
|
Occi::Core::Link
|
120
127
|
else
|
121
128
|
raise Occi::Core::Errors::ModelLookupError,
|
122
|
-
"Could not identify #{kind.identifier
|
129
|
+
"Could not identify #{kind.identifier} as a Link or Resource"
|
123
130
|
end
|
124
131
|
end
|
125
132
|
|
@@ -153,8 +160,8 @@ module Occi
|
|
153
160
|
# :nodoc:
|
154
161
|
def args_with_kind(identifier, args)
|
155
162
|
k_args = args.clone
|
156
|
-
k_args[:kind] =
|
157
|
-
k_args[:rel] =
|
163
|
+
k_args[:kind] = kind_instance(identifier)
|
164
|
+
k_args[:rel] = kind_instance(k_args[:rel]) if k_args[:rel]
|
158
165
|
k_args
|
159
166
|
end
|
160
167
|
end
|
data/lib/occi/core/model.rb
CHANGED
@@ -33,13 +33,10 @@ module Occi
|
|
33
33
|
#
|
34
34
|
# @param body [String] JSON body for parsing
|
35
35
|
# @param model [Occi::Core::Model] model with existing categories
|
36
|
-
# @param full [Boolean] dereference categories
|
37
36
|
# @return [Occi::Core::Model] model with all known category instances
|
38
|
-
def json(body, model
|
37
|
+
def json(body, model)
|
39
38
|
parsed = raw_hash(body)
|
40
|
-
|
41
39
|
instantiate_hashes! parsed, model
|
42
|
-
return model unless full
|
43
40
|
|
44
41
|
raw_categories = [parsed[:kinds], parsed[:mixins]].flatten.compact
|
45
42
|
dereference_identifiers! model.categories, raw_categories
|
@@ -13,52 +13,49 @@
|
|
13
13
|
"kind": { "type": "string" }
|
14
14
|
}
|
15
15
|
},
|
16
|
-
"
|
17
|
-
"id": "#
|
16
|
+
"attributes": {
|
17
|
+
"id": "#attributes",
|
18
18
|
"type": "object",
|
19
|
-
"
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
"links": {
|
28
|
-
"type": "array",
|
29
|
-
"minItems": 1,
|
30
|
-
"items": {
|
31
|
-
"$ref": "#/definitions/link"
|
32
|
-
}
|
33
|
-
},
|
34
|
-
"summary": { "type": "string" },
|
35
|
-
"title": { "type": "string" }
|
19
|
+
"additionalProperties": {
|
20
|
+
"oneOf": [
|
21
|
+
{ "type": "number" },
|
22
|
+
{ "type": "boolean" },
|
23
|
+
{ "type": "string" },
|
24
|
+
{ "type": "object" },
|
25
|
+
{ "type": "array" }
|
26
|
+
]
|
36
27
|
}
|
37
28
|
},
|
38
|
-
"
|
39
|
-
"id": "#
|
29
|
+
"attribute_definition": {
|
30
|
+
"id": "#attribute_definition",
|
40
31
|
"type": "object",
|
41
|
-
"required": ["action"],
|
42
32
|
"additionalProperties": false,
|
33
|
+
"required": ["type", "mutable", "required"],
|
43
34
|
"properties": {
|
44
|
-
"
|
45
|
-
"
|
35
|
+
"mutable": { "type": "boolean" },
|
36
|
+
"required": { "type": "boolean" },
|
37
|
+
"type": { "type": "string" },
|
38
|
+
"default": {
|
39
|
+
"oneOf": [
|
40
|
+
{ "type": "number" },
|
41
|
+
{ "type": "string" },
|
42
|
+
{ "type": "boolean" },
|
43
|
+
{ "type": "object" },
|
44
|
+
{ "type": "array" }
|
45
|
+
]
|
46
|
+
},
|
47
|
+
"description": { "type": "string" },
|
48
|
+
"pattern": { "type": "string" }
|
46
49
|
}
|
47
50
|
},
|
48
|
-
"
|
49
|
-
"id": "#
|
51
|
+
"attribute_definitions": {
|
52
|
+
"id": "#attribute_definitions",
|
50
53
|
"type": "object",
|
51
|
-
"required": ["kind", "id", "target", "source", "attributes"],
|
52
54
|
"additionalProperties": false,
|
53
|
-
"
|
54
|
-
"
|
55
|
-
|
56
|
-
|
57
|
-
"actions": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
58
|
-
"id": { "type": "string" },
|
59
|
-
"source": { "$ref": "#/definitions/kinded_uri" },
|
60
|
-
"target": { "$ref": "#/definitions/kinded_uri" },
|
61
|
-
"title": { "type": "string" }
|
55
|
+
"patternProperties": {
|
56
|
+
".+": {
|
57
|
+
"$ref": "#/definitions/attribute_definition"
|
58
|
+
}
|
62
59
|
}
|
63
60
|
},
|
64
61
|
"kind": {
|
@@ -104,6 +101,54 @@
|
|
104
101
|
"attributes": { "$ref": "#/definitions/attribute_definitions" }
|
105
102
|
}
|
106
103
|
},
|
104
|
+
"action_instance": {
|
105
|
+
"id": "#action_instance",
|
106
|
+
"type": "object",
|
107
|
+
"required": ["action"],
|
108
|
+
"additionalProperties": false,
|
109
|
+
"properties": {
|
110
|
+
"action": { "type": "string" },
|
111
|
+
"attributes": { "$ref": "#/definitions/attributes" }
|
112
|
+
}
|
113
|
+
},
|
114
|
+
"resource": {
|
115
|
+
"id": "#resource",
|
116
|
+
"type": "object",
|
117
|
+
"required": ["kind", "id", "attributes"],
|
118
|
+
"additionalProperties": false,
|
119
|
+
"properties": {
|
120
|
+
"kind": { "type": "string" },
|
121
|
+
"mixins": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
122
|
+
"attributes": { "$ref": "#/definitions/attributes" },
|
123
|
+
"actions": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
124
|
+
"id": { "type": "string" },
|
125
|
+
"links": {
|
126
|
+
"type": "array",
|
127
|
+
"minItems": 1,
|
128
|
+
"items": {
|
129
|
+
"$ref": "#/definitions/link"
|
130
|
+
}
|
131
|
+
},
|
132
|
+
"summary": { "type": "string" },
|
133
|
+
"title": { "type": "string" }
|
134
|
+
}
|
135
|
+
},
|
136
|
+
"link": {
|
137
|
+
"id": "#link",
|
138
|
+
"type": "object",
|
139
|
+
"required": ["kind", "id", "target", "source", "attributes"],
|
140
|
+
"additionalProperties": false,
|
141
|
+
"properties": {
|
142
|
+
"kind": { "type": "string" },
|
143
|
+
"mixins": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
144
|
+
"attributes": { "$ref": "#/definitions/attributes" },
|
145
|
+
"actions": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
146
|
+
"id": { "type": "string" },
|
147
|
+
"source": { "$ref": "#/definitions/kinded_uri" },
|
148
|
+
"target": { "$ref": "#/definitions/kinded_uri" },
|
149
|
+
"title": { "type": "string" }
|
150
|
+
}
|
151
|
+
},
|
107
152
|
"resource_collection": {
|
108
153
|
"id": "#resource_collection",
|
109
154
|
"type": "object",
|
@@ -155,94 +200,41 @@
|
|
155
200
|
}
|
156
201
|
}
|
157
202
|
},
|
158
|
-
"
|
159
|
-
"id": "#
|
203
|
+
"mixin_identifiers": {
|
204
|
+
"id": "#mixin_identifiers",
|
160
205
|
"type": "object",
|
161
|
-
"required": ["
|
206
|
+
"required": ["mixins"],
|
162
207
|
"additionalProperties": false,
|
163
208
|
"properties": {
|
164
|
-
"
|
165
|
-
"type": "array",
|
166
|
-
"minItems": 1,
|
167
|
-
"items": {
|
168
|
-
"$ref": "#/definitions/kind"
|
169
|
-
}
|
170
|
-
}
|
209
|
+
"mixins": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }
|
171
210
|
}
|
172
211
|
},
|
173
|
-
"
|
174
|
-
"id": "#
|
212
|
+
"kind_identifiers": {
|
213
|
+
"id": "#kind_identifiers",
|
175
214
|
"type": "object",
|
176
|
-
"required": ["
|
215
|
+
"required": ["kinds"],
|
177
216
|
"additionalProperties": false,
|
178
217
|
"properties": {
|
179
|
-
"
|
180
|
-
"type": "array",
|
181
|
-
"minItems": 1,
|
182
|
-
"items": {
|
183
|
-
"$ref": "#/definitions/mixin"
|
184
|
-
}
|
185
|
-
}
|
218
|
+
"kinds": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }
|
186
219
|
}
|
187
220
|
},
|
188
|
-
"
|
189
|
-
"id": "#
|
221
|
+
"action_identifiers": {
|
222
|
+
"id": "#action_identifiers",
|
190
223
|
"type": "object",
|
191
224
|
"required": ["actions"],
|
192
225
|
"additionalProperties": false,
|
193
226
|
"properties": {
|
194
|
-
"actions": {
|
195
|
-
"type": "array",
|
196
|
-
"minItems": 1,
|
197
|
-
"items": {
|
198
|
-
"$ref": "#/definitions/action"
|
199
|
-
}
|
200
|
-
}
|
227
|
+
"actions": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }
|
201
228
|
}
|
202
229
|
},
|
203
|
-
"
|
204
|
-
"id": "#
|
205
|
-
"type": "object",
|
206
|
-
"additionalProperties": {
|
207
|
-
"oneOf": [
|
208
|
-
{ "type": "number" },
|
209
|
-
{ "type": "boolean" },
|
210
|
-
{ "type": "string" },
|
211
|
-
{ "type": "object" },
|
212
|
-
{ "type": "array" }
|
213
|
-
]
|
214
|
-
}
|
215
|
-
},
|
216
|
-
"attribute_definition": {
|
217
|
-
"id": "#attribute_definition",
|
230
|
+
"category_identifiers": {
|
231
|
+
"id": "#category_identifiers",
|
218
232
|
"type": "object",
|
219
233
|
"additionalProperties": false,
|
220
|
-
"required": ["type", "mutable", "required"],
|
221
234
|
"properties": {
|
222
|
-
"
|
223
|
-
"
|
224
|
-
"
|
225
|
-
"default": {
|
226
|
-
"oneOf": [
|
227
|
-
{ "type": "number" },
|
228
|
-
{ "type": "string" },
|
229
|
-
{ "type": "boolean" },
|
230
|
-
{ "type": "object" },
|
231
|
-
{ "type": "array" }
|
232
|
-
]
|
233
|
-
},
|
234
|
-
"description": { "type": "string" },
|
235
|
-
"pattern": { "type": "string" }
|
236
|
-
}
|
237
|
-
},
|
238
|
-
"attribute_definitions": {
|
239
|
-
"id": "#attribute_definitions",
|
240
|
-
"type": "object",
|
241
|
-
"additionalProperties": false,
|
242
|
-
"patternProperties": {
|
243
|
-
".+": {
|
244
|
-
"$ref": "#/definitions/attribute_definition"
|
245
|
-
}
|
235
|
+
"mixins": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
236
|
+
"kinds": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" },
|
237
|
+
"actions": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }
|
246
238
|
}
|
247
239
|
},
|
248
240
|
"model": {
|
@@ -27,18 +27,18 @@ module Occi
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# :nodoc:
|
30
|
-
def
|
31
|
-
validate! json, :
|
30
|
+
def validate_locations!(json)
|
31
|
+
validate! json, :locations
|
32
32
|
end
|
33
33
|
|
34
34
|
# :nodoc:
|
35
|
-
def
|
36
|
-
validate! json, :
|
35
|
+
def validate_category_identifiers!(json)
|
36
|
+
validate! json, :'category-identifiers'
|
37
37
|
end
|
38
38
|
|
39
39
|
# :nodoc:
|
40
|
-
def
|
41
|
-
validate! json, :
|
40
|
+
def validate_model!(json)
|
41
|
+
validate! json, :model
|
42
42
|
end
|
43
43
|
|
44
44
|
# :nodoc:
|
@@ -47,28 +47,18 @@ module Occi
|
|
47
47
|
end
|
48
48
|
|
49
49
|
# :nodoc:
|
50
|
-
def
|
51
|
-
validate! json, :
|
52
|
-
end
|
53
|
-
|
54
|
-
# :nodoc:
|
55
|
-
def validate_link_collection!(json)
|
56
|
-
validate! json, :'link-collection'
|
57
|
-
end
|
58
|
-
|
59
|
-
# :nodoc:
|
60
|
-
def validate_resource_collection!(json)
|
61
|
-
validate! json, :'resource-collection'
|
50
|
+
def validate_resource!(json)
|
51
|
+
validate! json, :resource
|
62
52
|
end
|
63
53
|
|
64
54
|
# :nodoc:
|
65
|
-
def
|
66
|
-
validate! json, :
|
55
|
+
def validate_link!(json)
|
56
|
+
validate! json, :link
|
67
57
|
end
|
68
58
|
|
69
59
|
# :nodoc:
|
70
|
-
def
|
71
|
-
validate! json, :
|
60
|
+
def validate_entity_collection!(json)
|
61
|
+
validate! json, :'entity-collection'
|
72
62
|
end
|
73
63
|
|
74
64
|
# :nodoc:
|
@@ -67,8 +67,13 @@ module Occi
|
|
67
67
|
# @return [Set] set of instances
|
68
68
|
def categories(body, _headers = nil, expectation = nil)
|
69
69
|
expectation ||= Occi::Core::Category
|
70
|
-
Json::Validator.
|
71
|
-
|
70
|
+
Json::Validator.validate_category_identifiers! body
|
71
|
+
|
72
|
+
cats = Set.new
|
73
|
+
hsh = handle(Occi::Core::Errors::ParsingError) { JSON.parse(body) }
|
74
|
+
hsh.values.flatten.each { |cat_id| cats << lookup(cat_id, expectation) }
|
75
|
+
|
76
|
+
cats
|
72
77
|
end
|
73
78
|
|
74
79
|
# :nodoc:
|
@@ -79,8 +84,8 @@ module Occi
|
|
79
84
|
begin
|
80
85
|
Json::Validator.validate! body, type
|
81
86
|
found = type
|
82
|
-
rescue
|
83
|
-
logger.debug "#{self.class}: Body isn't #{type}"
|
87
|
+
rescue => ex
|
88
|
+
logger.debug "#{self.class}: Body isn't #{type} - #{ex.message}"
|
84
89
|
end
|
85
90
|
end
|
86
91
|
raise Occi::Core::Errors::ParsingError, "#{self.class} -> No entity sub-type instance found" unless found
|
data/lib/occi/core/version.rb
CHANGED
@@ -3,7 +3,7 @@ module Occi
|
|
3
3
|
MAJOR_VERSION = 5 # Major update constant
|
4
4
|
MINOR_VERSION = 0 # Minor update constant
|
5
5
|
PATCH_VERSION = 0 # Patch/Fix version constant
|
6
|
-
STAGE_VERSION = 'alpha.
|
6
|
+
STAGE_VERSION = 'alpha.4'.freeze # use `nil` for production releases
|
7
7
|
|
8
8
|
unless defined?(::Occi::Core::VERSION)
|
9
9
|
VERSION = [
|
data/lib/occi/core/warehouse.rb
CHANGED
@@ -29,6 +29,7 @@ module Occi
|
|
29
29
|
#
|
30
30
|
# @param model [Occi::Core::Model] model to be bootstrapped
|
31
31
|
def bootstrap!(model)
|
32
|
+
logger.debug "#{self}: Bootstrapping#{model.empty? ? ' empty' : ''} model"
|
32
33
|
actions! model
|
33
34
|
kinds! model
|
34
35
|
mixins! model
|
@@ -66,6 +67,7 @@ module Occi
|
|
66
67
|
def kinds!(model)
|
67
68
|
attribute_definitions = attribute_definitions_for(kinds_path)
|
68
69
|
yamls_in(kinds_path).each do |file|
|
70
|
+
logger.debug "#{self}: Loading kind from #{file.inspect}"
|
69
71
|
model << Occi::Core::Kind.from_yaml(file, model, attribute_definitions)
|
70
72
|
end
|
71
73
|
end
|
@@ -74,6 +76,7 @@ module Occi
|
|
74
76
|
def mixins!(model)
|
75
77
|
attribute_definitions = attribute_definitions_for(mixins_path)
|
76
78
|
yamls_in(mixins_path).each do |file|
|
79
|
+
logger.debug "#{self}: Loading mixin from #{file.inspect}"
|
77
80
|
model << Occi::Core::Mixin.from_yaml(file, model, attribute_definitions)
|
78
81
|
end
|
79
82
|
end
|
@@ -83,6 +86,7 @@ module Occi
|
|
83
86
|
# TODO: work with separate attribute definitions
|
84
87
|
attribute_definitions = {}
|
85
88
|
yamls_in(actions_path).each do |file|
|
89
|
+
logger.debug "#{self}: Loading action from #{file.inspect}"
|
86
90
|
model << Occi::Core::Action.from_yaml(file, model, attribute_definitions)
|
87
91
|
end
|
88
92
|
end
|
@@ -94,6 +98,7 @@ module Occi
|
|
94
98
|
attr_defs_path = File.join(categories_path, ATTRIBS)
|
95
99
|
yamls_in(attr_defs_path).each do |file|
|
96
100
|
name = attribute_name_from(file)
|
101
|
+
logger.debug "#{self}: Loading attribute definition for #{name.inspect} from #{file.inspect}"
|
97
102
|
attribute_definitions[name] = Occi::Core::AttributeDefinition.from_yaml(file)
|
98
103
|
end
|
99
104
|
|
@@ -10,6 +10,7 @@ module Occi
|
|
10
10
|
# model = Occi::Infrastructure::Model.new
|
11
11
|
# model.load_infrastructure!
|
12
12
|
def load_infrastructure!
|
13
|
+
logger.debug "#{self.class}: Loading Infrastructure from Warehouse"
|
13
14
|
Occi::Infrastructure::Warehouse.bootstrap! self
|
14
15
|
self << Occi::Infrastructure::Mixins::OsTpl.new
|
15
16
|
self << Occi::Infrastructure::Mixins::ResourceTpl.new
|
@@ -22,6 +23,20 @@ module Occi
|
|
22
23
|
def instance_builder
|
23
24
|
Occi::Infrastructure::InstanceBuilder.new(model: self)
|
24
25
|
end
|
26
|
+
|
27
|
+
# Returns all mixins dependent on the base `os_tpl` mixin defined by OGF.
|
28
|
+
#
|
29
|
+
# @return [Set] set of mixins dependent on `os_tpl`
|
30
|
+
def find_os_tpls
|
31
|
+
find_dependent Occi::Infrastructure::Mixins::OsTpl.new
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns all mixins dependent on the base `resource_tpl` mixin defined by OGF.
|
35
|
+
#
|
36
|
+
# @return [Set] set of mixins dependent on `resource_tpl`
|
37
|
+
def find_resource_tpls
|
38
|
+
find_dependent Occi::Infrastructure::Mixins::ResourceTpl.new
|
39
|
+
end
|
25
40
|
end
|
26
41
|
end
|
27
42
|
end
|
@@ -10,6 +10,7 @@ module Occi
|
|
10
10
|
# model = Occi::InfrastructureExt::Model.new
|
11
11
|
# model.load_infrastructure_ext!
|
12
12
|
def load_infrastructure_ext!
|
13
|
+
logger.debug "#{self.class}: Loading InfrastructureExt from Warehouse"
|
13
14
|
Occi::InfrastructureExt::Warehouse.bootstrap! self
|
14
15
|
self << Occi::InfrastructureExt::Mixins::AvailabilityZone.new
|
15
16
|
nil
|
@@ -21,6 +22,13 @@ module Occi
|
|
21
22
|
def instance_builder
|
22
23
|
Occi::InfrastructureExt::InstanceBuilder.new(model: self)
|
23
24
|
end
|
25
|
+
|
26
|
+
# Returns all mixins dependent on the base `availability_zone` mixin defined by OGF.
|
27
|
+
#
|
28
|
+
# @return [Set] set of mixins dependent on `availability_zone`
|
29
|
+
def find_availability_zones
|
30
|
+
find_dependent Occi::InfrastructureExt::Mixins::AvailabilityZone.new
|
31
|
+
end
|
24
32
|
end
|
25
33
|
end
|
26
34
|
end
|
data/occi-core.gemspec
CHANGED
@@ -17,7 +17,6 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
|
20
|
-
gem.add_runtime_dependency 'ox', '>= 2.4', '< 3'
|
21
20
|
gem.add_runtime_dependency 'json', '>= 1.8', '< 3'
|
22
21
|
gem.add_runtime_dependency 'activesupport', '>= 4.0', '< 6'
|
23
22
|
gem.add_runtime_dependency 'json-schema', '>= 2.5', '< 3'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: occi-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.alpha.
|
4
|
+
version: 5.0.0.alpha.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boris Parak
|
@@ -10,28 +10,8 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-05-
|
13
|
+
date: 2017-05-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: ox
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
requirements:
|
19
|
-
- - ">="
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '2.4'
|
22
|
-
- - "<"
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: '3'
|
25
|
-
type: :runtime
|
26
|
-
prerelease: false
|
27
|
-
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
requirements:
|
29
|
-
- - ">="
|
30
|
-
- !ruby/object:Gem::Version
|
31
|
-
version: '2.4'
|
32
|
-
- - "<"
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '3'
|
35
15
|
- !ruby/object:Gem::Dependency
|
36
16
|
name: json
|
37
17
|
requirement: !ruby/object:Gem::Requirement
|
@@ -409,14 +389,12 @@ files:
|
|
409
389
|
- lib/occi/core/parsers/json/validator.rb
|
410
390
|
- lib/occi/core/parsers/json/validator/.gitkeep
|
411
391
|
- lib/occi/core/parsers/json/validator/action-instance.json
|
392
|
+
- lib/occi/core/parsers/json/validator/category-identifiers.json
|
412
393
|
- lib/occi/core/parsers/json/validator/entity-collection.json
|
413
|
-
- lib/occi/core/parsers/json/validator/link-collection.json
|
414
394
|
- lib/occi/core/parsers/json/validator/link.json
|
415
395
|
- lib/occi/core/parsers/json/validator/locations.json
|
416
|
-
- lib/occi/core/parsers/json/validator/mixin-collection.json
|
417
396
|
- lib/occi/core/parsers/json/validator/model.json
|
418
397
|
- lib/occi/core/parsers/json/validator/occi-schema.json
|
419
|
-
- lib/occi/core/parsers/json/validator/resource-collection.json
|
420
398
|
- lib/occi/core/parsers/json/validator/resource.json
|
421
399
|
- lib/occi/core/parsers/json_parser.rb
|
422
400
|
- lib/occi/core/parsers/text/.gitkeep
|
@@ -588,7 +566,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
588
566
|
version: 1.3.1
|
589
567
|
requirements: []
|
590
568
|
rubyforge_project:
|
591
|
-
rubygems_version: 2.6.
|
569
|
+
rubygems_version: 2.6.8
|
592
570
|
signing_key:
|
593
571
|
specification_version: 4
|
594
572
|
summary: The rOCCI toolkit
|