hoss 0.0.1 → 0.1.0

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
  SHA1:
3
- metadata.gz: 33580c829a812c199b0a92fbd6a834383b618f51
4
- data.tar.gz: 91c016fcd6cebf246ca1e6d1da23e9b33d63d774
3
+ metadata.gz: 2fbcffb164bffc8e6678fa05d7d7a9f586ecfa71
4
+ data.tar.gz: 3ec2425370b1f16df23886a7997542e7ff6db82e
5
5
  SHA512:
6
- metadata.gz: 1dbd5e399d5bed15c24b0b6cff048af700642ca100ebce9c06631d48d22b74b0a003e4b688450c9009aaee345bfff6cd01113b63e938984a26e03d4f6a8654f5
7
- data.tar.gz: 4b9bcadb93bd0987d21dd1656f50b6427564b7f611af652d4a99db3f1542a6afa89b4bf5745ab99c3f981a76bcf1ef203db20dced2645801afb53ea8d837d711
6
+ metadata.gz: 533ef7c673ff7363f4e3d9c9526ec4e6a348d96f8dcc1301cfb71281e061f3160f0382cb1f03ec859bc4dac80df930f02224d8bdf80971c34606756bb38744bd
7
+ data.tar.gz: 8c7c9f8eb0dc93c1e7f4e51454ce3ca98830429bff0ca210a04031d58c215d88900bdd8eb5691d92e9f0298443b80dcfd03c7f369cc0f143962c0660738e4666
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Sean Clemmer
1
+ Copyright (c) 2015 Sean Clemmer
2
2
 
3
3
  Permission to use, copy, modify, and/or distribute this software for any
4
4
  purpose with or without fee is hereby granted, provided that the above
data/README.md CHANGED
@@ -1,3 +1,3 @@
1
- # Hoss
1
+ # Hoss ![Version](https://img.shields.io/gem/v/hoss.svg?style=flat-square)
2
2
 
3
- Like a hoss.
3
+ Index your Chef Server with Elasticsearch.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -14,6 +14,10 @@ Gem::Specification.new do |s|
14
14
  s.description = Hoss::SUMMARY + '.'
15
15
 
16
16
  s.add_runtime_dependency 'thor', '~> 0'
17
+ s.add_runtime_dependency 'pmap', '~> 1'
18
+ s.add_runtime_dependency 'slog', '~> 1'
19
+ s.add_runtime_dependency 'ridley', '~> 4.1'
20
+ s.add_runtime_dependency 'elasticsearch', '~> 1'
17
21
 
18
22
  s.files = `git ls-files`.split("\n")
19
23
  s.test_files = `git ls-files -- test/*`.split("\n")
@@ -1,15 +1,64 @@
1
- require 'thor'
1
+ require 'pmap'
2
+ require 'ridley'
3
+ require 'elasticsearch'
2
4
 
3
5
  require_relative 'metadata'
6
+ require_relative 'mjolnir'
7
+ require_relative 'reindex'
4
8
 
5
9
 
10
+ Celluloid.logger = nil
11
+
6
12
  module Hoss
7
- class Main < Thor
13
+ class Main < Mjolnir
8
14
 
9
15
  desc 'version', 'Echo the application version'
10
16
  def version
11
17
  puts VERSION
12
18
  end
13
19
 
20
+
21
+ desc 'art', 'View the application art'
22
+ def art
23
+ puts "\n%s\n" % ART
24
+ end
25
+
26
+
27
+ desc 'reindex', '(Re)index Chef server objects into Elasticsearch'
28
+ option :knife_path, \
29
+ type: :string,
30
+ aliases: %w[ -k ],
31
+ desc: 'Path to a knife for Chef server to index'
32
+ option :elasticsearch_host, \
33
+ type: :string,
34
+ aliases: %w[ -e ],
35
+ desc: 'Set Elasticsearch host to connect client',
36
+ default: 'localhost:9200'
37
+ option :index_name, \
38
+ type: :string,
39
+ aliases: %w[ -i ],
40
+ desc: 'Set Elasticsearch index name for object documents',
41
+ default: 'chef'
42
+ option :chef_resources, \
43
+ type: :string,
44
+ aliases: %w[ -r ],
45
+ desc: 'Comma-separated list of Chef resources to index',
46
+ default: 'user,cookbook,data_bag,environment,role,client,node'
47
+ include_common_options
48
+ def reindex
49
+ ridley = Ridley.from_chef_config options.knife
50
+
51
+ elasticsearch = Elasticsearch::Client.new \
52
+ host: options.elasticsearch_host,
53
+ reload_connections: true,
54
+ reload_on_failure: true,
55
+ trace: options.trace?,
56
+ log: options.trace? ? log : nil
57
+
58
+ Reindex.new options.merge \
59
+ ridley: ridley,
60
+ elasticsearch: elasticsearch,
61
+ logger: log
62
+ end
14
63
  end
15
64
  end
@@ -4,7 +4,7 @@ module Hoss
4
4
  VERSION = File.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION')).strip
5
5
 
6
6
  # We don't really do all that much, be humble
7
- SUMMARY = 'Like a hoss'
7
+ SUMMARY = 'Index your Chef Server with Elasticsearch'
8
8
 
9
9
  # Your benevolent dictator for life
10
10
  AUTHOR = 'Sean Clemmer'
@@ -0,0 +1,56 @@
1
+ require 'slog'
2
+ require 'thor'
3
+
4
+
5
+ # Thor's hammer! Like Thor with better logging
6
+ class Mjolnir < Thor
7
+
8
+ # Common options for Thor commands
9
+ COMMON_OPTIONS = {
10
+ log: {
11
+ type: :string,
12
+ aliases: %w[ -l ],
13
+ desc: 'Log to file instead of STDOUT',
14
+ default: ENV['HOSS_LOG'] || nil
15
+ },
16
+ debug: {
17
+ type: :boolean,
18
+ aliases: %w[ -v ],
19
+ desc: 'Enable DEBUG-level logging',
20
+ default: ENV['HOSS_DEBUG'] || false
21
+ },
22
+ trace: {
23
+ type: :boolean,
24
+ aliases: %w[ -z ],
25
+ desc: 'Enable TRACE-level logging',
26
+ default: ENV['HOSS_TRACE'] || false
27
+ }
28
+ }
29
+
30
+ # Decorate Thor commands with the options above
31
+ def self.include_common_options
32
+ COMMON_OPTIONS.each do |name, spec|
33
+ option name, spec
34
+ end
35
+ end
36
+
37
+
38
+ no_commands do
39
+
40
+ # Construct a Logger given the command-line options
41
+ def log
42
+ return @logger if defined? @logger
43
+ level = :info
44
+ level = :debug if options.debug?
45
+ level = :trace if options.trace?
46
+ device = options.log || $stderr
47
+ pretty = device.tty? rescue false
48
+ @logger = Slog.new \
49
+ out: device,
50
+ level: level,
51
+ colorize: pretty,
52
+ prettify: pretty
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,127 @@
1
+ module Hoss
2
+ class Reindex
3
+ attr_reader :resources, :index, :es, :ridley, :log
4
+
5
+ def initialize opts
6
+ @resources = opts[:chef_resources]
7
+ @index = opts[:index_name]
8
+ @es = opts[:elasticsearch]
9
+ @ridley = opts[:ridley]
10
+ @log = opts[:logger]
11
+
12
+ log.debug \
13
+ event: 'reindex',
14
+ opts: opts
15
+
16
+ reindex_started = Time.now
17
+
18
+ reindex
19
+
20
+ log.info \
21
+ event: 'reindexed',
22
+ elapsed: Time.now - reindex_started
23
+ end
24
+
25
+
26
+
27
+ private
28
+
29
+
30
+ def reindex
31
+ resources.split(',').each do |resource|
32
+ started = Time.now
33
+ log.debug event: 'load_resource', resource: resource
34
+
35
+ ops = load_resource resource
36
+
37
+ log.info \
38
+ event: 'loaded_resource',
39
+ resource: resource,
40
+ elapsed: Time.now - started
41
+
42
+
43
+ started = Time.now
44
+ log.debug event: 'index_resource', resource: resource
45
+
46
+ index_resource resource, ops
47
+
48
+ log.info \
49
+ event: 'indexed_resource',
50
+ resource: resource,
51
+ elapsed: Time.now - started
52
+ end
53
+ end
54
+
55
+
56
+
57
+ def load_resource resource
58
+ ridley.send(resource.to_sym).all.pmap(8) do |r|
59
+ r = if resource == 'cookbook'
60
+ { 'name' => r[0], 'versions' => r[1] }
61
+ else
62
+ deep_hash r.reload
63
+ end
64
+
65
+ r['type'] = r['chef_type'] || resource
66
+ r['id'] = r['name']
67
+
68
+ raise if r['id'].nil?
69
+
70
+ log.trace event: 'reload_object', object: r
71
+
72
+ {
73
+ index: {
74
+ _index: index,
75
+ _type: r['type'],
76
+ _id: r['id'],
77
+ data: r
78
+ }
79
+ }
80
+ end
81
+ end
82
+
83
+
84
+
85
+ def index_resource resource, ops, bulk_size=500
86
+ while body = ops.shift(bulk_size)
87
+ break if body.empty?
88
+
89
+ begin
90
+ log.trace \
91
+ event: 'bulk_index',
92
+ response: es.bulk(body: body),
93
+ resource: resource,
94
+ size: body.size
95
+
96
+ log.debug \
97
+ event: 'index_resource',
98
+ resource: resource,
99
+ size: body.size
100
+
101
+ rescue
102
+ log.error \
103
+ event: 'bulk_index_failed',
104
+ resource: resource,
105
+ size: body.size,
106
+ body: body.inspect
107
+ end
108
+ end
109
+ end
110
+
111
+
112
+
113
+ def deep_hash obj
114
+ if obj.respond_to? :to_hash
115
+ obj = obj.to_hash
116
+ obj.keys.each do |k|
117
+ obj[k] = deep_hash obj[k]
118
+ end
119
+ obj
120
+ else
121
+ obj
122
+ end
123
+ end
124
+
125
+
126
+ end
127
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoss
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Clemmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-24 00:00:00.000000000 Z
11
+ date: 2015-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -24,7 +24,63 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description: Like a hoss.
27
+ - !ruby/object:Gem::Dependency
28
+ name: pmap
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: slog
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ridley
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: elasticsearch
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1'
83
+ description: Index your Chef Server with Elasticsearch.
28
84
  email: sclemmer@bluejeans.com
29
85
  executables:
30
86
  - hoss
@@ -42,6 +98,8 @@ files:
42
98
  - lib/hoss.rb
43
99
  - lib/hoss/main.rb
44
100
  - lib/hoss/metadata.rb
101
+ - lib/hoss/mjolnir.rb
102
+ - lib/hoss/reindex.rb
45
103
  homepage: https://github.com/sczizzo/hoss
46
104
  licenses:
47
105
  - ISC
@@ -62,8 +120,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
120
  version: '0'
63
121
  requirements: []
64
122
  rubyforge_project:
65
- rubygems_version: 2.2.2
123
+ rubygems_version: 2.4.5
66
124
  signing_key:
67
125
  specification_version: 4
68
- summary: Like a hoss
126
+ summary: Index your Chef Server with Elasticsearch
69
127
  test_files: []