redfish_tools 0.2.1 → 0.2.2

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: 7feb2c802d0f87e0234e667245ab79eb8fb370583dc7b1203b212facdd02cfbf
4
- data.tar.gz: 76c79888c493711b4689c3aaf8dd208542da7df126a57cd5f9ef5e47e38606a5
3
+ metadata.gz: a4f91c3c5220c2e6d5dcc1629bd45530ab56bbcab6b82dec3434c29392c195dd
4
+ data.tar.gz: 7a2dc097bb6e566ea3b3a26926dc1a3bb12ab1ffade24013d5bc5b4a08970198
5
5
  SHA512:
6
- metadata.gz: 88e19d49c2f3e783c4dae7694d2b451e8dc93e1e59e805185eccfa63dbb81c470dc27d8f0fc6900f58c976900645f141f9a5bd79ffd4b29f675026123b8e4239
7
- data.tar.gz: 047689712f71f7cde617939e9b64a53331ac767d812df6c933600597b1b0d74989a61396083493a5f6ce34f7b76e6218c8f6c1a28d4de5058ce16a4e085eeeca
6
+ metadata.gz: ee117d00c3b943b3acfc777563e16651af4e8e03d55fb4e2e647a9e3c22e4d0e254961943dbf9050ac70bf32de7410dce6dc6d0ec837c3159d0560ffcaca2dab
7
+ data.tar.gz: ab953ed1e9cf94325daeeabeacf4efdbae40992d4b42b7fa1e4ba1515dbe0fd5051e76733a3db1aed95726c476b3dc2c24d1c11d81dafd651fd3629b0b9f3961
@@ -34,13 +34,38 @@ module RedfishTools
34
34
  def serve(path)
35
35
  user = options[:user]
36
36
  pass = options[:pass]
37
- raise Thor::Error, "Missing password" if user && pass.nil?
38
- raise Thor::Error, "Missing username" if user.nil? && pass
37
+ raise "Missing password" if user && pass.nil?
38
+ raise "Missing username" if user.nil? && pass
39
39
 
40
40
  require "redfish_tools/cli/serve"
41
41
  Serve.new(path, options).run
42
42
  rescue StandardError => e
43
43
  raise Thor::Error, e.to_s
44
44
  end
45
+
46
+ desc "record SERVICE PATH", "create recording of SERVICE in PATH"
47
+ long_desc <<-LONGDESC
48
+ Record a Redfish service content into set of static files and store them
49
+ on disk. Sample record call:
50
+
51
+ $ . password_file
52
+ $ redfish record https://my.redfish.api:8443 output folder
53
+
54
+ Before running this command, make sure REDFISH_USERNAME and
55
+ REDFISH_PASSWORD environment variables are set. The recommended way of
56
+ setting them is by writing the assignments down into shell script that
57
+ can be then sourced as shown in example.
58
+ LONGDESC
59
+ def record(service, path)
60
+ username = ENV["REDFISH_USERNAME"]
61
+ password = ENV["REDFISH_PASSWORD"]
62
+ raise "Missing username" if username.nil?
63
+ raise "Missing password" if password.nil?
64
+
65
+ require "redfish_tools/cli/record"
66
+ Record.new(service, path, username, password).run
67
+ rescue StandardError => e
68
+ raise Thor::Error, e.to_s
69
+ end
45
70
  end
46
71
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redfish_client"
4
+ require "redfish_tools/recorder"
5
+
6
+ module RedfishTools
7
+ class Cli
8
+ class Record
9
+ def initialize(service, path, username, password)
10
+ @service = service
11
+ @path = path
12
+ @username = username
13
+ @password = password
14
+ end
15
+
16
+ def run
17
+ client = RedfishClient.new(@service, verify: false)
18
+ client.login(@username, @password)
19
+ Recorder.new(client, @path).record
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "json"
5
+ require "set"
6
+
7
+ module RedfishTools
8
+ # Recorder represents entry point into mock creation process.
9
+ class Recorder
10
+ def initialize(client, disk_path)
11
+ raise "Directory '#{disk_path}' exists" if File.directory?(disk_path)
12
+
13
+ @path = disk_path
14
+ @client = client
15
+ end
16
+
17
+ def record
18
+ visited = Set.new
19
+ batch = Set.new([@client["@odata.id"]])
20
+
21
+ until batch.empty?
22
+ visited.merge(batch)
23
+ batch = process_oid_batch(batch, visited)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def process_oid_batch(batch, visited)
30
+ next_batch = Set.new
31
+ batch.each do |oid|
32
+ puts(" Recording #{oid}")
33
+ next_batch.merge(process_oid(oid).subtract(visited))
34
+ end
35
+ next_batch
36
+ end
37
+
38
+ def process_oid(oid)
39
+ start = Time.now
40
+ resource = @client.find(oid)
41
+ duration = Time.now - start
42
+ return Set.new unless resource
43
+
44
+ persist_to_disk(oid, resource.raw, resource.headers, duration)
45
+ extract_oids(resource.raw)
46
+ end
47
+
48
+ def persist_to_disk(oid, body, headers, duration)
49
+ resource_path = File.join(@path, oid)
50
+ index_path = File.join(resource_path, "index.json")
51
+ headers_path = File.join(resource_path, "headers.json")
52
+ time_path = File.join(resource_path, "time.json")
53
+
54
+ FileUtils.mkdir_p(resource_path)
55
+ write_json(index_path, sanitize(body))
56
+ write_json(headers_path, "GET" => headers)
57
+ write_json(time_path, "GET_Time" => duration.to_s)
58
+ end
59
+
60
+ def sanitize(data)
61
+ case data
62
+ when Hash then sanitize_hash(data)
63
+ when Array then data.map { |v| sanitize(v) }
64
+ else data
65
+ end
66
+ end
67
+
68
+ def sanitize_hash(data)
69
+ keys = %w[serialnumber uuid durablename]
70
+ data.reduce({}) do |acc, (k, v)|
71
+ v = keys.include?(k.downcase) ? "REMOVED_FROM_MOCK" : sanitize(v)
72
+ acc.merge!(k => v)
73
+ end
74
+ end
75
+
76
+ def write_json(path, data)
77
+ write(path, data.to_json)
78
+ end
79
+
80
+ def write(path, data)
81
+ File.open(path, "w") { |f| f.write(data) }
82
+ end
83
+
84
+ def extract_oids_from_hash(data)
85
+ ids = Set.new
86
+ ids.add(data["@odata.id"]) if data["@odata.id"]
87
+ data.values.reduce(ids) { |a, v| a.merge(extract_oids(v)) }
88
+ end
89
+
90
+ def extract_oids(data)
91
+ case data
92
+ when Hash then extract_oids_from_hash(data)
93
+ when Array then data.reduce(Set.new) { |a, v| a.merge(extract_oids(v)) }
94
+ else Set.new
95
+ end
96
+ end
97
+ end
98
+ end
@@ -39,7 +39,7 @@ module RedfishTools
39
39
 
40
40
  data = JSON.parse(request.body)
41
41
  item_n = login_path?(request) ? login(item, data) : new_item(item, data)
42
- return response.status = 400 unless item_n.body
42
+ return response.status = 400 unless item_n&.body
43
43
 
44
44
  response.status = 201
45
45
  set_headers(response, item_n.headers)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedfishTools
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
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.1
4
+ version: 0.2.2
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-07-20 00:00:00.000000000 Z
11
+ date: 2018-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redfish_client
@@ -129,8 +129,10 @@ files:
129
129
  - exe/redfish
130
130
  - lib/redfish_tools.rb
131
131
  - lib/redfish_tools/cli.rb
132
+ - lib/redfish_tools/cli/record.rb
132
133
  - lib/redfish_tools/cli/serve.rb
133
134
  - lib/redfish_tools/datastore.rb
135
+ - lib/redfish_tools/recorder.rb
134
136
  - lib/redfish_tools/server.rb
135
137
  - lib/redfish_tools/servlet.rb
136
138
  - lib/redfish_tools/version.rb