wavefront-cli 2.1.2 → 2.1.3

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
  SHA1:
3
- metadata.gz: 40a642f73bf1dcaa8bfe36bb00ad3c56acf5d2f7
4
- data.tar.gz: 2920cf7de19ec00f16897a89d75a7c84a3fb9a55
3
+ metadata.gz: 1098aac042355b553d4b5e6b1ae5bad73794a61a
4
+ data.tar.gz: 97495d06c18f86febbc78578bfae1c60eec8b260
5
5
  SHA512:
6
- metadata.gz: 81bd3003b6d18cfadb87aa8c4fd21898b1ac6779413c1dd44544aedbd6f8a1106bc0e0774c869ebef345b91887785363b6c9c95ea932e1e3842fe490778903b1
7
- data.tar.gz: 6038bd021543276e6b90a05b275664c2a61e52bec2c4460e1018f1c619fd26ab589e863972f7e425f1a749ae4504e8e4c7e2bd6c45e30bdb219653293422effc
6
+ metadata.gz: 178fe53faaad7d665bf497b35177884b37b03175788e0cf7a808a3a7430aa655efd5ba3bd1941ea122ffd5b5e85aa5e90039906775088aa52fe390f59928a25d
7
+ data.tar.gz: 0ce5b99c7cf2af4376a6a5750243bc06155dbad7ef9c2908fd7e220e344a95af84ef6adc7c6166022e446a4035c213d4967be072cfe1f42724269a60a3734c36
@@ -1,14 +1,17 @@
1
+ # For development against a local checkout of the SDK, uncomment
2
+ # this block
3
+ #
4
+ # dir = Pathname.new(__FILE__).dirname.realpath.parent.parent.parent
5
+ # $LOAD_PATH.<< dir + 'lib'
6
+ # $LOAD_PATH.<< dir + 'wavefront-sdk' + 'lib'
7
+
1
8
  require 'pathname'
2
9
  require 'pp'
3
10
  require 'docopt'
4
11
  require_relative './version'
5
- require_relative './opt_handler'
6
12
  require_relative './exception'
7
13
 
8
- # $LOAD_PATH.<< Pathname.new(__FILE__).dirname.realpath.parent.parent
9
- # .parent + 'lib'
10
- # $LOAD_PATH.<< Pathname.new(__FILE__).dirname.realpath.parent.parent
11
- # .parent + 'wavefront-sdk' + 'lib'
14
+ require_relative './opt_handler'
12
15
 
13
16
  CMD_DIR = Pathname.new(__FILE__).dirname + 'commands'
14
17
 
@@ -29,7 +32,8 @@ class WavefrontCliController
29
32
  run_command(hook)
30
33
  end
31
34
 
32
- # What you see when you do 'wavefront --help'
35
+ # What you see when you do 'wf --help'
36
+ # @return [String]
33
37
  #
34
38
  def default_help
35
39
  s = "Wavefront CLI\n\nUsage:\n #{CMD} command [options]\n" \
@@ -39,7 +43,7 @@ class WavefrontCliController
39
43
  s.<< "\nUse '#{CMD} <command> --help' for further information.\n"
40
44
  end
41
45
 
42
- # Make a hash of command descriptions for docopt.
46
+ # @return [Hash] command descriptions for docopt.
43
47
  #
44
48
  def docopt_hash
45
49
  cmds.each_with_object(default: default_help) do |(k, v), ret|
@@ -67,11 +71,12 @@ class WavefrontCliController
67
71
  end
68
72
 
69
73
  def parse_opts(o)
70
- WavefrontCli::OptHandler.new(conf_file, o).opts
74
+ WavefrontCli::OptHandler.new(o).opts
71
75
  end
72
76
 
73
77
  # Get the SDK class we need to run the command we've been given.
74
78
  #
79
+ # @param cmd [String]
75
80
  def load_sdk(cmd, opts)
76
81
  require_relative File.join('.', cmds[cmd].sdk_file)
77
82
  Object.const_get('WavefrontCli').const_get(cmds[cmd].sdk_class).new(opts)
@@ -93,6 +98,7 @@ class WavefrontCliController
93
98
 
94
99
  # Each command is defined in its own file. Dynamically load all
95
100
  # those commands.
101
+ # @return [Hash] :command => CommandClass
96
102
  #
97
103
  def load_commands
98
104
  CMD_DIR.children.each_with_object({}) do |f, ret|
@@ -113,24 +119,12 @@ class WavefrontCliController
113
119
  Object.const_get("WavefrontCommand#{k_name.capitalize}").new
114
120
  end
115
121
 
116
- # The default config file path.
117
- #
118
- # @return [Pathname] where we excpect to find a config file
119
- #
120
- def conf_file
121
- if ENV['HOME']
122
- Pathname.new(ENV['HOME']) + '.wavefront'
123
- else
124
- Pathname.new('/etc/wavefront/client.conf')
125
- end
126
- end
127
-
128
122
  # Symbolize, and remove dashes from option keys
129
123
  #
130
124
  # @param h [Hash] options hash
131
125
  # return [Hash] h with modified keys
132
126
  #
133
127
  def sanitize_keys(h)
134
- h.each_with_object({}) { |(k, v), r| r[k.delete('-').to_sym] = v }
128
+ h.each_with_object({}) { |(k, v), r| r[k.to_s.delete('-').to_sym] = v }
135
129
  end
136
130
  end
@@ -1,5 +1,6 @@
1
1
  require 'inifile'
2
2
  require 'pathname'
3
+ require 'wavefront-sdk/credentials'
3
4
  require_relative './constants.rb'
4
5
 
5
6
  module WavefrontCli
@@ -23,40 +24,47 @@ module WavefrontCli
23
24
  class OptHandler
24
25
  include WavefrontCli::Constants
25
26
 
26
- attr_reader :opts, :cli_opts, :conf_file
27
+ attr_reader :opts
27
28
 
28
- def initialize(conf_file, cli_opts = {})
29
- @conf_file = if cli_opts.key?(:config) && cli_opts[:config]
30
- Pathname.new(cli_opts[:config])
31
- else
32
- conf_file
33
- end
34
-
35
- @cli_opts = cli_opts.reject { |_k, v| v.nil? }
36
-
37
- @opts = DEFAULT_OPTS.merge(load_profile).merge(@cli_opts)
29
+ def initialize(cli_opts = {})
30
+ cred_opts = setup_cred_opts(cli_opts)
31
+ cli_opts.reject! { |_k, v| v.nil? }
32
+ @opts = DEFAULT_OPTS.merge(load_profile(cred_opts)).merge(cli_opts)
38
33
  end
39
34
 
40
- # Load in configuration options from the (optionally) given
41
- # section of an ini-style configuration file. If the file's not
42
- # there, we don't consider that an error. Returns a hash of
43
- # options which matches what Docopt gives us.
35
+ # Create an options hash to pass to the Wavefront::Credentials
36
+ # constructor.
37
+ # @param cli_opts [Hash] options from docopt, which may include
38
+ # the location of the config file and the stanza within it
39
+ # @return [Hash] keys are none, one, or both of :file and
40
+ # :profile
44
41
  #
45
- # rubocop:disable Metrics/AbcSize
46
- def load_profile
47
- unless conf_file.exist?
48
- puts "config file '#{conf_file}' not found. Taking options " \
49
- 'from command-line.'
50
- return {}
51
- end
42
+ def setup_cred_opts(cli_opts)
43
+ cred_opts = {}
52
44
 
53
- pf = cli_opts.fetch(:profile, 'default')
45
+ if cli_opts[:config]
46
+ cred_opts[:file] = Pathname.new(cli_opts[:config])
54
47
 
55
- puts "reading '#{pf}' profile from '#{conf_file}'" if cli_opts[:debug]
56
-
57
- IniFile.load(conf_file)[pf].each_with_object({}) do |(k, v), memo|
58
- memo[k.to_sym] = v
48
+ unless cred_opts[:file].exist?
49
+ puts "config file '#{cred_opts[:file]}' not found."
50
+ end
59
51
  end
52
+
53
+ cred_opts[:profile] = cli_opts[:profile] if cli_opts[:profile]
54
+ cred_opts
55
+ end
56
+
57
+ # Load credentials (and other config) using the SDK Credentials
58
+ # class. This allows the user to override values with
59
+ # environment variables
60
+ #
61
+ # @param cred_opts [Hash] options to pass to
62
+ # Wavefront::Credentials constructor
63
+ # @return [Hash] keys are :token, :endpoint etc
64
+ #
65
+ def load_profile(cred_opts)
66
+ creds = Wavefront::Credentials.new(cred_opts).config
67
+ Hash[creds.map{ |k, v| [k.to_sym, v] }]
60
68
  end
61
69
  end
62
70
  end
@@ -1 +1 @@
1
- WF_CLI_VERSION = '2.1.2'.freeze
1
+ WF_CLI_VERSION = '2.1.3'.freeze
data/spec/spec_helper.rb CHANGED
@@ -7,21 +7,23 @@ require 'minitest/spec'
7
7
  require 'pathname'
8
8
  require_relative '../lib/wavefront-cli/controller'
9
9
 
10
- CMD = 'wavefront'.freeze
11
- ENDPOINT = 'metrics.wavefront.com'
12
- TOKEN = '0123456789-ABCDEF'
13
- RES_DIR = Pathname.new(__FILE__).dirname + 'wavefront-cli' + 'resources'
14
- CF = RES_DIR + 'conf.yaml'
15
- CF_VAL = IniFile.load(CF)
16
- JSON_POST_HEADERS = {
17
- :'Content-Type' => 'application/json', :Accept => 'application/json'
18
- }.freeze
19
-
20
- CMDS = %w(alert integration dashboard event link message metric
21
- proxy query savedsearch source user window webhook write).freeze
22
-
23
- BAD_TAG="*BAD TAG*"
24
- TW = 80
10
+ unless defined?(CMD)
11
+ CMD = 'wavefront'.freeze
12
+ ENDPOINT = 'metrics.wavefront.com'
13
+ TOKEN = '0123456789-ABCDEF'
14
+ RES_DIR = Pathname.new(__FILE__).dirname + 'wavefront-cli' + 'resources'
15
+ CF = RES_DIR + 'wavefront.conf'
16
+ CF_VAL = IniFile.load(CF)
17
+ JSON_POST_HEADERS = {
18
+ :'Content-Type' => 'application/json', :Accept => 'application/json'
19
+ }.freeze
20
+
21
+ CMDS = %w(alert integration dashboard event link message metric
22
+ proxy query savedsearch source user window webhook write).freeze
23
+
24
+ BAD_TAG="*BAD TAG*"
25
+ TW = 80
26
+ end
25
27
 
26
28
  # Return an array of CLI permutations and the values to which they relate
27
29
  #
@@ -1,7 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- CMD = 'test'.freeze
4
-
5
3
  require 'pathname'
6
4
  require_relative(File.join('../../../lib/wavefront-cli/commands',
7
5
  Pathname.new(__FILE__).basename
@@ -1,4 +1,2 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/spec'
3
-
4
- TW = 80
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative '../../lib/wavefront-cli/controller'
4
3
  require_relative '../spec_helper'
4
+ require_relative '../../lib/wavefront-cli/controller'
5
5
 
6
6
  # Be sure the CLI behaves properly when people ask for help
7
7
  #
@@ -47,3 +47,25 @@ class WavefrontCliHelpTest < MiniTest::Test
47
47
  end
48
48
  end
49
49
  end
50
+
51
+ # To test internal methods, make a subclass with no initializer,
52
+ # so we can get at the methods without triggering one of the things
53
+ # tested above.
54
+ #
55
+ class Giblets < WavefrontCliController
56
+ def initialize; end
57
+ end
58
+
59
+ class GibletsTest < MiniTest::Test
60
+ attr_reader :wfc
61
+
62
+ def setup
63
+ @wfc = Giblets.new
64
+ end
65
+
66
+ def test_sanitize_keys
67
+ h_in = { '--help': true, stuff: false, 'key' => 'value' }
68
+ assert_equal(wfc.sanitize_keys(h_in),
69
+ { help: true, stuff: false, key: 'value' })
70
+ end
71
+ end
@@ -1,7 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- CMD = 'test'.freeze
4
-
5
3
  require 'date'
6
4
  require 'map'
7
5
  require 'pathname'
@@ -1,5 +1,3 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/spec'
3
3
  require 'spy/integration'
4
-
5
- TW = 80
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../spec_helper'
4
+ require_relative '../../lib/wavefront-cli/opt_handler'
5
+
6
+ # Test option handler class. End to end tests because the work is
7
+ # always done in the constructor
8
+ #
9
+ class OptHandlerTest < MiniTest::Test
10
+
11
+ # This one has to be kind of vague because I have a config file on
12
+ # the box I develop on, which will always be picked up. Other
13
+ # tests are more specific
14
+ def test_no_opts
15
+ x = WavefrontCli::OptHandler.new
16
+ assert x.is_a?(WavefrontCli::OptHandler)
17
+ assert x.opts.is_a?(Hash)
18
+ assert x.opts.keys.include?(:endpoint)
19
+ end
20
+
21
+ def test_no_config_no_env
22
+ opts = { config: '/nosuchfile' }
23
+ x = WavefrontCli::OptHandler.new(opts)
24
+ o = x.opts
25
+ assert x.is_a?(WavefrontCli::OptHandler)
26
+ assert o.is_a?(Hash)
27
+ refute o.keys.include?(:token)
28
+ assert_equal(o[:config], '/nosuchfile')
29
+ assert_equal(o[:endpoint], 'metrics.wavefront.com')
30
+
31
+ assert_output("config file '/nosuchfile' not found.\n") do
32
+ WavefrontCli::OptHandler.new(opts)
33
+ end
34
+ end
35
+
36
+ def test_no_config_env
37
+ ENV['WAVEFRONT_TOKEN'] = 'abcd1234'
38
+ ENV['WAVEFRONT_ENDPOINT'] = 'myendpoint.wavefront.com'
39
+ opts = { config: '/nosuchfile' }
40
+ x = WavefrontCli::OptHandler.new(opts)
41
+ o = x.opts
42
+ assert x.is_a?(WavefrontCli::OptHandler)
43
+ assert o.is_a?(Hash)
44
+ assert_equal(o[:token], 'abcd1234')
45
+ assert_equal(o[:config], '/nosuchfile')
46
+ assert_equal(o[:endpoint], 'myendpoint.wavefront.com')
47
+ refute o.keys.include?(:proxy)
48
+
49
+ assert_output("config file '/nosuchfile' not found.\n") do
50
+ WavefrontCli::OptHandler.new(opts)
51
+ end
52
+ ENV['WAVEFRONT_TOKEN'] = nil
53
+ ENV['WAVEFRONT_ENDPOINT'] = nil
54
+ end
55
+
56
+ def test_default_config_no_env
57
+ opts = { config: CF }
58
+ x = WavefrontCli::OptHandler.new(opts)
59
+ o = x.opts
60
+ assert x.is_a?(WavefrontCli::OptHandler)
61
+ assert o.is_a?(Hash)
62
+ assert_equal(o[:token], '12345678-abcd-1234-abcd-123456789012')
63
+ assert_equal(o[:config], CF)
64
+ assert_equal(o[:endpoint], 'default.wavefront.com')
65
+ assert_equal(o[:proxy], 'wavefront.localnet')
66
+ assert_output("") { WavefrontCli::OptHandler.new(opts) }
67
+ end
68
+
69
+ def test_alt_config_env
70
+ ENV['WAVEFRONT_TOKEN'] = 'abdc1234'
71
+ ENV['WAVEFRONT_ENDPOINT'] = nil
72
+ opts = { config: CF, profile: 'other' }
73
+ x = WavefrontCli::OptHandler.new(opts)
74
+ o = x.opts
75
+ assert x.is_a?(WavefrontCli::OptHandler)
76
+ assert o.is_a?(Hash)
77
+ assert_equal(o[:token], 'abdc1234')
78
+ assert_equal(o[:config], CF)
79
+ assert_equal(o[:endpoint], 'other.wavefront.com')
80
+ assert_equal(o[:proxy], 'otherwf.localnet')
81
+ assert_output("") { WavefrontCli::OptHandler.new(opts) }
82
+ ENV['WAVEFRONT_TOKEN'] = nil
83
+ ENV['WAVEFRONT_ENDPOINT'] = nil
84
+ end
85
+
86
+ def test_alt_config_env
87
+ ENV['WAVEFRONT_TOKEN'] = nil
88
+ ENV['WAVEFRONT_ENDPOINT'] = 'myendpoint.wavefront.com'
89
+ opts = { config: CF, profile: 'other' }
90
+ x = WavefrontCli::OptHandler.new(opts)
91
+ o = x.opts
92
+ assert x.is_a?(WavefrontCli::OptHandler)
93
+ assert o.is_a?(Hash)
94
+ assert_equal(o[:token], 'abcdefab-0123-abcd-0123-abcdefabcdef')
95
+ assert_equal(o[:config], CF)
96
+ assert_equal(o[:endpoint], 'myendpoint.wavefront.com')
97
+ assert_equal(o[:proxy], 'otherwf.localnet')
98
+ assert_output("") { WavefrontCli::OptHandler.new(opts) }
99
+ ENV['WAVEFRONT_TOKEN'] = nil
100
+ ENV['WAVEFRONT_ENDPOINT'] = nil
101
+ end
102
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wavefront-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Fisher
@@ -217,7 +217,6 @@ files:
217
217
  - spec/spec_helper.rb
218
218
  - spec/wavefront-cli/alert_spec.rb
219
219
  - spec/wavefront-cli/base_spec.rb
220
- - spec/wavefront-cli/cli_help_spec.rb
221
220
  - spec/wavefront-cli/cloudintegration_spec.rb
222
221
  - spec/wavefront-cli/commands/alert_spec.rb
223
222
  - spec/wavefront-cli/commands/base_spec.rb
@@ -233,6 +232,7 @@ files:
233
232
  - spec/wavefront-cli/commands/webhook_spec.rb
234
233
  - spec/wavefront-cli/commands/window_spec.rb
235
234
  - spec/wavefront-cli/commands/write_spec.rb
235
+ - spec/wavefront-cli/controller_spec.rb
236
236
  - spec/wavefront-cli/dashboard_spec.rb
237
237
  - spec/wavefront-cli/display/base_spec.rb
238
238
  - spec/wavefront-cli/display/printer/base_spec.rb
@@ -245,9 +245,10 @@ files:
245
245
  - spec/wavefront-cli/maintanancewindow_spec.rb
246
246
  - spec/wavefront-cli/message_spec.rb
247
247
  - spec/wavefront-cli/metric_spec.rb
248
+ - spec/wavefront-cli/opt_handler_spec.rb
248
249
  - spec/wavefront-cli/proxy_spec.rb
249
250
  - spec/wavefront-cli/query_spec.rb
250
- - spec/wavefront-cli/resources/conf.yaml
251
+ - spec/wavefront-cli/resources/wavefront.conf
251
252
  - spec/wavefront-cli/savedsearch_spec.rb
252
253
  - spec/wavefront-cli/source_spec.rb
253
254
  - spec/wavefront-cli/string_spec.rb
@@ -282,7 +283,6 @@ test_files:
282
283
  - spec/spec_helper.rb
283
284
  - spec/wavefront-cli/alert_spec.rb
284
285
  - spec/wavefront-cli/base_spec.rb
285
- - spec/wavefront-cli/cli_help_spec.rb
286
286
  - spec/wavefront-cli/cloudintegration_spec.rb
287
287
  - spec/wavefront-cli/commands/alert_spec.rb
288
288
  - spec/wavefront-cli/commands/base_spec.rb
@@ -298,6 +298,7 @@ test_files:
298
298
  - spec/wavefront-cli/commands/webhook_spec.rb
299
299
  - spec/wavefront-cli/commands/window_spec.rb
300
300
  - spec/wavefront-cli/commands/write_spec.rb
301
+ - spec/wavefront-cli/controller_spec.rb
301
302
  - spec/wavefront-cli/dashboard_spec.rb
302
303
  - spec/wavefront-cli/display/base_spec.rb
303
304
  - spec/wavefront-cli/display/printer/base_spec.rb
@@ -310,9 +311,10 @@ test_files:
310
311
  - spec/wavefront-cli/maintanancewindow_spec.rb
311
312
  - spec/wavefront-cli/message_spec.rb
312
313
  - spec/wavefront-cli/metric_spec.rb
314
+ - spec/wavefront-cli/opt_handler_spec.rb
313
315
  - spec/wavefront-cli/proxy_spec.rb
314
316
  - spec/wavefront-cli/query_spec.rb
315
- - spec/wavefront-cli/resources/conf.yaml
317
+ - spec/wavefront-cli/resources/wavefront.conf
316
318
  - spec/wavefront-cli/savedsearch_spec.rb
317
319
  - spec/wavefront-cli/source_spec.rb
318
320
  - spec/wavefront-cli/string_spec.rb