Skip to content

Commit

Permalink
Fix softlayer_api dep version, fix bug with transaction not being wai…
Browse files Browse the repository at this point in the history
…ted on and add transaction status to debug logging
  • Loading branch information
ju2wheels committed Oct 1, 2014
1 parent a465e44 commit 1c15a28
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 60 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Parameter | Description

Parameter | Description | Default | Required
------------------- | ------------------------------------------| ----------------| --------
`api_timeout` | SoftLayer API call timeout | 60 | no
`api_timeout` | SoftLayer API call timeout in seconds | 60 | no
`provision_timeout` | Provisioning wait timeout in seconds | 1200 | no
`rebuild_timeout` | Rebuild wait timeout in seconds | 1200 | no
`transaction_wait` | Wait for order transactions to complete | true | no
Expand Down
37 changes: 11 additions & 26 deletions lib/vagrant-softlayer/action/wait_for_provision.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,35 +16,20 @@ def call(env)
env[:ui].info I18n.t("vagrant_softlayer.vm.wait_for_provision")

env[:sl_machine] = env[:sl_client]["SoftLayer_Virtual_Guest"].object_with_id(env[:machine].id.to_i)

retry_msg = lambda { @logger.debug("Object not found, retrying in 10 seconds.") }

# Defaults to 20 minutes timeout
Timeout::timeout(env[:machine].provider_config.provision_timeout, Errors::SLProvisionTimeoutError) do
@logger.debug("Checking if the newly ordered machine has been provisioned.")
sl_warden(retry_msg, 10) do
ready = false

while ! ready
softlayer_properties = env[:sl_machine].object_mask("mask[#{virtual_guest_object_mask.join(",")}]").getObject

has_os_reload = softlayer_properties.has_key?("lastOperatingSystemReload")
has_active_transaction = softlayer_properties.has_key?("activeTransaction")
provisioned = softlayer_properties.has_key?("provisionDate")
reloading_os = has_active_transaction && has_os_reload && (softlayer_properties["lastOperatingSystemReload"]['id'] == softlayer_properties["activeTransaction"]['id'])

ready = provisioned && !reloading_os && (!env[:machine].provider_config.transaction_wait || !has_active_transaction)

if ! ready
provision_status = env[:sl_machine].getActiveTransaction
provision_status = " Provision status: #{provision_status["transactionStatus"]["friendlyName"]} (#{provision_status["transactionStatus"]["name"]})." if provision_status && ! provision_status.empty?
@logger.debug("#{env[:machine].provider_config.hostname} is still provisioning. Retrying in 10 seconds.#{provision_status}")
sleep 10
end
end

virtual_server = ::SoftLayer::VirtualServer.server_with_id(env[:machine].id.to_i, :client => env[:sl_client])

#Rechecks every 10 sec
ready = virtual_server.wait_until_ready((env[:machine].provider_config.provision_timeout.to_f/10).ceil, env[:machine].provider_config.transaction_wait, 10) do |server_ready|
unless server_ready
provision_status = env[:sl_machine].getActiveTransaction
provision_status = " Provision status: #{provision_status["transactionStatus"]["friendlyName"]} (#{provision_status["transactionStatus"]["name"]})." if provision_status && ! provision_status.empty?
@logger.info("#{env[:machine].provider_config.hostname} is still provisioning. Retrying in 10 seconds.#{provision_status}")
end
end

raise Errors::SLProvisionTimeoutError unless ready

env[:ui].info I18n.t("vagrant_softlayer.vm.provisioned")

@app.call(env)
Expand Down
41 changes: 10 additions & 31 deletions lib/vagrant-softlayer/action/wait_for_rebuild.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,19 @@ def initialize(app, env)
def call(env)
env[:ui].info I18n.t("vagrant_softlayer.vm.wait_for_rebuild")

virtual_guest_object_mask = [
"activeTransaction.id",
"activeTransaction.transactionStatus.friendlyName",
"activeTransaction.transactionStatus.name",
"lastOperatingSystemReload.id",
"provisionDate",
]

# Defaults to 20 minutes timeout
Timeout::timeout(env[:machine].provider_config.rebuild_timeout, Errors::SLRebuildTimeoutError) do
@logger.debug("Checking if the instance has been rebuilt.")
sl_warden do
ready = false

while ! ready
softlayer_properties = env[:sl_machine].object_mask("mask[#{virtual_guest_object_mask.join(",")}]").getObject

has_os_reload = softlayer_properties.has_key?("lastOperatingSystemReload")
has_active_transaction = softlayer_properties.has_key?("activeTransaction")
provisioned = softlayer_properties.has_key?("provisionDate")
reloading_os = has_active_transaction && has_os_reload && (softlayer_properties["lastOperatingSystemReload"]['id'] == softlayer_properties["activeTransaction"]['id'])

ready = provisioned && !reloading_os && (!env[:machine].provider_config.transaction_wait || !has_active_transaction)

if ! ready
rebuild_status = env[:sl_machine].getActiveTransaction
rebuild_status = " Rebuild status: #{rebuild_status["transactionStatus"]["friendlyName"]} (#{rebuild_status["transactionStatus"]["name"]})." if rebuild_status && ! rebuild_status.empty?
@logger.debug("#{env[:machine].provider_config.hostname} is still rebuilding. Retrying in 10 seconds.#{rebuild_status}")
sleep 10
end
end
#Rechecks every 10 sec
virtual_server = ::SoftLayer::VirtualServer.server_with_id(env[:machine].id.to_i, :client => env[:sl_client])

ready = virtual_server.wait_until_ready((env[:machine].provider_config.rebuild_timeout.to_f/10).ceil, env[:machine].provider_config.transaction_wait, 10) do |server_ready|
unless server_ready
rebuild_status = env[:sl_machine].getActiveTransaction
rebuild_status = " Rebuild status: #{rebuild_status["transactionStatus"]["friendlyName"]} (#{rebuild_status["transactionStatus"]["name"]})." if rebuild_status && ! rebuild_status.empty?
@logger.info("#{env[:machine].provider_config.hostname} is still rebuilding. Retrying in 10 seconds.#{rebuild_status}")
end
end

raise Errors::SLRebuildTimeoutError unless ready

env[:ui].info I18n.t("vagrant_softlayer.vm.rebuilt")

@app.call(env)
Expand Down
2 changes: 1 addition & 1 deletion lib/vagrant-softlayer/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module VagrantPlugins
module SoftLayer
VERSION = "0.3.4"
VERSION = "0.4.0.dev"
end
end
2 changes: 1 addition & 1 deletion vagrant-softlayer.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_path = "lib"

spec.add_dependency "softlayer_api", ">= 2.2.0"
spec.add_dependency "softlayer_api", "~> 2.0", ">= 2.2.0"

spec.add_development_dependency "bundler", "~> 1.3"
spec.add_development_dependency "rake"
Expand Down

0 comments on commit 1c15a28

Please sign in to comment.