-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Ansible facts modules #247
Changes from all commits
df54fbe
a466c1d
c25763d
e01e05a
c62679a
744714b
1e0bd0d
43aa032
a2d1363
53a7def
05de810
a5ca310
c082f24
b9c4152
d30ae80
9aaf6c2
559cbde
1ca3e70
ba31600
69b5bc3
df2393e
5d49f95
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -92,6 +92,65 @@ def build_task(state, object) | |
|
||
private | ||
|
||
def verbs | ||
{ | ||
present: 'created', | ||
absent: 'deleted', | ||
facts: 'verify' | ||
} | ||
end | ||
end | ||
|
||
# Holds all information necessary to run a facts module and verify the | ||
# creation / deletion of a resource. | ||
# Takes in a set of parameters, which are used as properties on the facts | ||
# module. | ||
class FactsVerifier < Api::Object | ||
include Compile::Core | ||
|
||
def validate | ||
@failure ||= FailureCondition.new | ||
|
||
check_property :parameters, Hash | ||
end | ||
|
||
# rubocop:disable Metrics/AbcSize | ||
# rubocop:disable Metrics/MethodLength | ||
def build_task(state, object) | ||
obj_name = Google::StringUtils.underscore(object.name) | ||
verb = verbs[state.to_sym] | ||
number = state == 'present' ? 1 : 0 | ||
module_name = ["gcp_#{object.__product.prefix[1..-1]}", | ||
Google::StringUtils.underscore(object.name), | ||
'facts'].join('_') | ||
[ | ||
"- name: verify that #{obj_name} was #{verb}", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There are a lot of formatting things in here- would it make sense for this part to be an erb template? Or is there enough regular ruby going on that this is better? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the moment, I think it's alright to keep this as Ruby. I'm going to do a small refactor of this code in a separate PR. It should clean it up and make generating facts examples from regular examples possible. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
indent([ | ||
"#{module_name}:", | ||
indent([ | ||
'filters:', | ||
' - name = "{{ resource_name }}"', | ||
@parameters.map { |k, v| "#{k}: #{v}" }, | ||
'project: "{{ gcp_project }}"', | ||
'auth_kind: "{{ gcp_cred_kind }}"', | ||
'service_account_file: "{{ gcp_cred_file }}"', | ||
'scopes:', | ||
" - #{object.__product.scopes[0]}" | ||
], 4), | ||
'register: results' | ||
].flatten.compact, 2), | ||
|
||
'- name: verify that command succeeded', | ||
' assert:', | ||
' that:', | ||
indent("- results['items'] | length == #{number}", 6) | ||
].compact | ||
end | ||
# rubocop:enable Metrics/MethodLength | ||
# rubocop:enable Metrics/AbcSize | ||
|
||
private | ||
|
||
def verbs | ||
{ | ||
present: 'created', | ||
|
@@ -196,6 +255,7 @@ def verbs | |
private | ||
|
||
# rubocop:disable Metrics/CyclomaticComplexity | ||
# rubocop:disable Metrics/PerceivedComplexity | ||
def build_task(state, hash, object, noop = false) | ||
verb = verbs[state.to_sym] | ||
|
||
|
@@ -208,17 +268,17 @@ def build_task(state, hash, object, noop = false) | |
indent([ | ||
"#{@name}:", | ||
indent([ | ||
compile_string(hash, @code), | ||
'scopes:', | ||
indent(lines(scopes), 2), | ||
"state: #{state}" | ||
], 4), | ||
compile_string(hash, @code), | ||
'scopes:', | ||
indent(lines(scopes), 2), | ||
("state: #{state}" if state != 'facts') | ||
].compact, 4), | ||
("register: #{@register}" unless @register.nil?) | ||
].compact, 2) | ||
] | ||
end | ||
# rubocop:enable Metrics/MethodLength | ||
# rubocop:enable Metrics/CyclomaticComplexity | ||
# rubocop:enable Metrics/PerceivedComplexity | ||
|
||
def object_name_from_module_name(mod_name) | ||
product_name = mod_name.match(/gcp_[a-z]*_(.*)/).captures[0] | ||
|
@@ -234,13 +294,15 @@ def dependency_name(dependency, resource) | |
# examples. | ||
class Example < Api::Object | ||
attr_reader :task | ||
attr_reader :facts | ||
attr_reader :verifier | ||
attr_reader :dependencies | ||
|
||
def validate | ||
super | ||
check_property :task, Task | ||
check_optional_property :verifier, Verifier | ||
check_optional_property :facts, Task | ||
check_optional_property :verifier, [Verifier, FactsVerifier] | ||
check_optional_property_list :dependencies, Task | ||
end | ||
end | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry to keep hassling you here, but it seems like off-by-default would be the right approach. Most resources don't need datasources.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the Ansible world, we're looking to build datasources for everything. I'm inclined to keep this as-is because my intent is for most of these lines to go away (very, very soon).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great, in the Terraform world we agree also!