wavefront-cli 6.1.0 → 7.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +34 -1
  3. data/HISTORY.md +17 -1
  4. data/README.md +2 -3
  5. data/lib/wavefront-cli/account.rb +119 -0
  6. data/lib/wavefront-cli/alert.rb +29 -0
  7. data/lib/wavefront-cli/base.rb +0 -2
  8. data/lib/wavefront-cli/commands/.rubocop.yml +34 -0
  9. data/lib/wavefront-cli/commands/account.rb +61 -0
  10. data/lib/wavefront-cli/commands/alert.rb +1 -0
  11. data/lib/wavefront-cli/commands/base.rb +1 -1
  12. data/lib/wavefront-cli/commands/query.rb +4 -1
  13. data/lib/wavefront-cli/commands/role.rb +44 -0
  14. data/lib/wavefront-cli/commands/spy.rb +0 -5
  15. data/lib/wavefront-cli/commands/usergroup.rb +7 -11
  16. data/lib/wavefront-cli/commands/write.rb +7 -2
  17. data/lib/wavefront-cli/controller.rb +5 -63
  18. data/lib/wavefront-cli/display/account.rb +122 -0
  19. data/lib/wavefront-cli/display/alert.rb +8 -0
  20. data/lib/wavefront-cli/display/base.rb +1 -1
  21. data/lib/wavefront-cli/display/cloudintegration.rb +3 -2
  22. data/lib/wavefront-cli/display/printer/long.rb +2 -1
  23. data/lib/wavefront-cli/display/role.rb +66 -0
  24. data/lib/wavefront-cli/display/settings.rb +1 -0
  25. data/lib/wavefront-cli/display/usergroup.rb +18 -14
  26. data/lib/wavefront-cli/exception_handler.rb +87 -0
  27. data/lib/wavefront-cli/output/hcl/base.rb +1 -1
  28. data/lib/wavefront-cli/query.rb +13 -7
  29. data/lib/wavefront-cli/role.rb +54 -0
  30. data/lib/wavefront-cli/serviceaccount.rb +0 -6
  31. data/lib/wavefront-cli/spy.rb +0 -8
  32. data/lib/wavefront-cli/usergroup.rb +8 -8
  33. data/lib/wavefront-cli/version.rb +1 -1
  34. data/lib/wavefront-cli/write.rb +28 -4
  35. data/spec/.rubocop.yml +34 -0
  36. data/spec/test_mixins/delete.rb +1 -2
  37. data/spec/wavefront-cli/account_spec.rb +303 -0
  38. data/spec/wavefront-cli/alert_spec.rb +28 -0
  39. data/spec/wavefront-cli/commands/write_spec.rb +1 -1
  40. data/spec/wavefront-cli/event_spec.rb +1 -1
  41. data/spec/wavefront-cli/output/csv/query_spec.rb +1 -1
  42. data/spec/wavefront-cli/output/wavefront/query_spec.rb +2 -2
  43. data/spec/wavefront-cli/query_spec.rb +20 -3
  44. data/spec/wavefront-cli/role_spec.rb +187 -0
  45. data/spec/wavefront-cli/serviceaccount_spec.rb +3 -3
  46. data/spec/wavefront-cli/usergroup_spec.rb +48 -43
  47. data/spec/wavefront-cli/write_spec.rb +44 -0
  48. data/wavefront-cli.gemspec +3 -3
  49. metadata +30 -27
  50. data/lib/wavefront-cli/commands/user.rb +0 -54
  51. data/lib/wavefront-cli/display/user.rb +0 -103
  52. data/lib/wavefront-cli/user.rb +0 -92
  53. data/spec/wavefront-cli/resources/responses/user-list.json +0 -1
  54. data/spec/wavefront-cli/user_spec.rb +0 -311
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d0fa52b33cb79a4b67bcb7054e9a998584630efc8318962b85e929029391af5
4
- data.tar.gz: 9c5151b963d5cb5931b3c8d868e568f951a56de590a72d9277048ae36de3b086
3
+ metadata.gz: b1e0ee9608157074b898b31b5c169f432e4feed2d4af31e184b80016675f73cc
4
+ data.tar.gz: 4e845f4a56684903f2f1d800ee41cad9a8062a969a8fcb31e839bd51fac3891c
5
5
  SHA512:
6
- metadata.gz: dd09d2f689141ab55e41cc8ec2e234b5e06c7e79f497587026f43acee11b624c8b06d436004d27fcb861c0b89731fa9f736c0c0490ca60e8ef20ec3de7612b40
7
- data.tar.gz: f76f25fe45d6042e0800c658c482115658a122f56781c2b37835da1b2529a602c4f932f60fefd4f79fc1a91305619bfc82b0cf7c750986e7968ec823a69e6025
6
+ metadata.gz: 4635ae95d16aeb2bcb779010fc435945300991f1853ba75488a9e2914b6860129be4257ca13d5765c004efb746ce5f03fa7d686f71bb13ec5fe860f77c4cddbe
7
+ data.tar.gz: 501b3425f488c977363b42ec9d362d3e0c56ef8ba0b7cc91a2feb1da8bb2b91d2a1c27ade8cf8d3e5c01f3bde74cf0a582ead9c84f4dc4f0ae6e71c1a3691cc9
@@ -8,10 +8,43 @@ Metrics/ClassLength:
8
8
 
9
9
  Style/IfUnlessModifier:
10
10
  Enabled: false # because it wants to make lines >80 chars
11
-
12
11
  Style/HashEachMethods:
13
12
  Enabled: true
14
13
  Style/HashTransformKeys:
15
14
  Enabled: true
16
15
  Style/HashTransformValues:
17
16
  Enabled: true
17
+
18
+ # New compatabilities
19
+ Layout/EmptyLinesAroundAttributeAccessor:
20
+ Enabled: true
21
+ Layout/SpaceAroundMethodCallOperator:
22
+ Enabled: true
23
+ Lint/RaiseException:
24
+ Enabled: true
25
+ Lint/StructNewOverride:
26
+ Enabled: true
27
+ Style/ExponentialNotation:
28
+ Enabled: true
29
+ Style/SlicingWithRange:
30
+ Enabled: true
31
+ Lint/DeprecatedOpenSSLConstant:
32
+ Enabled: true
33
+ Lint/MixedRegexpCaptureTypes:
34
+ Enabled: true
35
+ Style/RedundantRegexpCharacterClass:
36
+ Enabled: true
37
+ Style/RedundantRegexpEscape:
38
+ Enabled: true
39
+ Style/AccessorGrouping:
40
+ Enabled: true
41
+ Style/BisectedAttrAccessor:
42
+ Enabled: true
43
+ Style/RedundantAssignment:
44
+ Enabled: true
45
+ Style/RedundantFetchBlock:
46
+ Enabled: true
47
+
48
+ # Is nothing sacred?
49
+ Layout/LineLength:
50
+ Max: 80
data/HISTORY.md CHANGED
@@ -1,17 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## 7.1.0 (2020-08-07)
4
+ * Remove `user` command. (Breaking change.)
5
+ * Add `account` command.
6
+ * Complete coverage of roles and user groups.
7
+ * Add `alert affected hosts` command to show which hosts are affected by one
8
+ or all firing alerts.
9
+ * Remove obsolete `group` subcommands. (`grant` and `revoke`).
10
+ * Add `write noise` command to send a flow of random data to an endpoint.
11
+ * Better information when working with cloud integrations.
12
+
13
+ ## 7.0.0 (unreleased)
14
+
3
15
  ## 6.1.0 (2020-06-02)
4
16
  * Add `-A` flag to `proxy list` command, to only list active proxies
5
17
 
6
18
  ## 6.0.0 (2020-04-07)
7
19
  * Remove `cluster` command. (Breaking change.)
20
+ * Add `role` command.
21
+ * Add `--nocache`, `--nostrict` and `--histogram-view` options to `query`
22
+ command.
23
+ * Require 5.x of [the SDK](https://github.com/snltd/wavefront-sdk).
8
24
 
9
25
  ## 5.1.2 (2020-02-28)
10
26
  * Fix regression in HCL dashboard export.
11
27
  * Properly handle unavailable port when sending distributions to a proxy.
12
28
 
13
29
  ## 5.1.1 (2020-02-20)
14
- * Say whether `--upsert` did and update or an import.
30
+ * Say whether `--upsert` did an update or an import.
15
31
 
16
32
  ## 5.1.0 (2020-02-20)
17
33
  * Add `-U` (`--upsert`) option to `import` sub-commands.
data/README.md CHANGED
@@ -51,7 +51,6 @@ Commands:
51
51
  source view and manage source tags and descriptions
52
52
  spy monitor traffic going into Wavefront
53
53
  usage view and manage usage reports
54
- user view and manage Wavefront users
55
54
  usergroup view and manage Wavefront user groups
56
55
  webhook view and manage webhooks
57
56
  window view and manage maintenance windows
@@ -103,7 +102,7 @@ $ wf proxy list
103
102
 
104
103
  You can get more verbose listings with the `-l` flag. Results may be
105
104
  paginated. You can progress through pages with the `-L` and `-o`
106
- options, or user `--all` to get everything in one go.
105
+ options, or use `--all` to get everything in one go.
107
106
 
108
107
  ### Describing Things
109
108
 
@@ -151,7 +150,7 @@ mentioned above, human-readable listings and desctiptions may omit
151
150
  data which is not likely to be useful, or which is extremely hard to
152
151
  present in a readable way.
153
152
 
154
- If you `describe` an object like a dashboard, user, webhook etc as
153
+ If you `describe` an object like a dashboard, account, webhook etc as
155
154
  `json` or `yaml`, and send the output to a file, you can re-import
156
155
  that data. The format of the file to be imported is automatically
157
156
  detected.
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module WavefrontCli
6
+ #
7
+ # CLI coverage for the v2 'account' API.
8
+ #
9
+ class Account < WavefrontCli::Base
10
+ alias do_roles do_describe
11
+ alias do_groups do_describe
12
+ alias do_ingestionpolicy do_describe
13
+ alias do_permissions do_describe
14
+
15
+ def do_role_add_to
16
+ wf_account_id?(options[:'<id>'])
17
+ wf.add_roles(options[:'<id>'], options[:'<role>'])
18
+ end
19
+
20
+ def do_role_remove_from
21
+ wf_account_id?(options[:'<id>'])
22
+ wf.remove_roles(options[:'<id>'], options[:'<role>'])
23
+ end
24
+
25
+ def do_group_add_to
26
+ wf_account_id?(options[:'<id>'])
27
+ wf.add_user_groups(options[:'<id>'], options[:'<group>'])
28
+ end
29
+
30
+ def do_group_remove_from
31
+ wf_account_id?(options[:'<id>'])
32
+ wf.remove_user_groups(options[:'<id>'], options[:'<group>'])
33
+ end
34
+
35
+ def do_business_functions
36
+ wf_user_id?(options[:'<id>'])
37
+ wf.business_functions(options[:'<id>'])
38
+ end
39
+
40
+ def do_grant_to
41
+ wf.grant(options[:'<account>'], options[:'<permission>'])
42
+ end
43
+
44
+ def do_revoke_from
45
+ wf.revoke(options[:'<account>'], options[:'<permission>'])
46
+ end
47
+
48
+ def do_ingestionpolicy_add_to
49
+ wf_account_id?(options[:'<id>'])
50
+ wf.add_ingestion_policy(options[:'<policy>'], [options[:'<id>']])
51
+ end
52
+
53
+ def do_ingestionpolicy_remove_from
54
+ wf_account_id?(options[:'<id>'])
55
+ wf_ingestionpolicy_id?(options[:'<policy>'])
56
+ wf.remove_ingestion_policy(options[:'<policy>'], [options[:'<id>']])
57
+ end
58
+
59
+ def do_create_user
60
+ wf_user_id?(options[:'<id>'])
61
+ wf.user_create(user_body)
62
+ end
63
+
64
+ def do_invite_user
65
+ wf_user_id?(options[:'<id>'])
66
+ wf.user_invite([user_body])
67
+ end
68
+
69
+ def do_validate
70
+ wf.validate_accounts(options[:'<account>'])
71
+ end
72
+
73
+ def extra_validation
74
+ validate_policy
75
+ validate_permission
76
+ validate_roles
77
+ validate_groups
78
+ validate_accounts
79
+ end
80
+
81
+ private
82
+
83
+ def validate_policy
84
+ wf_ingestionpolicy_id?(options[:'<policy>']) if options[:'<policy>']
85
+ end
86
+
87
+ def validate_permission
88
+ wf_permission?(options[:'<permission>']) if options[:'<permission>']
89
+ end
90
+
91
+ def validate_roles
92
+ options[:'<role>'].each { |r| wf_role_id?(r) }
93
+ end
94
+
95
+ def validate_groups
96
+ options[:'<group>'].each { |g| wf_usergroup_id?(g) }
97
+ end
98
+
99
+ def validate_accounts
100
+ options[:'<account>'].each { |a| wf_account_id?(a) }
101
+ end
102
+
103
+ # Object used to create and invite users. We deal with the permissions
104
+ # seperately because if we don't supply any and they get compacted out,
105
+ # the user is created with a default set of perms, and we don't want that.
106
+ #
107
+ def user_body
108
+ raw = {
109
+ emailAddress: options[:'<id>'],
110
+ roles: options[:roleid],
111
+ ingestionPolicyId: options[:policyid],
112
+ userGroups: options[:groupid]
113
+ }.reject { |_k, v| v&.empty? }.compact
114
+
115
+ raw[:groups] = options[:permission]
116
+ raw
117
+ end
118
+ end
119
+ end
@@ -50,6 +50,14 @@ module WavefrontCli
50
50
  wf.history(options[:'<id>'], options[:offset], options[:limit])
51
51
  end
52
52
 
53
+ def do_affected_hosts
54
+ if options[:'<id>']
55
+ affected_hosts_for_id(options[:'<id>'])
56
+ else
57
+ all_affected_hosts
58
+ end
59
+ end
60
+
53
61
  def do_currently
54
62
  state = options[:'<state>'].to_s
55
63
 
@@ -146,5 +154,26 @@ module WavefrontCli
146
154
  end
147
155
  end.compact
148
156
  end
157
+
158
+ def all_affected_hosts
159
+ cannot_noop!
160
+ in_state(:firing).tap do |r|
161
+ r.response = r.response.items.each_with_object({}) do |alert, aggr|
162
+ aggr[alert[:id]] = affected_hosts_for_id(alert[:id]).response
163
+ end
164
+ end
165
+ end
166
+
167
+ def affected_hosts_for_id(id)
168
+ resp = wf.describe(id)
169
+
170
+ return if options[:noop]
171
+
172
+ return resp unless resp.ok? && resp.response.key?(:failingHostLabelPairs)
173
+
174
+ resp.tap do |r|
175
+ r.response = r.response[:failingHostLabelPairs].map { |h| h[:host] }
176
+ end
177
+ end
149
178
  end
150
179
  end
@@ -485,7 +485,6 @@ module WavefrontCli
485
485
  # @param cond [String] a search condition, like "key=value"
486
486
  # @return [Hash] of matchingMethod and negated
487
487
  #
488
- # rubocop:disable Metrics/CyclomaticComplexity
489
488
  # rubocop:disable Metrics/MethodLength
490
489
  def matching_method(cond)
491
490
  case cond
@@ -506,7 +505,6 @@ module WavefrontCli
506
505
  end
507
506
  end
508
507
  # rubocop:enable Metrics/MethodLength
509
- # rubocop:enable Metrics/CyclomaticComplexity
510
508
 
511
509
  # Return a detailed description of one item, if an ID has been
512
510
  # given, or all items if it has not.
@@ -11,3 +11,37 @@ Style/HashTransformKeys:
11
11
  Enabled: true
12
12
  Style/HashTransformValues:
13
13
  Enabled: true
14
+
15
+ # new compatabilities
16
+ Layout/EmptyLinesAroundAttributeAccessor:
17
+ Enabled: true
18
+ Layout/SpaceAroundMethodCallOperator:
19
+ Enabled: true
20
+ Lint/RaiseException:
21
+ Enabled: true
22
+ Lint/StructNewOverride:
23
+ Enabled: true
24
+ Style/ExponentialNotation:
25
+ Enabled: true
26
+ Style/SlicingWithRange:
27
+ Enabled: true
28
+ Lint/DeprecatedOpenSSLConstant:
29
+ Enabled: true
30
+ Lint/MixedRegexpCaptureTypes:
31
+ Enabled: true
32
+ Style/RedundantRegexpCharacterClass:
33
+ Enabled: true
34
+ Style/RedundantRegexpEscape:
35
+ Enabled: true
36
+ Style/AccessorGrouping:
37
+ Enabled: true
38
+ Style/BisectedAttrAccessor:
39
+ Enabled: true
40
+ Style/RedundantAssignment:
41
+ Enabled: true
42
+ Style/RedundantFetchBlock:
43
+ Enabled: true
44
+
45
+ # Is nothing sacred?
46
+ Layout/LineLength:
47
+ Max: 80
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ # Define the account command.
6
+ #
7
+ class WavefrontCommandAccount < WavefrontCommandBase
8
+ def description
9
+ "view and manage Wavefront #{things}"
10
+ end
11
+
12
+ def _commands
13
+ ["list #{CMN} [-sSal] [-O fields] [-o offset] [-L limit]",
14
+ "describe #{CMN} <id>",
15
+ "create user #{CMN} [-m permission...] [-g group-id...] " \
16
+ '[-r role-id...] [-i policy-id] <id>',
17
+ "invite user #{CMN} [-m permission...] [-g group-id...] " \
18
+ '[-r role-id...] [-i policy-id] <id>',
19
+ "delete #{CMN} <id>",
20
+ "dump #{CMN}",
21
+ "import #{CMN} [-uU] <file>",
22
+ "role #{CMN} add to <id> <role>...",
23
+ "role #{CMN} remove from <id> <role>...",
24
+ "roles #{CMN} <id>",
25
+ "ingestionpolicy #{CMN} add to <id> <policy>",
26
+ "ingestionpolicy #{CMN} remove from <id> <policy>",
27
+ "ingestionpolicy #{CMN} <id>",
28
+ "group #{CMN} add to <id> <group>...",
29
+ "group #{CMN} remove from <id> <group>...",
30
+ "groups #{CMN} <id>",
31
+ "grant #{CMN} <permission> to <account>...",
32
+ "revoke #{CMN} <permission> from <account>...",
33
+ "permissions #{CMN} <id>",
34
+ "business functions #{CMN} <id>",
35
+ "validate #{CMN} [-l] <account>...",
36
+ "search #{CMN} [-al] [-o offset] [-L limit] [-O fields] <condition>..."]
37
+ end
38
+
39
+ def _options
40
+ [common_options,
41
+ "-l, --long list #{things} in detail",
42
+ "-a, --all list all #{things}",
43
+ "-o, --offset=n start from nth #{thing}",
44
+ "-L, --limit=COUNT number of #{things} to list",
45
+ '-s, --service list only service accounts',
46
+ '-S, --user list only user accounts',
47
+ '-O, --fields=F1,F2,... only show given fields',
48
+ "-u, --update update an existing #{thing}",
49
+ "-U, --upsert import new or update existing #{thing}",
50
+ '-m, --permission=STRING Wavefront permission name',
51
+ '-g, --groupid=STRING Wavefront usergroup ID',
52
+ '-r, --roleid=STRING Wavefront role ID',
53
+ '-i, --policyid=STRING Wavefront ingestion policy ID']
54
+ end
55
+
56
+ def postscript
57
+ 'Service accounts can be partially managed with this command, but ' \
58
+ "'wf serviceaccount' has more features.\n\nFor a list of permissions, " \
59
+ "run 'wf settings list permissions'.".fold(TW, 0)
60
+ end
61
+ end
@@ -8,6 +8,7 @@ class WavefrontCommandAlert < WavefrontCommandBase
8
8
  def _commands
9
9
  ["list #{CMN} [-al] [-O fields] [-o offset] [-L limit]",
10
10
  "firing #{CMN} [-o offset] [-L limit]",
11
+ "affected #{CMN} hosts [<id>]",
11
12
  "snoozed #{CMN} [-o offset] [-L limit]",
12
13
  "describe #{CMN} [-v version] <id>",
13
14
  "delete #{CMN} <id>",
@@ -165,6 +165,6 @@ class WavefrontCommandBase
165
165
  # @return [String] a full options string which docopt understands
166
166
  #
167
167
  def docopt
168
- commands + "\n\n" + options + "\n" + postscript
168
+ commands + "\n\n" + options + "\n\n" + postscript
169
169
  end
170
170
  end
@@ -12,7 +12,7 @@ class WavefrontCommandQuery < WavefrontCommandBase
12
12
  def _commands
13
13
  ['aliases [-DV] [-c file] [-P profile]',
14
14
  "#{CMN} [-g granularity] [-s time] [-e time] " \
15
- '[-WikvO] [-S mode] [-N name] [-p points] [-F options] <query>',
15
+ '[-ikvCGKOW] [-S mode] [-N name] [-p points] [-F options] <query>',
16
16
  "raw #{CMN} [-H host] [-s time] [-e time] " \
17
17
  '[-F options] <metric>',
18
18
  "run #{CMN} [-g granularity] [-s time] [-e time] " \
@@ -36,6 +36,9 @@ class WavefrontCommandQuery < WavefrontCommandBase
36
36
  '-F, --format-opts=STRING comma-separated options to pass to ' \
37
37
  'output formatter',
38
38
  '-k, --nospark do not show sparkline',
39
+ '-C, --nocache do not use the query cache',
40
+ '-K, --nostrict allow points outside the query window',
41
+ '-G, --histogram-view use histogram view rather than metric',
39
42
  '-W, --nowarn do not show API warning messages']
40
43
  end
41
44
 
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ # Define the 'role' command.
6
+ #
7
+ class WavefrontCommandRole < WavefrontCommandBase
8
+ def _commands
9
+ ["list #{CMN} [-al] [-O fields] [-o offset] [-L limit]",
10
+ "describe #{CMN} <id>",
11
+ "create #{CMN} [-d description] [-p permission...] <name>",
12
+ "delete #{CMN} <id>",
13
+ "dump #{CMN}",
14
+ "import #{CMN} [-uU] <file>",
15
+ "set #{CMN} <key=value> <id>",
16
+ "accounts #{CMN} <id>",
17
+ "groups #{CMN} <id>",
18
+ "permissions #{CMN} <id>",
19
+ "give #{CMN} <id> to <member>...",
20
+ "take #{CMN} <id> from <member>...",
21
+ "grant #{CMN} <permission> to <id>",
22
+ "revoke #{CMN} <permission> from <id>",
23
+ "search #{CMN} [-al] [-o offset] [-L limit] [-O fields] <condition>..."]
24
+ end
25
+
26
+ def _options
27
+ [common_options,
28
+ "-l, --long list #{things} in detail",
29
+ "-a, --all list all #{things}",
30
+ "-o, --offset=n start from nth #{thing}",
31
+ "-L, --limit=COUNT number of #{things} to list",
32
+ '-O, --fields=F1,F2,... only show given fields',
33
+ "-u, --update update an existing #{thing}",
34
+ "-U, --upsert import new or update existing #{thing}",
35
+ "-d, --description=STRING description of #{thing}",
36
+ '-p, --permission=STRING Wavefront permission']
37
+ end
38
+
39
+ def postscript
40
+ "A role 'member' can be an account ID or a usergroup ID. 'wf settings " \
41
+ "list permissions' will give you a list of all currently supported " \
42
+ 'permissions.'.fold(TW, 0)
43
+ end
44
+ end