redfish_tools 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4dde903d12481a6fcfd6d1ad22361a3241aa66e6b352749343c815bf7e8c41d2
4
- data.tar.gz: 4c3093c8e30d947371aecb3d1ebe33b7a6450ee23ab5bfd920388fdf4b564f6a
3
+ metadata.gz: fc9c77cc1157ae9cd393037166415de232253227a598a0e6a6e4f21cb13d7099
4
+ data.tar.gz: eaa18973472a9ade244813bf46430f8aa185a0cf9f374e7608020995796c3c00
5
5
  SHA512:
6
- metadata.gz: 38949cd88d05c30c39bbb9c9a37aa318084ab12d10aa3d9501bf2419f08ee88e6002ed0c4426940b40b0a0ec790c79604a00b97f194b871879656cb9037422ae
7
- data.tar.gz: 18ec60a00bf481fab900a3c8d9a50629209d3b6f3bcb40dd4301526fc425e14858b907d2925ef7a1a9f8fd4565fb85498f4c29319e17fa3fcf84565310985831
6
+ metadata.gz: 4b622a6604c1c5584055108cc19ad6a637b619cb5dc6a2890b4f0dcf016903b55b9ec190444dfad7369dce497a776073f992de46ece288f98b2feef1bf07469c
7
+ data.tar.gz: 2d4b1ebf6bb2761b0f0853ee741dca6ff1d5e5a36b8700301ad8307f8ad857498d6a9e6d444019f9604ab149ab3fa35985ed337aa00a8fa7b5cbbf816543fe0e
@@ -67,5 +67,28 @@ module RedfishTools
67
67
  rescue StandardError => e
68
68
  raise Thor::Error, e.to_s
69
69
  end
70
+
71
+ desc "serve_sse [OPTIONS] SOURCE", "serve events from SOURCE"
72
+ option :port,
73
+ desc: "port that should be used to serve events",
74
+ default: 8001,
75
+ type: :numeric
76
+ option :bind,
77
+ desc: "address that server should bind to",
78
+ default: "127.0.0.1"
79
+ option :ssl,
80
+ desc: "use SSL",
81
+ default: false,
82
+ type: :boolean
83
+ def serve_sse(source)
84
+ require "redfish_tools/cli/serve_sse"
85
+ ServeSse.new(source, options).run
86
+ end
87
+
88
+ desc "listen_sse ADDRESS", "listen to events from ADDRESS"
89
+ def listen_sse(address)
90
+ require "redfish_tools/cli/listen_sse"
91
+ ListenSse.new(address, options).run
92
+ end
70
93
  end
71
94
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redfish_tools/sse_client"
4
+
5
+ module RedfishTools
6
+ class Cli
7
+ class ListenSse
8
+ def initialize(address, options)
9
+ @address = address
10
+ @options = options
11
+ end
12
+
13
+ def run
14
+ sse = RedfishTools::SseClient.new(@address)
15
+ trap("INT") { exit }
16
+ sse.start
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redfish_tools/sse_server"
4
+
5
+ module RedfishTools
6
+ class Cli
7
+ class ServeSse
8
+ def initialize(source, options)
9
+ @source = source
10
+ @options = options
11
+ end
12
+
13
+ def run
14
+ sse = RedfishTools::SseServer.new(
15
+ @source, @options[:bind], @options[:port]
16
+ )
17
+ trap("INT") { exit }
18
+ sse.start
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,7 +4,7 @@ require "json"
4
4
 
5
5
  module RedfishTools
6
6
  class DataStore
7
- Resource = Struct.new(:id, :body, :headers, :time)
7
+ Resource = Struct.new(:id, :body, :headers, :time, :parent)
8
8
 
9
9
  def initialize(base_path)
10
10
  @base_path = File.expand_path(base_path)
@@ -16,11 +16,11 @@ module RedfishTools
16
16
 
17
17
  def get(id)
18
18
  id = id.chomp("/")
19
- @overlay[id] ||= load_resource(id)
19
+ @overlay[id] = @overlay.fetch(id, load_resource(id))
20
20
  end
21
21
 
22
- def set(id, body, headers: nil, time: nil)
23
- @overlay[id] = Resource.new(id, body, headers, time)
22
+ def set(id, body, headers: nil, time: nil, parent: nil)
23
+ @overlay[id] = Resource.new(id, body, headers, time, parent)
24
24
  end
25
25
 
26
26
  private
@@ -56,8 +56,9 @@ module RedfishTools
56
56
  response.status = 501
57
57
  end
58
58
 
59
- def do_DELETE(_request, response)
60
- response.status = 501
59
+ def do_DELETE(request, response)
60
+ delete_item(datastore.get(request.path))
61
+ response.status = 204
61
62
  end
62
63
 
63
64
  private
@@ -86,7 +87,17 @@ module RedfishTools
86
87
  item.body["Members"].push("@odata.id" => oid)
87
88
 
88
89
  base = { "@odata.id" => oid, "Id" => id, "Name" => id }
89
- datastore.set(id, base.merge(data))
90
+ datastore.set(oid, base.merge(data), parent: item)
91
+ end
92
+
93
+ def delete_item(item)
94
+ if item.parent
95
+ item.parent.body["Members@odata.count"] -= 1
96
+ item.parent.body["Members"].delete_if do |m|
97
+ m["@odata.id"] == item.id
98
+ end
99
+ end
100
+ datastore.set(item.id, nil)
90
101
  end
91
102
 
92
103
  def authorized?(request)
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ require "server_sent_events"
6
+
7
+ module RedfishTools
8
+ class SseClient
9
+ def initialize(address)
10
+ @address = address
11
+ end
12
+
13
+ def start
14
+ ServerSentEvents.listen(@address) do |event|
15
+ puts JSON.pretty_generate("id" => event.id,
16
+ "data" => JSON.parse(event.data))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require "json"
5
+ require "socket"
6
+
7
+ module RedfishTools
8
+ class SseServer
9
+ HEADERS = "HTTP/1.1 200 OK\r\n"\
10
+ "Content-Type: text/event-stream\r\n"\
11
+ "\r\n"
12
+
13
+ def initialize(source, address, port)
14
+ @events = load_events(source)
15
+ @server = TCPServer.open(address, port)
16
+ end
17
+
18
+ def start
19
+ loop { Thread.start(@server.accept) { |client| handle_client(client) } }
20
+ end
21
+
22
+ private
23
+
24
+ def load_events(source)
25
+ JSON.parse(File.read(source))
26
+ end
27
+
28
+ def handle_client(socket)
29
+ socket.print(HEADERS)
30
+ id = 0
31
+ loop do
32
+ event = @events.sample
33
+ event["Events"][0]["EventTimestamp"] = DateTime.now.to_s
34
+ socket.print("id: #{id}\ndata: #{event.to_json}\n\n")
35
+ sleep(rand(1..10))
36
+ id += 1
37
+ end
38
+ ensure
39
+ socket.close
40
+ end
41
+ end
42
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedfishTools
4
- VERSION = "0.2.3"
4
+ VERSION = "0.2.4"
5
5
  end
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ["lib"]
30
30
 
31
31
  spec.add_runtime_dependency "redfish_client", "~> 0.2.2"
32
+ spec.add_runtime_dependency "server_sent_events", "~> 0.1.1"
32
33
  spec.add_runtime_dependency "thor", "~> 0.19"
33
34
 
34
35
  spec.add_development_dependency "bundler", "~> 1.16"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redfish_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tadej Borovšak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-29 00:00:00.000000000 Z
11
+ date: 2018-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redfish_client
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: server_sent_events
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: thor
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -129,12 +143,16 @@ files:
129
143
  - exe/redfish
130
144
  - lib/redfish_tools.rb
131
145
  - lib/redfish_tools/cli.rb
146
+ - lib/redfish_tools/cli/listen_sse.rb
132
147
  - lib/redfish_tools/cli/record.rb
133
148
  - lib/redfish_tools/cli/serve.rb
149
+ - lib/redfish_tools/cli/serve_sse.rb
134
150
  - lib/redfish_tools/datastore.rb
135
151
  - lib/redfish_tools/recorder.rb
136
152
  - lib/redfish_tools/server.rb
137
153
  - lib/redfish_tools/servlet.rb
154
+ - lib/redfish_tools/sse_client.rb
155
+ - lib/redfish_tools/sse_server.rb
138
156
  - lib/redfish_tools/version.rb
139
157
  - redfish_tools.gemspec
140
158
  homepage: https://github.com/xlab-si/redfish-tools-ruby