Class: CPEE::NewInstance

Inherits:
Riddl::Implementation
  • Object
show all
Defined in:
lib/cpee/implementation.rb

Overview

}}}

Instance Method Summary collapse

Instance Method Details

#path(e) ⇒ Object

{{{



195
196
197
198
199
200
201
202
# File 'lib/cpee/implementation.rb', line 195

def path(e)
  ret = []
  until e.qname.name == 'properties'
    ret << (e.class == XML::Smart::Dom::Attribute ? '@' : '') + e.qname.name
    e = e.parent
  end
  File.join(*ret.reverse)
end

#responseObject



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/cpee/implementation.rb', line 204

def response
  opts = @a[0]
  redis = opts[:redis]
  doc = XML::Smart::open_unprotected(opts[:properties_init])
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
  name     = @p[0].value
  id       = redis.zrevrange('instances', 0, 0).first.to_i + 1
  uuid     = SecureRandom.uuid
  instance = 'instance:' + id.to_s
  redis.multi do |multi|
    multi.zadd('instances',id,id)
    doc.root.find(PROPERTIES_PATHS_FULL.join(' | ')).each do |e|
      if e.class == XML::Smart::Dom::Element && e.element_only?
        val = e.find('*').map { |f| f.dump }.join
        multi.set(File.join(instance, path(e)), val)
      else
        multi.set(File.join(instance, path(e)), e.text)
      end
    end
    doc.root.find(PROPERTIES_PATHS_INDEX_UNORDERED.join(' | ')).each do |e|
      p = path(e)
      multi.sadd(File.join(instance, File.dirname(p)), File.basename(p))
    end
    doc.root.find(PROPERTIES_PATHS_INDEX_ORDERED.join(' | ')).each_with_index do |e,i|
      p = path(e)
      multi.zadd(File.join(instance, File.dirname(p)), i, File.basename(p))
    end
    Dir[File.join(opts[:notifications_init],'*','subscription.xml')].each do |f|
      XML::Smart::open_unprotected(f) do |doc|
        doc.register_namespace 'np', 'http://riddl.org/ns/common-patterns/notifications-producer/2.0'
        key = File.basename(File.dirname(f))
        url = doc.find('string(/np:subscription/@url)')
        multi.sadd("instance:#{id}/handlers",key)
        multi.set("instance:#{id}/handlers/#{key}/url",url)
        doc.find('/np:subscription/np:topic/*').each do |e|
          c = File.join(e.parent.attributes['id'],e.qname.name,e.text)
          multi.sadd("instance:#{id}/handlers/#{key}",c)
          multi.sadd("instance:#{id}/handlers/#{c}",key)
        end
      end rescue nil # all the ones that are not ok, are ignored
    end
    multi.set(File.join(instance, 'attributes', 'uuid'), uuid)
    multi.zadd(File.join(instance, 'attributes'), -2, 'uuid')
    multi.set(File.join(instance, 'attributes', 'info'), name)
    multi.zadd(File.join(instance, 'attributes'), -1, 'info')
    multi.set(File.join(instance, 'state', '@changed'), Time.now.xmlschema(3))
  end

  @headers << Riddl::Header.new("CPEE-INSTANCE", id.to_s)
  @headers << Riddl::Header.new("CPEE-INSTANCE-URL", File.join(opts[:url].to_s,id.to_s))
  @headers << Riddl::Header.new("CPEE-INSTANCE-UUID", uuid)

  Riddl::Parameter::Simple.new("id", id.to_s)
end