omf_sfa 0.2.3 → 0.2.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.
@@ -0,0 +1,60 @@
1
+
2
+ require 'omf_base/lobject'
3
+ OMF::Base::Loggable.init_log 'brite2rspec'
4
+
5
+ require 'omf-sfa/util/brite_parser'
6
+ require 'omf-sfa/resource'
7
+ include OMF::SFA::Resource
8
+
9
+ GURN.default_domain = "urn:publicid:IDN+acme.org"
10
+
11
+ unless file_name = ARGV[0]
12
+ puts "Missing BRITE file name - #{ARGV}"
13
+ exit -1
14
+ end
15
+
16
+ OMF::SFA::Resource::OResource.init()
17
+
18
+ node_services = []
19
+ node_services << ExecuteService.create(command: "sudo sh /local/postboot_script.sh", shell: "sh")
20
+ node_services << InstallService.create(install_path: "/local", url: "http://emmy9.casa.umass.edu/InstaGENI_Images/install-script.tar.gz")
21
+
22
+ di = DiskImage.create(url: "urn:publicid:IDN+utah.geniracks.net+image+emulab-ops:OPENVZ-STD")
23
+ sliver_type = SliverType.create(name: 'emulab-openvz', disk_image: di)
24
+
25
+ parser = OMF::SFA::Util::BriteParser.new()
26
+ # opts; [:id, :i], [:x, :f], [:y, :f], [:type]
27
+ parser.on_new_node do |opts|
28
+ name = "n#{opts[:id]}"
29
+ node = Node.create(name: name, urn: 'foo_urn', sliver_type: sliver_type, exclusive: false)
30
+ node_services.each {|s| node.services << s }
31
+ node
32
+ end
33
+
34
+ network_cnt = 0
35
+ # opts: [:id, :i], [:from, :i], [:to, :i], [:length, :f], [:delay, :f], [:bw, :f], [:type], [:direction]
36
+ parser.on_new_edge do |opts, from, to|
37
+ name = "l#{opts[:id]}"
38
+ link = Link.create(name: name)
39
+
40
+ # Create a new subnet for each link
41
+ ip_nw = "10.#{network_cnt / 256}.#{network_cnt % 256}"
42
+ network_cnt += 1
43
+
44
+ f_ip = Ip.create(address: "#{ip_nw}.1", netmask: "255.255.255.0", ip_type: "ipv4")
45
+ f_name = "#{from.name}:if#{from.interfaces.length}"
46
+ from.interfaces << f_if = Interface.create(name: f_name, ip: f_ip)
47
+
48
+ t_ip = Ip.create(address: "#{ip_nw}.2", netmask: "255.255.255.0", ip_type: "ipv4")
49
+ t_name = "#{to.name}:if#{to.interfaces.length}"
50
+ to.interfaces << t_if = Interface.create(name: t_name, ip: t_ip)
51
+
52
+ link.interfaces << f_if << t_if
53
+ link.capacity = opts[:bw]
54
+ #link.latency = opts[:delay]
55
+ link
56
+ end
57
+
58
+ # Write RSPEC to stdout
59
+ parser.parse_file(file_name)
60
+ puts parser.to_rspec
@@ -0,0 +1,37 @@
1
+ Topology: ( 10 Nodes, 20 Edges )
2
+ Model (1 - RTWaxman): 10 1000 100 2 2 0.15000000596046448 0.20000000298023224 1 1 10.0 1024.0
3
+
4
+ Nodes: ( 10 )
5
+ 0 46 77 3 3 -1 RT_NODE
6
+ 1 102 39 5 5 -1 RT_NODE
7
+ 2 257 24 5 5 -1 RT_NODE
8
+ 3 388 1 5 5 -1 RT_NODE
9
+ 4 404 86 3 3 -1 RT_NODE
10
+ 5 405 16 5 5 -1 RT_NODE
11
+ 6 543 41 6 6 -1 RT_NODE
12
+ 7 685 59 3 3 -1 RT_NODE
13
+ 8 767 32 3 3 -1 RT_NODE
14
+ 9 733 1 2 2 -1 RT_NODE
15
+
16
+
17
+ Edges: ( 20 )
18
+ 0 2 0 217.55459085020476 0.7256840025315272 10.0 -1 -1 E_RT U
19
+ 1 2 1 155.72411502397438 0.5194397352850497 10.0 -1 -1 E_RT U
20
+ 2 3 2 133.00375934536586 0.44365278643989725 10.0 -1 -1 E_RT U
21
+ 3 3 1 288.51343122981297 0.9623772164068684 10.0 -1 -1 E_RT U
22
+ 4 4 2 159.5399636454766 0.5321680362134947 10.0 -1 -1 E_RT U
23
+ 5 4 1 305.6354037084055 1.019489968985162 10.0 -1 -1 E_RT U
24
+ 6 5 2 148.21605850919124 0.4943955545045474 10.0 -1 -1 E_RT U
25
+ 7 5 4 70.00714249274856 0.23351869143001774 10.0 -1 -1 E_RT U
26
+ 8 6 5 140.24621207005913 0.46781100834117423 10.0 -1 -1 E_RT U
27
+ 9 6 3 160.0781059358212 0.5339630856751614 10.0 -1 -1 E_RT U
28
+ 10 7 3 302.61031046545656 1.009399344080419 10.0 -1 -1 E_RT U
29
+ 11 7 6 143.13629868066312 0.47745129959427834 10.0 -1 -1 E_RT U
30
+ 12 8 7 86.33075929238663 0.28796841611134405 10.0 -1 -1 E_RT U
31
+ 13 8 6 224.1807306616695 0.747786425840204 10.0 -1 -1 E_RT U
32
+ 14 9 3 345.0 1.1507961284336246 10.0 -1 -1 E_RT U
33
+ 15 9 8 46.010868281309364 0.1534757364753631 10.0 -1 -1 E_RT U
34
+ 16 0 5 364.1455752854894 1.2146588934051483 10.0 -1 -1 E_RT U
35
+ 17 0 6 498.30211719397704 1.6621569485713248 10.0 -1 -1 E_RT U
36
+ 18 1 5 303.87168344549644 1.013606831448363 10.0 -1 -1 E_RT U
37
+ 19 1 6 441.0045351240733 1.4710327873694318 10.0 -1 -1 E_RT U
@@ -18,3 +18,6 @@ require 'omf-sfa/resource/component_lease'
18
18
  require 'omf-sfa/resource/link'
19
19
  require 'omf-sfa/resource/interface'
20
20
  require 'omf-sfa/resource/node'
21
+ require 'omf-sfa/resource/execute_service'
22
+ require 'omf-sfa/resource/install_service'
23
+ require 'omf-sfa/resource/disk_image'
@@ -0,0 +1,14 @@
1
+
2
+ require 'omf-sfa/resource/oresource'
3
+
4
+ module OMF::SFA::Resource
5
+
6
+ # This class represents a service attached to a resource
7
+ #
8
+ class AbstractService < OMF::SFA::Resource::OResource
9
+ extend OMF::SFA::Resource::Base::ClassMethods
10
+ include OMF::SFA::Resource::Base::InstanceMethods
11
+
12
+ end
13
+ end
14
+
@@ -0,0 +1,23 @@
1
+
2
+ require 'omf-sfa/resource/oresource'
3
+
4
+ module OMF::SFA::Resource
5
+
6
+ # This class represents a disk image to be used for a particular node.
7
+ #
8
+ # <disk_image name="urn:publicid:IDN+instageni.gpolab.bbn.com+image+emulab-net//GIMIomf"/>
9
+ # <disk_image version="de35e71b31771870bcdfcccb4dee11657ba145b8" name="http://emmy9.casa.umass.edu/Disk_Images/ExoGENI/exogeni-umass-ovs-1.0.2.xml"/>
10
+ #
11
+ class DiskImage < OResource
12
+ oproperty :url, String, required: true
13
+ oproperty :version, String, required: false
14
+
15
+ extend OMF::SFA::Resource::Base::ClassMethods
16
+ include OMF::SFA::Resource::Base::InstanceMethods
17
+
18
+ sfa_class 'disk_image'
19
+ sfa :name, prop_name: :url, attribute: true
20
+ sfa :version, attribute: true
21
+ end
22
+ end
23
+
@@ -0,0 +1,20 @@
1
+
2
+ require 'omf-sfa/resource/oresource'
3
+
4
+ module OMF::SFA::Resource
5
+
6
+ # This class represents a service which executes a
7
+ # program as part of the boot process.
8
+ #
9
+ # <execute command="sudo sh /local/postboot_script.sh" shell="sh"/>
10
+ #
11
+ class ExecuteService < AbstractService
12
+ oproperty :command, String, required: true
13
+ oproperty :shell, String, default: 'sh'
14
+
15
+ sfa_class 'execute'
16
+ sfa :command, :attribute => true
17
+ sfa :shell, :attribute => true
18
+ end
19
+ end
20
+
@@ -5,7 +5,7 @@ module OMF::SFA::Resource
5
5
  #
6
6
  class GURN #< OMF::Base::MObject
7
7
 
8
- @@def_domain = 'omf:nitos'
8
+ @@def_domain = "urn:publicid:IDN+acme.org"
9
9
  @@name2obj = {}
10
10
 
11
11
  # Create a GURN
@@ -18,6 +18,9 @@ module OMF::SFA::Resource
18
18
  #
19
19
  def self.create(name, opts = {})
20
20
  return name if name.kind_of? self
21
+ unless name
22
+ raise "No name given"
23
+ end
21
24
  #puts "GUID: #{name}###{opts}"
22
25
 
23
26
  obj = @@name2obj[name]
@@ -0,0 +1,20 @@
1
+
2
+ require 'omf-sfa/resource/oresource'
3
+
4
+ module OMF::SFA::Resource
5
+
6
+ # This class represents a service which installs a
7
+ # program as part of the boot process.
8
+ #
9
+ # <install install_path="/local" url="http://emmy9.casa.umass.edu/InstaGENI_Images/install-script.tar.gz"/>
10
+ #
11
+ class InstallService < AbstractService
12
+ oproperty :url, String, required: true # Location of file to install
13
+ oproperty :install_path, String, default: '/usr/local'
14
+
15
+ sfa_class 'install'
16
+ sfa :url, :attribute => true
17
+ sfa :install_path, :attribute => true
18
+ end
19
+ end
20
+
@@ -33,10 +33,12 @@ module OMF::SFA::Resource
33
33
  end
34
34
 
35
35
  def to_sfa_ref_xml(res_el, obj2id, opts)
36
+ #puts "IF_OPTS #{opts}"
36
37
  if obj2id.key?(self)
37
38
  el = res_el.add_child(Nokogiri::XML::Element.new('interface_ref', res_el.document))
38
- el.set_attribute('component_id', self.component_id.to_s)
39
- el.set_attribute('id_ref', self.uuid.to_s)
39
+ el.set_attribute('component_id', self.component_id.to_s) unless opts[:type] == :request
40
+ #el.set_attribute('id_ref', self.uuid.to_s)
41
+ el.set_attribute('client_id', self.component_name)
40
42
  else
41
43
  self.to_sfa_xml(res_el, obj2id, opts)
42
44
  end
@@ -5,24 +5,47 @@ require 'omf-sfa/resource/channel'
5
5
 
6
6
  module OMF::SFA::Resource
7
7
 
8
- # <link component_id="urn:publicid:IDN+emulab.net+link+link-pc102%3Aeth2-internet%3Aborder" component_name="link-pc102:eth2-internet:border">
9
- # <component_manager name="urn:publicid:IDN+emulab.net+authority+cm"/>
10
- # <interface_ref component_id="urn:publicid:IDN+emulab.net+interface+pc102:eth2"/>
11
- # <interface_ref component_id="urn:publicid:IDN+emulab.net+interface+internet:border"/>
12
- # <property capacity="100000" dest_id="urn:publicid:IDN+emulab.net+interface+internet:border" latency="0" packet_loss="0" source_id="urn:publicid:IDN+emulab.net+interface+pc102:eth2"/>
13
- # <property capacity="100000" dest_id="urn:publicid:IDN+emulab.net+interface+pc102:eth2" latency="0" packet_loss="0" source_id="urn:publicid:IDN+emulab.net+interface+internet:border"/>
14
- # <link_type name="ipv4"/>
15
- # </link>
16
-
8
+ # <link component_id="urn:publicid:IDN+emulab.net+link+link-pc102%3Aeth2-internet%3Aborder" component_name="link-pc102:eth2-internet:border">
9
+ # <component_manager name="urn:publicid:IDN+emulab.net+authority+cm"/>
10
+ # <interface_ref component_id="urn:publicid:IDN+emulab.net+interface+pc102:eth2"/>
11
+ # <interface_ref component_id="urn:publicid:IDN+emulab.net+interface+internet:border"/>
12
+ # <property capacity="100000" dest_id="urn:publicid:IDN+emulab.net+interface+internet:border" latency="0" packet_loss="0" source_id="urn:publicid:IDN+emulab.net+interface+pc102:eth2"/>
13
+ # <property capacity="100000" dest_id="urn:publicid:IDN+emulab.net+interface+pc102:eth2" latency="0" packet_loss="0" source_id="urn:publicid:IDN+emulab.net+interface+internet:border"/>
14
+ # <link_type name="ipv4"/>
15
+ # </link>
17
16
  class Link < Channel
18
17
 
19
18
  oproperty :link_type, String
20
- #has 2, :interfaces
19
+ oproperty :capacity, Integer # kbps
20
+ oproperty :latency, Integer # ms
21
+ oproperty :packet_loss, Float # 0 .. 1
21
22
 
22
23
  sfa_class 'link'
23
24
  sfa :link_type, :content_attribute => :name
25
+ sfa :property # sets capacity, latency and packet_loss
24
26
  #sfa :properties, LinkProperty, :inline => true, :has_many => true
25
27
 
28
+ #Override xml serialization of 'property'
29
+ def _to_sfa_xml_property(res_el, pdef, obj2id, opts)
30
+ capacity = self.capacity
31
+ latency = self.latency
32
+ packet_loss = self.packet_loss
33
+ if capacity || latency || packet_loss
34
+ source, dest = self.interfaces.to_a
35
+ _to_sfa_xml_one_way_property(res_el, source, dest, capacity, latency, packet_loss)
36
+ _to_sfa_xml_one_way_property(res_el, dest, source, capacity, latency, packet_loss)
37
+ end
38
+ end
39
+
40
+ def _to_sfa_xml_one_way_property(res_el, source, dest, capacity, latency, packet_loss)
41
+ # <property source_id="n7:if1" dest_id="n6:if2" capacity="10" latency="20" packet_loss="0.3"/>
42
+ el = res_el.add_child(Nokogiri::XML::Element.new('property', res_el.document))
43
+ el.set_attribute('source_id', source.client_id)
44
+ el.set_attribute('dest_id_id', dest.client_id)
45
+ el.set_attribute('capacity', capacity.to_i) if capacity
46
+ el.set_attribute('latency', latency.to_i) if latency
47
+ el.set_attribute('packet_loss', packet_loss) if packet_loss
48
+ end
26
49
  end
27
50
 
28
51
  end # OMF::SFA::Resource
@@ -1,6 +1,8 @@
1
1
 
2
2
  require 'omf-sfa/resource/ocomponent'
3
3
  require 'omf-sfa/resource/interface'
4
+ require 'omf-sfa/resource/abstract_service'
5
+ require 'omf-sfa/resource/sliver_type'
4
6
 
5
7
  module OMF::SFA::Resource
6
8
 
@@ -9,18 +11,21 @@ module OMF::SFA::Resource
9
11
 
10
12
  oproperty :hardware_type, String, :required => false
11
13
  oproperty :available, Boolean, :default => true
12
- #oproperty :sliver_type, String, :required => false
14
+ oproperty :sliver_type, SliverType, :required => false # Is this required?
13
15
  oproperty :interfaces, :interface, :functional => false
14
16
  oproperty :exclusive, Boolean, :default => true
17
+ oproperty :services, OMF::SFA::Resource::AbstractService, functional: false
15
18
 
16
19
  #belongs_to :sliver
17
20
 
18
21
  sfa_class 'node'
19
22
  sfa :hardware_type, :inline => true, :has_many => true
20
- sfa :available, :attr_value => 'now' # <available now="true">
23
+ sfa :available, attr_value: 'now', in_request: false # <available now="true">
21
24
  #sfa :sliver_type, :attr_value => 'name'
25
+ sfa :sliver_type
22
26
  sfa :interfaces, :inline => true, :has_many => true
23
27
  sfa :exclusive, :attribute => true
28
+ sfa :services, :has_many => true
24
29
 
25
30
 
26
31
  # Override xml serialization of 'interface'
@@ -41,13 +41,13 @@ module OMF::SFA::Resource
41
41
 
42
42
  #sfa_add_namespace :ol, 'http://nitlab.inf.uth.gr/schema/sfa/rspec/1'
43
43
 
44
- sfa :component_id, :attribute => true, :prop_name => :component_gurn # "urn:publicid:IDN+plc:cornell+node+planetlab3-dsl.cs.cornell.edu"
44
+ sfa :component_id, attribute: true, prop_name: :component_gurn, in_request: false
45
45
 
46
46
  sfa :client_id, :attribute => true, :prop_name => :name
47
47
  alias_method :client_id, :name
48
48
 
49
- sfa :component_manager_id, :attribute => true, :prop_name => :component_manager_gurn # "urn:publicid:IDN+plc+authority+am"
50
- sfa :component_name, :attribute => true # "plane
49
+ sfa :component_manager_id, attribute: true, prop_name: :component_manager_gurn, in_request: false
50
+ sfa :component_name, attribute: true, in_request: false
51
51
  sfa :leases, :inline => true, :has_many => true
52
52
 
53
53
  sfa :exo_sliver__geni_sliver_info
@@ -47,57 +47,6 @@ module OMF::SFA::Resource
47
47
 
48
48
  belongs_to :o_resource
49
49
 
50
- # module ArrayProxy
51
- # def << (val)
52
- # if @on_set_block
53
- # val = @on_set_block.call(val)
54
- # return if val.nil?
55
- # end
56
- # @oproperty << val
57
- # @on_modified_block.call(val, true) if @on_add_block
58
- # super
59
- # end
60
- #
61
- # def clear()
62
- # _remove { super }
63
- # end
64
- #
65
- # def delete(obj)
66
- # _remove { super }
67
- # end
68
- #
69
- # def delete_at(index)
70
- # _remove { super }
71
- # end
72
- #
73
- # def delete_if(&block)
74
- # _remove { super }
75
- # end
76
- #
77
- # # Callback to support 'reverse' operation
78
- # def on_modified(&block)
79
- # @on_modified_block = block
80
- # end
81
- #
82
- # def on_set(&block)
83
- # @on_set_block = block
84
- # end
85
- #
86
- # private
87
- # def _remove(&block)
88
- # old = self.dup
89
- # r = block.call()
90
- # removed = old - self
91
- # unless removed.empty?
92
- # if @on_remove_block
93
- # removed.each {|it| @on_modified_block.call(it, false) }
94
- # end
95
- # @oproperty.value = self
96
- # end
97
- # r
98
- # end
99
- # end
100
-
101
50
  def self.prop_all(query, opts = {}, resource_class = nil)
102
51
  i = 0
103
52
  where = query.map do |pn, v|
@@ -208,7 +157,10 @@ module OMF::SFA::Resource
208
157
  when 's'
209
158
  val = attribute_get(:s_value)
210
159
  when 'r'
211
- uuid = attribute_get(:s_value)
160
+ uuid_s = attribute_get(:s_value)
161
+ uuid = UUIDTools::UUID.parse(uuid_s)
162
+ #puts "RRRR >> #{uuid}"
163
+ #puts "OOOO >> #{OResource.all.to_a}"
212
164
  val = OResource.first(uuid: uuid)
213
165
  when 't'
214
166
  val = Time.at(attribute_get(:n_value))
@@ -225,7 +177,7 @@ module OMF::SFA::Resource
225
177
  val = JSON.load(js)[0]
226
178
  #puts "VALUE: #{js.inspect}-#{val.inspect}-#{val.class}"
227
179
  if val.kind_of? Array
228
- val.tap {|v| v.extend(ArrayProxy).instance_variable_set(:@oproperty, self) }
180
+ #val.tap {|v| v.extend(OPropertyArray).instance_variable_set(:@oproperty, self) }
229
181
  end
230
182
  else
231
183
  throw "Unknown property type '#{type}'"
@@ -307,8 +259,20 @@ module OMF::SFA::Resource
307
259
  end
308
260
  end
309
261
 
262
+ def [](index)
263
+ if p = OProperty.all(name: @name, o_resource: @resource).all[index]
264
+ p.value
265
+ else
266
+ nil
267
+ end
268
+ end
269
+
270
+ def length
271
+ OProperty.count(name: @name, o_resource: @resource)
272
+ end
273
+
310
274
  def empty?
311
- OProperty.count(name: @name, o_resource: @resource) == 0
275
+ self.length == 0
312
276
  end
313
277
 
314
278
  # Callback to support 'reverse' operation
@@ -2,6 +2,8 @@ require 'rubygems'
2
2
  require 'dm-core'
3
3
  require 'dm-types'
4
4
  require 'dm-validations'
5
+ require 'dm-aggregates'
6
+
5
7
  require 'omf_base/lobject'
6
8
  require 'set'
7
9
  require 'active_support/inflector'
@@ -66,6 +68,20 @@ module OMF::SFA::Resource
66
68
 
67
69
  #belongs_to :account, :model => 'OAccount', :child_key => [ :account_id ], :required => false
68
70
 
71
+ def self.init(persistence_url = 'sqlite::memory:')
72
+ DataMapper::Logger.new($stdout, :info) # :note
73
+
74
+ DataMapper.setup(:default, persistence_url)
75
+ DataMapper::Model.raise_on_save_failure = true
76
+
77
+ DataMapper.finalize
78
+ #DataMapper.auto_upgrade!
79
+ require 'dm-migrations'
80
+ DataMapper.auto_migrate!
81
+
82
+ self
83
+ end
84
+
69
85
  def self.href_resolver(&block)
70
86
  @@href_resolvers[self] = block
71
87
  end
@@ -73,6 +89,10 @@ module OMF::SFA::Resource
73
89
  def self.oproperty(name, type, opts = {})
74
90
  name = name.to_s
75
91
 
92
+ if self.properties.find {|p| p.name.to_s == name }
93
+ raise "Can't define an oproperty '#{name}' as it is already used as a base property."
94
+ end
95
+
76
96
  # should check if +name+ is already used
77
97
  op = @@oprops[self] ||= {}
78
98
  opts[:__type__] = type
@@ -241,7 +261,7 @@ module OMF::SFA::Resource
241
261
 
242
262
 
243
263
  def oproperty_get(pname)
244
- #puts "OPROPERTY_GET: pname:'#{pname}'"
264
+ #puts "OPROPERTY_GET: pname:'#{pname}':#{pname.class}"
245
265
  pname = pname.to_sym
246
266
  return self.name if pname == :name
247
267
 
@@ -251,7 +271,7 @@ module OMF::SFA::Resource
251
271
  alias_method :[], :oproperty_get
252
272
 
253
273
  def oproperty_set(pname, value, type = nil)
254
- #puts "OPROPERTY_SET pname:'#{pname}', value:'#{value.class}'-#{type}, self:'#{self.inspect}'"
274
+ #puts "OPROPERTY_SET pname:'#{pname}', value:'#{value.class}'::#{type}, self:'#{self.inspect}'"
255
275
  pname = pname.to_sym
256
276
  if pname == :name
257
277
  self.name = value
@@ -260,6 +280,7 @@ module OMF::SFA::Resource
260
280
  #puts ">>>>>" + @@oprops[self.class][pname.to_s].to_s
261
281
  prop = self.oproperties.first_or_create(:name => pname)
262
282
  prop.value = value
283
+ #puts ">> #{prop.inspect}"
263
284
  end
264
285
  value
265
286
  end
@@ -30,6 +30,7 @@ module OMF::SFA
30
30
  @@sfa_namespace2prefix = {}
31
31
  @@sfa_classes = {}
32
32
  @@sfa_name2class = {}
33
+ @@sfa_suppress_id = {}
33
34
 
34
35
  #
35
36
  # @opts
@@ -65,6 +66,14 @@ module OMF::SFA
65
66
  end
66
67
  end
67
68
 
69
+ def sfa_suppress_id
70
+ @@sfa_suppress_id[self] = true
71
+ end
72
+
73
+ def sfa_suppress_id?
74
+ @@sfa_suppress_id[self] == true
75
+ end
76
+
68
77
  # Define a SFA property
69
78
  #
70
79
  # @param [Symbol] name name of resource in RSpec
@@ -85,29 +94,34 @@ module OMF::SFA
85
94
  # opts:
86
95
  # :valid_for - valid [sec] from now
87
96
  #
88
- def sfa_advertisement_xml(resources, opts = {})
97
+ def to_rspec(resources, type, opts = {})
89
98
  doc = Nokogiri::XML::Document.new
90
99
  #<rspec expires="2011-09-13T09:07:09Z" generated="2011-09-13T09:07:09Z" type="advertisement" xmlns="http://www.geni.net/resources/rspec/3" xmlns:ol="http://nitlab.inf.uth.gr/schema/sfa/rspec/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/ad.xsd http://nitlab.inf.uth.gr/schema/sfa/rspec/1 http://nitlab.inf.uth.gr/schema/sfa/rspec/1/ad-reservation.xsd">
91
100
  root = doc.add_child(Nokogiri::XML::Element.new('rspec', doc))
92
- root.add_namespace(nil, SFA_NAMESPACE_URI)
93
- root.add_namespace('xsi', "http://www.w3.org/2001/XMLSchema-instance")
94
101
 
95
- opts[:type] = 'advertisement' unless opts[:type]
96
- if opts[:type] == 'manifest'
102
+ root.set_attribute('type', type)
103
+ now = Time.now
104
+ root.set_attribute('generated', now.iso8601)
105
+
106
+ case opts[:type] = type = type.to_sym
107
+ when :manifest
97
108
  schema = 'manifest.xsd'
98
- else
109
+ when :advertisement
99
110
  schema = 'ad.xsd'
111
+ root.set_attribute('expires', (now + (opts[:valid_for] || 600)).iso8601)
112
+ when :request
113
+ schema = 'request.xsd'
114
+ else
115
+ raise "Unnown Rspec type '#{type}'"
100
116
  end
101
- root['xsi:schemaLocation'] = "#{SFA_NAMESPACE_URI} #{SFA_NAMESPACE_URI}/#{schema} #{@@sfa_namespaces[:ol]} #{@@sfa_namespaces[:ol]}/ad-reservation.xsd"
117
+
118
+ root.add_namespace(nil, SFA_NAMESPACE_URI)
119
+ root.add_namespace('xsi', "http://www.w3.org/2001/XMLSchema-instance")
120
+ #root['xsi:schemaLocation'] = "#{SFA_NAMESPACE_URI} #{SFA_NAMESPACE_URI}/#{schema} #{@@sfa_namespaces[:ol]} #{@@sfa_namespaces[:ol]}/ad-reservation.xsd"
102
121
  @@sfa_namespaces.each do |prefix, opts|
103
122
  root.add_namespace(prefix.to_s, opts[:urn])
104
123
  end
105
124
 
106
- root.set_attribute('type', opts[:type])
107
- now = Time.now
108
- root.set_attribute('generated', now.iso8601)
109
- root.set_attribute('expires', (now + (opts[:valid_for] || 600)).iso8601)
110
-
111
125
  #root = doc.create_element('rspec', doc)
112
126
  #doc.add_child root
113
127
  obj2id = {}
@@ -443,28 +457,41 @@ module OMF::SFA
443
457
  self.class.sfa_add_namespaces_to_document(parent)
444
458
  end
445
459
  defs = self.class.sfa_defs()
446
- if (id = obj2id[self])
460
+ if (!(opts[:suppress_id] || self.class.sfa_suppress_id?) && id = obj2id[self])
447
461
  new_element.set_attribute('idref', id)
448
462
  return parent
449
463
  end
450
464
 
451
465
  id = sfa_id()
452
466
  obj2id[self] = id
453
- new_element.set_attribute('id', id) #if detail_level > 0
467
+ unless opts[:suppress_id] || self.class.sfa_suppress_id?
468
+ new_element.set_attribute('id', id) #if detail_level > 0
469
+ end
454
470
  #if href = self.href(opts)
455
471
  # new_element.set_attribute('omf:href', href)
456
472
  #end
457
473
  level = opts[:level] ? opts[:level] : 0
458
474
  opts[:level] = level + 1
475
+ sfa_type = opts[:type]
476
+ is_request = sfa_type == :request
459
477
  defs.keys.sort.each do |key|
460
478
  next if key.start_with?('_')
461
479
  pdef = defs[key]
480
+ #puts ">>>> PDEF(#{key}): #{pdef}"
462
481
  if (ilevel = pdef[:include_level])
463
482
  #next if level > ilevel
464
483
  end
465
- #puts ">>>> #{k} <#{self}> #{pdef.inspect}"
466
- value = send(key.to_sym)
467
- #puts "#{k} <#{v}> #{pdef.inspect}"
484
+ next if is_request && pdef[:in_request] == false
485
+
486
+ if respond_to?(m = "_to_sfa_xml_#{key}".to_sym)
487
+ send(m, new_element, pdef, obj2id, opts)
488
+ next
489
+ end
490
+ pname = (pdef[:prop_name] || key).to_sym
491
+ #puts ">>>> #{pname} <#{self}> #{pdef.inspect}"
492
+ next unless respond_to? pname
493
+ value = send(pname)
494
+ #puts "#{key} <#{value} - #{value.class}> #{pdef.inspect}"
468
495
  if value.nil?
469
496
  value = pdef[:default]
470
497
  end
@@ -473,7 +500,7 @@ module OMF::SFA
473
500
  if value.is_a?(Time)
474
501
  value = value.xmlschema # xs:dateTime
475
502
  end
476
- _to_sfa_property_xml(key, value, new_element, pdef, obj2id, opts)
503
+ _to_sfa_property_xml(key, value, new_element, pdef, obj2id, opts)
477
504
  #end
478
505
  end
479
506
  end
@@ -483,6 +510,11 @@ module OMF::SFA
483
510
 
484
511
  def _to_sfa_property_xml(pname, value, res_el, pdef, obj2id, opts)
485
512
  pname = self.class._sfa_add_ns(pname, pdef)
513
+ if value.respond_to?(:to_sfa_xml)
514
+ value.to_sfa_xml(res_el, obj2id, opts)
515
+ return
516
+ end
517
+
486
518
  if pdef[:attribute]
487
519
  res_el.set_attribute(pname, value.to_s)
488
520
  elsif aname = pdef[:attr_value]
@@ -494,7 +526,8 @@ module OMF::SFA
494
526
  else
495
527
  cel = res_el.add_child(Nokogiri::XML::Element.new(pname, res_el.document))
496
528
  end
497
- if !value.kind_of?(String) && value.kind_of?(Enumerable)
529
+ #puts ">>> _to_sfa_property_xml(#{pname}): class: #{value.class} string? #{value.kind_of?(String)} enumerable: #{value.kind_of?(Enumerable)} "
530
+ if !value.kind_of?(String) && (value.kind_of?(Enumerable) || value.is_a?(OMF::SFA::Resource::OPropertyArray))
498
531
  value.each do |v|
499
532
  if v.respond_to?(:to_sfa_xml)
500
533
  v.to_sfa_xml(cel, obj2id, opts)
@@ -0,0 +1,25 @@
1
+
2
+ require 'omf-sfa/resource/oresource'
3
+ require 'omf-sfa/resource/disk_image'
4
+
5
+ module OMF::SFA::Resource
6
+
7
+ # This class represents a disk image to be used for a particular node.
8
+ #
9
+ # <sliver_type name="emulab-openvz">
10
+ # <disk_image name="urn:publicid:IDN+instageni.gpolab.bbn.com+image+emulab-net//GIMIomf"/>
11
+ # </sliver_type>
12
+ #
13
+ class SliverType < OResource
14
+ oproperty :disk_image, DiskImage, required: false
15
+
16
+ extend OMF::SFA::Resource::Base::ClassMethods
17
+ include OMF::SFA::Resource::Base::InstanceMethods
18
+
19
+ sfa_class 'sliver_type'
20
+ sfa_suppress_id
21
+ sfa :name, :attribute => true
22
+ sfa :disk_image
23
+ end
24
+ end
25
+
@@ -1,4 +1,4 @@
1
1
  module OMF; module SFA
2
2
  #VERSION = "6.0.0.pre.1"
3
- VERSION = "0.2.3"
3
+ VERSION = "0.2.4"
4
4
  end; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omf_sfa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-10 00:00:00.000000000 Z
12
+ date: 2014-05-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -393,8 +393,10 @@ files:
393
393
  - Rakefile
394
394
  - bin/parse_rspec.rb
395
395
  - etc/omf-sfa/omf-sfa-am.yaml
396
+ - examples/brite2rspec.rb
396
397
  - examples/exogeni5nodemanifest.rspec
397
398
  - examples/instageni5nodemanifest.rspec
399
+ - examples/waxman_10.brite
398
400
  - lib/omf-sfa/am.rb
399
401
  - lib/omf-sfa/am/am-rest/REST_API.md
400
402
  - lib/omf-sfa/am/am-rest/account_handler.rb
@@ -426,13 +428,17 @@ files:
426
428
  - lib/omf-sfa/model/ontology.rb
427
429
  - lib/omf-sfa/resource.rb
428
430
  - lib/omf-sfa/resource/README.md
431
+ - lib/omf-sfa/resource/abstract_service.rb
429
432
  - lib/omf-sfa/resource/channel.rb
430
433
  - lib/omf-sfa/resource/comp_group.rb
431
434
  - lib/omf-sfa/resource/component_lease.rb
432
435
  - lib/omf-sfa/resource/constants.rb
436
+ - lib/omf-sfa/resource/disk_image.rb
437
+ - lib/omf-sfa/resource/execute_service.rb
433
438
  - lib/omf-sfa/resource/group_component.rb
434
439
  - lib/omf-sfa/resource/group_membership.rb
435
440
  - lib/omf-sfa/resource/gurn.rb
441
+ - lib/omf-sfa/resource/install_service.rb
436
442
  - lib/omf-sfa/resource/interface.rb
437
443
  - lib/omf-sfa/resource/ip.rb
438
444
  - lib/omf-sfa/resource/link.rb
@@ -447,6 +453,7 @@ files:
447
453
  - lib/omf-sfa/resource/project.rb
448
454
  - lib/omf-sfa/resource/project_membership.rb
449
455
  - lib/omf-sfa/resource/sfa_base.rb
456
+ - lib/omf-sfa/resource/sliver_type.rb
450
457
  - lib/omf-sfa/resource/user.rb
451
458
  - lib/omf-sfa/util/create_sample_testbed.rb
452
459
  - lib/omf-sfa/util/load_from_sfa_xml.rb