wise_omf 0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2c646960c311267d13f375733a6e9eeb8445d892
4
+ data.tar.gz: 987108e23efaa45458ad3cafd5f908e63f24b192
5
+ SHA512:
6
+ metadata.gz: c877157e684d0d8603af76c98ff868f7eebefd34e033e39750c6005dd79dc5b15e3831bdea753728edfb6de4bb093b1ee0c9fd25f05c2da549384cd7b5021c8e
7
+ data.tar.gz: 3efdae6ecfc627219897d5f9210706ff0f2fb8485c59dc2d59da8b0eae424bc25c07a4a474ebcce8b19ca599cb3ef75fd5bc8a3d6b978780df39612951acf4b1
@@ -0,0 +1,211 @@
1
+ require 'lrucache'
2
+ require 'wise_omf/uid_helper'
3
+ require 'yaml'
4
+ module WiseOMF
5
+ module Client
6
+ class ExperimentHelper
7
+ @@random = Random.new
8
+ @@uid_cache = LRUCache.new(ttl: 30.minutes)
9
+
10
+
11
+ # Create an unique message id
12
+ # NOTE: Message ids are guaranteed to be unique within 30 minutes.
13
+ def self.messageUID
14
+ uid = -1
15
+ while true
16
+ uid = @@random.rand(2**32)
17
+ break if @@uid_cache.fetch(uid).nil?
18
+ end
19
+ @@uid_cache.store(uid, 1)
20
+ return uid
21
+ end
22
+
23
+ end
24
+
25
+ # The WiseGroup is the representation of an omf resource group
26
+ # which provides the ability to register callback for requests and configure messages.
27
+ # You should not create an instance of this group directly. This can cause unwanted side effects.
28
+ # The better way is to ask the ReservationManager (factory) for a group for a list of node urns.
29
+ class WiseGroup
30
+ # Message types to call callbacks for
31
+ @@default_message_types = [:response, :inform]
32
+ attr_accessor :name, :uid, :group, :default_callback
33
+ @callback_cache
34
+ @name
35
+ @uid
36
+ @group
37
+ @default_callback
38
+
39
+ def initialize(name, uid)
40
+ @callback_cache = LRUCache.new(ttl: 30.minutes)
41
+ @name = name
42
+ @uid = uid
43
+ group = OmfEc::Group.new(name)
44
+ OmfEc.experiment.add_group(group)
45
+ group.add_resource(uid)
46
+ @group = group
47
+
48
+ #@group = OmfEc::Group.new(uid, {unique: false}) { |g|
49
+ # info "Created Group #{name}: #{g.to_yaml}"
50
+ #
51
+ # #yield self unless block.nil?
52
+ #
53
+ #}
54
+ #OmfEc.experiment.add_group(@group)
55
+ #@group.add_resource(name)
56
+ warn "Finished init"
57
+ end
58
+
59
+ def init_callback
60
+
61
+ while @group.topic.nil?
62
+ info "Delaying callback creation for 0.5 seconds"
63
+ sleep 0.5
64
+ end
65
+ info "Setting message callback for #{self.name}"
66
+ @group.topic.on_message(:inform_status) { |msg|
67
+ rid = msg.content.properties.requestId
68
+ if rid.nil? && @@default_message_types.include?(msg.content.type)
69
+ self.default_callback.call(msg) unless self.default_callback.nil?
70
+ else
71
+ callback = @callback_cache.fetch(rid)
72
+ unless callback.nil?
73
+ callback.call(msg.content.properties)
74
+ else
75
+ if @@default_message_types.include? msg.content.type
76
+ self.default_callback.call(msg) unless self.default_callback.nil?
77
+ end
78
+ end
79
+ end
80
+ }
81
+
82
+ end
83
+
84
+ def request(property, &block)
85
+ mid = WiseOMF::Client::ExperimentHelper.messageUID
86
+ unless block.nil?
87
+ @callback_cache.store(mid, block)
88
+ end
89
+ fail "Can't request topic here" if property.to_sym.eql? 'topic'.to_sym
90
+ @group.topic.configure({property => mid})
91
+ end
92
+
93
+ def configure(property, value, &block)
94
+ mid = WiseOMF::Client::ExperimentHelper.messageUID
95
+ unless block.nil?
96
+ @callback_cache.store(mid, block)
97
+ end
98
+ @group.topic.configure({property => {requestId: mid, value: value}})
99
+ end
100
+
101
+ def method_missing(name, *args, &block)
102
+ if name =~ /set_(.+)/
103
+ configure($1, args[0], &block)
104
+ else
105
+ request(name, &block)
106
+ end
107
+ end
108
+
109
+ def delete_callback(requestId)
110
+ @callback_cache.delete(requestId)
111
+ end
112
+
113
+ end
114
+
115
+ # The reservation manager handles the creation and storage of node groups and stores all relevant information
116
+ # for the current experiment.
117
+ # If you need to talk to a single node, call the ResverationManager.groupForNode(nodeUrn) method.
118
+ # If you want a custom subset of nodes, call the ReservationManager.groupForNodes(nodeUrnArray) method.
119
+ # For talking to all nodes, you can get the approprita group bei calling ReservationManager.allNodesGroup.
120
+ class ReservationManager
121
+ @@reservation
122
+ @@nodeUrns
123
+ @@nodeGroups
124
+ @@reservationGroup
125
+
126
+ # Initializes the reservation manager class and creates all needed wise groups
127
+ #
128
+ # TODO explain parameters here
129
+ def self.init(reservation, nodeUrns)
130
+ @@nodeGroups = {}
131
+ @@reservation = reservation
132
+ @@nodeUrns = nodeUrns
133
+ @@reservationGroup = WiseOMF::Client::WiseGroup.new('ReservationGroup', self.reservationID)
134
+ @@reservationGroup.init_callback
135
+ # Creating the all nodes group:
136
+ self.allNodesGroup
137
+
138
+ # Creating the single node groups:
139
+ @@nodeUrns.each { |node|
140
+ self.groupForNode(node)
141
+ }
142
+
143
+ end
144
+
145
+ def self.reservationGroup
146
+ @@reservationGroup
147
+ end
148
+
149
+ def self.createGroupForNodes(nodeUrns, name = nil, &block)
150
+ groupId = WiseOMFUtils::UIDHelper.node_group_uid(@@reservation, nodeUrns)
151
+ if @@nodeGroups[groupId].nil?
152
+ if name.nil?
153
+ group = WiseOMF::Client::WiseGroup.new(nodeUrns.to_s, groupId)
154
+ else
155
+ group = WiseOMF::Client::WiseGroup.new(name, groupId)
156
+ end
157
+ @@nodeGroups[groupId] = group
158
+ group.init_callback
159
+ group.group.topic.on_message(:wait_for_membership) { |msg|
160
+ if msg.properties.membership && msg.properties.membership.include?(group.group.address)
161
+ info "New group setup finished"
162
+ group.group.topic.on_message(:wait_for_membership) {}
163
+ #group.init_callback
164
+ block.call(group) if block
165
+ end
166
+
167
+ }
168
+ @@reservationGroup.group.topic.create(:wisebed_node, {uid: groupId, urns: nodeUrns, membership: group.group.address})
169
+
170
+ end
171
+ end
172
+
173
+ # Returns a group to use when interacting with an arbitrary subset of the all nodes set
174
+ #
175
+ # @param[Array, Set, #read] a list of nodes to get the group for.
176
+ def self.groupForNodes(nodeUrns)
177
+ groupId = WiseOMFUtils::UIDHelper.node_group_uid(@@reservation, nodeUrns)
178
+ @@nodeGroups[groupId]
179
+ end
180
+
181
+ # Returns a group to work with when interacting with all nodes of the reservation
182
+ def self.allNodesGroup
183
+ groupId = WiseOMFUtils::UIDHelper.node_group_uid(@@reservation, @@nodeUrns)
184
+ if @@nodeGroups[groupId].nil?
185
+ @@nodeGroups[groupId] = WiseOMF::Client::WiseGroup.new('AllNodes', groupId)
186
+ @@nodeGroups[groupId].init_callback
187
+ end
188
+ @@nodeGroups[groupId]
189
+ end
190
+
191
+ # Returns a WiseGroup to talk to. This group should be used for interacting with single nodes.
192
+ #
193
+ # @param[String, #read] the node urn
194
+ def self.groupForNode(nodeUrn)
195
+ groupId = WiseOMFUtils::UIDHelper.node_group_uid(@@reservation, [nodeUrn])
196
+ if @@nodeGroups[groupId].nil?
197
+ @@nodeGroups[groupId] = WiseOMF::Client::WiseGroup.new(nodeUrn, groupId)
198
+ @@nodeGroups[groupId].init_callback
199
+ end
200
+ @@nodeGroups[groupId]
201
+ end
202
+
203
+ # Getter for the reservation id of the current reservation
204
+ def self.reservationID
205
+ WiseOMFUtils::UIDHelper.reservation_uid(@@reservation)
206
+ end
207
+
208
+
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,3 @@
1
+ require 'wise_omf/protobuf/external-plugin-messages.pb'
2
+ require 'wise_omf/protobuf/iwsn-messages.pb'
3
+ require 'wise_omf/protobuf/internal-messages.pb'
@@ -0,0 +1,4 @@
1
+ require 'wise_omf/protobuf'
2
+ require 'wise_omf/uid_helper'
3
+ class Server
4
+ end
data/lib/wise_omf.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'wise_omf/client'
2
+ require 'wise_omf/protobuf'
3
+ class WiseOmf
4
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wise_omf
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.9'
5
+ platform: ruby
6
+ authors:
7
+ - Tobias Mende
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-19 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: This gem provides helpers for working with the testbed runtime via the
14
+ OMF (Orbit Measurement Framework)
15
+ email: me@tobsolution.de
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/wise_omf.rb
21
+ - lib/wise_omf/protobuf.rb
22
+ - lib/wise_omf/server.rb
23
+ - lib/wise_omf/client.rb
24
+ homepage: https://github.com/wisebed/wiseomf
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.0.6
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: WiseOMF Utility Gem
48
+ test_files: []