redfish_tools 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.
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