wavefront-cli 0.0.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/Gemfile +1 -1
- data/README.md +21 -21
- data/Rakefile +2 -2
- data/bin/{wavefront → wf} +6 -2
- data/lib/wavefront-cli/alert.rb +7 -6
- data/lib/wavefront-cli/base.rb +27 -6
- data/lib/wavefront-cli/commands/alert.rb +2 -1
- data/lib/wavefront-cli/commands/base.rb +54 -29
- data/lib/wavefront-cli/commands/dashboard.rb +1 -0
- data/lib/wavefront-cli/commands/event.rb +7 -3
- data/lib/wavefront-cli/commands/integration.rb +2 -1
- data/lib/wavefront-cli/commands/link.rb +2 -2
- data/lib/wavefront-cli/commands/proxy.rb +2 -1
- data/lib/wavefront-cli/commands/savedsearch.rb +2 -1
- data/lib/wavefront-cli/commands/source.rb +3 -2
- data/lib/wavefront-cli/commands/webhook.rb +2 -1
- data/lib/wavefront-cli/commands/window.rb +2 -1
- data/lib/wavefront-cli/commands/write.rb +10 -6
- data/lib/wavefront-cli/constants.rb +1 -1
- data/lib/wavefront-cli/controller.rb +6 -4
- data/lib/wavefront-cli/dashboard.rb +6 -6
- data/lib/wavefront-cli/display/alert.rb +8 -4
- data/lib/wavefront-cli/display/base.rb +115 -170
- data/lib/wavefront-cli/display/cloudintegration.rb +2 -2
- data/lib/wavefront-cli/display/event.rb +1 -1
- data/lib/wavefront-cli/display/maintenancewindow.rb +1 -1
- data/lib/wavefront-cli/display/metric.rb +6 -7
- data/lib/wavefront-cli/display/printer/base.rb +24 -0
- data/lib/wavefront-cli/display/printer/long.rb +186 -0
- data/lib/wavefront-cli/display/printer/terse.rb +55 -0
- data/lib/wavefront-cli/display/query.rb +1 -2
- data/lib/wavefront-cli/display/savedsearch.rb +1 -1
- data/lib/wavefront-cli/display/source.rb +7 -3
- data/lib/wavefront-cli/display/webhook.rb +3 -4
- data/lib/wavefront-cli/event.rb +62 -23
- data/lib/wavefront-cli/exception.rb +1 -1
- data/lib/wavefront-cli/opt_handler.rb +6 -6
- data/lib/wavefront-cli/query.rb +5 -6
- data/lib/wavefront-cli/source.rb +5 -1
- data/lib/wavefront-cli/string.rb +59 -0
- data/lib/wavefront-cli/version.rb +1 -1
- data/lib/wavefront-cli/write.rb +4 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/wavefront-cli/alert_spec.rb +16 -5
- data/spec/wavefront-cli/base_spec.rb +5 -2
- data/spec/wavefront-cli/cli_help_spec.rb +7 -5
- data/spec/wavefront-cli/cloudintegration_spec.rb +9 -0
- data/spec/wavefront-cli/commands/alert_spec.rb +16 -0
- data/spec/wavefront-cli/commands/base_spec.rb +133 -0
- data/spec/wavefront-cli/commands/dashboard_spec.rb +16 -0
- data/spec/wavefront-cli/commands/event_spec.rb +17 -0
- data/spec/wavefront-cli/commands/integration_spec.rb +21 -0
- data/spec/wavefront-cli/commands/link_spec.rb +21 -0
- data/spec/wavefront-cli/commands/message_spec.rb +16 -0
- data/spec/wavefront-cli/commands/metric_spec.rb +16 -0
- data/spec/wavefront-cli/commands/proxy_spec.rb +16 -0
- data/spec/wavefront-cli/commands/query_spec.rb +16 -0
- data/spec/wavefront-cli/commands/spec_helper.rb +4 -0
- data/spec/wavefront-cli/commands/webhook_spec.rb +16 -0
- data/spec/wavefront-cli/commands/window_spec.rb +21 -0
- data/spec/wavefront-cli/commands/write_spec.rb +17 -0
- data/spec/wavefront-cli/dashboard_spec.rb +14 -4
- data/spec/wavefront-cli/display/base_spec.rb +162 -0
- data/spec/wavefront-cli/display/printer/base_spec.rb +20 -0
- data/spec/wavefront-cli/display/printer/long_spec.rb +137 -0
- data/spec/wavefront-cli/display/printer/terse_spec.rb +46 -0
- data/spec/wavefront-cli/display/spec_helper.rb +5 -0
- data/spec/wavefront-cli/event_spec.rb +9 -0
- data/spec/wavefront-cli/externallink_spec.rb +9 -0
- data/spec/wavefront-cli/maintanancewindow_spec.rb +10 -0
- data/spec/wavefront-cli/proxy_spec.rb +9 -0
- data/spec/wavefront-cli/savedsearch_spec.rb +9 -0
- data/spec/wavefront-cli/source_spec.rb +13 -1
- data/spec/wavefront-cli/string_spec.rb +51 -0
- data/spec/wavefront-cli/user_spec.rb +2 -2
- data/spec/wavefront-cli/webhook_spec.rb +9 -0
- data/wavefront-cli.gemspec +5 -5
- metadata +59 -22
- data/Gemfile.lock +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abded61ee10732bf7af826637d39e1a736db92bc
|
4
|
+
data.tar.gz: bf039ef6b77cde28bcd7f6c3c1d2e8f141e86f9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e99d3375a2f2693e3b18974a8cd6099d642d3e78bbe88a752fef943d21fbc93432028ff59e5d345074aa1c93990de9b1bfd1a6da9e3f3f8e49eed647ab32554a
|
7
|
+
data.tar.gz: b5a9e93eef9dda6708651c49736aa7d69008553c633494d955153fc1440afb80cfdc0a296ecdfc30b18cb5b2c3d87254463ba8cffae44277d32b23aa7f7b738a
|
data/.travis.yml
CHANGED
@@ -8,9 +8,10 @@ before_install: gem install bundler --no-rdoc --no-ri
|
|
8
8
|
deploy:
|
9
9
|
provider: rubygems
|
10
10
|
api_key:
|
11
|
-
secure:
|
11
|
+
secure: dpVC480pAmGQrkEeugPowxhYzM8Er9UDhY02u2P5ytrCXC9J05uGKvN8uZ6H8SJr1ZKUb7OGxCq+EVKrA/q1s6Cv07Xl9u1HiOR0cB4ZUW3wBl6TGdl7c/rcor5AQxjELTcWnhCJvTzB+i46a1s4AcWjGBIVEY7/b1iloj/Sm0U43UZPcWPaIl5xfnANBk6v9F5eEfQy5IXlQUQKtRLXzgyqwyJi7DQcNcnEXA0O33KKwka7QDQsycYE7axEiJGOBt0PbYiRUXRZBxKWnsrtq9Sk9QukYsZSQqZgkykV6ImvMYzWI/vUwDRl+dJWmyAG6K2mz4kqMjhiMkB4ctbj5sxDG1BzsBlNTTEb0P8PGBEYgcf4VBd7XDlEt0Sythp6ztn9EVtw35M22n5Q7sdgalf6TFrzQpp9sec3o4AqO3IXUIqRN4VD4vPRQVBJHcwFOuZ3EUO0VekUzCUO3R/mG4oHUIQ9VgRzrUuyYpCwuwWyoVKVA/AukHHW6Y7El2g+JlpP+ijf0ABpqusHENELVWnuCRcv36sxbyM6Rbt2JrT9FrG1oSAELz4yMS86Qhq104II89d6apGJT3thUH8n9m2KA16DmxQYXkNamfygCn3D5ogC2gcIgVicQnJma+405Pv43/a+PaKy/oKr3/H7IJJmoqHfiMyG9DtkFTWQrfA=
|
12
12
|
gem: wavefront-cli
|
13
13
|
on:
|
14
14
|
tags: true
|
15
15
|
repo: snltd/wavefront-cli
|
16
16
|
ruby: 2.3.4
|
17
|
+
|
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source 'https://rubygems.org'
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Wavefront CLI
|
2
|
-
[![Build Status](https://travis-ci.org/snltd/wavefront-cli.svg?branch=master)](https://travis-ci.org/snltd/wavefront-cli) [![Code Climate](https://codeclimate.com/github/snltd/wavefront-cli/badges/gpa.svg)](https://codeclimate.com/github/snltd/wavefront-cli) [![Issue Count](https://codeclimate.com/github/snltd/wavefront-cli/badges/issue_count.svg)](https://codeclimate.com/github/snltd/wavefront-cli) [![
|
2
|
+
[![Build Status](https://travis-ci.org/snltd/wavefront-cli.svg?branch=master)](https://travis-ci.org/snltd/wavefront-cli) [![Code Climate](https://codeclimate.com/github/snltd/wavefront-cli/badges/gpa.svg)](https://codeclimate.com/github/snltd/wavefront-cli) [![Issue Count](https://codeclimate.com/github/snltd/wavefront-cli/badges/issue_count.svg)](https://codeclimate.com/github/snltd/wavefront-cli) [![Dependency Status](https://gemnasium.com/badges/github.com/snltd/wavefront-cli.svg)](https://gemnasium.com/github.com/snltd/wavefront-cli) [![Gem Version](https://badge.fury.io/rb/wavefront-cli.svg)](https://badge.fury.io/rb/wavefront-cli) ![](http://ruby-gem-downloads-badge.herokuapp.com/wavefront-cli?type=total)
|
3
3
|
|
4
4
|
|
5
5
|
This package provides a command-line interface to Wavefront's API. Each API path
|
@@ -9,13 +9,13 @@ It is built on [the Wavefront Ruby
|
|
9
9
|
SDK](https://github.com/snltd/wavefront-sdk) and requires Ruby >= 2.2.
|
10
10
|
|
11
11
|
```
|
12
|
-
$
|
12
|
+
$ wf --help
|
13
13
|
Wavefront CLI
|
14
14
|
|
15
15
|
Usage:
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
wf [options] command [options]
|
17
|
+
wf --version
|
18
|
+
wf --help
|
19
19
|
|
20
20
|
Commands:
|
21
21
|
alert view and manage alerts
|
@@ -34,7 +34,7 @@ Commands:
|
|
34
34
|
webhook view and manage webhooks
|
35
35
|
write send data points to a Wavefront proxy
|
36
36
|
|
37
|
-
Use '
|
37
|
+
Use 'wf <command> --help' for further information.
|
38
38
|
```
|
39
39
|
|
40
40
|
## General Rules
|
@@ -71,7 +71,7 @@ Most commands have a `list` subcommand, which will produce brief
|
|
71
71
|
column.
|
72
72
|
|
73
73
|
```
|
74
|
-
$
|
74
|
+
$ wf proxy list
|
75
75
|
457d6cf3-5171-45e0-8d31-5c980be889ea test agent
|
76
76
|
917102d1-a10e-997b-ba63-95058f98d4fb Agent on wavefront-2017-03-13-02
|
77
77
|
926dfb4c-23c6-4fb9-8c8d-833625ab8f6f Agent on shark-wavefront
|
@@ -85,7 +85,7 @@ Most commands have a `describe` subcommand which will tell you more about the
|
|
85
85
|
object.
|
86
86
|
|
87
87
|
```
|
88
|
-
$
|
88
|
+
$ wf proxy describe 917102d1-a10e-497b-ba63-95058f98d4fb
|
89
89
|
name Agent on wavefront-2017-03-13-02
|
90
90
|
id 917102d1-a10e-497b-ba63-95058f98d4fb
|
91
91
|
version 4.7
|
@@ -121,22 +121,22 @@ If you `describe` an object like a dashboard, user, webhook etc as `json` or
|
|
121
121
|
`yaml`, and send the output to a file, you can re-import that data. The format of the file to be imported is automatically detected.
|
122
122
|
|
123
123
|
```
|
124
|
-
$
|
124
|
+
$ wf user list
|
125
125
|
slackboy@gmail.com
|
126
126
|
sysdef.limited@gmail.com
|
127
|
-
$
|
127
|
+
$ wf user describe -f json sysdef.limited@gmail.com > user.json
|
128
128
|
$ cat user.json
|
129
129
|
{"identifier":"sysdef.limited@gmail.com","customer":"sysdef","groups":["agent_management"]}
|
130
|
-
$
|
130
|
+
$ wf user delete sysdef.limited@gmail.com
|
131
131
|
Deleted user 'sysdef.limited@gmail.com'.
|
132
|
-
$
|
132
|
+
$ wf user list
|
133
133
|
slackboy@gmail.com
|
134
|
-
$
|
134
|
+
$ wf user import user.json
|
135
135
|
Imported user.
|
136
136
|
identifier sysdef.limited@gmail.com
|
137
137
|
customer sysdef
|
138
138
|
groups agent_management
|
139
|
-
$
|
139
|
+
$ wf user list
|
140
140
|
slackboy@gmail.com
|
141
141
|
sysdef.limited@gmail.com
|
142
142
|
```
|
@@ -154,7 +154,7 @@ method](https://ruby-doc.org/stdlib-2.3.1/libdoc/date/rdoc/DateTime.html#method-
|
|
154
154
|
method can parse unaided. For instance:
|
155
155
|
|
156
156
|
```
|
157
|
-
$
|
157
|
+
$ wf command --start 12:15 --end 12:20 ...
|
158
158
|
```
|
159
159
|
|
160
160
|
will define a window between 12:15 and 12:20pm today. If you ran
|
@@ -162,7 +162,7 @@ that in the morning, the time would be invalid, and you would get a
|
|
162
162
|
400 error from Wavefront, so something of the form
|
163
163
|
`2016-04-17T12:25:00` would remove all ambiguity.
|
164
164
|
|
165
|
-
There is no need to include a timezone in your time: the `
|
165
|
+
There is no need to include a timezone in your time: the `wf`
|
166
166
|
CLI will automatically use your local timezone when it parses the
|
167
167
|
string.
|
168
168
|
|
@@ -185,20 +185,20 @@ fail. This output can be very verbose.
|
|
185
185
|
Writing a single point is simple:
|
186
186
|
|
187
187
|
```
|
188
|
-
$
|
188
|
+
$ wf write point cli.example 10
|
189
189
|
```
|
190
190
|
|
191
191
|
and you can add point tags, if you like.
|
192
192
|
|
193
193
|
```
|
194
|
-
$
|
194
|
+
$ wf write point cli.example 9.4 -E wavefront -T proxy=wavefront \
|
195
195
|
-T from=README
|
196
196
|
```
|
197
197
|
|
198
198
|
or force a timestamp:
|
199
199
|
|
200
200
|
```
|
201
|
-
$
|
201
|
+
$ wf write point -t 16:53:14 cli.example 8
|
202
202
|
```
|
203
203
|
|
204
204
|
More usefully, you can write from a file. Your file must contain multiple
|
@@ -212,11 +212,11 @@ $ cat datafile
|
|
212
212
|
1496767813 dev.cli.test 12.1
|
213
213
|
1496767813 dev.cli.test 10.0
|
214
214
|
1496767813 dev.cli.test 14.5
|
215
|
-
$
|
215
|
+
$ wf write file -F tmv datafile
|
216
216
|
```
|
217
217
|
|
218
218
|
If you set the file to `-`, you can read from standard in:
|
219
219
|
|
220
220
|
```
|
221
|
-
$ while true; do echo $RANDOM; sleep 1; done |
|
221
|
+
$ while true; do echo $RANDOM; sleep 1; done | wf write file -m cli.demo -Fv -
|
222
222
|
```
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rubocop/rake_task'
|
|
5
5
|
task default: :test
|
6
6
|
|
7
7
|
Rake::TestTask.new do |t|
|
8
|
-
t.pattern = 'spec/wavefront-cli
|
8
|
+
t.pattern = 'spec/wavefront-cli/**/*_spec.rb'
|
9
9
|
t.warning = false
|
10
10
|
end
|
11
11
|
|
@@ -14,5 +14,5 @@ RuboCop::RakeTask.new(:rubocop) do |t|
|
|
14
14
|
end
|
15
15
|
|
16
16
|
YARD::Rake::YardocTask.new do |t|
|
17
|
-
t.files = ['lib/wavefront-cli
|
17
|
+
t.files = ['lib/wavefront-cli/**/*.rb']
|
18
18
|
end
|
data/bin/{wavefront → wf}
RENAMED
@@ -5,10 +5,14 @@ require 'io/console'
|
|
5
5
|
require_relative '../lib/wavefront-cli/controller'
|
6
6
|
|
7
7
|
begin
|
8
|
-
|
8
|
+
tw = IO.console.winsize.last
|
9
9
|
rescue
|
10
|
-
|
10
|
+
tw = 80
|
11
11
|
end
|
12
12
|
|
13
|
+
tw = 80 if tw < 60
|
14
|
+
|
15
|
+
TW = tw
|
16
|
+
|
13
17
|
CMD = Pathname.new(__FILE__).basename
|
14
18
|
WavefrontCliController.new(ARGV)
|
data/lib/wavefront-cli/alert.rb
CHANGED
@@ -18,13 +18,13 @@ module WavefrontCli
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def do_delete
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
word = if wf.describe(options[:'<id>']).status.code == 200
|
22
|
+
'Soft'
|
23
|
+
else
|
24
|
+
'Permanently'
|
25
|
+
end
|
26
26
|
|
27
|
-
puts " deleting alert '#{options[:'<id>']}'."
|
27
|
+
puts "#{word} deleting alert '#{options[:'<id>']}'."
|
28
28
|
wf.delete(options[:'<id>'])
|
29
29
|
end
|
30
30
|
|
@@ -41,6 +41,7 @@ module WavefrontCli
|
|
41
41
|
#
|
42
42
|
# @param raw [Hash] Ruby hash of imported data
|
43
43
|
#
|
44
|
+
# rubocop:disable Metrics/MethodLength
|
44
45
|
def import_to_create(raw)
|
45
46
|
ret = %w(name condition minutes target severity displayExpression
|
46
47
|
additionalInformation).each_with_object({}) do |k, aggr|
|
data/lib/wavefront-cli/base.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
1
|
require 'yaml'
|
3
2
|
require 'json'
|
4
3
|
require 'wavefront-sdk/validators'
|
5
|
-
# require_relative './constants'
|
6
4
|
require_relative './exception'
|
7
5
|
|
8
6
|
module WavefrontCli
|
@@ -89,7 +87,10 @@ module WavefrontCli
|
|
89
87
|
# @return [Hash] containing `token` and `endpoint`.
|
90
88
|
#
|
91
89
|
def mk_creds
|
92
|
-
{ token:
|
90
|
+
{ token: options[:token],
|
91
|
+
endpoint: options[:endpoint],
|
92
|
+
agent: "wavefront-cli-#{WF_CLI_VERSION}"
|
93
|
+
}
|
93
94
|
end
|
94
95
|
|
95
96
|
# Make a common wavefront-sdk options object from standard CLI
|
@@ -98,12 +99,14 @@ module WavefrontCli
|
|
98
99
|
# @return [Hash] containing `debug`, `verbose`, and `noop`.
|
99
100
|
#
|
100
101
|
def mk_opts
|
101
|
-
{ debug:
|
102
|
-
|
102
|
+
{ debug: options[:debug],
|
103
|
+
verbose: options[:verbose],
|
104
|
+
noop: options[:noop],
|
105
|
+
}
|
103
106
|
end
|
104
107
|
|
105
108
|
# To allow a user to default to different output formats for
|
106
|
-
# different object, we define a format for each class.
|
109
|
+
# different object, we are able to define a format for each class.
|
107
110
|
# instance, `alertformat` or `agentformat`. This method returns
|
108
111
|
# such a string appropriate for the inheriting class.
|
109
112
|
#
|
@@ -166,6 +169,8 @@ module WavefrontCli
|
|
166
169
|
# this output. Used to find a suitable humanize method.
|
167
170
|
#
|
168
171
|
def display(data, method)
|
172
|
+
exit if options[:noop]
|
173
|
+
|
169
174
|
[:status, :response].each do |b|
|
170
175
|
abort "no #{b} block in API response" unless data.respond_to?(b)
|
171
176
|
end
|
@@ -290,6 +295,22 @@ module WavefrontCli
|
|
290
295
|
wf.update(options[:'<id>'], k => v)
|
291
296
|
end
|
292
297
|
|
298
|
+
def do_search
|
299
|
+
require 'wavefront-sdk/search'
|
300
|
+
wfs = Wavefront::Search.new(mk_creds, mk_opts)
|
301
|
+
|
302
|
+
query = options[:'<condition>'].each_with_object([]) do |c, aggr|
|
303
|
+
key, value = c.split(/\W/, 2)
|
304
|
+
q = { key: key, value: value }
|
305
|
+
q[:matchingMethod] = 'EXACT' if c.start_with?("#{key}=")
|
306
|
+
q[:matchingMethod] = 'STARTSWITH' if c.start_with?("#{key}^")
|
307
|
+
aggr.<< q
|
308
|
+
end
|
309
|
+
|
310
|
+
wfs.search(klass_word, query, { limit: options[:limit],
|
311
|
+
offset: options[:offset] || options[:cursor]})
|
312
|
+
end
|
313
|
+
|
293
314
|
def do_tags
|
294
315
|
wf.tags(options[:'<id>'])
|
295
316
|
end
|
@@ -17,6 +17,7 @@ class WavefrontCommandAlert < WavefrontCommandBase
|
|
17
17
|
"snooze #{CMN} [-T time] <id>",
|
18
18
|
"update #{CMN} <key=value> <id>",
|
19
19
|
"unsnooze #{CMN} <id>",
|
20
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>...",
|
20
21
|
"tags #{CMN} [-f format] <id>",
|
21
22
|
"tag set #{CMN} <id> <tag>...",
|
22
23
|
"tag clear #{CMN} <id>",
|
@@ -28,11 +29,11 @@ class WavefrontCommandAlert < WavefrontCommandBase
|
|
28
29
|
def _options
|
29
30
|
[common_options,
|
30
31
|
'-l, --long list alerts in detail',
|
32
|
+
'-a, --all list all alerts',
|
31
33
|
'-v, --version=INTEGER describe only this version of alert',
|
32
34
|
'-o, --offset=n start from nth alert',
|
33
35
|
'-L, --limit=COUNT number of alerts to list',
|
34
36
|
'-T, --time=SECONDS how long to snooze (default 3600)',
|
35
|
-
'-a, --all list all alerts',
|
36
37
|
'-f, --format=STRING output format']
|
37
38
|
end
|
38
39
|
end
|
@@ -1,9 +1,12 @@
|
|
1
|
+
require_relative '../string'
|
2
|
+
|
1
3
|
CMN = '[-DnV] [-c file] [-P profile] [-E endpoint] [-t token]'.freeze
|
2
4
|
|
3
5
|
# A base class which all command classes extend.
|
4
6
|
#
|
5
7
|
class WavefrontCommandBase
|
6
8
|
# All commands have these options
|
9
|
+
# @return [Array]
|
7
10
|
#
|
8
11
|
def global_options
|
9
12
|
['-c, --config=FILE path to configuration file',
|
@@ -15,13 +18,22 @@ class WavefrontCommandBase
|
|
15
18
|
end
|
16
19
|
|
17
20
|
# Many commands have these options
|
21
|
+
# @return [Array]
|
18
22
|
#
|
19
23
|
def common_options
|
20
24
|
['-E, --endpoint=URI cluster endpoint',
|
21
25
|
'-t, --token=TOKEN Wavefront authentication token']
|
22
26
|
end
|
23
27
|
|
28
|
+
# Inheriting classes must override this method
|
29
|
+
# @return [Array]
|
30
|
+
#
|
31
|
+
def _options
|
32
|
+
[]
|
33
|
+
end
|
34
|
+
|
24
35
|
# Anything which takes tags provides the same interface
|
36
|
+
# @return [Array]
|
25
37
|
#
|
26
38
|
def tag_commands
|
27
39
|
["tags #{CMN} [-f format] <id>",
|
@@ -31,75 +43,88 @@ class WavefrontCommandBase
|
|
31
43
|
"tag delete #{CMN} <id> <tag>"]
|
32
44
|
end
|
33
45
|
|
34
|
-
#
|
46
|
+
# Inheriting classes must override this method
|
47
|
+
# @return [Array]
|
48
|
+
#
|
49
|
+
def _commands
|
50
|
+
[]
|
51
|
+
end
|
52
|
+
|
53
|
+
# @return [String] the command keyword
|
35
54
|
#
|
36
55
|
def word
|
37
56
|
self.class.name.sub(/WavefrontCommand/, '').downcase
|
38
57
|
end
|
39
58
|
|
40
|
-
#
|
41
|
-
# command.
|
59
|
+
# @return [String] the name of the SDK class which does the work
|
60
|
+
# for this command.
|
42
61
|
#
|
43
62
|
def sdk_class
|
44
63
|
word.capitalize
|
45
64
|
end
|
46
65
|
|
66
|
+
# @return [String] the name of the SDK file which does the work
|
67
|
+
# for this command.
|
68
|
+
#
|
47
69
|
def sdk_file
|
48
70
|
word
|
49
71
|
end
|
50
72
|
|
51
|
-
#
|
73
|
+
# @param term_width [Integer] force a terminal width. Makes
|
74
|
+
# testing far simpler.
|
75
|
+
# @return [String] the subcommands the command offers.
|
52
76
|
#
|
53
|
-
|
77
|
+
#
|
78
|
+
def commands(term_width = TW)
|
54
79
|
_commands.flatten.each_with_object("Usage:\n") do |cmd, ret|
|
55
|
-
ret.<< ' ' + "#{CMD} #{word} #{cmd}\n".cmd_fold + "\n"
|
80
|
+
ret.<< ' ' + "#{CMD} #{word} #{cmd}\n".cmd_fold(term_width) + "\n"
|
56
81
|
end + " #{CMD} #{word} --help"
|
57
82
|
end
|
58
83
|
|
59
|
-
#
|
84
|
+
# @param term_width [Integer] force a terminal width. Makes
|
85
|
+
# testing far simpler.
|
86
|
+
# @return [String] the options the command understands.
|
87
|
+
#
|
60
88
|
#
|
61
|
-
def options
|
62
|
-
width =
|
89
|
+
def options(term_width = TW)
|
90
|
+
width = option_column_width
|
63
91
|
ret = "Global options:\n"
|
64
|
-
global_options.each { |o| ret.<< opt_row(o, width) }
|
92
|
+
global_options.each { |o| ret.<< opt_row(o, width, term_width) }
|
65
93
|
ret.<< "\nOptions:\n"
|
66
|
-
_options.flatten.each { |o| ret.<< opt_row(o, width) }
|
94
|
+
_options.flatten.each { |o| ret.<< opt_row(o, width, term_width) }
|
67
95
|
ret
|
68
96
|
end
|
69
97
|
|
70
|
-
|
98
|
+
# Formats an option string.
|
99
|
+
#
|
100
|
+
# @param opt [String] the option string
|
101
|
+
# @param width [Integer] the width of the short + long options
|
102
|
+
# columns. This is used to indent following lines
|
103
|
+
# @param term_width [Integer] the width of the user's terminal
|
104
|
+
#
|
105
|
+
def opt_row(opt, width, term_width = TW)
|
71
106
|
format(" %s %-#{width}s %s\n", *opt.split(/\s+/, 3))
|
107
|
+
.opt_fold(term_width, width + 5)
|
72
108
|
end
|
73
109
|
|
74
|
-
|
110
|
+
# @return [Integer] the width of the column containing short and
|
111
|
+
# long options
|
112
|
+
#
|
113
|
+
def option_column_width
|
75
114
|
(global_options + _options).flatten.map do |o|
|
76
115
|
o.split(/\s+/, 3)[0..1].join(' ').size
|
77
116
|
end.max
|
78
117
|
end
|
79
118
|
|
80
|
-
#
|
119
|
+
# @return [String] which will be printed underneath the options.
|
81
120
|
#
|
82
121
|
def postscript
|
83
122
|
''
|
84
123
|
end
|
85
124
|
|
86
|
-
#
|
125
|
+
# @return [String] a full options string which docopt understands
|
87
126
|
#
|
88
127
|
def docopt
|
89
128
|
commands + "\n\n" + options + "\n" + postscript
|
90
129
|
end
|
91
130
|
end
|
92
|
-
|
93
|
-
# Extensions to the String class to help with formatting.
|
94
|
-
#
|
95
|
-
class String
|
96
|
-
|
97
|
-
# Fold long command lines. We can't break on a space inside
|
98
|
-
# [square brackets] or it confuses docopt.
|
99
|
-
#
|
100
|
-
def cmd_fold(width = TW, indent = 10)
|
101
|
-
gsub(/\s(?=\w+\])/, '^').
|
102
|
-
scan(/\S.{0,#{width - 8}}\S(?=\s|$)|\S+/).join("\n" + ' ' * indent).
|
103
|
-
gsub('^', ' ')
|
104
|
-
end
|
105
|
-
end
|
@@ -15,6 +15,7 @@ class WavefrontCommandDashboard < WavefrontCommandBase
|
|
15
15
|
"delete #{CMN} <id>",
|
16
16
|
"undelete #{CMN} <id>",
|
17
17
|
"history #{CMN} [-b] [-f format] [-o offset] [-L limit] <id>",
|
18
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>...",
|
18
19
|
tag_commands]
|
19
20
|
end
|
20
21
|
|
@@ -9,13 +9,16 @@ class WavefrontCommandEvent < WavefrontCommandBase
|
|
9
9
|
|
10
10
|
def _commands
|
11
11
|
["list #{CMN} [-l] [-f format] [-s start] [-e end] [-L limit] " \
|
12
|
-
'[-o
|
12
|
+
'[-o cursor]',
|
13
13
|
"describe #{CMN} [-f format] <id>",
|
14
14
|
"create #{CMN} [-d description] [-s time] [-i | -e time] " \
|
15
15
|
'[-S severity] [-T type] [-H host...] [-N] <event>',
|
16
16
|
"close #{CMN} [<id>]",
|
17
17
|
"delete #{CMN} <id>",
|
18
18
|
"update #{CMN} <key=value> <id>",
|
19
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>...",
|
20
|
+
"wrap #{CMN} [-C command] [-d description] [-S severity] [-T type] " \
|
21
|
+
'[-H host...] <event>',
|
19
22
|
tag_commands,
|
20
23
|
'show [-D]']
|
21
24
|
end
|
@@ -23,7 +26,7 @@ class WavefrontCommandEvent < WavefrontCommandBase
|
|
23
26
|
def _options
|
24
27
|
[common_options,
|
25
28
|
'-l, --long list events in detail',
|
26
|
-
'-o, --
|
29
|
+
'-o, --cursor=EVENT start listing from given event',
|
27
30
|
'-L, --limit=COUNT number of events to list',
|
28
31
|
'-s, --start=TIME time at which event/window begins',
|
29
32
|
'-e, --end=TIME time at which even/window ends',
|
@@ -34,7 +37,8 @@ class WavefrontCommandEvent < WavefrontCommandBase
|
|
34
37
|
'-H, --host=STRING source to which event applies',
|
35
38
|
'-N, --nostate do not create a local file recording ' \
|
36
39
|
'the event',
|
37
|
-
'-
|
40
|
+
'-C, --command=COMMAND command to run',
|
41
|
+
'-f, --format=STRING output format']
|
38
42
|
end
|
39
43
|
|
40
44
|
def postscript
|
@@ -20,7 +20,8 @@ class WavefrontCommandIntegration < WavefrontCommandBase
|
|
20
20
|
"describe #{CMN} [-f format] <id>",
|
21
21
|
"delete #{CMN} <id>",
|
22
22
|
"undelete #{CMN} <id>",
|
23
|
-
"import #{CMN} <file>"
|
23
|
+
"import #{CMN} <file>",
|
24
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>..."]
|
24
25
|
end
|
25
26
|
|
26
27
|
def _options
|
@@ -20,8 +20,8 @@ class WavefrontCommandLink < WavefrontCommandBase
|
|
20
20
|
"describe #{CMN} [-f format] <id>",
|
21
21
|
"delete #{CMN} <id>",
|
22
22
|
"import #{CMN} <file>",
|
23
|
-
"update #{CMN} <key=value> <id>"
|
24
|
-
|
23
|
+
"update #{CMN} <key=value> <id>",
|
24
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>..."]
|
25
25
|
end
|
26
26
|
|
27
27
|
def _options
|
@@ -12,7 +12,8 @@ class WavefrontCommandProxy < WavefrontCommandBase
|
|
12
12
|
"describe #{CMN} [-f format] <id>",
|
13
13
|
"delete #{CMN} <id>",
|
14
14
|
"undelete #{CMN} <id>",
|
15
|
-
"rename #{CMN} <id> <name>"
|
15
|
+
"rename #{CMN} <id> <name>",
|
16
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>..."]
|
16
17
|
end
|
17
18
|
|
18
19
|
def _options
|
@@ -19,7 +19,8 @@ class WavefrontCommandSavedsearch < WavefrontCommandBase
|
|
19
19
|
["list #{CMN} [-l] [-f format] [-o offset] [-L limit]",
|
20
20
|
"describe #{CMN} [-f format] <id>",
|
21
21
|
"delete #{CMN} <id>",
|
22
|
-
"import #{CMN} <file>"
|
22
|
+
"import #{CMN} <file>",
|
23
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>..."]
|
23
24
|
end
|
24
25
|
|
25
26
|
def _options
|
@@ -8,18 +8,19 @@ class WavefrontCommandSource < WavefrontCommandBase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def _commands
|
11
|
-
["list #{CMN} [-l] [-f format] [-o
|
11
|
+
["list #{CMN} [-l] [-f format] [-o cursor] [-L limit] [-a]",
|
12
12
|
"describe #{CMN} [-f format] <id>",
|
13
13
|
"description set #{CMN} <id> <description>",
|
14
14
|
"description clear #{CMN} <id>",
|
15
15
|
"clear #{CMN} <id>",
|
16
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>...",
|
16
17
|
tag_commands]
|
17
18
|
end
|
18
19
|
|
19
20
|
def _options
|
20
21
|
[common_options,
|
21
22
|
'-l, --long list sources in detail',
|
22
|
-
'-o, --
|
23
|
+
'-o, --cursor=SOURCE start list given source',
|
23
24
|
'-L, --limit=COUNT number of sources to list',
|
24
25
|
'-a, --all list all sources, including cluster',
|
25
26
|
'-f, --format=STRING output format']
|
@@ -12,7 +12,8 @@ class WavefrontCommandWebhook < WavefrontCommandBase
|
|
12
12
|
"describe #{CMN} [-f format] <id>",
|
13
13
|
"delete #{CMN} <id>",
|
14
14
|
"import #{CMN} <file>",
|
15
|
-
"update #{CMN} <key=value> <id>"
|
15
|
+
"update #{CMN} <key=value> <id>",
|
16
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>..."]
|
16
17
|
end
|
17
18
|
|
18
19
|
def _options
|
@@ -20,7 +20,8 @@ class WavefrontCommandWindow < WavefrontCommandBase
|
|
20
20
|
"describe #{CMN} [-f format] <id>",
|
21
21
|
"delete #{CMN} <id>",
|
22
22
|
"import #{CMN} <file>",
|
23
|
-
"update #{CMN} <key=value> <id>"
|
23
|
+
"update #{CMN} <key=value> <id>",
|
24
|
+
"search #{CMN} [-f format] [-o offset] [-L limit] [-l] <condition>..."]
|
24
25
|
end
|
25
26
|
|
26
27
|
def _options
|
@@ -9,9 +9,10 @@ class WavefrontCommandWrite < WavefrontCommandBase
|
|
9
9
|
|
10
10
|
def _commands
|
11
11
|
['point [-DnV] [-c file] [-P profile] [-E proxy] [-t time] ' \
|
12
|
-
|
12
|
+
'[-p port] [-H host] [-n] [-T tag...] <metric> <value>',
|
13
13
|
'file [-DnV] [-c file] [-P profile] [-E proxy] [-H host] ' \
|
14
|
-
'[-p port] [-n] [-F format] [-m metric] [-T tag...]
|
14
|
+
'[-p port] [-n] [-F format] [-m metric] [-T tag...] ' \
|
15
|
+
'[-r rate] <file>']
|
15
16
|
end
|
16
17
|
|
17
18
|
def _options
|
@@ -24,12 +25,15 @@ class WavefrontCommandWrite < WavefrontCommandBase
|
|
24
25
|
'-F, --infileformat=STRING format of input file or stdin',
|
25
26
|
'-m, --metric=STRING the metric path to which contents of ' \
|
26
27
|
'a file will be assigned. If the file contains a metric name, ' \
|
27
|
-
'the two will be concatenated'
|
28
|
+
'the two will be dot-concatenated, with this value first',
|
29
|
+
'-r, --rate=INTEGER throttle point sending to this many ' \
|
30
|
+
'points per second']
|
28
31
|
end
|
29
32
|
|
30
33
|
def postscript
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
'Files are whitespace separated, and fields can be defined ' \
|
35
|
+
"with the '-F' option. Use 't' for timestamp; 'm' for metric " \
|
36
|
+
"name; 'v' for value, 's' for source, and 'T' for tags. Put 'T' " \
|
37
|
+
'last.'.cmd_fold(TW, 0)
|
34
38
|
end
|
35
39
|
end
|