crowbar-client 2.2.1 → 2.3.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 +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/crowbar/client/app/backup.rb +148 -0
- data/lib/crowbar/client/app/entry.rb +4 -4
- data/lib/crowbar/client/app/node.rb +26 -13
- data/lib/crowbar/client/app/proposal.rb +59 -0
- data/lib/crowbar/client/app.rb +3 -3
- data/lib/crowbar/client/command/{reset/proposal.rb → backup/create.rb} +9 -3
- data/lib/crowbar/client/command/backup/delete.rb +42 -0
- data/lib/crowbar/client/command/backup/download.rb +68 -0
- data/lib/crowbar/client/command/backup/list.rb +76 -0
- data/lib/crowbar/client/command/{reset/nodes.rb → backup/upload.rb} +9 -4
- data/lib/crowbar/client/command/{reset.rb → backup.rb} +14 -5
- data/lib/crowbar/client/command/node/group.rb +44 -0
- data/lib/crowbar/client/command/node/list.rb +37 -16
- data/lib/crowbar/client/command/node.rb +3 -0
- data/lib/crowbar/client/command/proposal/reset.rb +48 -0
- data/lib/crowbar/client/command/proposal.rb +3 -0
- data/lib/crowbar/client/command.rb +3 -3
- data/lib/crowbar/client/config.rb +5 -5
- data/lib/crowbar/client/mixin/barclamp.rb +1 -4
- data/lib/crowbar/client/request/backup/create.rb +46 -0
- data/lib/crowbar/client/request/{reset/proposal.rb → backup/delete.rb} +8 -4
- data/lib/crowbar/client/request/backup/download.rb +47 -0
- data/lib/crowbar/client/request/{reset/nodes.rb → backup/list.rb} +6 -3
- data/lib/crowbar/client/request/backup/upload.rb +48 -0
- data/lib/crowbar/client/request/backup.rb +38 -0
- data/lib/crowbar/client/request/base.rb +4 -4
- data/lib/crowbar/client/request/node/group.rb +39 -0
- data/lib/crowbar/client/request/node.rb +3 -0
- data/lib/crowbar/client/request/party.rb +2 -2
- data/lib/crowbar/client/request/proposal/reset.rb +40 -0
- data/lib/crowbar/client/request/proposal.rb +3 -0
- data/lib/crowbar/client/request.rb +3 -3
- data/lib/crowbar/client/version.rb +2 -2
- data/spec/crowbar/client/command/backup/create_spec.rb +42 -0
- data/spec/crowbar/client/command/backup/delete_spec.rb +41 -0
- data/spec/crowbar/client/command/backup/download_spec.rb +40 -0
- data/spec/crowbar/client/command/{reset/nodes_spec.rb → backup/list_spec.rb} +3 -3
- data/spec/crowbar/client/command/backup/upload_spec.rb +40 -0
- data/spec/crowbar/client/command/{reset/proposal_spec.rb → node/group_spec.rb} +3 -3
- data/spec/crowbar/client/command/proposal/create_spec.rb +3 -7
- data/spec/crowbar/client/command/proposal/edit_spec.rb +4 -8
- data/spec/crowbar/client/command/proposal/reset_spec.rb +39 -0
- data/spec/crowbar/client/request/{reset/proposal_spec.rb → backup/create_spec.rb} +37 -36
- data/spec/crowbar/client/request/{reset/nodes_spec.rb → backup/delete_spec.rb} +34 -36
- data/spec/crowbar/client/request/backup/download_spec.rb +53 -0
- data/spec/crowbar/client/request/backup/list_spec.rb +52 -0
- data/spec/crowbar/client/request/backup/upload_spec.rb +55 -0
- data/spec/crowbar/client/request/barclamp/list_spec.rb +1 -1
- data/spec/crowbar/client/request/batch/build_spec.rb +1 -1
- data/spec/crowbar/client/request/batch/export_spec.rb +1 -1
- data/spec/crowbar/client/request/host_ip/allocate_spec.rb +1 -1
- data/spec/crowbar/client/request/host_ip/deallocate_spec.rb +1 -1
- data/spec/crowbar/client/request/installer/start_spec.rb +1 -1
- data/spec/crowbar/client/request/installer/status_spec.rb +1 -1
- data/spec/crowbar/client/request/interface/disable_spec.rb +1 -1
- data/spec/crowbar/client/request/interface/enable_spec.rb +1 -1
- data/spec/crowbar/client/request/node/action_spec.rb +1 -1
- data/spec/crowbar/client/request/node/delete_spec.rb +1 -1
- data/spec/crowbar/client/request/node/group_spec.rb +53 -0
- data/spec/crowbar/client/request/node/list_spec.rb +1 -1
- data/spec/crowbar/client/request/node/rename_spec.rb +1 -1
- data/spec/crowbar/client/request/node/role_spec.rb +1 -1
- data/spec/crowbar/client/request/node/show_spec.rb +1 -1
- data/spec/crowbar/client/request/node/status_spec.rb +1 -1
- data/spec/crowbar/client/request/node/transition_spec.rb +1 -1
- data/spec/crowbar/client/request/proposal/commit_spec.rb +1 -1
- data/spec/crowbar/client/request/proposal/create_spec.rb +34 -36
- data/spec/crowbar/client/request/proposal/delete_spec.rb +1 -1
- data/spec/crowbar/client/request/proposal/dequeue_spec.rb +1 -1
- data/spec/crowbar/client/request/proposal/edit_spec.rb +34 -36
- data/spec/crowbar/client/request/proposal/list_spec.rb +1 -1
- data/spec/crowbar/client/request/proposal/reset_spec.rb +53 -0
- data/spec/crowbar/client/request/proposal/show_spec.rb +1 -1
- data/spec/crowbar/client/request/proposal/template_spec.rb +1 -1
- data/spec/crowbar/client/request/repository/activate_all_spec.rb +1 -1
- data/spec/crowbar/client/request/repository/activate_spec.rb +1 -1
- data/spec/crowbar/client/request/repository/deactivate_all_spec.rb +1 -1
- data/spec/crowbar/client/request/repository/deactivate_spec.rb +1 -1
- data/spec/crowbar/client/request/repository/list_spec.rb +1 -1
- data/spec/crowbar/client/request/role/list_spec.rb +1 -1
- data/spec/crowbar/client/request/role/show_spec.rb +1 -1
- data/spec/crowbar/client/request/server/api_spec.rb +1 -1
- data/spec/crowbar/client/request/virtual_ip/allocate_spec.rb +1 -1
- data/spec/crowbar/client/request/virtual_ip/deallocate_spec.rb +1 -1
- data/spec/fixtures/upload.tgz +0 -0
- data/spec/spec_helper.rb +2 -0
- data/{lib/crowbar/client/request/reset.rb → spec/support/helper_methods.rb} +10 -11
- data/spec/support/request_examples.rb +31 -12
- metadata +130 -96
- data/lib/crowbar/client/app/reset.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 196e25c8ac9b8112656985164751b9a51b732178
|
4
|
+
data.tar.gz: 3d281cb6d8561bc51f78d9aae02517b714761d0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba6e3e297bd4a9d22c6c737c040101af78dbf2b1c70b9ee70eddb377f72e844b3759e098dcbd646998ebababb04d9c6070d666048b95eb6bdcfa58387c99fefe
|
7
|
+
data.tar.gz: 8572d1bb1472e8a57133bd94731205783011803fb5902ef8f0947591350f6197b2bd19fc1237defeec06c6a455d6352e58a2c4d9f2c85976a9b20424d0b8dfd6
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [2.3.0](https://github.com/crowbar/crowbar-client/releases/tag/v2.3.0) - 2015-01-15
|
4
|
+
|
5
|
+
* BREAKING
|
6
|
+
* Dropped --no-aliases option from node list subcommand (@tboerger)
|
7
|
+
* Dropped --no-names option from node list subcommand (@tboerger)
|
8
|
+
* ENHANCEMENT
|
9
|
+
* Added more columns to node list subcommand (@tboerger)
|
10
|
+
* Order node list subcommand output alphabetically now (@tboerger)
|
11
|
+
* Added subcommand to reset a proposal state through the API (@tboerger)
|
12
|
+
* Added subcommand to interact with the backup API (@tboerger)
|
13
|
+
* Added subcommand to set the group of a node (@tboerger)
|
14
|
+
|
3
15
|
## [2.2.1](https://github.com/crowbar/crowbar-client/releases/tag/v2.2.1) - 2015-12-15
|
4
16
|
|
5
17
|
* BUGFIX
|
@@ -0,0 +1,148 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, SUSE Linux GmbH
|
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
|
+
class Backup < Base
|
21
|
+
desc "list",
|
22
|
+
"List existing backups"
|
23
|
+
|
24
|
+
long_desc <<-LONGDESC
|
25
|
+
`list` will print out a list of existing backups on the admin
|
26
|
+
node. You can display the list in different output
|
27
|
+
formats and you can filter the list by any search criteria.
|
28
|
+
|
29
|
+
With --format <format> option you can choose an output format
|
30
|
+
with the available options table, json or plain. You can also
|
31
|
+
use the shortcut options --table, --json or --plain.
|
32
|
+
|
33
|
+
With --filter <filter> option you can limit the result of
|
34
|
+
printed out elements. You can use any substring that is part
|
35
|
+
of the found elements.
|
36
|
+
LONGDESC
|
37
|
+
|
38
|
+
method_option :format,
|
39
|
+
type: :string,
|
40
|
+
default: "table",
|
41
|
+
banner: "<format>",
|
42
|
+
desc: "Format of the output, valid formats are table, json or plain"
|
43
|
+
|
44
|
+
method_option :table,
|
45
|
+
type: :boolean,
|
46
|
+
default: false,
|
47
|
+
aliases: [],
|
48
|
+
desc: "Format output as table, a shortcut for --format table option"
|
49
|
+
|
50
|
+
method_option :json,
|
51
|
+
type: :boolean,
|
52
|
+
default: false,
|
53
|
+
aliases: [],
|
54
|
+
desc: "Format output as table, a shortcut for --format table option"
|
55
|
+
|
56
|
+
method_option :plain,
|
57
|
+
type: :boolean,
|
58
|
+
default: false,
|
59
|
+
aliases: [],
|
60
|
+
desc: "Format output as table, a shortcut for --format table option"
|
61
|
+
|
62
|
+
method_option :filter,
|
63
|
+
type: :string,
|
64
|
+
default: nil,
|
65
|
+
banner: "<filter>",
|
66
|
+
desc: "Filter by criteria, display only data that contains filter"
|
67
|
+
|
68
|
+
def list
|
69
|
+
Command::Backup::List.new(
|
70
|
+
*command_params
|
71
|
+
).execute
|
72
|
+
rescue => e
|
73
|
+
catch_errors(e)
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "create",
|
77
|
+
"Create a new backup"
|
78
|
+
|
79
|
+
long_desc <<-LONGDESC
|
80
|
+
`create NAME` will create a new backup on the Administration Server.
|
81
|
+
LONGDESC
|
82
|
+
|
83
|
+
def create(name)
|
84
|
+
Command::Backup::Create.new(
|
85
|
+
*command_params(
|
86
|
+
backup: name
|
87
|
+
)
|
88
|
+
).execute
|
89
|
+
rescue => e
|
90
|
+
catch_errors(e)
|
91
|
+
end
|
92
|
+
|
93
|
+
desc "download",
|
94
|
+
"Download a backup"
|
95
|
+
|
96
|
+
long_desc <<-LONGDESC
|
97
|
+
`download ID` will download a backup from the Administration Server.
|
98
|
+
LONGDESC
|
99
|
+
|
100
|
+
def download(id)
|
101
|
+
Command::Backup::Download.new(
|
102
|
+
*command_params(
|
103
|
+
id: id
|
104
|
+
)
|
105
|
+
).execute
|
106
|
+
rescue => e
|
107
|
+
catch_errors(e)
|
108
|
+
end
|
109
|
+
|
110
|
+
desc "upload",
|
111
|
+
"Upload a backup"
|
112
|
+
|
113
|
+
long_desc <<-LONGDESC
|
114
|
+
`upload FILE` will upload a backup to the Administration Server.
|
115
|
+
LONGDESC
|
116
|
+
|
117
|
+
def upload(file)
|
118
|
+
Command::Backup::Upload.new(
|
119
|
+
*command_params(
|
120
|
+
file: File.new(
|
121
|
+
file
|
122
|
+
)
|
123
|
+
)
|
124
|
+
).execute
|
125
|
+
rescue => e
|
126
|
+
catch_errors(e)
|
127
|
+
end
|
128
|
+
|
129
|
+
desc "delete",
|
130
|
+
"Delete a backup"
|
131
|
+
|
132
|
+
long_desc <<-LONGDESC
|
133
|
+
`delete ID` will delete a backup from the Administration Server.
|
134
|
+
LONGDESC
|
135
|
+
|
136
|
+
def delete(id)
|
137
|
+
Command::Backup::Delete.new(
|
138
|
+
*command_params(
|
139
|
+
id: id
|
140
|
+
)
|
141
|
+
).execute
|
142
|
+
rescue => e
|
143
|
+
catch_errors(e)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -78,6 +78,10 @@ module Crowbar
|
|
78
78
|
say "crowbar-client v#{Crowbar::Client::Version}"
|
79
79
|
end
|
80
80
|
|
81
|
+
desc "backup [COMMANDS]",
|
82
|
+
"Backup specific commands, call without params for help"
|
83
|
+
subcommand "backup", Crowbar::Client::App::Backup
|
84
|
+
|
81
85
|
desc "barclamp [COMMANDS]",
|
82
86
|
"Barclamp specific commands, call without params for help"
|
83
87
|
subcommand "barclamp", Crowbar::Client::App::Barclamp
|
@@ -102,10 +106,6 @@ module Crowbar
|
|
102
106
|
"Repository specific commands, call without params for help"
|
103
107
|
subcommand "repository", Crowbar::Client::App::Repository
|
104
108
|
|
105
|
-
desc "reset [COMMANDS]",
|
106
|
-
"Reset specific commands, call without params for help"
|
107
|
-
subcommand "reset", Crowbar::Client::App::Reset
|
108
|
-
|
109
109
|
desc "role [COMMANDS]",
|
110
110
|
"Role specific commands, call without params for help"
|
111
111
|
subcommand "role", Crowbar::Client::App::Role
|
@@ -101,11 +101,9 @@ module Crowbar
|
|
101
101
|
printed out elements. You can use any substring that is part
|
102
102
|
of the found elements.
|
103
103
|
|
104
|
-
With --no-
|
105
|
-
|
106
|
-
|
107
|
-
With --no-names switch you can disable the output of the node
|
108
|
-
names, per default the listing will display them.
|
104
|
+
With --no-meta switch you can disable the additional information
|
105
|
+
and just get a list of names and aliases for further scripting
|
106
|
+
where you don't care about the other columns.
|
109
107
|
LONGDESC
|
110
108
|
|
111
109
|
method_option :format,
|
@@ -138,17 +136,11 @@ module Crowbar
|
|
138
136
|
banner: "<filter>",
|
139
137
|
desc: "Filter by criteria, display only data that contains filter"
|
140
138
|
|
141
|
-
method_option :
|
142
|
-
type: :boolean,
|
143
|
-
default: true,
|
144
|
-
aliases: [],
|
145
|
-
desc: "Show or hide the aliases for the available nodes within listing"
|
146
|
-
|
147
|
-
method_option :names,
|
139
|
+
method_option :meta,
|
148
140
|
type: :boolean,
|
149
141
|
default: true,
|
150
142
|
aliases: [],
|
151
|
-
desc: "Show or hide the
|
143
|
+
desc: "Show or hide the additional meta info like group and status"
|
152
144
|
|
153
145
|
def list
|
154
146
|
Command::Node::List.new(
|
@@ -455,6 +447,27 @@ module Crowbar
|
|
455
447
|
catch_errors(e)
|
456
448
|
end
|
457
449
|
|
450
|
+
desc "group NAME_OR_ALIAS GROUP",
|
451
|
+
"Assign another group to a node"
|
452
|
+
|
453
|
+
long_desc <<-LONGDESC
|
454
|
+
`group NAME_OR_ALIAS GROUP` will try to assign the specified
|
455
|
+
node to a different group. If you want to guess a group
|
456
|
+
automatically you can provide the group "automatic", then you
|
457
|
+
will get the new name as a response.
|
458
|
+
LONGDESC
|
459
|
+
|
460
|
+
def group(name, value)
|
461
|
+
Command::Node::Group.new(
|
462
|
+
*command_params(
|
463
|
+
name: name,
|
464
|
+
value: value
|
465
|
+
)
|
466
|
+
).execute
|
467
|
+
rescue => e
|
468
|
+
catch_errors(e)
|
469
|
+
end
|
470
|
+
|
458
471
|
desc "transition NAME_OR_ALIAS STATE",
|
459
472
|
"Transition a node to a specific state"
|
460
473
|
|
@@ -294,6 +294,65 @@ module Crowbar
|
|
294
294
|
rescue => e
|
295
295
|
catch_errors(e)
|
296
296
|
end
|
297
|
+
|
298
|
+
desc "reset BARCLAMP [PROPOSAL]",
|
299
|
+
"Reset a proposal for specific barclamp"
|
300
|
+
|
301
|
+
long_desc <<-LONGDESC
|
302
|
+
`reset BARCLAMP [PROPOSAL]` will try to reset the state
|
303
|
+
for the specified barclamp. If you don't provide a proposal
|
304
|
+
the client will select the default proposal. The usage of
|
305
|
+
this command is unsupported, unless you have been specifically
|
306
|
+
told to run it as part of a support request!
|
307
|
+
|
308
|
+
With --yes option you can force the reset without any further
|
309
|
+
question, this skips the otherwise required confirmation.
|
310
|
+
LONGDESC
|
311
|
+
|
312
|
+
method_option :yes,
|
313
|
+
type: :boolean,
|
314
|
+
default: false,
|
315
|
+
aliases: [],
|
316
|
+
desc: "Force the reset without any confirmation message"
|
317
|
+
|
318
|
+
def reset(barclamp, proposal = "default")
|
319
|
+
unless accepts_reset?
|
320
|
+
say "Canceled reset"
|
321
|
+
return
|
322
|
+
end
|
323
|
+
|
324
|
+
Command::Proposal::Reset.new(
|
325
|
+
*command_params(
|
326
|
+
barclamp: barclamp,
|
327
|
+
proposal: proposal
|
328
|
+
)
|
329
|
+
).execute
|
330
|
+
rescue => e
|
331
|
+
catch_errors(e)
|
332
|
+
end
|
333
|
+
|
334
|
+
no_commands do
|
335
|
+
def accepts_reset?
|
336
|
+
return true if options[:yes]
|
337
|
+
|
338
|
+
question = <<-QUESTION.strip_heredoc
|
339
|
+
Usage of this command is unsupported, unless you have been
|
340
|
+
specifically told to run it as part of a support request!
|
341
|
+
Are you sure you want to proceed?
|
342
|
+
QUESTION
|
343
|
+
|
344
|
+
answer = ask(
|
345
|
+
question,
|
346
|
+
:red,
|
347
|
+
limited_to: [
|
348
|
+
"yes",
|
349
|
+
"no"
|
350
|
+
]
|
351
|
+
)
|
352
|
+
|
353
|
+
answer == "yes"
|
354
|
+
end
|
355
|
+
end
|
297
356
|
end
|
298
357
|
end
|
299
358
|
end
|
data/lib/crowbar/client/app.rb
CHANGED
@@ -17,6 +17,9 @@
|
|
17
17
|
module Crowbar
|
18
18
|
module Client
|
19
19
|
module App
|
20
|
+
autoload :Backup,
|
21
|
+
File.expand_path("../app/backup", __FILE__)
|
22
|
+
|
20
23
|
autoload :Barclamp,
|
21
24
|
File.expand_path("../app/barclamp", __FILE__)
|
22
25
|
|
@@ -50,9 +53,6 @@ module Crowbar
|
|
50
53
|
autoload :Repository,
|
51
54
|
File.expand_path("../app/repository", __FILE__)
|
52
55
|
|
53
|
-
autoload :Reset,
|
54
|
-
File.expand_path("../app/reset", __FILE__)
|
55
|
-
|
56
56
|
autoload :Role,
|
57
57
|
File.expand_path("../app/role", __FILE__)
|
58
58
|
|
@@ -17,16 +17,22 @@
|
|
17
17
|
module Crowbar
|
18
18
|
module Client
|
19
19
|
module Command
|
20
|
-
module
|
21
|
-
class
|
20
|
+
module Backup
|
21
|
+
class Create < Base
|
22
22
|
def request
|
23
|
-
@request ||= Request::
|
23
|
+
@request ||= Request::Backup::Create.new(
|
24
24
|
args
|
25
25
|
)
|
26
26
|
end
|
27
27
|
|
28
28
|
def execute
|
29
29
|
request.process do |request|
|
30
|
+
case request.code
|
31
|
+
when 200
|
32
|
+
say "Successfully created the backup"
|
33
|
+
else
|
34
|
+
err request.parsed_response["error"]
|
35
|
+
end
|
30
36
|
end
|
31
37
|
end
|
32
38
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, SUSE Linux GmbH
|
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
|
+
module Backup
|
21
|
+
class Delete < Base
|
22
|
+
def request
|
23
|
+
@request ||= Request::Backup::Delete.new(
|
24
|
+
args
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def execute
|
29
|
+
request.process do |request|
|
30
|
+
case request.code
|
31
|
+
when 200
|
32
|
+
say "Successfully deleted the backup"
|
33
|
+
else
|
34
|
+
err request.parsed_response["error"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, SUSE Linux GmbH
|
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 "httparty"
|
18
|
+
|
19
|
+
module Crowbar
|
20
|
+
module Client
|
21
|
+
module Command
|
22
|
+
module Backup
|
23
|
+
class Download < Base
|
24
|
+
def request
|
25
|
+
@request ||= Request::Backup::Download.new(
|
26
|
+
args
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def execute
|
31
|
+
request.process do |request|
|
32
|
+
case request.code
|
33
|
+
when 200
|
34
|
+
if write(request.body)
|
35
|
+
say "Successfully downloaded backup to #{path}"
|
36
|
+
else
|
37
|
+
say "Failed to download backup to #{path}"
|
38
|
+
end
|
39
|
+
else
|
40
|
+
err request.parsed_response["error"]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
def write(body)
|
48
|
+
path.open("wb") do |f|
|
49
|
+
f.binmode
|
50
|
+
f.write body
|
51
|
+
|
52
|
+
true
|
53
|
+
end
|
54
|
+
rescue
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
def path
|
59
|
+
filename = Request::Backup::List.new.process do |p|
|
60
|
+
p.parsed_response.select { |s| s["id"] == args.id.to_i }
|
61
|
+
end.first["name"]
|
62
|
+
Pathname.new("#{filename}.tar.gz")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, SUSE Linux GmbH
|
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
|
+
module Backup
|
21
|
+
class List < Base
|
22
|
+
include Mixin::Format
|
23
|
+
include Mixin::Filter
|
24
|
+
|
25
|
+
def request
|
26
|
+
@request ||= Request::Backup::List.new(
|
27
|
+
args
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def execute
|
32
|
+
request.process do |request|
|
33
|
+
case request.code
|
34
|
+
when 200
|
35
|
+
formatter = Formatter::Hash.new(
|
36
|
+
format: provide_format,
|
37
|
+
headings: headings,
|
38
|
+
values: Filter::Hash.new(
|
39
|
+
filter: provide_filter,
|
40
|
+
values: content_from(request)
|
41
|
+
).result
|
42
|
+
)
|
43
|
+
|
44
|
+
if formatter.empty?
|
45
|
+
err "No backups"
|
46
|
+
else
|
47
|
+
say formatter.result
|
48
|
+
end
|
49
|
+
else
|
50
|
+
err request.parsed_response["error"]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def headings
|
58
|
+
["Id", "Name", "Created", "Size", "Version"]
|
59
|
+
end
|
60
|
+
|
61
|
+
def content_from(request)
|
62
|
+
request.parsed_response.map do |row|
|
63
|
+
row.slice(
|
64
|
+
"id",
|
65
|
+
"name",
|
66
|
+
"created_at",
|
67
|
+
"size",
|
68
|
+
"version"
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
#
|
2
1
|
# Copyright 2015, SUSE Linux GmbH
|
3
2
|
#
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -17,16 +16,22 @@
|
|
17
16
|
module Crowbar
|
18
17
|
module Client
|
19
18
|
module Command
|
20
|
-
module
|
21
|
-
class
|
19
|
+
module Backup
|
20
|
+
class Upload < Base
|
22
21
|
def request
|
23
|
-
@request ||= Request::
|
22
|
+
@request ||= Request::Backup::Upload.new(
|
24
23
|
args
|
25
24
|
)
|
26
25
|
end
|
27
26
|
|
28
27
|
def execute
|
29
28
|
request.process do |request|
|
29
|
+
case request.code
|
30
|
+
when 200
|
31
|
+
say "Successfully uploaded backup"
|
32
|
+
else
|
33
|
+
err request.parsed_response["error"]
|
34
|
+
end
|
30
35
|
end
|
31
36
|
end
|
32
37
|
end
|
@@ -17,12 +17,21 @@
|
|
17
17
|
module Crowbar
|
18
18
|
module Client
|
19
19
|
module Command
|
20
|
-
module
|
21
|
-
autoload :
|
22
|
-
File.expand_path("../
|
20
|
+
module Backup
|
21
|
+
autoload :Create,
|
22
|
+
File.expand_path("../backup/create", __FILE__)
|
23
23
|
|
24
|
-
autoload :
|
25
|
-
File.expand_path("../
|
24
|
+
autoload :Delete,
|
25
|
+
File.expand_path("../backup/delete", __FILE__)
|
26
|
+
|
27
|
+
autoload :Download,
|
28
|
+
File.expand_path("../backup/download", __FILE__)
|
29
|
+
|
30
|
+
autoload :List,
|
31
|
+
File.expand_path("../backup/list", __FILE__)
|
32
|
+
|
33
|
+
autoload :Upload,
|
34
|
+
File.expand_path("../backup/upload", __FILE__)
|
26
35
|
end
|
27
36
|
end
|
28
37
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, SUSE Linux GmbH
|
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
|
+
module Node
|
21
|
+
class Group < Base
|
22
|
+
def request
|
23
|
+
@request ||= Request::Node::Group.new(
|
24
|
+
args
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def execute
|
29
|
+
request.process do |request|
|
30
|
+
case request.code
|
31
|
+
when 200
|
32
|
+
say "Successfully updated group to #{request.parsed_response["group"]}"
|
33
|
+
when 404
|
34
|
+
err "Node does not exist"
|
35
|
+
else
|
36
|
+
err request.parsed_response["error"]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|