Skip to content

Commit

Permalink
provisioner: Add autoyast self update option
Browse files Browse the repository at this point in the history
AutoYaST can update itself before installing the OS. This patch enables
this feature and adds a field to the provisioner barclamp so that a
repository URL can be set by the user. The special token `<ADMINWEB>` resolves
to the IP:port of the admin node. An empty URL defaults to the SUSE
customer center (scc.suse.com).
  • Loading branch information
nicolasbock committed Jan 10, 2017
1 parent 7badddd commit 08ae4fc
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 2 deletions.
14 changes: 14 additions & 0 deletions chef/cookbooks/provisioner/recipes/update_nodes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -301,13 +301,25 @@ def find_node_boot_mac_addresses(node, admin_data_net)
end

when /^(open)?suse/
expanded_self_update_url = node[:provisioner][:suse][:autoyast][:self_update_url].gsub(
"<ADMINWEB>", "#{admin_ip}:#{web_port}"
)
do_self_update = node[:provisioner][:suse][:autoyast][:do_self_update]
if do_self_update && ! expanded_self_update_url.empty?
do_self_update = system("wget --quiet --spider #{expanded_self_update_url.gsub("$arch", "#{arch}")}")
if ! do_self_update
Chef::Log.warn("AutoYaST self-update URL #{expanded_self_update_url} does not exist")
end
end

append << "install=#{install_url} autoyast=#{node_url}/autoyast.xml"
if node[:provisioner][:use_serial_console]
append << "textmode=1"
end
append << "ifcfg=dhcp4 netwait=60"
append << "squash=0" # workaround bsc#962397
append << "autoupgrade=1" if mnode[:state] == "os-upgrading"
append << "self_update" if do_self_update

target_platform_distro = os.gsub(/-.*$/, "")
target_platform_version = os.gsub(/^.*-/, "")
Expand Down Expand Up @@ -350,6 +362,8 @@ def find_node_boot_mac_addresses(node, admin_data_net)
web_port: web_port,
packages: packages,
repos: repos,
do_self_update: do_self_update,
self_update_url: expanded_self_update_url,
rootpw_hash: node[:provisioner][:root_password_hash] || "",
timezone: timezone,
boot_device: boot_device,
Expand Down
17 changes: 17 additions & 0 deletions chef/cookbooks/provisioner/templates/default/autoyast.xml.erb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,24 @@
<import_gpg_key config:type="boolean">true</import_gpg_key>
</signature-handling>
<storage/>
<% if @do_self_update %>
<self_update_url>
<%= @self_update_url %>
</self_update_url>
<% end -%>
</general>
<report>
<errors>
<log config:type="boolean">true</log>
<show config:type="boolean">true</show>
<timeout config:type="integer">10</timeout>
</errors>
<warnings>
<log config:type="boolean">true</log>
<show config:type="boolean">true</show>
<timeout config:type="integer">10</timeout>
</warnings>
</report>
<add-on>
<add_on_products config:type="list">
<% @repos.keys.sort.each do |name| %>
Expand Down
15 changes: 15 additions & 0 deletions chef/data_bags/crowbar/migrate/provisioner/103_self_update.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
def upgrade(ta, td, a, d)
a["suse"] = {} unless a.key?("suse")
a["suse"]["autoyast"] = {} unless a["suse"].key?("autoyast")
a["suse"]["autoyast"]["do_self_update"] = ta["suse"]["autoyast"]["do_self_update"]
a["suse"]["autoyast"]["self_update_url"] = ta["suse"]["autoyast"]["self_update_url"]
return a, d
end

def downgrade(ta, td, a, d)
delete a["suse"]["autoyast"]["do_self_update"]
delete a["suse"]["autoyast"]["self_update_url"]
delete a["suse"]["autoyast"] if a["suse"]["autoyast"].empty?
delete a["suse"] if a["suse"].empty?
return a, d
end
8 changes: 7 additions & 1 deletion chef/data_bags/crowbar/template-provisioner.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@
}
}
},
"suse": {
"autoyast": {
"do_self_update": false,
"self_update_url": "http://<ADMINWEB>/suse-12.2/$arch/repos/installer-update"
}
},
"keep_existing_hostname": false,
"timezone": "UTC",
"web_port": 8091,
Expand Down Expand Up @@ -200,7 +206,7 @@
"provisioner": {
"crowbar-revision": 0,
"crowbar-applied": false,
"schema-revision": 102,
"schema-revision": 103,
"element_states": {
"provisioner-server": [ "readying", "ready", "applying" ],
"provisioner-base": [ "hardware-installing", "readying", "ready", "applying" ]
Expand Down
4 changes: 3 additions & 1 deletion chef/data_bags/crowbar/template-provisioner.schema
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@
"type": "map",
"required": false,
"mapping": {
"ssh_password": { "type": "str", "required": false }
"ssh_password": { "type": "str", "required": false },
"do_self_update": { "type": "bool", "required": true },
"self_update_url": { "type": "str", "required": true }
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
%span.help-block
= t(".access_keys_hint")

= boolean_field %w(suse autoyast do_self_update)
= string_field %w(suse autoyast self_update_url)
%span.help-block
= t(".suse.autoyast.self_update_url_hint")

= string_field :shell_prompt
%span.help-block
= t(".shell_prompt_hint")
Expand Down
5 changes: 5 additions & 0 deletions crowbar_framework/config/locales/provisioner/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ en:
edit_attributes:
access_keys: 'Additional SSH keys'
access_keys_hint: 'Each SSH key must be on its own line'
suse:
autoyast:
do_self_update: 'Update AutoYaST before installing node'
self_update_url: 'AutoYaST Self-update URL'
self_update_url_hint: 'The alias <ADMINWEB> can be used to specify the admin server. An empty URL implies scc.suse.com.'
shell_prompt: 'Custom Shell Prompt'
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.'
serial_console: 'Serial Console'
Expand Down

0 comments on commit 08ae4fc

Please sign in to comment.