This repository has been archived by the owner on Sep 15, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 14
/
service_catalog.rb
151 lines (140 loc) · 7.47 KB
/
service_catalog.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
module TopologicalInventory::AnsibleTower
class Collector
module ServiceCatalog
def get_service_credentials(connection, query_params, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[credentials]
get_tower_objects(connection, query_params, tower_types, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params)
end
def get_service_credential_types(connection, query_params, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[credential_types]
get_tower_objects(connection, query_params, tower_types, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params)
end
def get_service_inventories(connection, query_params, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[inventories]
get_tower_objects(connection, query_params, tower_types, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params)
end
def get_service_offerings(connection, query_params, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[job_templates workflow_job_templates]
get_tower_objects(connection, query_params, tower_types, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params) do
# transformation of [Workflow] Job Template to parser-compatible hash
# + subqueries for service_plans (surveys)
lambda do |template|
{
:template => template,
:template_type => template.type.to_sym,
:survey_spec => get_service_plan(template)
}
end
end
end
def get_service_offering_nodes(connection, query_params, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[workflow_job_template_nodes]
get_tower_objects(connection, query_params, tower_types, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params) do
# transformation of Workflow Job Template Node to parser-compatible hash
# + subqueries for node's credentials
lambda do |service_offering_node|
api_obj = connection.api.workflow_job_template_nodes
credentials = api_obj.find_all_by_url(service_offering_node.related.credentials)
{
:node => service_offering_node,
:credentials => credentials
}
end
end
end
def get_service_instances(connection, query_params, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[jobs workflow_jobs]
get_tower_objects(connection, query_params, tower_types, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params) do
# transformation of Job/Workflow Job to parser-compatible hash
lambda do |job_or_workflow|
{
:job => job_or_workflow,
:type => job_or_workflow.type.to_sym
}
end
end
end
def get_service_instance_nodes(connection, query_params, workflow: nil, on_premise: false, receptor_receiver: nil, receptor_params: {})
tower_types = %i[workflow_job_nodes]
get_tower_objects(connection, query_params, tower_types, :slug => workflow&.related&.workflow_nodes, :on_premise => on_premise, :receptor_receiver => receptor_receiver, :receptor_params => receptor_params) do
# transformation of Workflow Job Node to parser-compatible hash
# + subqueries for node's credentials
lambda do |service_instance_node|
api_obj = connection.api.workflow_job_nodes
credentials = api_obj.find_all_by_url(service_instance_node.related.credentials)
{
:node => service_instance_node,
:credentials => credentials
}
end
end
end
def get_service_plan(template)
template.survey_spec_hash if template.survey_enabled
end
private
# @param connection [AnsibleTowerClient::Connection | TopologicalInventory::AnsibleTower::Receptor::ApiClient]
# @param query_params [Hash] API query params
# @param tower_types [Array<Symbol>] i.e. %i[job_templates workflow_job_templates]
# @param slug [String] optional, slug for calling "find_all_by_url" instead of "all"
# @param on_premise [Boolean] Ansible Tower placement (in public/on premise)
# @param receptor_receiver [TopologicalInventory::AnsibleTower::Receptor::AsyncReceiver] Receiver for receptor's asynchronous responses
# @param receptor_params [Hash] Params for Receptor node's Catalog HTTP plugin (@see https://github.com/mkanoor/receptor-catalog/README.md)
def get_tower_objects(connection, query_params, tower_types, slug: nil, on_premise: false, receptor_receiver: nil, receptor_params: {})
api_calls_block = lambda do |&block|
#
# Initializing API Calls
api_objects = init_api_objects(connection, on_premise, query_params, receptor_params, receptor_receiver, tower_types, slug)
#
# Getting custom lambda block for transformation of API object to Parser compatible object
parsing_transformation = yield if block_given?
if on_premise
# on-premise tower requests are asynchronous => processed in receptor_receiver
receptor_receiver.transformation = parsing_transformation if receptor_receiver && parsing_transformation
else
api_objects.each do |enumerator|
# public tower requests are synchronous => processed there (block from Collector.collector_thread)
enumerator.each do |template|
block.call(parsing_transformation&.call(template) || template)
end
end
end
end
#
# Invoking requests
# Public Tower requests wrapped in iterator (support for .each)
if on_premise
receptor_receiver.async_requests_remaining.value = tower_types.size if receptor_receiver.respond_to?(:async_requests_remaining)
api_calls_block.call
else
TopologicalInventory::AnsibleTower::Iterator.new(api_calls_block, "Couldn't fetch '#{tower_types.join(', ')}' of service catalog.")
end
end
def init_api_objects(connection, on_premise, query_params, receptor_params, receptor_receiver, tower_types, slug = nil)
tower_types.collect do |entity_type|
#
# Creating Ansible/Receptor API client objects
api_obj = on_premise ? connection.api.send(entity_type, receptor_receiver) : connection.api.send(entity_type)
#
# Logging Tower Full path
log_external_url("#{connection_manager.api_url(tower_hostname)}/#{slug || api_obj.klass.endpoint}")
#
# Calling Tower API
if slug
if on_premise
api_obj.find_all_by_url(slug, query_params, receptor_params)
else
api_obj.find_all_by_url(slug, query_params)
end
else
if on_premise
api_obj.all(query_params, receptor_params)
else
api_obj.all(query_params)
end
end
end
end
end
end
end