crowbar-client 3.6.1 → 3.9.3

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/lib/crowbar/client/app.rb +6 -0
  4. data/lib/crowbar/client/app/entry.rb +13 -0
  5. data/lib/crowbar/client/app/proposal.rb +20 -0
  6. data/lib/crowbar/client/app/restricted.rb +136 -0
  7. data/lib/crowbar/client/app/ses.rb +54 -0
  8. data/lib/crowbar/client/command.rb +6 -0
  9. data/lib/crowbar/client/command/base.rb +9 -0
  10. data/lib/crowbar/client/command/proposal/edit.rb +5 -1
  11. data/lib/crowbar/client/command/proposal/show.rb +7 -1
  12. data/lib/crowbar/client/command/restricted.rb +38 -0
  13. data/lib/crowbar/client/command/restricted/allocate.rb +51 -0
  14. data/lib/crowbar/client/command/restricted/ping.rb +45 -0
  15. data/lib/crowbar/client/command/restricted/show.rb +72 -0
  16. data/lib/crowbar/client/command/restricted/transition.rb +47 -0
  17. data/lib/crowbar/client/command/ses.rb +29 -0
  18. data/lib/crowbar/client/command/ses/upload.rb +60 -0
  19. data/lib/crowbar/client/command/upgrade/repocheck.rb +3 -1
  20. data/lib/crowbar/client/config.rb +24 -8
  21. data/lib/crowbar/client/request.rb +6 -0
  22. data/lib/crowbar/client/request/restricted.rb +38 -0
  23. data/lib/crowbar/client/request/restricted/allocate.rb +50 -0
  24. data/lib/crowbar/client/request/restricted/ping.rb +49 -0
  25. data/lib/crowbar/client/request/restricted/show.rb +50 -0
  26. data/lib/crowbar/client/request/restricted/transition.rb +63 -0
  27. data/lib/crowbar/client/request/ses.rb +29 -0
  28. data/lib/crowbar/client/request/ses/upload.rb +65 -0
  29. data/lib/crowbar/client/util.rb +3 -0
  30. data/lib/crowbar/client/util/apiversion.rb +2 -8
  31. data/lib/crowbar/client/util/osrelease.rb +37 -0
  32. data/lib/crowbar/client/version.rb +2 -2
  33. metadata +26 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f96242929ff4f63474c38f48779c047d71c06674f51f73b6b48dd939f2de6c90
4
- data.tar.gz: bea1ac00753c5d93e682299bc66c9e375faba6384e0d08db72d59ad6ee0a7c93
3
+ metadata.gz: e428d67fddb2605dc6e67286978de425bcdb5ebd45a932b31b1e13d570446a01
4
+ data.tar.gz: 31c88554931ea3a50ffb69dff36a65ae13f7b6791d9d5fd2c7f59ed213f437f5
5
5
  SHA512:
6
- metadata.gz: d279752db885d75556c6c4bb6d6c08793995fa67a07258da904bad1789769b47f223bd2074c0a18b20445eab7d3c9f80b37c39d14449e20d896745f77bbf266b
7
- data.tar.gz: 41976f4fc7189ac6cf208f1958fddb3db0919a8e6d4628c6d10ecbb93d70fc651c2461389b049522b7b724f3d17d32edb614e173f0f447e84030a4d924948080
6
+ metadata.gz: a09a55cde22dc377eafea92a9379c660443c6543376b37a81346ebfc472c2bc6bda346a205ee7526447fd75c58c14d8296735af757121899ac39c2b8207e9a3b
7
+ data.tar.gz: a1b8116be6e1c8d3653e6b4c284e861b2a4ff71c67a66243190a95b36de9c0c7863c15ee3692161d1c40df621bb575659e641fc212563b7caf69bb3485610ed5
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.9.3](https://github.com/crowbar/crowbar-client/releases/tag/v3.9.2) - 2020-09-02
4
+
5
+ * ENHANCEMENT
6
+ * Enable restricted commands for Cloud 7 (bsc#1117080)
7
+
8
+ ## [3.9.2](https://github.com/crowbar/crowbar-client/releases/tag/v3.9.2) - 2020-03-09
9
+
10
+ * ENHANCEMENT
11
+ * Enable SES commands in Cloud8 (SOC-11122)
12
+
13
+ ## [3.9.1](https://github.com/crowbar/crowbar-client/releases/tag/v3.9.1) - 2019-07-01
14
+
15
+ * BUGFIX
16
+ * Fix repocheck table output (SOC-10718)
17
+ * Enable restricted commands for Cloud8 (bsc#1117080)
18
+
19
+ ## [3.9.0](https://github.com/crowbar/crowbar-client/releases/tag/v3.9.0) - 2019-04-05
20
+
21
+ * ENHANCEMENT
22
+ * Add support for the restricted APIs
23
+ * Add --raw to "proposal show" & "proposal edit"
24
+ * Correctly parse error messages that we don't handle natively
25
+
26
+ ## [3.8.0](https://github.com/crowbar/crowbar-client/releases/tag/v3.8.0) - 2019-04-02
27
+
28
+ * ENHANCEMENT
29
+ * Add 'ses' subcommand to upload SES configuration file to crowbar (@skazi0)
30
+
31
+ ## [3.7.0](https://github.com/crowbar/crowbar-client/releases/tag/v3.7.0) - 2018-12-14
32
+
33
+ * ENHANCEMENT
34
+ * Better upgrade repocheck output
35
+
3
36
  ## [3.6.1](https://github.com/crowbar/crowbar-client/releases/tag/v3.6.1) - 2018-12-07
4
37
 
5
38
  * BUGFIX
@@ -59,9 +59,15 @@ module Crowbar
59
59
  autoload :Repository,
60
60
  File.expand_path("../app/repository", __FILE__)
61
61
 
62
+ autoload :Restricted,
63
+ File.expand_path("../app/restricted", __FILE__)
64
+
62
65
  autoload :Role,
63
66
  File.expand_path("../app/role", __FILE__)
64
67
 
68
+ autoload :Ses,
69
+ File.expand_path("../app/ses", __FILE__)
70
+
65
71
  autoload :Server,
66
72
  File.expand_path("../app/server", __FILE__)
67
73
 
@@ -166,6 +166,19 @@ module Crowbar
166
166
  desc "services [COMMANDS]",
167
167
  "Services specific commands, call without params for help"
168
168
  subcommand "services", Crowbar::Client::App::Services
169
+
170
+ desc "ses [COMMANDS]",
171
+ "SES (Ceph) specific commands, call without params for help"
172
+ subcommand "ses", Crowbar::Client::App::Ses
173
+
174
+ desc "restricted [COMMANDS]",
175
+ "Commands specifc to restricted clients, call without params for help"
176
+ subcommand "restricted", Crowbar::Client::App::Restricted
177
+
178
+ # hide SES command in older versions
179
+ remove_command :ses unless Config.defaults[:cloud_version].to_i >= 8
180
+ # hide Restricted command in older versions
181
+ remove_command :restricted unless Config.defaults[:cloud_version].to_i >= 7
169
182
  end
170
183
  end
171
184
  end
@@ -98,6 +98,10 @@ module Crowbar
98
98
  With --filter <filter> option you can limit the result of
99
99
  printed out elements. You can use any substring that is part
100
100
  of the found elements.
101
+
102
+ With --raw option you can ensure that the program will not
103
+ automatically alter the proposal (to remove non-existing
104
+ nodes, for instance).
101
105
  LONGDESC
102
106
 
103
107
  method_option :format,
@@ -130,6 +134,12 @@ module Crowbar
130
134
  banner: "<filter>",
131
135
  desc: "Filter by criteria, display only data that contains filter"
132
136
 
137
+ method_option :raw,
138
+ type: :boolean,
139
+ default: false,
140
+ aliases: ["-r"],
141
+ desc: "Do not automatically edit the content of the proposal data"
142
+
133
143
  def show(barclamp, proposal)
134
144
  Command::Proposal::Show.new(
135
145
  *command_params(
@@ -221,6 +231,10 @@ module Crowbar
221
231
 
222
232
  With --merge option you can deep merge the provided data with
223
233
  the preloaded proposal.
234
+
235
+ With --raw option you can ensure that the program will not
236
+ automatically alter the proposal (to remove non-existing
237
+ nodes, for instance).
224
238
  LONGDESC
225
239
 
226
240
  method_option :data,
@@ -241,6 +255,12 @@ module Crowbar
241
255
  aliases: ["-m"],
242
256
  desc: "Merge input loaded from server with proposal data"
243
257
 
258
+ method_option :raw,
259
+ type: :boolean,
260
+ default: false,
261
+ aliases: ["-r"],
262
+ desc: "Do not automatically edit the content of the proposal data"
263
+
244
264
  def edit(barclamp, proposal)
245
265
  Command::Proposal::Edit.new(
246
266
  *command_params(
@@ -0,0 +1,136 @@
1
+ #
2
+ # Copyright 2019, SUSE
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Crowbar
18
+ module Client
19
+ module App
20
+ #
21
+ # A Thor based CLI wrapper for restricted commands
22
+ #
23
+ class Restricted < Base
24
+ desc "allocate NAME_OR_ALIAS",
25
+ "Allocate the specified node"
26
+
27
+ long_desc <<-LONGDESC
28
+ `allocate NAME_OR_ALIAS` will try to allocate the specified
29
+ node.
30
+ LONGDESC
31
+
32
+ def allocate(name)
33
+ Command::Restricted::Allocate.new(
34
+ *command_params(
35
+ name: name
36
+ )
37
+ ).execute
38
+ rescue => e
39
+ catch_errors(e)
40
+ end
41
+
42
+ desc "ping",
43
+ "Ping the administration server"
44
+
45
+ long_desc <<-LONGDESC
46
+ `ping` will check that the administration server is up.
47
+ LONGDESC
48
+
49
+ def ping
50
+ Command::Restricted::Ping.new(
51
+ *command_params
52
+ ).execute
53
+ rescue => e
54
+ catch_errors(e)
55
+ end
56
+
57
+ desc "show NAME_OR_ALIAS",
58
+ "Show restricted data for a specific node"
59
+
60
+ long_desc <<-LONGDESC
61
+ `show NAME_OR_ALIAS` will try to fetch the restricted data
62
+ for the specified node. If you just want to see a specific
63
+ subset of the restricted data you can provide the --filter
64
+ option separated by a dot for every element.
65
+
66
+ With --format <format> option you can choose an output format
67
+ with the available options table, json or plain. You can also
68
+ use the shortcut options --table, --json or --plain.
69
+
70
+ With --filter <filter> option you can limit the result of
71
+ printed out elements. You can use any substring that is part
72
+ of the found elements.
73
+ LONGDESC
74
+
75
+ method_option :format,
76
+ type: :string,
77
+ default: "table",
78
+ banner: "<format>",
79
+ desc: "Format of the output, valid formats are table, json or plain"
80
+
81
+ method_option :table,
82
+ type: :boolean,
83
+ default: false,
84
+ aliases: [],
85
+ desc: "Format output as table, a shortcut for --format table option"
86
+
87
+ method_option :json,
88
+ type: :boolean,
89
+ default: false,
90
+ aliases: [],
91
+ desc: "Format output as json, a shortcut for --format json option"
92
+
93
+ method_option :plain,
94
+ type: :boolean,
95
+ default: false,
96
+ aliases: [],
97
+ desc: "Format output as plain text, a shortcut for --format plain option"
98
+
99
+ method_option :filter,
100
+ type: :string,
101
+ default: nil,
102
+ banner: "<filter>",
103
+ desc: "Filter by criteria, display only data that contains filter"
104
+
105
+ def show(name)
106
+ Command::Restricted::Show.new(
107
+ *command_params(
108
+ name: name
109
+ )
110
+ ).execute
111
+ rescue => e
112
+ catch_errors(e)
113
+ end
114
+
115
+ desc "transition NAME_OR_ALIAS STATE",
116
+ "Transition a node to a specific state"
117
+
118
+ long_desc <<-LONGDESC
119
+ `transition NAME_OR_ALIAS STATE` will try to transition the
120
+ specified node into a specified state.
121
+ LONGDESC
122
+
123
+ def transition(name, state)
124
+ Command::Restricted::Transition.new(
125
+ *command_params(
126
+ name: name,
127
+ state: state
128
+ )
129
+ ).execute
130
+ rescue => e
131
+ catch_errors(e)
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,54 @@
1
+ #
2
+ # Copyright 2019, SUSE
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Crowbar
18
+ module Client
19
+ module App
20
+ #
21
+ # A Thor based CLI wrapper for SES commands
22
+ #
23
+ class Ses < Base
24
+ desc "upload FILE",
25
+ "Upload SES configuration file"
26
+
27
+ long_desc <<-LONGDESC
28
+ `upload FILE` will upload yaml file with SES configuration to the
29
+ server. Data inside this file could be used later for integrating
30
+ SES cluster with other services.
31
+ LONGDESC
32
+
33
+ #
34
+ # SES config upload command
35
+ #
36
+ # It will upload yaml file with SES configuration to the server.
37
+ # Data inside this file could be used later for integrating SES
38
+ # cluster with other services.
39
+ #
40
+ # @param file [String] the path to the file
41
+ #
42
+ def upload(file)
43
+ Command::Ses::Upload.new(
44
+ *command_params(
45
+ file: file
46
+ )
47
+ ).execute
48
+ rescue => e
49
+ catch_errors(e)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -53,9 +53,15 @@ module Crowbar
53
53
  autoload :Repository,
54
54
  File.expand_path("../command/repository", __FILE__)
55
55
 
56
+ autoload :Restricted,
57
+ File.expand_path("../command/restricted", __FILE__)
58
+
56
59
  autoload :Role,
57
60
  File.expand_path("../command/role", __FILE__)
58
61
 
62
+ autoload :Ses,
63
+ File.expand_path("../command/ses", __FILE__)
64
+
59
65
  autoload :Server,
60
66
  File.expand_path("../command/server", __FILE__)
61
67
 
@@ -58,6 +58,15 @@ module Crowbar
58
58
  end
59
59
 
60
60
  def err(message)
61
+ if message.is_a?(RestClient::Response)
62
+ begin
63
+ json = JSON.parse(message.to_s)
64
+ message = json.fetch("error", message)
65
+ rescue JSON::ParserError
66
+ # too bad, this is not what we expected, we'll print the ugly string
67
+ nil
68
+ end
69
+ end
61
70
  raise SimpleCatchableError, message
62
71
  end
63
72
  end
@@ -59,7 +59,11 @@ module Crowbar
59
59
 
60
60
  case result.code
61
61
  when 200
62
- deployment_cleanup result.parsed_response
62
+ if options[:raw]
63
+ result.parsed_response
64
+ else
65
+ deployment_cleanup result.parsed_response
66
+ end
63
67
  when 404
64
68
  err "Failed to preload proposal"
65
69
  else
@@ -40,13 +40,19 @@ module Crowbar
40
40
  request.process do |request|
41
41
  case request.code
42
42
  when 200
43
+ content = if options[:raw]
44
+ content_from(request)
45
+ else
46
+ deployment_cleanup(content_from(request))
47
+ end
48
+
43
49
  formatter = Formatter::Nested.new(
44
50
  format: provide_format,
45
51
  path: provide_filter,
46
52
  headings: ["Key", "Value"],
47
53
  values: Filter::Subset.new(
48
54
  filter: provide_filter,
49
- values: deployment_cleanup(content_from(request))
55
+ values: content
50
56
  ).result
51
57
  )
52
58
 
@@ -0,0 +1,38 @@
1
+ #
2
+ # Copyright 2019, SUSE
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Crowbar
18
+ module Client
19
+ module Command
20
+ #
21
+ # Module for the Restricted command implementations
22
+ #
23
+ module Restricted
24
+ autoload :Allocate,
25
+ File.expand_path("../restricted/allocate", __FILE__)
26
+
27
+ autoload :Ping,
28
+ File.expand_path("../restricted/ping", __FILE__)
29
+
30
+ autoload :Show,
31
+ File.expand_path("../restricted/show", __FILE__)
32
+
33
+ autoload :Transition,
34
+ File.expand_path("../restricted/transition", __FILE__)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ #
2
+ # Copyright 2019, SUSE
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "easy_diff"
18
+
19
+ module Crowbar
20
+ module Client
21
+ module Command
22
+ module Restricted
23
+ #
24
+ # Implementation for the restricted allocate command
25
+ #
26
+ class Allocate < Base
27
+ def request
28
+ @request ||= Request::Restricted::Allocate.new(
29
+ args.easy_merge(
30
+ action: :allocate
31
+ )
32
+ )
33
+ end
34
+
35
+ def execute
36
+ request.process do |request|
37
+ case request.code
38
+ when 200
39
+ say "Successfully triggered allocate for #{args.name}"
40
+ when 404
41
+ err "Node does not exist"
42
+ else
43
+ err request.parsed_response["error"]
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end