Skip to content

Commit 62180d4

Browse files
authored
Merge pull request #23542 from agrare/miq_provision_configuration_scripts
Add MiqRequest and MiqProvisionWorkflow classes for ConfigurationScript provisioning
2 parents 77bc642 + a0c3edd commit 62180d4

11 files changed

+394
-16
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class ManageIQ::Providers::AutomationManager::Provision < MiqProvisionTask
2+
def self.request_class
3+
MiqProvisionConfigurationScriptRequest
4+
end
5+
6+
def my_role(*)
7+
"ems_operations"
8+
end
9+
10+
def my_queue_name
11+
source.manager&.queue_name_for_ems_operations
12+
end
13+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class ManageIQ::Providers::AutomationManager::ProvisionWorkflow < MiqProvisionConfigurationScriptWorkflow
2+
def dialog_name_from_automate(message = 'get_dialog_name', extra_attrs = {})
3+
extra_attrs['platform_category'] ||= 'automation_manager'
4+
super(message, %i[request_type], extra_attrs)
5+
end
6+
end
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class MiqProvisionConfigurationScriptRequest < MiqRequest
2+
delegate :my_zone, :to => :source
3+
4+
TASK_DESCRIPTION = N_('Automation Manager Provisioning')
5+
SOURCE_CLASS_NAME = 'ConfigurationScript'
6+
7+
default_value_for(:source_id) { |r| r.get_option(:source_id) }
8+
default_value_for :source_type, "ConfigurationScript"
9+
validates :source, :presence => true
10+
validate :must_have_user
11+
12+
def self.request_task_class_from(attribs)
13+
source_id = MiqRequestMixin.get_option(:source_id, nil, attribs['options'])
14+
configuration_script = ::ConfigurationScript.find_by(:id => source_id)
15+
return if configuration_script.nil?
16+
17+
configuration_script.manager.class.provision_class(nil)
18+
end
19+
20+
def self.new_request_task(attribs)
21+
request_task_class_from(attribs).new(attribs)
22+
end
23+
24+
def customize_request_task_attributes(_req_task_attrs, _idx)
25+
end
26+
27+
def requested_task_idx
28+
[-1] # we are only using one task per request
29+
end
30+
31+
def originating_controller
32+
"configuration_scripts"
33+
end
34+
35+
def event_name(mode)
36+
"configuration_script_provision_request_#{mode}"
37+
end
38+
end
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
class MiqProvisionConfigurationScriptRequestTemplate < MiqProvisionConfigurationScriptRequest
2+
def create_tasks_for_service(service_task, parent_svc)
3+
template_service_resource = ServiceResource.find_by(:id => service_task.options[:service_resource_id])
4+
scaling_min = 1
5+
6+
_log.info("create_tasks_for_service ID #{service_task.id} SCALING : #{scaling_min}")
7+
scaling_min.times.collect do |idx|
8+
create_request_task(idx) do |req_task|
9+
req_task.miq_request_id = service_task.miq_request.id
10+
req_task.userid = service_task.userid
11+
12+
task_options = req_task.options.merge(service_options(parent_svc, service_task, template_service_resource))
13+
task_options = task_options.merge(owner_options(service_task))
14+
req_task.options = task_options
15+
end
16+
end
17+
end
18+
19+
def request_task_class
20+
MiqProvisionConfigurationScriptTask
21+
end
22+
23+
def get_source_name
24+
SecureRandom.uuid # TODO
25+
end
26+
27+
def post_create(_auto_approve)
28+
update(:description => "Miq Provision ConfigurationScript Request Template for #{source.name}")
29+
self
30+
end
31+
32+
def service_template_resource_copy
33+
dup.tap(&:save!)
34+
end
35+
36+
def execute
37+
# Should not be called.
38+
raise _("Provision ConfigurationScript Request Templates do not support the execute method.")
39+
end
40+
41+
private
42+
43+
def service_options(parent_svc, service_task, template_service_resource)
44+
{
45+
:miq_force_unique_name => [true, 1],
46+
:service_guid => parent_svc.guid,
47+
:service_resource_id => template_service_resource.id,
48+
:service_template_request => false,
49+
:configuration_script_payload_id => service_task.options&.dig(:parent_configuration_script_payload_id)
50+
}
51+
end
52+
53+
# NOTE: for services, the requester is the owner
54+
def owner_options(service_task)
55+
user = User.lookup_by_userid(service_task.userid)
56+
return {} if user.nil?
57+
58+
{
59+
:requester_group => service_task.options[:requester_group],
60+
:owner_email => user.email,
61+
:owner_group => service_task.options[:requester_group],
62+
:owner_first_name => user.first_name,
63+
:owner_last_name => user.last_name
64+
}
65+
end
66+
67+
def get_root_svc(parent_svc)
68+
return nil unless parent_svc
69+
70+
parent_svc.parent || parent_svc
71+
end
72+
73+
def get_parent_task(service_task)
74+
MiqRequestTask.find_by(:id => service_task.options[:parent_task_id])
75+
end
76+
end
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class MiqProvisionConfigurationScriptTask < MiqRequestTask
2+
def self.get_description(*)
3+
end
4+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class MiqProvisionConfigurationScriptWorkflow < MiqProvisionWorkflow
2+
def self.base_model
3+
MiqProvisionConfigurationScriptWorkflow
4+
end
5+
6+
def self.default_dialog_file
7+
'miq_provision_configuration_script_dialogs'
8+
end
9+
10+
def self.automate_dialog_request
11+
'UI_CONFIGURATION_SCRIPT_PROVISION_INFO'
12+
end
13+
14+
def self.request_class
15+
MiqProvisionConfigurationScriptRequest
16+
end
17+
end

app/models/miq_request.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ class MiqRequest < ApplicationRecord
8282
:MiqProvisionConfiguredSystemRequest => {
8383
:provision_via_foreman => N_("%{config_mgr_type} Provision") % {:config_mgr_type => ui_lookup(:ui_title => 'foreman')}
8484
},
85+
:MiqProvisionConfigurationScriptRequest => {
86+
:provision_via_automation_manager => N_("Automation Manager Provision")
87+
},
8588
:MiqProvisionRequest => {
8689
:template => N_("VM Provision"),
8790
:clone_to_vm => N_("VM Clone"),
@@ -121,7 +124,8 @@ class MiqRequest < ApplicationRecord
121124
}.freeze
122125

123126
REQUEST_TYPES_BACKEND_ONLY = {
124-
:MiqProvisionRequestTemplate => {:template => "VM Provision Template"},
127+
:MiqProvisionRequestTemplate => {:template => "VM Provision Template"},
128+
:MiqProvisionConfigurationScriptRequestTemplate => {:provision_via_automation_manager => "Configuration Script Template"}
125129
}
126130

127131
REQUEST_TYPES = MODEL_REQUEST_TYPES.values.each_with_object(REQUEST_TYPES_BACKEND_ONLY) { |i, h| i.each { |k, v| h[k] = v } }

app/models/service_template.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ class ServiceTemplate < ApplicationRecord
2020
:fqname,
2121
:configuration_template,
2222
:configuration_template_id,
23-
:configuration_template_type].freeze
23+
:configuration_template_type,
24+
:configuration_script_id].freeze
2425

2526
include CustomActionsMixin
2627
include ServiceMixin
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
---
2+
:name: miq_provision_configuration_script_dialogs
3+
:description: Sample Configuration Script Provisioning Dialog
4+
:dialog_type: MiqProvisionConfigurationScriptWorkflow
5+
:content:
6+
:buttons:
7+
- :submit
8+
- :cancel
9+
:dialogs:
10+
:requester:
11+
:description: Request
12+
:fields:
13+
:owner_phone:
14+
:description: Phone
15+
:required: false
16+
:display: :hide
17+
:data_type: :string
18+
:owner_country:
19+
:description: Country/Region
20+
:required: false
21+
:display: :hide
22+
:data_type: :string
23+
:owner_phone_mobile:
24+
:description: Mobile
25+
:required: false
26+
:display: :hide
27+
:data_type: :string
28+
:owner_title:
29+
:description: Title
30+
:required: false
31+
:display: :hide
32+
:data_type: :string
33+
:owner_first_name:
34+
:description: First Name
35+
:required: false
36+
:display: :edit
37+
:data_type: :string
38+
:owner_manager:
39+
:description: Name
40+
:required: false
41+
:display: :edit
42+
:data_type: :string
43+
:owner_address:
44+
:description: Address
45+
:required: false
46+
:display: :hide
47+
:data_type: :string
48+
:owner_company:
49+
:description: Company
50+
:required: false
51+
:display: :hide
52+
:data_type: :string
53+
:owner_last_name:
54+
:description: Last Name
55+
:required: false
56+
:display: :edit
57+
:data_type: :string
58+
:owner_manager_mail:
59+
:description: E-Mail
60+
:required: false
61+
:display: :hide
62+
:data_type: :string
63+
:owner_city:
64+
:description: City
65+
:required: false
66+
:display: :hide
67+
:data_type: :string
68+
:owner_department:
69+
:description: Department
70+
:required: false
71+
:display: :hide
72+
:data_type: :string
73+
:owner_load_ldap:
74+
:pressed:
75+
:method: :retrieve_ldap
76+
:description: Look Up LDAP Email
77+
:required: false
78+
:display: :show
79+
:data_type: :button
80+
:owner_manager_phone:
81+
:description: Phone
82+
:required: false
83+
:display: :hide
84+
:data_type: :string
85+
:owner_state:
86+
:description: State
87+
:required: false
88+
:display: :hide
89+
:data_type: :string
90+
:owner_office:
91+
:description: Office
92+
:required: false
93+
:display: :hide
94+
:data_type: :string
95+
:owner_zip:
96+
:description: Zip code
97+
:required: false
98+
:display: :hide
99+
:data_type: :string
100+
:owner_email:
101+
:description: E-Mail
102+
:required_method: :validate_regex
103+
:required_regex: !ruby/regexp /\A[\w!#$\%&'*+\/=?`\{|\}~^-]+(?:\.[\w!#$\%&'*+\/=?`\{|\}~^-]+)*@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\Z/i
104+
:required: true
105+
:display: :edit
106+
:data_type: :string
107+
:request_notes:
108+
:description: Notes
109+
:required: false
110+
:display: :edit
111+
:data_type: :string
112+
:display: :show
113+
:field_order:
114+
:purpose:
115+
:description: Purpose
116+
:fields:
117+
:tag_ids:
118+
:required_method: :validate_tags
119+
:description: Tags
120+
:required: false
121+
:options:
122+
:include: []
123+
:order: []
124+
:single_select: []
125+
:exclude: []
126+
:display: :edit
127+
:required_tags: []
128+
:data_type: :integer
129+
:display: :show
130+
:field_order:
131+
:customize:
132+
:description: Customize
133+
:fields:
134+
:root_password:
135+
:description: Root Password
136+
:required: false
137+
:display: :edit
138+
:data_type: :string
139+
:notes: Minimum 8 characters or blank
140+
:hostname:
141+
:description: Host Name
142+
:required: false
143+
:display: :edit
144+
:data_type: :string
145+
:ip_addr:
146+
:description: IP Address
147+
:required: false
148+
:notes: (Enter starting IP address)
149+
:display: :edit
150+
:data_type: :string
151+
:notes_display: :hide
152+
:display: :show
153+
:service:
154+
:description: Catalog
155+
:fields:
156+
:source_id:
157+
:values_from:
158+
:method: :allowed_configuration_scripts
159+
:description: Workspaces
160+
:required: true
161+
:notes:
162+
:display: :show
163+
:data_type: :integer
164+
:notes_display: :show
165+
:display: :show
166+
:schedule:
167+
:description: Schedule
168+
:fields:
169+
:schedule_type:
170+
:values:
171+
schedule: Schedule
172+
immediately: Immediately on Approval
173+
:description: When to Provision
174+
:required: false
175+
:display: :edit
176+
:default: immediately
177+
:data_type: :string
178+
:schedule_time:
179+
:values_from:
180+
:options:
181+
:offset: 1.day
182+
:method: :default_schedule_time
183+
:description: Provision on
184+
:required: false
185+
:display: :edit
186+
:data_type: :time
187+
:display: :show
188+
:dialog_order:
189+
- :requester
190+
- :purpose
191+
- :service
192+
- :customize
193+
- :schedule

0 commit comments

Comments
 (0)