class VagrantPlugins::SecuredCloud::Action::Create

Public Class Methods

new(app, env) click to toggle source
# File lib/secured-cloud-vagrant/actions/create.rb, line 10
def initialize(app, env)

        @app = app
        @machine = env[:machine]
        @logger = Log4r::Logger.new('vagrant::secured_cloud::action::create')
        
end

Public Instance Methods

call(env) click to toggle source
# File lib/secured-cloud-vagrant/actions/create.rb, line 19
                      def call(env)
                      
                              @logger.debug("Creating VM with name #{@machine.provider_config.vm.name}")
                              env[:ui].info(I18n.t("secured_cloud_vagrant.info.creating"))
                              
                              # Create a Secured Cloud Connection instance to connect tot he SecuredCloud API
                              authInfo = @machine.provider_config.auth
sc_connection = SecuredCloudConnection.new(authInfo.url, authInfo.applicationKey, authInfo.sharedSecret)

                              # Extract the parameters to pass to the createVM method
                              vmName = @machine.provider_config.vm.name
                              vmDescription = @machine.provider_config.vm.description
                              vmStorageGB = @machine.provider_config.vm.storageGB
                              vmMemoryMB = @machine.provider_config.vm.memoryMB
                              vmVcpus = @machine.provider_config.vm.vcpus
                              vmPowerStatus = "POWERED_ON"
                              vmOsPassword = @machine.provider_config.vm.newOsPassword
                              
                              orgResource = @machine.provider_config.vm.orgResourceUrl
                              nodeResource = @machine.provider_config.vm.nodeResourceUrl
                              osTemplateResource = @machine.provider_config.vm.osTemplateUrl
                              imageResource = @machine.provider_config.vm.imageResourceUrl
                                                                      
                              begin
                              
                                      # Call Rest Client to create a VM
                                      response = SecuredCloudRestClient::createVM(sc_connection, orgResource, nodeResource, vmName, vmDescription, vmStorageGB, vmMemoryMB, vmVcpus, vmPowerStatus, imageResource, osTemplateResource, vmOsPassword)
                                      
                                      #Monitor the transaction.
                                      if (response[0] == "202")

                                              #Task successful.
                                              taskResource = response[1]
                                              taskStatus = SecuredCloudRestClient::getTaskStatus(sc_connection, taskResource)
                                              
                                              @logger.info("Task Status:\n#{taskStatus.get_details()}")
                                                
                                              while ((taskStatus.instance_variable_get(:@requestStateEnum) == nil) || (taskStatus.instance_variable_get(:@requestStateEnum) == "OPEN")) do
                                                      sleep(20)
                                                      taskStatus = SecuredCloudRestClient.getTaskStatus(sc_connection, taskResource)
      env[:ui].info(I18n.t("secured_cloud_vagrant.info.task_status", :percentage => taskStatus.get_percentage_completed, 
        :task_desc => taskStatus.get_latest_task_description))
                                                      @logger.info("Task Status:\n#{taskStatus.get_details()}")
                                              end
                                               
                                              if(taskStatus.get_result.nil?) 
                                              
                                              #Task unsuccessful.
      @logger.debug("VM Creation failed with the following error:\n#{taskStatus.get_error_code}: #{taskStatus.get_error_message}")
    
      error_code = (taskStatus.get_error_code.nil?) ? "" : "#{taskStatus.get_error_code} "
      error_message = (taskStatus.get_error_message.nil?) ? I18n.t('secured_cloud_vagrant.errors.internal_server_error') : 
        error_code + taskStatus.get_error_message
          
      env[:ui].error(I18n.t("secured_cloud_vagrant.errors.creating_vm", :vm_name => @machine.provider_config.vm.name,
         :error_message => error_message))
                                              
                                      else
                                        
                                        # Put the resource URL of the newly created VM in the environment
      env[:machine].id = taskStatus.get_result 
      env[:vm_name] = vmName
      
      @logger.debug("VM #{@machine.provider_config.vm.name} has been created with resource URL: #{env[:machine].id}")
      env[:ui].info(I18n.t("secured_cloud_vagrant.info.success.create_vm", :vm_name => @machine.provider_config.vm.name, 
        :resource_url => env[:machine].id))
      
                                      end
                                              
                                               
                                      else
                                              
                                              #Task unsuccessful.
    @logger.debug("VM Creation failed with the following error:\n#{response}")
    
                                              error_message = (response[2].nil?) ? I18n.t('secured_cloud_vagrant.errors.internal_server_error') : response[2]
                                              env[:ui].error(I18n.t("secured_cloud_vagrant.errors.creating_vm", :vm_name => @machine.provider_config.vm.name, 
                                                      :error_message => error_message))
                                      end
                                      
                              rescue Errno::ETIMEDOUT
                                      env[:ui].error(I18n.t("secured_cloud_vagrant.errors.request_timed_out", :request => "create VM '#{vmName}'"))
rescue Exception => e
  env[:ui].error(I18n.t("secured_cloud_vagrant.errors.generic_error", :error_message => e.message))
                              end
                      
                              @app.call(env)
                      end