Skip to content

Commit 011cbf1

Browse files
committed
[provisioner] Add autoyast self update option
1 parent 6eca187 commit 011cbf1

File tree

10 files changed

+74
-1
lines changed

10 files changed

+74
-1
lines changed

chef/cookbooks/provisioner/recipes/update_nodes.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ def find_node_boot_mac_addresses(node, admin_data_net)
290290
append << "ifcfg=dhcp4 netwait=60"
291291
append << "squash=0" # workaround bsc#962397
292292
append << "autoupgrade=1" if mnode[:state] == "os-upgrading"
293+
append << "self_update"
293294

294295
target_platform_distro = os.gsub(/-.*$/, "")
295296
target_platform_version = os.gsub(/^.*-/, "")
@@ -333,6 +334,7 @@ def find_node_boot_mac_addresses(node, admin_data_net)
333334
web_port: web_port,
334335
packages: packages,
335336
repos: repos,
337+
self_update_url: node[:provisioner][:self_update_url],
336338
rootpw_hash: node[:provisioner][:root_password_hash] || "",
337339
timezone: timezone,
338340
boot_device: (mnode[:crowbar_wall][:boot_device] rescue nil),

chef/cookbooks/provisioner/templates/default/autoyast.xml.erb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,22 @@
2626
<import_gpg_key config:type="boolean">true</import_gpg_key>
2727
</signature-handling>
2828
<storage/>
29+
<% unless @self_update_url.nil? || @self_update_url.empty? -%>
30+
<self_update_url><%= @self_update_url %></self_update_url>
31+
<% end -%>
2932
</general>
33+
<report>
34+
<errors>
35+
<log config:type="boolean">true</log>
36+
<show config:type="boolean">true</show>
37+
<timeout config:type="integer">10</timeout>
38+
</errors>
39+
<warnings>
40+
<log config:type="boolean">true</log>
41+
<show config:type="boolean">true</show>
42+
<timeout config:type="integer">10</timeout>
43+
</warnings>
44+
</report>
3045
<add-on>
3146
<add_on_products config:type="list">
3247
<% @repos.keys.sort.each do |name| %>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
def upgrade(ta, td, a, d)
2+
a["self_update_url"] = ta["self_update_url"]
3+
return a, d
4+
end
5+
6+
def downgrade(ta, td, a, d)
7+
delete a["self_update_url"]
8+
return a, d
9+
end

chef/data_bags/crowbar/template-provisioner.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"access_keys": "",
1010
"shell_prompt": "USER@HOST:CWD SUFFIX",
1111
"enable_pxe": true,
12+
"self_update_url": "http://<ADMINWEB>/suse-12.2/$arch/repos/installer-update",
1213
"discovery": {
1314
"append": ""
1415
},
@@ -200,7 +201,7 @@
200201
"provisioner": {
201202
"crowbar-revision": 0,
202203
"crowbar-applied": false,
203-
"schema-revision": 102,
204+
"schema-revision": 103,
204205
"element_states": {
205206
"provisioner-server": [ "readying", "ready", "applying" ],
206207
"provisioner-base": [ "hardware-installing", "readying", "ready", "applying" ]

chef/data_bags/crowbar/template-provisioner.schema

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"access_keys": { "type": "str", "required": true },
2020
"shell_prompt": { "type": "str", "required": true },
2121
"enable_pxe": { "type": "bool", "required": true },
22+
"self_update_url": { "type": "str", "required": true },
2223
"web_port": { "type": "int", "required": true },
2324
"keep_existing_hostname": { "type": "bool", "required": true },
2425
"timezone": { "type": "str", "required": true },

crowbar_framework/app/controllers/barclamp_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,7 @@ def proposal_delete
704704
error 404, "Proposal of barclamp not found"
705705
error 500, "Failed to commit proposal, details in the response"
706706
def proposal_commit
707+
Rails.logger.info("starting proposal_commit, params = #{params.inspect}")
707708
code, message = @service_object.proposal_commit(
708709
params[:id]
709710
)

crowbar_framework/app/models/provisioner_service.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def role_constraints
4242
end
4343

4444
def validate_proposal_after_save proposal
45+
@logger.info("provisioner_service.validate_proposal_after_save")
4546
proposal["attributes"]["provisioner"]["packages"].each do |platform, packages|
4647
packages.each do |package|
4748
unless Crowbar::Validator::PackageNameValidator.new.validate(package)
@@ -50,6 +51,21 @@ def validate_proposal_after_save proposal
5051
end
5152
end
5253

54+
@logger.info("validating existence of #{proposal["attributes"]["provisioner"]["self_update_url"]}")
55+
56+
#if /<ADMINWEB>/ =~ proposal["attributes"]["provisioner"]["self_update_url"]
57+
# localdir = proposal["attributes"]["provisioner"]["self_update_url"]
58+
# Rails::logger.info("localdir = #{localdir}")
59+
# output = `wget #{proposal["attributes"]["provisioner"]["self_update_url"]}`
60+
# Rails::logger.info("[provisioner] #{$?}: #{output}")
61+
# if output != 0
62+
# validation_error(html_escape(
63+
# "Unable to reach AutoYaST self update at "
64+
# "#{proposal["attributes"]["provisioner"]["self_update_url"]}"
65+
# ))
66+
# end
67+
#end
68+
5369
validate_one_for_role proposal, "provisioner-server"
5470

5571
super
@@ -233,4 +249,20 @@ def disable_repository(platform, arch, repo)
233249

234250
[200, ""]
235251
end
252+
253+
def apply_role_pre_chef_call(old_role, role, all_nodes)
254+
@logger.debug("[provisioner] apply_role_pre_chef_call: entering #{all_nodes.inspect}")
255+
return if all_nodes.empty?
256+
257+
nodes = NodeObject.find("roles:provisioner-server")
258+
unless nodes.nil? or nodes.length < 1
259+
admin_ip = nodes[0].get_network_by_type("admin")["address"]
260+
web_port = nodes[0]["provisioner"]["web_port"]
261+
@logger.info("self_update_url: #{role.default_attributes["provisioner"]["self_update_url"]}")
262+
role.default_attributes["provisioner"]["self_update_url"].gsub!(
263+
/<ADMINWEB>/, "#{admin_ip}:#{web_port}"
264+
)
265+
@logger.info("self_update_url: #{role.default_attributes["provisioner"]["self_update_url"]}")
266+
end
267+
end
236268
end

crowbar_framework/app/models/service_object.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ def create_proposal
476476

477477
# FIXME: looks like purely controller methods
478478
def proposal_create(params)
479+
@logger.debug("proposal_create")
479480
base_id = params["id"]
480481
params["id"] = "#{@bc_name}-#{params["id"]}"
481482
if FORBIDDEN_PROPOSAL_NAMES.any?{ |n| n == base_id }
@@ -513,6 +514,7 @@ def proposal_create_bootstrap(params)
513514
end
514515

515516
def proposal_edit(params, validate_after_save = true)
517+
@logger.debug("proposal_edit")
516518
base_id = params["id"] || params[:name]
517519
params["id"] = "#{@bc_name}-#{base_id}"
518520
proposal = {}.merge(params)
@@ -533,6 +535,7 @@ def proposal_delete(inst)
533535
# FIXME: most of these can be validations on the model itself,
534536
# preferrably refactored into Validator classes.
535537
def save_proposal!(prop, options = {})
538+
@logger.debug("save_proposal")
536539
options.reverse_merge!(validate_after_save: true)
537540
clean_proposal(prop.raw_data)
538541
validate_proposal(prop.raw_data)
@@ -545,7 +548,9 @@ def save_proposal!(prop, options = {})
545548
# is computed (in apply_role) and chef client gets called on the nodes.
546549
# Hopefully, this will get moved into a background job.
547550
def proposal_commit(inst, in_queue = false, validate_after_save = true, bootstrap = false)
551+
@logger.info("starting proposal_commit")
548552
prop = Proposal.where(barclamp: @bc_name, name: inst).first
553+
@logger.info("prop = #{prop.inspect}")
549554

550555
if prop.nil?
551556
[404, "#{I18n.t('.cannot_find', scope: 'model.service')}: #{@bc_name}.#{inst}"]
@@ -600,6 +605,7 @@ def accept_remotes
600605
#
601606
# FIXME: move into validator classes
602607
def validate_proposal_elements proposal_elements
608+
@logger.debug("validate_proposal_elements")
603609
proposal_elements.each do |role_and_elements|
604610
role, elements = role_and_elements
605611
uniq_elements = elements.uniq
@@ -660,6 +666,7 @@ def validate_proposal proposal
660666
# after your overriden method for error handling and constraints validation.
661667
#
662668
def validate_proposal_after_save proposal
669+
Rails.logger.info("service_object.validate_proposal_after_save")
663670
validate_proposal_constraints proposal
664671
handle_validation_errors
665672
end
@@ -990,6 +997,8 @@ def apply_role(role, inst, in_queue, bootstrap = false)
990997
new_deployment.delete("elements_expanded")
991998
end
992999

1000+
@logger.debug("role = #{role.pretty_inspect}")
1001+
9931002
# make sure the role is saved
9941003
role.save
9951004

crowbar_framework/app/views/barclamp/provisioner/_edit_attributes.html.haml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
%span.help-block
88
= t(".access_keys_hint")
99

10+
= string_field :self_update_url
11+
1012
= string_field :shell_prompt
1113
%span.help-block
1214
= t(".shell_prompt_hint")

crowbar_framework/config/locales/provisioner/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ en:
2121
edit_attributes:
2222
access_keys: 'Additional SSH keys'
2323
access_keys_hint: 'Each SSH key must be on its own line'
24+
self_update_url: 'AutoYaST Self-update URL (The alias <ADMINWEB> can be used to specify the admin server)'
2425
shell_prompt: 'Custom Shell Prompt'
2526
shell_prompt_hint: 'You can use the placeholders USER, ALIAS, HOST, FQDN, CWD and SUFFIX to customize the shell prompt on all nodes. Add a \n for a new line within the prompt.'
2627
serial_console: 'Serial Console'

0 commit comments

Comments
 (0)