ansible_tower_client 0.15.0 → 0.16.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a34cad5e35410c160d20d10252d77061c4820686405051be201fe08877ddca8
4
- data.tar.gz: e1a0323a69026441505bbc75602ef1b3786f314510417958498d33abfa524be8
3
+ metadata.gz: a1b0a1ac463760d8b5494152a6e9646ed367655dfbf857f1899a322cbf89b98f
4
+ data.tar.gz: 643abb688c74f01c1e7caaed8fb7cb3e1e65eab2a658c1825a5dd1e7176cc398
5
5
  SHA512:
6
- metadata.gz: 950a9d840eb13c84df3e94ef08a5749172a549bbbc0de50cb9325c7c3aec216a221328bf02fd645f731432f64abd41f45c734085410e7f131c392c6eae038b94
7
- data.tar.gz: 174f2b89477d26d9c5141c8668129c8ef13223ce38f513ad9a0ec70b13026f3e78bbbe41171f5b27b3fb92e85a259c3b6be85f70745b5415e7a33a20f3fbdd38
6
+ metadata.gz: 9f7a7d8a683736eddec813fd3e85aab35675e6bbe1cddc3da13f780e6ebe8d0672ea76bccfe0352f5cdd2255ad2500abf875b193973740e530db2e8704ed200f
7
+ data.tar.gz: 7d3388d96c17847d266597a5a47d31b02cd6777d819dcad8c448df4e44bf1787399f0d282c39d2ae45453db8f62efa4376a93f99acd04c641d91a1715f54eb18
@@ -5,6 +5,17 @@ This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.16.0] - 2018-07-06
9
+ ### Added
10
+ - Added support for API v2 and v2 Credentials [(#107)](https://github.com/ansible/ansible_tower_client_ruby/pull/107)
11
+ - Added AnsibleTowerClient::WorkflowJobNode [(#109)](https://github.com/ansible/ansible_tower_client_ruby/pull/109)
12
+ - Set the Faraday logger when creating a connection [(#110)](https://github.com/ansible/ansible_tower_client_ruby/pull/110)
13
+ - Added AnsibleTowerClient::CredentialTypev2 [(#108)](https://github.com/ansible/ansible_tower_client_ruby/pull/108)
14
+ - Added AnsibleTowerClient::WorkflowJob#extra_vars_hash [(#111)](https://github.com/ansible/ansible_tower_client_ruby/pull/111)
15
+
16
+ ### Changed
17
+ - Substitute invalid characters for dynamically defined class names [(#105)](https://github.com/ansible/ansible_tower_client_ruby/pull/105)
18
+
8
19
  ## [0.15.0] - 2018-06-05
9
20
  ### Added
10
21
  - Added AnsibleTowerClient::WorkflowJob [(#104)](https://github.com/ansible/ansible_tower_client_ruby/pull/104)
@@ -80,7 +91,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
80
91
  ### Fixed
81
92
  - Adjusted project_spec to test on a Project [(#63)](https://github.com/ansible/ansible_tower_client_ruby/pull/63)
82
93
 
83
- [Unreleased]: https://github.com/ansible/ansible_tower_client_ruby/compare/v0.15.0...master
94
+ [Unreleased]: https://github.com/ansible/ansible_tower_client_ruby/compare/v0.16.0...master
95
+ [0.16.0]: https://github.com/ansible/ansible_tower_client_ruby/compare/v0.15.0...v0.16.0
84
96
  [0.15.0]: https://github.com/ansible/ansible_tower_client_ruby/compare/v0.14.0...v0.15.0
85
97
  [0.14.0]: https://github.com/ansible/ansible_tower_client_ruby/compare/v0.13.0...v0.14.0
86
98
  [0.13.0]: https://github.com/ansible/ansible_tower_client_ruby/compare/v0.12.2...v0.13.0
@@ -28,11 +28,14 @@ require "ansible_tower_client/base_models/project_update"
28
28
  require "ansible_tower_client/base_models/schedule"
29
29
  require "ansible_tower_client/base_models/system_job"
30
30
  require "ansible_tower_client/base_models/system_job_template"
31
+ require "ansible_tower_client/base_models/workflow_job_node"
31
32
  require "ansible_tower_client/base_models/workflow_job"
32
33
  require "ansible_tower_client/base_models/workflow_job_template"
33
34
  require "ansible_tower_client/base_models/workflow_job_template_node"
34
35
 
35
36
  require "ansible_tower_client/v2/job_template_v2"
37
+ require "ansible_tower_client/v2/credential_v2"
38
+ require "ansible_tower_client/v2/credential_type_v2"
36
39
 
37
40
  require "more_core_extensions/all"
38
41
  require "active_support/inflector"
@@ -6,9 +6,10 @@ module AnsibleTowerClient
6
6
 
7
7
  DEFAULT_ERROR_MSG = "An unknown error was returned from the provider".freeze
8
8
 
9
- attr_reader :instance
10
- def initialize(connection)
11
- @instance = connection
9
+ attr_reader :instance, :api_version
10
+ def initialize(connection, api_version)
11
+ @instance = connection
12
+ @api_version = api_version
12
13
  end
13
14
 
14
15
  def config
@@ -35,6 +36,11 @@ module AnsibleTowerClient
35
36
  Collection.new(self, credential_class)
36
37
  end
37
38
 
39
+ def credential_types
40
+ raise AnsibleTowerClient::UnsupportedApiError, 'requires API v2 or higher' if api_version?(1)
41
+ Collection.new(self, credential_type_class)
42
+ end
43
+
38
44
  def groups
39
45
  Collection.new(self, group_class)
40
46
  end
@@ -95,6 +101,10 @@ module AnsibleTowerClient
95
101
  Collection.new(self, system_job_template_class)
96
102
  end
97
103
 
104
+ def workflow_job_nodes
105
+ Collection.new(self, workflow_job_node_class)
106
+ end
107
+
98
108
  def workflow_jobs
99
109
  Collection.new(self, workflow_job_class)
100
110
  end
@@ -142,7 +152,17 @@ module AnsibleTowerClient
142
152
  end
143
153
 
144
154
  def credential_class
145
- @credential_class ||= AnsibleTowerClient::Credential
155
+ @credential_class ||= begin
156
+ if api_version?(2)
157
+ AnsibleTowerClient::CredentialV2
158
+ else
159
+ AnsibleTowerClient::Credential
160
+ end
161
+ end
162
+ end
163
+
164
+ def credential_type_class
165
+ @credential_type_class ||= AnsibleTowerClient::CredentialTypeV2
146
166
  end
147
167
 
148
168
  def group_class
@@ -179,7 +199,7 @@ module AnsibleTowerClient
179
199
 
180
200
  def job_template_class
181
201
  @job_template_class ||= begin
182
- if Gem::Version.new(version).between?(Gem::Version.new(2), Gem::Version.new(3))
202
+ if awx_version_between?(2, 3)
183
203
  AnsibleTowerClient::JobTemplateV2
184
204
  else
185
205
  AnsibleTowerClient::JobTemplate
@@ -215,6 +235,10 @@ module AnsibleTowerClient
215
235
  @workflow_job_class ||= AnsibleTowerClient::WorkflowJob
216
236
  end
217
237
 
238
+ def workflow_job_node_class
239
+ @workflow_job_node_class ||= AnsibleTowerClient::WorkflowJobNode
240
+ end
241
+
218
242
  def workflow_job_template_class
219
243
  @workflow_job_template_class ||= AnsibleTowerClient::WorkflowJobTemplate
220
244
  end
@@ -230,5 +254,13 @@ module AnsibleTowerClient
230
254
  return original if instance.url_prefix.path == "/"
231
255
  File.join(instance.url_prefix.path, Regexp.last_match[1])
232
256
  end
257
+
258
+ def awx_version_between?(min, max)
259
+ Gem::Version.new(version).between?(Gem::Version.new(min), Gem::Version.new(max))
260
+ end
261
+
262
+ def api_version?(desired)
263
+ Gem::Version.new(api_version).eql?(Gem::Version.new(desired))
264
+ end
233
265
  end
234
266
  end
@@ -1,4 +1,12 @@
1
1
  module AnsibleTowerClient
2
2
  class WorkflowJob < BaseModel
3
+ def workflow_job_nodes
4
+ # this is where Ansible API deviates from other part by using `workflow_nodes`
5
+ Collection.new(api).find_all_by_url(related['workflow_nodes'])
6
+ end
7
+
8
+ def extra_vars_hash
9
+ extra_vars.empty? ? {} : hashify(:extra_vars)
10
+ end
3
11
  end
4
12
  end
@@ -0,0 +1,11 @@
1
+ module AnsibleTowerClient
2
+ class WorkflowJobNode < BaseModel
3
+ def workflow_job
4
+ api.workflow_jobs.find(workflow_job_id)
5
+ end
6
+
7
+ def job
8
+ job_id.nil? ? nil : api.jobs.find(job_id)
9
+ end
10
+ end
11
+ end
@@ -1,29 +1,70 @@
1
1
  module AnsibleTowerClient
2
2
  class Connection
3
- attr_reader :connection
3
+ attr_reader :options
4
4
 
5
- def initialize(options = nil)
5
+ # Options:
6
+ # - base_url: you have two options here:
7
+ # a) pass in only scheme and hostname e.g. 'https://localhost:54321' to allow client to connect to both api v1
8
+ # and v2 versions like this: `client.api(:version => 1)` and `client.api(:version => 2)`. This requires ansible
9
+ # tower API being accessible directly at `https://localhost:54321/api/v1` and `https://localhost:54321/api/v2`.
10
+ # b) pass in a complete api address e.g. 'https://localhost:54321/tower'. Client will then connect to the path
11
+ # directly and it's your responsibility to know what version of API is there.
12
+ # - username
13
+ # - password
14
+ # - verify_ssl
15
+ def initialize(options = {})
6
16
  raise "Credentials are required" unless options[:username] && options[:password]
7
17
  raise ":base_url is required" unless options[:base_url]
8
- verify_ssl = options[:verify_ssl] || OpenSSL::SSL::VERIFY_PEER
9
- verify_ssl = verify_ssl == OpenSSL::SSL::VERIFY_NONE ? false : true
18
+ logger = options[:logger] || AnsibleTowerClient.logger
10
19
 
11
20
  require 'faraday'
12
21
  require 'faraday_middleware'
13
22
  require 'ansible_tower_client/middleware/raise_tower_error'
14
23
  Faraday::Response.register_middleware :raise_tower_error => -> { Middleware::RaiseTowerError }
15
- @connection = Faraday.new(options[:base_url], :ssl => {:verify => verify_ssl}) do |f|
24
+
25
+ @options = {
26
+ :url => options[:base_url],
27
+ :verify_ssl => (options[:verify_ssl] || OpenSSL::SSL::VERIFY_PEER) != OpenSSL::SSL::VERIFY_NONE,
28
+ :username => options[:username],
29
+ :password => options[:password],
30
+ :logger => logger,
31
+ }
32
+
33
+ reset
34
+ end
35
+
36
+ def connection(url:, username:, password:, verify_ssl: false, logger: nil)
37
+ Faraday.new(url, :ssl => {:verify => verify_ssl}) do |f|
16
38
  f.use(FaradayMiddleware::EncodeJson)
17
39
  f.use(FaradayMiddleware::FollowRedirects, :limit => 3, :standards_compliant => true)
18
40
  f.request(:url_encoded)
19
41
  f.response(:raise_tower_error)
42
+ f.response(:logger, logger)
20
43
  f.adapter(Faraday.default_adapter)
21
- f.basic_auth(options[:username], options[:password])
44
+ f.basic_auth(username, password)
22
45
  end
23
46
  end
24
47
 
25
- def api
26
- @api ||= Api.new(connection)
48
+ def api(version: 2)
49
+ @api[version] ||= begin
50
+ # Build uri path.
51
+ options = @options.clone.tap do |opts|
52
+ opts[:url] = URI(opts[:url]).tap { |url| url.path = url_path_for_version(url.path, version) }
53
+ end
54
+
55
+ Api.new(connection(**options), version)
56
+ end
57
+ end
58
+
59
+ def reset
60
+ @api = {}
61
+ end
62
+
63
+ private
64
+
65
+ def url_path_for_version(orig_path, api_version)
66
+ return orig_path unless orig_path.sub(/\/$/, "").empty?
67
+ "/api/v#{api_version}"
27
68
  end
28
69
  end
29
70
  end
@@ -7,4 +7,5 @@ module AnsibleTowerClient
7
7
  class ResourceNotFoundError < ClientError; end
8
8
  class SSLError < ClientError; end
9
9
  class UnlicensedFeatureError < ClientError; end
10
+ class UnsupportedApiError < ClientError; end
10
11
  end
@@ -46,7 +46,8 @@ module AnsibleTowerClient
46
46
  end
47
47
 
48
48
  def convert_value(key, value, parent)
49
- method = key_to_attribute(key)
49
+ method = key_to_attribute(key).gsub(/\W/, '_') # replace all unqualified characters for method and class names
50
+
50
51
  new_val =
51
52
  if attr_excluded?(method)
52
53
  value
@@ -0,0 +1,9 @@
1
+ module AnsibleTowerClient
2
+ class CredentialTypeV2 < BaseModel
3
+ class Inputs < BaseModel; end
4
+
5
+ def self.endpoint
6
+ 'credential_types'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module AnsibleTowerClient
2
+ class CredentialV2 < Credential
3
+ class Inputs < BaseModel
4
+ def size
5
+ @raw_hash.keys.size
6
+ end
7
+ end
8
+
9
+ def self.endpoint
10
+ 'credentials'
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module AnsibleTowerClient
2
- VERSION = "0.15.0".freeze
2
+ VERSION = "0.16.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ansible_tower_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Dunne
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-06-05 00:00:00.000000000 Z
12
+ date: 2018-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -165,6 +165,7 @@ files:
165
165
  - lib/ansible_tower_client/base_models/system_job.rb
166
166
  - lib/ansible_tower_client/base_models/system_job_template.rb
167
167
  - lib/ansible_tower_client/base_models/workflow_job.rb
168
+ - lib/ansible_tower_client/base_models/workflow_job_node.rb
168
169
  - lib/ansible_tower_client/base_models/workflow_job_template.rb
169
170
  - lib/ansible_tower_client/base_models/workflow_job_template_node.rb
170
171
  - lib/ansible_tower_client/collection.rb
@@ -174,6 +175,8 @@ files:
174
175
  - lib/ansible_tower_client/logging.rb
175
176
  - lib/ansible_tower_client/middleware/raise_tower_error.rb
176
177
  - lib/ansible_tower_client/null_logger.rb
178
+ - lib/ansible_tower_client/v2/credential_type_v2.rb
179
+ - lib/ansible_tower_client/v2/credential_v2.rb
177
180
  - lib/ansible_tower_client/v2/job_template_v2.rb
178
181
  - lib/ansible_tower_client/version.rb
179
182
  homepage: https://github.com/Ansible/ansible_tower_client_ruby