rundeck 0.0.3.pre → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -0
  3. data/.rubocop_todo.yml +0 -10
  4. data/.travis.yml +1 -1
  5. data/lib/rundeck/client.rb +61 -3
  6. data/lib/rundeck/client/execution.rb +194 -0
  7. data/lib/rundeck/client/{jobs.rb → job.rb} +19 -36
  8. data/lib/rundeck/client/{keys.rb → key.rb} +42 -20
  9. data/lib/rundeck/configuration.rb +5 -1
  10. data/lib/rundeck/objectified_hash.rb +13 -3
  11. data/lib/rundeck/request.rb +7 -1
  12. data/lib/rundeck/version.rb +1 -1
  13. data/rundeck.gemspec +2 -1
  14. data/spec/cassettes/12/abort_execution_not_running.yml +41 -0
  15. data/spec/cassettes/12/abort_execution_valid.yml +41 -0
  16. data/spec/cassettes/12/abort_executions_invalid.yml +41 -0
  17. data/spec/cassettes/12/bulk_delete_executions_invalid.yml +46 -0
  18. data/spec/cassettes/12/bulk_delete_executions_valid.yml +41 -0
  19. data/spec/cassettes/12/create_private_key.yml +64 -0
  20. data/spec/cassettes/12/create_public_key.yml +38 -0
  21. data/spec/cassettes/12/delete_execution_invalid.yml +41 -0
  22. data/spec/cassettes/12/delete_execution_valid.yml +32 -0
  23. data/spec/cassettes/12/delete_job_executions.yml +41 -0
  24. data/spec/cassettes/12/delete_job_executions_invalid.yml +41 -0
  25. data/spec/cassettes/12/delete_job_invalid.yml +41 -0
  26. data/spec/cassettes/12/delete_job_valid.yml +32 -0
  27. data/spec/cassettes/12/delete_key_invalid.yml +41 -0
  28. data/spec/cassettes/12/delete_key_private.yml +32 -0
  29. data/spec/cassettes/12/delete_key_public.yml +32 -0
  30. data/spec/cassettes/12/execution_invalid.yml +41 -0
  31. data/spec/cassettes/12/execution_query_invalid.yml +39 -0
  32. data/spec/cassettes/12/execution_query_no_params_valid.yml +124 -0
  33. data/spec/cassettes/12/execution_state_invalid.yml +41 -0
  34. data/spec/cassettes/12/execution_state_valid.yml +39 -0
  35. data/spec/cassettes/12/execution_valid.yml +60 -0
  36. data/spec/cassettes/12/export_job_xml.yml +234 -0
  37. data/spec/cassettes/12/export_job_yaml.yml +228 -0
  38. data/spec/cassettes/12/import_job_xml.yml +69 -0
  39. data/spec/cassettes/12/import_job_yaml.yml +63 -0
  40. data/spec/cassettes/12/job.yml +84 -0
  41. data/spec/cassettes/12/job_executions.yml +96 -0
  42. data/spec/cassettes/12/jobs.yml +76 -0
  43. data/spec/cassettes/12/key_contents_direct.yml +67 -0
  44. data/spec/cassettes/12/key_contents_multiple.yml +38 -0
  45. data/spec/cassettes/12/key_contents_private.yml +35 -0
  46. data/spec/cassettes/12/key_metadata_direct.yml +35 -0
  47. data/spec/cassettes/12/key_metadata_multiple.yml +38 -0
  48. data/spec/cassettes/12/keys_direct.yml +35 -0
  49. data/spec/cassettes/12/keys_multiple.yml +38 -0
  50. data/spec/cassettes/12/keys_none.yml +34 -0
  51. data/spec/cassettes/12/run_job_invalid.yml +44 -0
  52. data/spec/cassettes/12/run_job_valid.yml +77 -0
  53. data/spec/cassettes/12/running_jobs_multiple.yml +70 -0
  54. data/spec/cassettes/12/running_jobs_none.yml +39 -0
  55. data/spec/cassettes/12/running_jobs_single.yml +55 -0
  56. data/spec/cassettes/12/update_private_key.yml +96 -0
  57. data/spec/cassettes/12/update_public_key.yml +70 -0
  58. data/spec/rundeck/client/execution_spec.rb +346 -0
  59. data/spec/rundeck/client/job_spec.rb +175 -0
  60. data/spec/rundeck/client/key_spec.rb +223 -0
  61. data/spec/spec_helper.rb +15 -60
  62. data/spec/support/helpers.rb +136 -0
  63. metadata +118 -35
  64. data/spec/fixtures/empty.xml +0 -0
  65. data/spec/fixtures/job.xml +0 -17
  66. data/spec/fixtures/job_executions.xml +0 -31
  67. data/spec/fixtures/job_run.xml +0 -16
  68. data/spec/fixtures/jobs_import.xml +0 -23
  69. data/spec/fixtures/jobs_my_project.xml +0 -14
  70. data/spec/fixtures/jobs_xml.xml +0 -32
  71. data/spec/fixtures/jobs_yaml.xml +0 -22
  72. data/spec/fixtures/key_contents_public.xml +0 -1
  73. data/spec/fixtures/key_private.xml +0 -8
  74. data/spec/fixtures/key_public.xml +0 -7
  75. data/spec/fixtures/keys.xml +0 -27
  76. data/spec/rundeck/client/jobs_spec.rb +0 -181
  77. data/spec/rundeck/client/keys_spec.rb +0 -216
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c88f0666b4b89351a6e9c34f7769036936f5cf8
4
- data.tar.gz: 9f7c1c30d0ece66d6dcfb297422e5b38d2e31ee2
3
+ metadata.gz: ff00bf23f1fde03b1f603132d506ae0695e02827
4
+ data.tar.gz: fb4a1f1a7b74dac64e73e03a5c23d2acdd089d99
5
5
  SHA512:
6
- metadata.gz: 34e9d290de610879d9041338456b593e5e4ca57c40d77d0007bb0c5aefbf7e2bc05f8568b59647628dc38c3ccbcb1aed7d5c3cfe0691f393b54fb3e5d1f6eeea
7
- data.tar.gz: ea34452acb80ed0782d9e5235ddb84c7083ae2d9377dc4fe80bf15c4b8bbdc8ac6b63f23b562bd0717b5e1d53a25e06146608cf07d3fa7a838efc5b55132e894
6
+ metadata.gz: c51e3995a9bb9ac36d5fe7522e9e98ca6d685b65d6b11b9fbf453c32c34883852976651fedf0fbf85b1fbf70d84291629681fca273ad358bdfc8c224ac57c3d9
7
+ data.tar.gz: 57094ebfae59988afb663fadda7ae78e0244feda93da93dc77e586dad0f20f08787999ede8de7a73014a7ff211b23eaf427fa1809a2b2ec872eb77eb2cfd9018
@@ -5,3 +5,13 @@ inherit_from: .rubocop_todo.yml
5
5
  # Lots of crappy false-positives from this cop. Go home!
6
6
  GuardClause:
7
7
  Enabled: false
8
+
9
+ # Sometimes the method is legitimately longer but not complex.
10
+ # See spec/support/helpers.rb#job_xml
11
+ Metrics/MethodLength:
12
+ Max: 30
13
+
14
+ # I am a big fan of lines 80 chars and less. However, in some cases it makes
15
+ # sense to let the line exceed that length, especially in specs.
16
+ Metrics/LineLength:
17
+ Max: 500
@@ -9,16 +9,6 @@
9
9
  Metrics/CyclomaticComplexity:
10
10
  Max: 10
11
11
 
12
- # Offense count: 1
13
- # Configuration parameters: AllowURI.
14
- Metrics/LineLength:
15
- Max: 159
16
-
17
- # Offense count: 1
18
- # Configuration parameters: CountComments.
19
- Metrics/MethodLength:
20
- Max: 12
21
-
22
12
  # Offense count: 2
23
13
  Style/Documentation:
24
14
  Severity: warning
@@ -5,7 +5,7 @@ rvm:
5
5
  - 2.1
6
6
  script:
7
7
  - bundle exec rake
8
- # - bundle exec rubocop
8
+ - bundle exec rubocop
9
9
  addons:
10
10
  code_climate:
11
11
  repo_token: 2aea108baa65d08ea87fb2371ec22a1741cb760027b8605bdabd5e153e595f4c
@@ -1,15 +1,73 @@
1
1
  module Rundeck
2
2
  # Wrapper for the Rundeck REST API.
3
3
  class Client < API
4
+ # Macros to simplify client method documentation.
5
+
6
+ # @!macro [new] options
7
+ # @param [Hash] options A set of options passed directly to HTTParty. See
8
+ # http://rubydoc.info/gems/httparty/HTTParty/ClassMethods
9
+ # @option options [Hash] :query The parameters to pass with the request
10
+ # Use this hash to specify Rundeck parameters.
11
+ # - +query: { project: 'anvils', id: '123456' }+
12
+
13
+ # @!macro [new] exceptions
14
+ # @raise [Rundeck::Error::BadRequest] 400 error - Most likely indicates a
15
+ # required parameter is missing.
16
+ # @raise [Rundeck::Error::Unauthorized] 401 error - Unauthorized
17
+ # @raise [Rundeck::Error::Forbidden] 403 forbidden - ACL policies prevent
18
+ # accessing the given resource
19
+ # @raise [Rundeck::Error::NotFound] 404 not found - Indicates a resource
20
+ # could not be found at the location
21
+ # @raise [Rundeck::Error::MethodNotAllowed] 405 method not allowed - The
22
+ # request method is not allowed. This probably indicates a
23
+ # misconfiguration in a reverse proxy, such as Nginx or Apache
24
+ # @raise [Rundeck::Error::Conflict] 409 conflict - A conflicting resource
25
+ # exists.
26
+ # @raise [Rundeck::Error::InternalServerError] 500 server error -
27
+ # Indicates the Rundeck server experienced an error.
28
+ # @raise [Rundeck::Error::BadGateway] 502 bad gateway - Indicates
29
+ # something probably isn't working right or is misconfigured on the
30
+ # Rundeck server.
31
+ # @raise [Rundeck::Error::ServiceUnavailable] 503 error - Indicates an
32
+ # issue on the Rundeck server.
33
+
34
+ # @!macro [new] has_optional_params
35
+ # @note This method has optional Rundeck parameters that can be passed
36
+ # to the options parameter. See Rundeck API documentation
37
+ # for more information.
38
+ # - +query: { param1: 'value', param2: 'value' }+
39
+
40
+ # @!macro [new] has_required_params
41
+ # @note This method has required Rundeck parameters that can be passed
42
+ # to the options parameter. See Rundeck API documentation
43
+ # for more information.
44
+ # - +query: { param1: 'value', param2: 'value' }+
45
+
46
+ # @!macro [new] has_required_and_optional_params
47
+ # @note This method has both required and optional Rundeck parameters that
48
+ # can be passed to the options parameter. See Rundeck API documentation
49
+ # for more information.
50
+ # - +query { param1: 'value', param2: 'value' }+
51
+
4
52
  Dir[File.expand_path('../client/*.rb', __FILE__)].each { |f| require f }
5
53
 
6
- include Jobs
7
- include Keys
54
+ include Execution
55
+ include Job
56
+ include Key
8
57
 
58
+ # Turn a hash into an object for easy accessibility.
59
+ #
60
+ # @note This method will objectify nested hashes/arrays.
61
+ #
62
+ # @param [Hash, Array] result An array or hash of results to turn into
63
+ # an object
64
+ # @return [Rundeck::ObjectifiedHash] if +result+ was a hash
65
+ # @return [Rundeck::ObjectifiedHash] if +result+ was an array
66
+ # @raise [Array<Rundeck::Error::Parsing>] Error objectifying array or hash
9
67
  def objectify(result)
10
68
  if result.is_a?(Hash)
11
69
  ObjectifiedHash.new(result)
12
- elsif result.is_a? Array
70
+ elsif result.is_a?(Array)
13
71
  result.map! { |e| ObjectifiedHash.new(e) }
14
72
  elsif result.nil?
15
73
  nil
@@ -0,0 +1,194 @@
1
+ module Rundeck
2
+ class Client
3
+ # Defines methods related to executions.
4
+ module Execution
5
+ # Execute a job
6
+ #
7
+ # @!macro has_optional_params
8
+ #
9
+ # @see http://rundeck.org/docs/api/index.html#running-a-job
10
+ # Rundeck API documentation for 'POST /api/12/job/[ID]/executions'
11
+ # endpoint
12
+ #
13
+ # @example
14
+ # Rundeck.execute_job('c07518ef-b697-4792-9a59-5b4f08855b67')
15
+ # Rundeck.run_job('c07518ef-b697-4792-9a59-5b4f08855b67')
16
+ #
17
+ # @param [String] id Job id
18
+ # @!macro options
19
+ # @return [Rundeck::ObjectifiedHash]
20
+ # @!macro exceptions
21
+ def execute_job(id, options = {})
22
+ objectify post("/job/#{id}/executions", options)['result']['executions']['execution']
23
+ end
24
+ alias_method :run_job, :execute_job
25
+
26
+ # Get executions for a specific job.
27
+ #
28
+ # @!macro has_optional_params
29
+ #
30
+ # @see http://rundeck.org/docs/api/index.html#getting-executions-for-a-job
31
+ # Rundeck API documentation for 'GET /api/1/job/[ID]/executions'
32
+ # endpoint
33
+ #
34
+ # @example
35
+ # Rundeck.job_executions('c07518ef-b697-4792-9a59-5b4f08855b67')
36
+ #
37
+ # @param [String] id Job id
38
+ # @!macro options
39
+ # @return [Rundeck::ObjectifiedHash]
40
+ # @!macro exceptions
41
+ def job_executions(id, options = {})
42
+ r = get("/job/#{id}/executions", options)['result']['executions']['execution']
43
+ objectify r
44
+ end
45
+
46
+ # Get all running job executions
47
+ #
48
+ # @!macro has_required_params
49
+ #
50
+ # @see http://rundeck.org/docs/api/index.html#listing-running-executions
51
+ # Rundeck API documentation for 'GET /api/1/executions/running' endpoint
52
+ #
53
+ # @example
54
+ # Rundeck.running_job_executions('anvils')
55
+ #
56
+ # @param [String] project List running executions from this project
57
+ # @!macro options
58
+ # @return [nil] if no running executions
59
+ # @return [Rundeck::ObjectifiedHash] if a single running job execution
60
+ # @return [Array<Rundeck::ObjectifiedHash>] if multiple running job executions
61
+ # @!macro exceptions
62
+ # def running_job_executions(project, options = {})
63
+ # options[:query] = {} if options[:query].nil?
64
+ # options[:query]['project'] = project
65
+ # r = get('/executions/running', options)
66
+ #
67
+ # if objectify(r['result']['executions']).count != '0'
68
+ # objectify r['result']['executions']['execution']
69
+ # else
70
+ # nil
71
+ # end
72
+ # end
73
+
74
+ # Delete all executions for a specific job
75
+ #
76
+ # @see http://rundeck.org/docs/api/index.html#delete-all-executions-for-a-job
77
+ # Rundeck API documentation for 'DELETE /api/12/job/[ID]/executions'
78
+ # endpoint
79
+ #
80
+ # @example
81
+ # Rundeck.delete_job_executions('c07518ef-b697-4792-9a59-5b4f08855b67')
82
+ #
83
+ # @param [String] id Job id
84
+ # @!macro options
85
+ # @return [Rundeck::ObjectifiedHash]
86
+ # @!macro exceptions
87
+ def delete_job_executions(id, options = {})
88
+ objectify delete("/job/#{id}/executions", options)['deleteExecutions']
89
+ end
90
+
91
+ # Delete an execution
92
+ #
93
+ # @see http://rundeck.org/docs/api/index.html#delete-an-execution
94
+ # Rundeck API documentation for 'DELETE /api/12/execution/[ID]' endpoint
95
+ #
96
+ # @param [String] id Execution id
97
+ # @!macro options
98
+ # @return [nil] If the delete was successful
99
+ # @!macro exceptions
100
+ def delete_execution(id, options = {})
101
+ delete("/execution/#{id}", options)
102
+ end
103
+
104
+ # Abort a running execution
105
+ #
106
+ # @!macro has_optional_params
107
+ #
108
+ # @see http://rundeck.org/docs/api/index.html#aborting-executions
109
+ # Rundeck API documentation for 'POST /api/1/execution/[ID]/abort'
110
+ # endpoint
111
+ #
112
+ # @param [String] id Execution id
113
+ # @!macro options
114
+ # @return [Rundeck::ObjectifiedHash]
115
+ # @!macro exceptions
116
+ def abort_execution(id, options = {})
117
+ objectify post("/execution/#{id}/abort", options)['abort']
118
+ end
119
+
120
+ # Get info for an execution
121
+ #
122
+ # @see http://rundeck.org/docs/api/index.html#execution-info
123
+ # Rundeck API documentation for 'GET /api/1/execution/[ID]' endpoint
124
+ #
125
+ # @example
126
+ # Rundeck.execution('c07518ef-b697-4792-9a59-5b4f08855b67'')
127
+ #
128
+ # @param [String] id Execution id
129
+ # @!macro options
130
+ # @return [Rundeck::ObjectifiedHash]
131
+ # @!macro exceptions
132
+ def execution(id, options = {})
133
+ objectify get("/execution/#{id}", options)['result']['executions']['execution']
134
+ end
135
+
136
+ # Bulk delete executions
137
+ #
138
+ # @see http://rundeck.org/docs/api/index.html#bulk-delete-executions
139
+ # Rundeck API documentation for 'POST /api/12/executions/delete'
140
+ #
141
+ # @param [String] ids An array of execution ids to delete
142
+ # @!macro options
143
+ # @return [Rundeck::ObjectifiedHash]
144
+ # @raise [Rundeck::Error::InvalidAttribites] if ids is not an array
145
+ # @!macro exceptions
146
+ def bulk_delete_executions(ids, options = {})
147
+ unless ids.is_a?(Array)
148
+ fail Rundeck::Error::InvalidAttributes, '`ids` must be an array of ids'
149
+ end
150
+
151
+ options[:query] = {} if options[:query].nil?
152
+ options[:query].merge!(ids: ids.join(','))
153
+ objectify post('/executions/delete', options)['deleteExecutions']
154
+ end
155
+
156
+ # Get the state of an execution
157
+ #
158
+ # @see http://rundeck.org/docs/api/index.html#execution-state
159
+ # Rundeck API documentation for 'GET /api/12/execution/[ID]/state'
160
+ #
161
+ # @param [String] id Execution ID
162
+ # @!macro options
163
+ # @return [Rundeck::ObjectifiedHash]
164
+ # @!macro exceptions
165
+ def execution_state(id, options = {})
166
+ objectify get("/execution/#{id}/state", options)['result']['executionState']
167
+ end
168
+
169
+ # Query for executions based on job or execution details.
170
+ #
171
+ # @note This method maps to an advanced Rundeck endpoint. View the Rundeck
172
+ # API documentation and understand what query parameters are required.
173
+ # Responses may include paging details. Recall this method with the
174
+ # next set of paging values to retrieve more elements.
175
+ #
176
+ # @see http://rundeck.org/docs/api/index.html#execution-query
177
+ # Rundeck API documentation for 'GET /api/12/executions'
178
+ # def execution_query(project, options = {})
179
+ # options[:query] = {} if options[:query].nil?
180
+ # options[:query]['project'] = project
181
+ #
182
+ # objectify get('/executions', options)['result']
183
+ # end
184
+
185
+ # def execution_output()
186
+ #
187
+ # end
188
+ #
189
+ # def execution_output_with_state()
190
+ #
191
+ # end
192
+ end
193
+ end
194
+ end
@@ -1,15 +1,16 @@
1
1
  module Rundeck
2
2
  class Client
3
- # Defines methods related to projects.
4
- module Jobs
3
+ # Defines methods related to jobs.
4
+ module Job
5
5
  # Gets a list of jobs for a specific project.
6
6
  #
7
7
  # @example
8
8
  # Rundeck.jobs('project')
9
9
  #
10
10
  # @param [String] project Project name
11
- # @param [Hash] options A set of options passed directly to HTTParty
11
+ # @!macro options
12
12
  # @return [Array<Rundeck::ObjectifiedHash>]
13
+ # @!macro exceptions
13
14
  def jobs(project, options = {})
14
15
  objectify get("/project/#{project}/jobs", options)['jobs']['job']
15
16
  end
@@ -19,49 +20,27 @@ module Rundeck
19
20
  # @example Rundeck.job('c07518ef-b697-4792-9a59-5b4f08855b67')
20
21
  #
21
22
  # @param [String] id Job id
22
- # @param [Hash] options A set of options passed directly to HTTParty
23
+ # @!macro options
23
24
  # @return [Rundeck::ObjectifiedHash]
25
+ # @!macro exceptions
24
26
  def job(id, options = {})
25
27
  objectify get("/job/#{id}", options)['joblist']['job']
26
28
  end
27
29
 
28
30
  # Delete a job
29
31
  #
32
+ # @TODO: What does this return?!
33
+ #
30
34
  # @example
31
35
  # Rundeck.delete_job('c07518ef-b697-4792-9a59-5b4f08855b67')
32
36
  #
33
37
  # @param [String] id Job id
34
- # @param [Hash] options A set of options passed directly to HTTParty
35
- # @return [Rundeck::ObjectifiedHash]
38
+ # @!macro options
39
+ # @!macro exceptions
36
40
  def delete_job(id, options = {})
37
41
  delete("/job/#{id}", options)
38
42
  end
39
43
 
40
- # Get executions for a specific job
41
- #
42
- # @example
43
- # Rundeck.job_executions('c07518ef-b697-4792-9a59-5b4f08855b67')
44
- #
45
- # @param [String] id Job id
46
- # @param [Hash] options A set of options passed directly to HTTParty
47
- # @return [Rundeck::ObjectifiedHash]
48
- def job_executions(id, options = {})
49
- r = get("/job/#{id}/executions", options)['result']['executions']['execution']
50
- objectify r
51
- end
52
-
53
- # Run a job
54
- #
55
- # @example
56
- # Rundeck.run_job('c07518ef-b697-4792-9a59-5b4f08855b67', 'DEBUG')
57
- #
58
- # @param [String] id Job id
59
- # @param [Hash] options A set of options passed directly to HTTParty
60
- # @return [Rundeck::ObjectifiedHash]
61
- def run_job(id, options = {})
62
- objectify post("/job/#{id}/executions", options)['result']['executions']['execution']
63
- end
64
-
65
44
  # Import a job or multiple jobs
66
45
  #
67
46
  # @example
@@ -78,9 +57,11 @@ module Rundeck
78
57
  # Rundeck.import_jobs(job, 'xml')
79
58
  #
80
59
  # @param [String] content The job definition(s) as yaml or xml
81
- # @param [String] format The import format. 'yaml|xml', defaults to 'yaml'
82
- # @param [Hash] options A set of options passed directly to HTTParty
60
+ # @param [String] format The import format. 'yaml|xml', defaults to
61
+ # 'yaml'
62
+ # @!macro options
83
63
  # @return [Rundeck::ObjectifiedHash]
64
+ # @!macro exceptions
84
65
  def import_jobs(content, format = 'yaml', options = {})
85
66
  unless format =~ /yaml|xml/
86
67
  fail Error::InvalidAttributes, 'format must be yaml or xml'
@@ -101,9 +82,11 @@ module Rundeck
101
82
  # Rundeck.export_jobs('project')
102
83
  #
103
84
  # @param [String] project Project name
104
- # @param [String] format The export format. 'yaml|xml', defaults to 'yaml'
105
- # @param [Hash] options A set of options passed directly to HTTParty
106
- # @return [String]
85
+ # @param [String] format The export format. Either 'yaml' or 'xml'
86
+ # @!macro options
87
+ # @return [String] a string representation of the job in either xml or
88
+ # yaml
89
+ # @!macro exceptions
107
90
  def export_jobs(project, format = 'yaml', options = {})
108
91
  unless format =~ /yaml|xml/
109
92
  fail Error::InvalidAttributes, 'format must be yaml or xml'
@@ -1,8 +1,10 @@
1
1
  module Rundeck
2
2
  class Client
3
3
  # Defines methods related to projects.
4
- module Keys
4
+ module Key
5
+ # The endpoint for key storage
5
6
  STORAGE_KEYS_PATH = '/storage/keys'
7
+ private_constant :STORAGE_KEYS_PATH
6
8
 
7
9
  # Gets a list of keys at a specific path.
8
10
  #
@@ -10,12 +12,15 @@ module Rundeck
10
12
  # Rundeck.keys('path')
11
13
  #
12
14
  # @param [String] path A key storage path
13
- # @param [Hash] options A set of options passed directly to HTTParty
15
+ # @!macro options
14
16
  # @return [Array<Rundeck::ObjectifiedHash>]
17
+ # @!macro exceptions
18
+ # @raise [Rundeck::Error::InvalidAttributes] if the path is a direct key
19
+ # path
15
20
  def keys(path = '', options = {})
16
21
  r = get("#{STORAGE_KEYS_PATH}/#{path}", options)
17
22
 
18
- # # In case a user provides a direct path to a key, error.
23
+ # In case a user provides a direct path to a key, error.
19
24
  if r['resource']['contents']
20
25
  objectify r['resource']['contents']['resource']
21
26
  else
@@ -31,8 +36,11 @@ module Rundeck
31
36
  # Rundeck.key_metadata('path/to/key1')
32
37
  #
33
38
  # @param [String] path A key storage path, including key name
34
- # @param [Hash] options A set of options passed directly to HTTParty
39
+ # @!macro options
35
40
  # @return [Rundeck::ObjectifiedHash]
41
+ # @!macro exceptions
42
+ # @raise [Rundeck::Error::InvalidAttributes] if the path is a direct key
43
+ # path
36
44
  def key_metadata(path, options = {})
37
45
  r = get("#{STORAGE_KEYS_PATH}/#{path}", options)
38
46
 
@@ -54,13 +62,15 @@ module Rundeck
54
62
  # Rundeck.key_contents('path/to/key1')
55
63
  #
56
64
  # @param [String] path A key storage path, including key name
57
- # @param [Hash] options A set of options passed directly to HTTParty
65
+ # @!macro options
58
66
  # @return [Rundeck::ObjectifiedHash]
67
+ # @!macro exceptions
59
68
  def key_contents(path, options = {})
60
69
  # Check if key exists first. Otherwise we could return some
61
70
  # weird strings. Also, raise error if user is trying to get a
62
71
  # private key.
63
- if key_metadata(path, options).rundeck_key_type == 'private'
72
+ key_content_type = key_metadata(path, options).rundeck_content_type
73
+ if key_content_type == content_type('private')
64
74
  fail Error::Unauthorized,
65
75
  'You are not allowed to retrieve the contents of a private key'
66
76
  end
@@ -79,8 +89,9 @@ module Rundeck
79
89
  #
80
90
  # @param [String] path A key storage path
81
91
  # @param [String] key The entire private key value
82
- # @param [Hash] options A set of options passed directory to HTTParty
92
+ # @!macro options
83
93
  # @return [Rundeck::ObjectifiedHash]
94
+ # @!macro exceptions
84
95
  def create_private_key(path, key, options = {})
85
96
  create_or_update_key(path, key, 'private', 'post', options)
86
97
  end
@@ -93,11 +104,13 @@ module Rundeck
93
104
  #
94
105
  # @param [String] path A key storage path
95
106
  # @param [String] key The entire private key value
96
- # @param [Hash] options A set of options passed directory to HTTParty
107
+ # @!macro options
97
108
  # @return [Rundeck::ObjectifiedHash]
109
+ # @!macro exceptions
110
+ # @raise [Rundeck::Error::NotFound] if the key was not found
98
111
  def update_private_key(path, key, options = {})
99
112
  key_check(path, 'private', options)
100
- create_or_update_key(path, key, 'public', 'put', options)
113
+ create_or_update_key(path, key, 'private', 'put', options)
101
114
  end
102
115
 
103
116
  # Create a public key
@@ -108,8 +121,9 @@ module Rundeck
108
121
  #
109
122
  # @param [String] path A key storage path
110
123
  # @param [String] key The entire private key value
111
- # @param [Hash] options A set of options passed directory to HTTParty
112
- # @return [Array<Rundeck::ObjectifiedHash>]
124
+ # @!macro options
125
+ # @return [Rundeck::ObjectifiedHash]
126
+ # @!macro exceptions
113
127
  def create_public_key(path, key, options = {})
114
128
  create_or_update_key(path, key, 'public', 'post', options)
115
129
  end
@@ -122,8 +136,10 @@ module Rundeck
122
136
  #
123
137
  # @param [String] path A key storage path
124
138
  # @param [String] key The entire private key value
125
- # @param [Hash] options A set of options passed directory to HTTParty
126
- # @return [Array<Rundeck::ObjectifiedHash>]
139
+ # @!macro options
140
+ # @return [Rundeck::ObjectifiedHash]
141
+ # @!macro exceptions
142
+ # @raise [Rundeck::Error::NotFound] if the key was not foun
127
143
  def update_public_key(path, key, options = {})
128
144
  key_check(path, 'public', options)
129
145
  create_or_update_key(path, key, 'public', 'put', options)
@@ -135,17 +151,19 @@ module Rundeck
135
151
  # Rundeck.delete_key('path/to/key')
136
152
  #
137
153
  # @param [String] path A key storage path
138
- # @param [Hash] options A set of options passed directly to HTTParty
154
+ # @!macro options
139
155
  # @return [nil]
156
+ # @!macro exceptions
140
157
  def delete_key(path, options = {})
141
158
  delete("#{STORAGE_KEYS_PATH}/#{path}", options)
142
159
  end
143
160
 
144
161
  private
145
162
 
146
- def key_check(path, type, options)
163
+ def key_check(path, key_type, options)
164
+ content_type = content_type(key_type)
147
165
  # Check existence and type
148
- if key_metadata(path, options).rundeck_key_type != type
166
+ if key_metadata(path, options).rundeck_content_type != content_type
149
167
  fail Error::NotFound,
150
168
  "A #{type} key was not found at the specified path."
151
169
  end
@@ -163,10 +181,14 @@ module Rundeck
163
181
  end
164
182
 
165
183
  def key_type_headers(type, options)
166
- if type == 'private'
167
- options.merge!(headers: { 'Content-Type' => 'application/octet-stream' })
168
- elsif type == 'public'
169
- options.merge!(headers: { 'Content-Type' => 'application/pgp-key' })
184
+ options.merge!(headers: { 'Content-Type' => content_type(type) })
185
+ end
186
+
187
+ def content_type(key_type)
188
+ if key_type == 'private'
189
+ 'application/octet-stream'
190
+ elsif key_type == 'public'
191
+ 'application/pgp-key'
170
192
  else
171
193
  fail Error::InvalidAttributes,
172
194
  'Invalid key type specified. Must be public or private.'