rhc 0.97.17 → 0.98.16

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 (93) hide show
  1. data/bin/rhc +9 -9
  2. data/bin/rhc-port-forward +3 -0
  3. data/bin/rhc-sshkey +3 -0
  4. data/features/README.md +163 -35
  5. data/features/application.feature +24 -0
  6. data/features/cartridge.feature +24 -0
  7. data/features/client.feature +11 -0
  8. data/features/domain.feature +29 -0
  9. data/features/lib/rhc_helper.rb +14 -0
  10. data/features/lib/rhc_helper/app.rb +2 -8
  11. data/features/lib/rhc_helper/cartridge.rb +1 -7
  12. data/features/lib/rhc_helper/commandify.rb +37 -6
  13. data/features/lib/rhc_helper/domain.rb +5 -1
  14. data/features/lib/rhc_helper/httpify.rb +124 -60
  15. data/features/lib/rhc_helper/loggable.rb +0 -2
  16. data/features/lib/rhc_helper/persistable.rb +12 -2
  17. data/features/lib/rhc_helper/sshkey.rb +29 -0
  18. data/features/multiple_cartridge.feature +17 -0
  19. data/features/sshkey.feature +58 -0
  20. data/features/step_definitions/application_steps.rb +60 -52
  21. data/features/step_definitions/cartridge_steps.rb +22 -24
  22. data/features/step_definitions/client_steps.rb +9 -2
  23. data/features/step_definitions/domain_steps.rb +4 -0
  24. data/features/step_definitions/sshkey_steps.rb +56 -0
  25. data/features/support/assumptions.rb +37 -0
  26. data/features/support/before_hooks.rb +25 -0
  27. data/features/support/env.rb +84 -39
  28. data/features/support/key1 +27 -0
  29. data/features/support/key1.pub +1 -0
  30. data/features/support/key2 +27 -0
  31. data/features/support/key2.pub +1 -0
  32. data/features/support/key3.pub +1 -0
  33. data/features/support/ssh.sh +2 -0
  34. data/features/verify.feature +18 -159
  35. data/lib/rhc-common.rb +8 -21
  36. data/lib/rhc.rb +9 -5
  37. data/lib/rhc/autocomplete.rb +68 -0
  38. data/lib/rhc/autocomplete_templates/rhc.erb +33 -0
  39. data/lib/rhc/cli.rb +9 -6
  40. data/lib/rhc/command_runner.rb +108 -0
  41. data/lib/rhc/commands.rb +66 -132
  42. data/lib/rhc/commands/base.rb +95 -24
  43. data/lib/rhc/commands/domain.rb +33 -50
  44. data/lib/rhc/commands/port-forward.rb +81 -0
  45. data/lib/rhc/commands/setup.rb +1 -1
  46. data/lib/rhc/commands/sshkey.rb +95 -0
  47. data/lib/rhc/config.rb +108 -103
  48. data/lib/rhc/context_helper.rb +19 -0
  49. data/lib/rhc/coverage_helper.rb +1 -1
  50. data/lib/rhc/exceptions.rb +55 -4
  51. data/lib/rhc/help_formatter.rb +2 -3
  52. data/lib/rhc/helpers.rb +31 -23
  53. data/lib/{rhc-rest.rb → rhc/rest.rb} +95 -23
  54. data/lib/{rhc-rest → rhc/rest}/application.rb +1 -1
  55. data/lib/{rhc-rest → rhc/rest}/cartridge.rb +1 -1
  56. data/lib/{rhc-rest → rhc/rest}/client.rb +40 -9
  57. data/lib/{rhc-rest → rhc/rest}/domain.rb +1 -1
  58. data/lib/{rhc-rest → rhc/rest}/key.rb +11 -1
  59. data/lib/{rhc-rest → rhc/rest}/user.rb +1 -1
  60. data/lib/rhc/ssh_key_helpers.rb +10 -1
  61. data/lib/rhc/targz.rb +7 -8
  62. data/lib/rhc/usage_templates/command_help.erb +7 -6
  63. data/lib/rhc/usage_templates/help.erb +6 -9
  64. data/lib/rhc/usage_templates/missing_help.erb +1 -0
  65. data/lib/rhc/version.rb +2 -2
  66. data/lib/rhc/wizard.rb +4 -9
  67. data/spec/coverage_helper.rb +2 -2
  68. data/spec/rest_spec_helper.rb +66 -16
  69. data/spec/rhc/cli_spec.rb +16 -5
  70. data/spec/rhc/command_spec.rb +61 -6
  71. data/spec/rhc/commands/domain_spec.rb +50 -27
  72. data/spec/rhc/commands/port-forward_spec.rb +133 -0
  73. data/spec/rhc/commands/setup_spec.rb +2 -2
  74. data/spec/rhc/commands/sshkey_spec.rb +141 -0
  75. data/spec/rhc/common_spec.rb +1 -1
  76. data/spec/rhc/config_spec.rb +6 -4
  77. data/spec/rhc/helpers_spec.rb +0 -21
  78. data/spec/rhc/rest_application_spec.rb +7 -7
  79. data/spec/rhc/rest_client_spec.rb +87 -24
  80. data/spec/rhc/rest_spec.rb +36 -36
  81. data/spec/rhc/wizard_spec.rb +3 -3
  82. data/spec/spec.opts +1 -0
  83. data/spec/spec_helper.rb +3 -3
  84. metadata +61 -31
  85. data/lib/rhc-rest/exceptions/exceptions.rb +0 -75
  86. data/test/functional/application_test.rb +0 -71
  87. data/test/functional/domain_test.rb +0 -123
  88. data/test/functional/test_credentials.rb +0 -5
  89. data/test/sample-usage.rb +0 -122
  90. data/test/support/server.rb +0 -14
  91. data/test/support/testcase.rb +0 -3
  92. data/test/test_helper.rb +0 -4
  93. data/test/unit/command_test.rb +0 -19
data/bin/rhc CHANGED
@@ -39,7 +39,14 @@ def get_args
39
39
  end
40
40
 
41
41
  def run_setup_wizard_if_needed
42
- default_setup_wizard unless ARGV.delete('--noprompt')
42
+ if not (RHC::Config.has_local_config? or
43
+ RHC::Config.has_opts_config? or
44
+ ARGV.include?('--noprompt') or
45
+ ARGV.include?('--help') or
46
+ ARGV.include?('-h'))
47
+ RHC::Wizard.new(RHC::Config).run
48
+ end
49
+ ARGV.delete('--noprompt')
43
50
  end
44
51
 
45
52
  begin
@@ -48,17 +55,10 @@ begin
48
55
  run_setup_wizard_if_needed
49
56
  system("rhc-app #{get_args} 2>&1")
50
57
  retcode = $?.exitstatus
51
- when "sshkey"
52
- run_setup_wizard_if_needed
53
- system("rhc-sshkey #{get_args} 2>&1")
54
- retcode = $?.exitstatus
55
- when "port-forward"
56
- run_setup_wizard_if_needed
57
- system("rhc-port-forward #{get_args} 2>&1")
58
- retcode = $?.exitstatus
59
58
  else
60
59
  begin
61
60
  require 'rhc/cli'
61
+ RHC::CLI.set_terminal
62
62
  RHC::CLI.start(ARGV)
63
63
  retcode = 0
64
64
  rescue SystemExit => e
data/bin/rhc-port-forward CHANGED
@@ -4,6 +4,9 @@ require 'rhc/coverage_helper'
4
4
 
5
5
  require 'rhc-common'
6
6
 
7
+ puts "Warning: This command is deprecated and will be removed in the future. Please use 'rhc port-forward' instead."
8
+ puts""
9
+
7
10
  #
8
11
  # print help
9
12
  #
data/bin/rhc-sshkey CHANGED
@@ -4,6 +4,9 @@ require 'rhc/coverage_helper'
4
4
 
5
5
  require 'rhc-common'
6
6
 
7
+ puts "Warning: This command is deprecated and will be removed in the future. Please use 'rhc sshkey' instead."
8
+ puts""
9
+
7
10
  #
8
11
  # print help
9
12
  #
data/features/README.md CHANGED
@@ -3,68 +3,196 @@ Overview
3
3
 
4
4
  These tests can be run against a production or OpenShift Origin instance for
5
5
  verification of basic functionality. These tests should be operating system
6
- independent and will shell out to execute the 'rhc *' commands to emulate a
7
- user as closely as possible. These tests exercise both the commandline
6
+ independent and will shell out to execute the `rhc *` commands to emulate a
7
+ user as closely as possible. These tests exercise both the command-line
8
8
  client and the underlying infrastructure and serve as integration level
9
9
  verification tests for the entire stack.
10
10
 
11
11
  Usage
12
12
  =============
13
13
 
14
- Run from the base directory with
14
+ Run from the base directory with
15
15
 
16
- <env variables> bundle exec rake features
16
+ ```
17
+ <env variables> bundle exec rake features
18
+ ```
17
19
 
18
- 'features' requires RHC_USERNAME+RHC_PASSWORD+RHC_NAMESPACE or
19
- RHC_ENDPOINT to be set in the environment.
20
+ At the very least, you will probably want to specify `RHC_SERVER` (or
21
+ the tests will run against the production OpenShift server by default).
20
22
 
21
- Using a proxy
22
- --------------
23
+ You may also want to specify credentials to use a specific account on
24
+ the OpenShift server.
23
25
 
24
- You can use a proxy by setting the http_proxy environment variable. For example
26
+ All of these environment variables are described in detail in [the
27
+ next section](#environment-variables).
25
28
 
26
- http_proxy='http://proxyserver:proxyport/' bundle exec rake features
29
+ If you are developing tests, or want to run specific tests, make sure to
30
+ check out the [development usage section](#development-usage).
27
31
 
28
- Pre-defined users
29
- -----------------
32
+ Environment Variables
33
+ =====================
34
+ Much of the configuration for these tests is controlled through
35
+ environment variables.
36
+ They can be used with either the `rake` commands or when executing
37
+ `cucumber` directly.
38
+
39
+ http_proxy
40
+ ----------
41
+ Since the `rhc` tools use a HTTP based REST API, if you need a proxy to
42
+ access the server you are testing against, you will need to specify a
43
+ proxy. For instance:
44
+
45
+ http_proxy='http://proxyserver:proxyport/'
46
+
47
+ GIT_SSH
48
+ -------
49
+ This is automatically set in `features/support/env.rb` but can be
50
+ overridden if desired.
51
+
52
+ This environment variable will be used by any `git` or `ssh` commands.
53
+ Currently, we are using it to bypass host key validation because the
54
+ user will be connecting to unknown hosts (the new OpenShift apps).
55
+ Without this variable, the tests will wait for approval before
56
+ connecting to the host.
57
+
58
+ RHC_DEV
59
+ -------
60
+ If set, this will use the `libra_server` specified in
61
+ `~/.openshift/express.conf` for `RHC_SERVER` (unless `RHC_SERVER` is
62
+ also specified).
63
+
64
+ RHC_(SERVER|ENDPOINT)
65
+ ---------------------
66
+ This is the server/endpoint the tests will execute against.
67
+
68
+ If `RHC_SERVER` is set, it will set `RHC_ENDPOINT` to be
69
+ `https://#{RHC_SERVER}/broker/rest/api`.
70
+
71
+ If you need to point to another API endpoint, you can also specify the full
72
+ `RHC_ENDPOINT`.
73
+
74
+ If not set, these will default to the production OpenShift server.
30
75
 
76
+ RHC_(USERNAME|PASSWORD|NAMESPACE)
77
+ -----------------
31
78
  In many cases, these tests will be run with an existing, pre-created user. The
32
79
  tests should keep the resource needs of that user to a minimum, but in some
33
80
  cases, the user might need to have an increased number of gears added to
34
81
  support certain tests.
35
82
 
36
- You use environment variables to notify the tests of the well defined user,
37
- password and namespace. This can be done by passing the values in before the
38
- command:
83
+ These variables allow the tests to be run with the defined credentials
84
+ instead of randomly generating new ones.
85
+
86
+ NO_CLEAN
87
+ --------
88
+ This option prevents the tests from deleting the existing apps in this
89
+ namespace before running the tests.
90
+ It also prevents the tests from replacing the existing
91
+ `~/.openshift/express.conf`.
39
92
 
40
- RHC_USERNAME='mylogin@example.com' RHC_PASSWORD='supersecretpassword' RHC_NAMESPACE='mynamespace' bundle exec rake features
93
+ If this is specified, the script will use values stored in `/tmp/rhc/(username|namespace)` (unless overridden by `RHC_(USERNAME|NAMESPACE)`).
41
94
 
42
95
  Development Usage
43
96
  =================
97
+ When developing new features, whether for the `rhc` tools or OpenShift
98
+ server, these tests will help to ensure the tools continue to function
99
+ properly.
44
100
 
45
- In development, you probably aren't going to be running against production systems.
46
- You will most likely be running against your own OpenShift Origin system. To be
47
- able to point to a custom system, you can configure the REST endpoint that is used.
48
- If not specified, it will default to the OpenShift Production REST Endpoint:
101
+ Running Tests
102
+ -------------
103
+ First, and foremost, you will want be able to run the tests.
104
+ Often when you are developing new tests, you don't want to run the entire suite
105
+ each time.
106
+ There are two ways to run them.
49
107
 
50
- RHC_ENDPOINT='https://myserver/rest/api' bundle exec rake features
108
+ 1. The `rake` command may add additional functionality, such as coverage
109
+ reporting.
110
+ To run the test, simply run
51
111
 
112
+ ```
113
+ <env variables> bundle exec rake features
114
+ ```
52
115
 
53
- Developing tests
54
- ----------------
116
+ 1. Running the tests directly via `cucumber` gives you some more
117
+ flexibility as to which tests to run. You can run `cucumber` using any of the techniques [shown
118
+ here](https://github.com/cucumber/cucumber/wiki/Running-Features).
55
119
 
56
- Often when you are developing new tests, you don't want to run the entire suite
57
- each time. However, the tests by default automatically clean up the test
58
- applications that were created on the previous run. You can quickly develop
59
- and interate on a single test by doing the following:
60
-
61
- * Run the initialization portion of the test suite
120
+ For instance:
62
121
 
63
- RHC_ENDPOINT='https://yourserver/rest/api' bundle exec cucumber -t @init
122
+ ```
123
+ # This runs all scenarios with the @application tag that also do not
124
+ # have the @init tag
125
+ cucumber features -t @application -t ~@init
126
+ # This runs the scenario starting at a specific line in the file
127
+ cucumber features/application.feature:42
128
+ ```
64
129
 
65
- * Run the tests on your specific feature without reset state and using the
66
- created username and namespace from the previous run. For example, if the
67
- cucumber feature you wanted to test started on line 17, in your .feature file,
68
- you would run
130
+ Developing tests
131
+ ----------------
69
132
 
70
- RHC_USERNAME=`cat /tmp/rhc/username` RHC_NAMESPACE=`cat /tmp/rhc/namespace` RHC_ENDPOINT='https://yourserver/rest/api' NO_CLEAN=1 bundle exec cucumber features/verify.feature:20
133
+ Due to their nature, some tests require previous state to
134
+ function properly.
135
+ For instance, in order to test adding cartridges to an application, an
136
+ application must exist first.
137
+
138
+ When the tests are run in order, this state is reused.
139
+ We have also devised a technique using before_hooks and backgrounds to
140
+ ensure the environment is in the correct state.
141
+
142
+ When a feature is run, there is generally a scenario tagged `@init` which does some sort of initialization step (such as creating an
143
+ application).
144
+
145
+ Normally, the other scenarios in the same feature will depend on this step to function
146
+ properly.
147
+ However, there are before_hooks defined for any `~@init` steps that
148
+ ensure that state is in place.
149
+ This way, you can run any scenario and know that you will have the same
150
+ state as if the `@init` step was run.
151
+
152
+
153
+ ### Example
154
+ In our feature file, we may have something like this:
155
+
156
+ ```
157
+ @demo
158
+ Feature: Demonstrating Hooks
159
+
160
+ @init
161
+ Scenario: Setting Up Demo
162
+ Given we are giving a demo
163
+ Then the demo directory should exist
164
+
165
+ Scenario: Running a Demo
166
+ Then we should start the demo
167
+
168
+ Scenario: Deleting a demo
169
+ Then the demo should be deleted
170
+ ```
171
+
172
+ Notice we don't have another `Given` statement in our second or third scenario.
173
+ We take care of that in our before hooks.
174
+ If we were to run either of those scenarios on their own, they would fail.
175
+ We fix this by defining a step that can set the expected state if it
176
+ doesn't exist.
177
+
178
+ ```
179
+ Given "a demo directory exists or is created" do
180
+ begin
181
+ Given "the demo directory exists"
182
+ rescue Spec::Expectations::ExpectationNotMetError
183
+ Then "create the demo directory"
184
+ end
185
+ end
186
+ ```
187
+
188
+ Now we can define a `before_hook` that runs our steps before any
189
+ scenarios that are not tagged `@init`.
190
+
191
+ ```
192
+ Before('@demo','~@init') do
193
+ Given "a demo directory exists or is created"
194
+ end
195
+ ```
196
+
197
+ After following these steps, we can confidently run any of our scenarios
198
+ and know that they will be in the state they expect.
@@ -0,0 +1,24 @@
1
+ @application @domain_required
2
+ Feature: Application Operations
3
+
4
+ @init
5
+ Scenario: Application Creation
6
+ When a php-5.3 application is created
7
+ Then the application should be accessible
8
+
9
+ # The state in these examples should be able to be broken into before hooks when we update cucumber
10
+ Scenario Outline: Running Application Commands
11
+ Given we have a <state> application
12
+ When the application is <command>
13
+ Then <what> should <status>
14
+
15
+ # Breaking these examples up so they can flow logically, but also be run individually
16
+ Examples:
17
+ | state | command | what | status |
18
+ | running | restarted | the application | be accessible |
19
+ | running | snapshot | the snapshot | be found |
20
+ | running | tidied | it | succeed |
21
+ | running | shown | it | succeed |
22
+ | running | stopped | the application | not be accessible |
23
+ | stopped | started | the application | be accessible |
24
+ | running | destroyed | the application | not exist |
@@ -0,0 +1,24 @@
1
+ @single_cartridge @domain_required
2
+ Feature: Single Cartridge Tests
3
+
4
+ # Need to keep these outlines duplicated until we update cucumber to allow tagged examples
5
+
6
+ @init
7
+ Scenario Outline: Cartridge Commands
8
+ When the <type> cartridge is <command>
9
+ Then the <type> cartridge should be <status>
10
+
11
+ Examples:
12
+ | type | command | status |
13
+ | mysql-5.1 | added | running |
14
+
15
+ Scenario Outline: Cartridge Commands
16
+ Given we have a <state> mysql-5.1 cartridge
17
+ When the mysql-5.1 cartridge is <command>
18
+ Then the mysql-5.1 cartridge should be <status>
19
+
20
+ Examples:
21
+ | state | command | status |
22
+ | running | restarted | running |
23
+ | running | stopped | stopped |
24
+ | stopped | started | running |
@@ -0,0 +1,11 @@
1
+ @client
2
+ Feature: Client Integration Tests
3
+ Background:
4
+ Given the libra client tools
5
+
6
+ @init
7
+ Scenario: Setup Wizard
8
+ When the setup wizard is run
9
+ Then the client tools should be setup
10
+
11
+ Scenario: Get Server Status
@@ -0,0 +1,29 @@
1
+ @domain @client_tools_required
2
+ Feature: Existing Domain Operations
3
+
4
+ @init
5
+ Scenario: Domain Creation
6
+ When a new domain is needed and created
7
+ Then the domain should be reserved
8
+
9
+ Scenario: Domain Update
10
+ When domain is updated
11
+ Then the domain should be reserved
12
+
13
+ Scenario: Domain Show
14
+ When rhc domain is run
15
+ When rhc domain show is run
16
+ Then the default domain action output should equal the show action output
17
+
18
+ Scenario: Domain Create Fails
19
+ When rhc domain create is called
20
+ Then the domain command should fail with an exitcode of 128
21
+
22
+ Scenario: Domain Delete
23
+ When domain is deleted
24
+ Then domains should be empty
25
+
26
+ Scenario: Domain Update Fails
27
+ When domain is deleted
28
+ When domain is updated
29
+ Then the domain command should fail with an exitcode of 127
@@ -1,3 +1,16 @@
1
+ require 'rubygems'
2
+ require 'active_support/ordered_hash'
3
+ require 'tmpdir'
4
+
5
+ ### Some shared constant declarations
6
+ module RHCHelper
7
+ TEMP_DIR = File.join(Dir.tmpdir, "rhc") unless const_defined?(:TEMP_DIR)
8
+ # The regex to parse the ssh output from the create app results
9
+ SSH_OUTPUT_PATTERN = %r|ssh://([^@]+)@([^/]+)| unless const_defined?(:SSH_OUTPUT_PATTERN)
10
+ # Regex to parse passwords out of logging messages
11
+ PASSWORD_REGEX = / -p [^\s]* / unless const_defined?(:PASSWORD_REGEX)
12
+ end
13
+
1
14
  require 'rhc_helper/loggable'
2
15
  require 'rhc_helper/commandify'
3
16
  require 'rhc_helper/httpify'
@@ -5,3 +18,4 @@ require 'rhc_helper/persistable'
5
18
  require 'rhc_helper/runnable'
6
19
  require 'rhc_helper/app'
7
20
  require 'rhc_helper/domain'
21
+ require 'rhc_helper/sshkey'
@@ -1,12 +1,6 @@
1
- require 'tmpdir'
2
- require 'rhc-rest'
1
+ require 'rhc/rest'
3
2
 
4
3
  module RHCHelper
5
- #
6
- # Constant Definitions
7
- #
8
- TEMP_DIR = File.join(Dir.tmpdir, "rhc")
9
-
10
4
  #
11
5
  # A class to help maintain the state from rhc calls and helper
12
6
  # methods around application management.
@@ -55,7 +49,7 @@ module RHCHelper
55
49
 
56
50
  def self.create_unique(type, prefix="test")
57
51
  # Get a REST client to verify the application name
58
- client = Rhc::Rest::Client.new($end_point, $username, $password)
52
+ client = RHC::Rest::Client.new($end_point, $username, $password)
59
53
 
60
54
  # Cleanup all test applications
61
55
  test_names = []
@@ -1,12 +1,6 @@
1
- require 'tmpdir'
2
- require 'rhc-rest'
1
+ require 'rhc/rest'
3
2
 
4
3
  module RHCHelper
5
- #
6
- # Constant Definitions
7
- #
8
- TEMP_DIR = File.join(Dir.tmpdir, "rhc")
9
-
10
4
  #
11
5
  # A class to help maintain the state from rhc calls and helper
12
6
  # methods around cartridge management.
@@ -48,7 +48,7 @@ module RHCHelper
48
48
  end
49
49
 
50
50
  # Print out the command arguments based on the state of the application instance
51
- def get_args(cmd, cartridge=nil, debug=true)
51
+ def get_args(cmd, arg0=nil, debug=true)
52
52
  args = " "
53
53
  args << "-l #{$username} "
54
54
  args << "-p #{$password} "
@@ -80,8 +80,12 @@ module RHCHelper
80
80
  raise "No alias set" unless @alias
81
81
  args << "--alias #{@alias} "
82
82
  when /cartridge/
83
- raise "No cartridge supplied" unless cartridge
84
- args << "-c #{cartridge}"
83
+ raise "No cartridge supplied" unless arg0
84
+ args << "-c #{arg0}"
85
+ when /sshkey/
86
+ # in RHCHelper::Sshkey, we pass *args to method_missing here, so that
87
+ # we _know_ that arg0 is an Array.
88
+ args << arg0.first if arg0.first
85
89
  end
86
90
 
87
91
  args.rstrip
@@ -115,9 +119,6 @@ module RHCHelper
115
119
  end
116
120
  end
117
121
 
118
- # The regex to parse the ssh output from the create app results
119
- SSH_OUTPUT_PATTERN = %r|ssh://([^@]+)@([^/]+)|
120
-
121
122
  #
122
123
  # Begin Post Processing Callbacks
123
124
  #
@@ -180,4 +181,34 @@ module RHCHelper
180
181
  @exitcode = exitcode
181
182
  end
182
183
 
184
+ def sshkey_callback(exitcode, stdout, stderr, arg)
185
+ @sshkey_output = stdout
186
+ @exitcode = exitcode
187
+ end
188
+
189
+ def sshkey_add_callback(exitcode, stdout, stderr, arg)
190
+ @sshkey_output = stdout
191
+ @exitcode = exitcode
192
+ end
193
+
194
+ def sshkey_list_callback(exitcode, stdout, stderr, arg)
195
+ @sshkey_output = stdout
196
+ @exitcode = exitcode
197
+ end
198
+
199
+ def sshkey_show_callback(exitcode, stdout, stderr, arg)
200
+ @sshkey_output = stdout
201
+ @exitcode = exitcode
202
+ end
203
+
204
+ def sshkey_update_callback(exitcode, stdout, stderr, arg)
205
+ @sshkey_output = stdout
206
+ @exitcode = exitcode
207
+ end
208
+
209
+ def sshkey_delete_callback(exitcode, stdout, stderr, arg)
210
+ @sshkey_output = stdout
211
+ @exitcode = exitcode
212
+ end
213
+
183
214
  end